Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 34836 invoked from network); 8 Aug 2006 07:18:36 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 8 Aug 2006 07:18:36 -0000 Received: (qmail 69225 invoked by uid 500); 8 Aug 2006 07:18:36 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 69137 invoked by uid 500); 8 Aug 2006 07:18:35 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 69127 invoked by uid 99); 8 Aug 2006 07:18:35 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Aug 2006 00:18:35 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: local policy) Received: from [140.211.166.113] (HELO eris.apache.org) (140.211.166.113) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Aug 2006 00:18:29 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 545431A981A; Tue, 8 Aug 2006 00:18:09 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r429606 [1/2] - in /jackrabbit/trunk/contrib/backup/src: main/java/org/apache/jackrabbit/backup/ test/ test/java/org/apache/jackrabbit/backup/ Date: Tue, 08 Aug 2006 07:18:06 -0000 To: commits@jackrabbit.apache.org From: jukka@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20060808071809.545431A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: jukka Date: Tue Aug 8 00:18:05 2006 New Revision: 429606 URL: http://svn.apache.org/viewvc?rev=429606&view=rev Log: JCR-442: Committed patch-060808-backup.txt from Nicolas. Added: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/ZipBackupIOHandler.java (with props) Removed: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/ZipFileBackupIOHandler.java Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/AllWorkspacesBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/Backup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfig.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationParser.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupIOHandler.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupManager.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/LaunchBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NamespaceBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeTypeBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeVersionHistoriesBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/RepositoryBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceBackup.java jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceConfigBackup.java jackrabbit/trunk/contrib/backup/src/test/backup.xml jackrabbit/trunk/contrib/backup/src/test/java/org/apache/jackrabbit/backup/BackupTest.java Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/AllWorkspacesBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/AllWorkspacesBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/AllWorkspacesBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/AllWorkspacesBackup.java Tue Aug 8 00:18:05 2006 @@ -17,6 +17,9 @@ package org.apache.jackrabbit.backup; import java.io.IOException; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; import javax.jcr.LoginException; import javax.jcr.RepositoryException; @@ -26,25 +29,32 @@ import org.apache.jackrabbit.core.RepositoryImpl; /** - * @author ntoper + * This class allows the backup and restore of all the worskspaces. * */ public class AllWorkspacesBackup extends Backup { /** - * @param repo - * @param conf - * @throws RepositoryException - * @throws LoginException + * @param repo the repository + * @param conf the BackupConfig object holding all informations about the backup/restore operations + * @param login + * @param password + * @throws RepositoryException + * @throws LoginException */ - public AllWorkspacesBackup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); + public AllWorkspacesBackup(RepositoryImpl repo, BackupConfig conf, String login, String password) + throws LoginException, RepositoryException { + super(repo, conf, login, password); } - - public AllWorkspacesBackup() { + + /** + * Constructor used by BackupManager. + * + */ + protected AllWorkspacesBackup() { super(); } - + /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#backup(org.apache.jackrabbit.backup.BackupIOHandler) @@ -54,12 +64,13 @@ Session s = this.getSession(); Workspace wsp = s.getWorkspace(); String[] allWsp = wsp.getAccessibleWorkspaceNames(); - + String login = this.getCredentials().getUserID(); + String password = this.getCredentials().getPassword().toString(); + for (int i = 0; i < allWsp.length; i++) { - WorkspaceBackup wspb = new WorkspaceBackup(this.repo, this.conf, allWsp[i]); - wspb.backup(h); - - WorkspaceConfigBackup wspConfb = new WorkspaceConfigBackup(this.repo, this.conf, allWsp[i]); + WorkspaceBackup wspb = new WorkspaceBackup(this.getRepo(), this.getConf(), allWsp[i], login, password); + wspb.backup(h); + WorkspaceConfigBackup wspConfb = new WorkspaceConfigBackup(this.getRepo(), this.getConf(), allWsp[i], login, password); wspConfb.backup(h); } } @@ -67,9 +78,29 @@ /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub - + public void restore(BackupIOHandler h) throws ZipException, IOException, LoginException, RepositoryException { + //Get All workspaces name in the zip + Enumeration entries = h.getEntries(); + while (entries.hasMoreElements()) { + String s = ((ZipEntry) entries.nextElement()).getName(); + if (s.indexOf("export_") != -1 && s.endsWith(".xml")) { + int begin = "export_".length(); + //Allow to manage is we backup 110 workspaces for instance + int end = s.length() - ".xml".length(); + String name = s.substring(begin, end); + String login = this.getCredentials().getUserID(); + String password = this.getCredentials().getPassword().toString(); + + //No need to check if the config file is there: if not, we will throw an exception later. + //Restore the config + WorkspaceConfigBackup wspConfb = new WorkspaceConfigBackup(this.getRepo(), this.getConf(), name, login, password); + wspConfb.restore(h); + + //Restore the content + WorkspaceBackup wsb = new WorkspaceBackup(this.getRepo(), this.getConf(), name, login, password); + wsb.restore(h); + } + } } } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/Backup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/Backup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/Backup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/Backup.java Tue Aug 8 00:18:05 2006 @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.backup; +import java.io.FileNotFoundException; import java.io.IOException; import javax.jcr.LoginException; @@ -33,64 +34,120 @@ */ public abstract class Backup { - RepositoryImpl repo; - BackupConfig conf; - Session session; + private RepositoryImpl repo; + private BackupConfig conf; + private Session session;; + private SimpleCredentials credentials; /** - * + * @param login + * @param password * @param repo The repository to backup * @param conf The specific BackupConfig object (usually a subset of backup.xml) - * @param name Name of the resource to backup. Unique. Useful? - * @throws RepositoryException - * @throws LoginException + * @throws RepositoryException + * @throws LoginException */ - //TODO Useful? - public Backup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { + public Backup(RepositoryImpl repo, BackupConfig conf, String login, String password) + throws LoginException, RepositoryException { this.repo = repo; this.conf = conf; - this.session = this.repo.login( - new SimpleCredentials(this.conf.getLogin(), this.conf.getPassword().toCharArray())); - + this.credentials = new SimpleCredentials(login, password.toCharArray()); + this.session = this.repo.login(this.credentials); } - - public Backup() { - + + /** + * Used only by BackupManager. No attributes are initialized. + */ + protected Backup() { } - public void init(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { + /** + * This constructor is used explicitly for restore operations + * + * @param login + * @param password + */ + protected Backup(String login, String password) { + this.credentials = new SimpleCredentials(login, password.toCharArray()); + } + /** + * Used by BackupManager with the empty constructor. + * + * @param repo + * @param conf + * @param login + * @param password + * @throws LoginException + * @throws RepositoryException + */ + + protected void init(RepositoryImpl repo, BackupConfig conf, String login, String password) throws LoginException, RepositoryException { this.repo = repo; this.conf = conf; - this.session = this.repo.login( - new SimpleCredentials(this.conf.getLogin(), this.conf.getPassword().toCharArray())); + this.credentials = new SimpleCredentials(login, password.toCharArray()); + this.session = this.repo.login(this.credentials); } public RepositoryImpl getRepo() { return this.repo; } - + + protected void setRepo(RepositoryImpl repo) { + this.repo = repo; + } + /* * Each ResourceBackup is responsible to handle the backup. - * + * * We use file when we cannot assume anything on the size of the data or we know it's big. When * we know the data is small we store it in RAM. - * - * - * + * * For each resource * Test maxFileSize * Zip the whole workingFolder * check the checksum - * Send it to out + * Send it to out */ + /** + * Backup the resource designated by this class to h from the current repository + * @param h + * @throws FileNotFoundException + * @throws RepositoryException + * @throws IOException + * + */ public abstract void backup(BackupIOHandler h) throws RepositoryException, IOException; - public abstract void restore(BackupIOHandler h); - public Session getSession() { + /** + * Restore the resource designated by this class from h to the current repository + * @param h + * @throws FileNotFoundException + * @throws RepositoryException + * @throws IOException + */ + public abstract void restore(BackupIOHandler h) throws FileNotFoundException, RepositoryException, IOException; + + protected Session getSession() { return this.session; } - //TODO call sesssion.logout or useless? - + protected BackupConfig getConf() { + return conf; + } + + protected void setConf(BackupConfig conf2) { + this.conf = conf2; + } + + protected SimpleCredentials getCredentials() { + return credentials; + } + + protected void setCredentials(SimpleCredentials cred) { + this.credentials = cred; + } + public void finalize() { + this.session.logout(); + } } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfig.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfig.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfig.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfig.java Tue Aug 8 00:18:05 2006 @@ -1,9 +1,9 @@ /* * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with + * contributor license agreements. See the NOTICE backupFile distributed with * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with + * The ASF licenses this backupFile to You under the Apache License, Version 2.0 + * (the "License"); you may not use this backupFile except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 @@ -25,6 +25,7 @@ import org.apache.jackrabbit.core.config.ConfigurationException; import org.apache.jackrabbit.core.config.PersistenceManagerConfig; +import org.apache.jackrabbit.core.config.RepositoryConfig; import org.xml.sax.InputSource; @@ -37,17 +38,15 @@ * */ public class BackupConfig { - - //TODO Useful? - private PersistenceManagerConfig pmc; - //Tused to backup a workspace first in a file - private File workFolder; + + //used to backup a workspace first in a backupFile + private final File workFolder; + //Not final since BackupManager adds some resources private Collection allResources; - private File file; - private File repoConfFile; - private String login; - private String password; - + private final File backupFile; + private final File repoConfFile; + + /** * Parses the given repository configuration document and returns the * parsed and initialized repository configuration. The given repository @@ -57,83 +56,58 @@ * method also initializes the configuration (creates the configured * directories, etc.). The {@link RepositoryConfigurationParser} class should be * used directly to just parse the configuration. - * @param repoConfFile + * @param repoConfFile * - * @param xml repository configuration document - * @param home repository home directory + * @param myFile repository configuration document + * @param repoConfFile repository file configuration * @return repository configuration * @throws ConfigurationException on configuration errors - * @throws IllegalAccessException - * @throws InstantiationException - * @throws ClassNotFoundException - * @throws IOException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + * @throws IOException */ - public static BackupConfig create(String myFile, String repoConfFile, String login, String password) + public static BackupConfig create(String myFile, String repoConfFile) throws ConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException { - URI uri = new File(myFile).toURI(); InputSource is = new InputSource(uri.toString()); - BackupConfigurationParser parser = new BackupConfigurationParser(new Properties()); - - BackupConfig config = parser.parseBackupConfig(is, myFile, repoConfFile, login, password); - + BackupConfig config = parser.parseBackupConfig(is, myFile, repoConfFile); return config; } - - - //TODO see if path is really useful? - public BackupConfig(PersistenceManagerConfig pmc, File path, Collection allResources, String myFile, String repoConfFile, String login, String password) throws IOException { - + public BackupConfig(File path, Collection allResources, String myFile, String repoConfFile) throws IOException { + //Logic application: not in the parser: this code has to be here if (!(path.isDirectory() && path.canWrite())) { - throw new IOException(); - } - - this.pmc = pmc; + //if path not set in the conf file then create one as the current dir + path = new File("."); + } + this.workFolder = path; this.allResources = allResources; - this.file = new File(myFile); + this.backupFile = new File(myFile); this.repoConfFile = new File(repoConfFile); - this.password = password; - this.login = login; } public Collection getAllResources() { return allResources; } + public void addResource(Backup b) { + this.allResources.add(b); + } + public File getWorkFolder() { return workFolder; } - public PersistenceManagerConfig getPmc() { - return pmc; - } public File getFile() { - return this.file; + return this.backupFile; } - - public File getRepoConfFile() { return repoConfFile; } - - - - public String getPassword() { - return this.password; - } - - - - public String getLogin() { - return this.login; - } - - - } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationBackup.java Tue Aug 8 00:18:05 2006 @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; +import java.util.zip.ZipException; import javax.jcr.LoginException; import javax.jcr.RepositoryException; @@ -26,7 +27,7 @@ /** * Backup/Restore the XML file used to configure this backup. - * + * * @author ntoper * */ @@ -35,34 +36,38 @@ /** * @param repo * @param conf - * @throws RepositoryException - * @throws LoginException + * @param login + * @param password + * @throws RepositoryException + * @throws LoginException */ - public BackupConfigurationBackup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); - + public BackupConfigurationBackup(RepositoryImpl repo, BackupConfig conf, String login, String password) + throws LoginException, RepositoryException { + super(repo, conf, login, password); + } - - public BackupConfigurationBackup() { + + protected BackupConfigurationBackup() { super(); } - - + /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#backup(org.apache.jackrabbit.backup.BackupIOHandler) */ public void backup(BackupIOHandler h) throws RepositoryException, IOException { - File file = conf.getFile(); + File file = this.getConf().getFile(); h.write("backup.xml", file); } /* (non-Javadoc) + * This method is quite special. It is used to restore content from scratch. To break cyclic reference, we restore the file + * in the current directory (we don't have yet the temporary one). + * * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub - + public void restore(BackupIOHandler h) throws ZipException, IOException { + File conf = new File("backup.xml"); + h.read("backup.xml", conf); } - } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationParser.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationParser.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationParser.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupConfigurationParser.java Tue Aug 8 00:18:05 2006 @@ -26,15 +26,14 @@ import org.apache.jackrabbit.core.config.ConfigurationException; import org.apache.jackrabbit.core.config.ConfigurationParser; -import org.apache.jackrabbit.core.config.PersistenceManagerConfig; -import org.apache.jackrabbit.core.config.RepositoryConfigurationParser; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; /** - * @author ntoper + * BackupConfigurationParser. Used to parse the Backup configuration XML file. + * Please look at the documentation for the format: http://wiki.apache.org/jackrabbit/BackupTool * */ public class BackupConfigurationParser extends ConfigurationParser { @@ -44,122 +43,116 @@ private static final String RESOURCES = "Resources"; private static final String RESOURCE = "Resource"; private static final String SAVING_CLASS = "savingClass"; - + //TODO Add parse to get the name if a specific wsp has to be backupped/restored. + //TODO Add UUID choice + + /** * @param variables */ public BackupConfigurationParser(Properties variables) { super(variables); } - - + /** - * Parses backup? configuration. Backup configuration uses the - * following format: - *

- * TODO comment. See wiki for format + * Parses backup/restore configuration file. + * + * Please look at the documentation for the format: http://wiki.apache.org/jackrabbit/BackupTool + * * @param xml repository configuration document - * @param myFile - * @param repoConfFile + * @param myFile path and name of the XML configuration file (TODO delete XML argument and build it with myFile) + * @param repoConfFile: path and name of the repository configuration file * @return repository configuration * @throws ConfigurationException if the configuration is broken - * @throws IllegalAccessException - * @throws InstantiationException - * @throws ClassNotFoundException - * @throws IOException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + * @throws IOException * @see #parseBeanConfig(Element, String) * @see #parseVersioningConfig(Element) */ - public BackupConfig parseBackupConfig(InputSource xml, String myFile, String repoConfFile, String login, String password) + public BackupConfig parseBackupConfig(InputSource xml, String myFile, String repoConfFile) throws ConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException { - //TODO refactor dependency between this method and BackupConfig + Element root = parseXML(xml); - + //Working Folder Element workingFolder = getElement(root, WORKING_FOLDER); File path = new File(workingFolder.getAttribute(WORKING_FOLDER_ATTRIBUTE)); - - //Persistence Manager - PersistenceManagerConfig pmc = this.parsePersistenceManagerConfig(root); - - //Management of resources tag + + //Management of resources tag Element resources = this.getElement(root, RESOURCES); - Collection allResources = this.parseResourcesConfig(resources); - - return new BackupConfig(pmc, path, allResources, myFile, repoConfFile, login, password); + Collection allResources = this.parseResourcesConfig(resources); + + return new BackupConfig(path, allResources, myFile, repoConfFile); } - + /** - * TODO: to put in ConfigurationParser? - * * Returns the named children of the given parent element. * * @param parent parent element * @param name name of the child element - * @param required indicates if the child element is required - * @return named children elements, or null if not found + * @return named children elements, or null if not found */ - protected List getElements(Element parent, String name) { + private List getElements(Element parent, String name) { NodeList children = parent.getChildNodes(); Vector selected = new Vector(10, 10); for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE && name.equals(child.getNodeName())) { - + selected.addElement((Element) child); } } - if (selected.size() == 0){ + if (selected.size() == 0){ return null; } - else - { + else { selected.trimToSize(); return selected; } } - - - /* - * For now only support of all workspace backup. I think it is actually simpler to manage on the end-user side. Be careful the objects aren't usable yet - * + + /** + * For now only support of all workspace backup. I think it is actually simpler to manage on the end-user side. + * Be careful the objects aren't properly initialized yet. You need to call init (in BackupManager). + * * Pre-condition: there are resource tags in the conf file (otherwise there is a problem in the backup) + * @root root Element of the XML + * @throws ConfigurationException + * @throws ClassNotFoundException + * @throws InstantiationException + * @throws IllegalAccessException + * @return Collection of all resources to backup found in the file */ - private Collection parseResourcesConfig(Element root) throws ConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException { + private Collection parseResourcesConfig(Element root) + throws ConfigurationException, ClassNotFoundException, InstantiationException, IllegalAccessException { /* * For each resource - * get class and instantiate - * addResource to BackupManager + * get class and instantiate */ Vector objects = new Vector(); Vector resources = (Vector) this.getElements(root, RESOURCE); Iterator it = resources.iterator(); - + while (it.hasNext()) { //We don't care about the name. It is here only for humans: only the savingClass is important //Instantiate it and put it in the collection. Element resource = (Element) it.next(); - String savingClass = resource.getAttribute(SAVING_CLASS); + String savingClass = resource.getAttribute(SAVING_CLASS); + + //Check we are not backupping/restoring a resource already backuped by BackupManager + if (savingClass.equals("org.apache.jackrabbit.backup.RepositoryBackup") || + savingClass.equals("org.apache.jackrabbit.backup.BackupConfigBackup")) { + throw new IllegalAccessException(); + } + Class c = Class.forName(savingClass); - objects.addElement( (Backup) c.newInstance()); + objects.addElement( (Backup) c.newInstance()); } return objects; - - } - - /** - * Parses the PersistenceManager config. - * - * @param parent parent of the PersistenceManager element - * @return persistence manager configuration - * @throws ConfigurationException if the configuration is broken - */ - protected PersistenceManagerConfig parsePersistenceManagerConfig( - Element parent) throws ConfigurationException { - return new PersistenceManagerConfig( - parseBeanConfig(parent, RepositoryConfigurationParser.PERSISTENCE_MANAGER_ELEMENT)); } } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupIOHandler.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupIOHandler.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupIOHandler.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupIOHandler.java Tue Aug 8 00:18:05 2006 @@ -18,16 +18,20 @@ import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException;; +import java.io.IOException; +import java.util.Enumeration; +import java.util.zip.ZipException; +/** + * Represent a backup/restore file. This is where + * the content should be sent to/fetched from. + * + */ public interface BackupIOHandler { - - //Add reference to the file - // How to precise if in or out... Maybe not needed? void close() throws IOException; - void initBackup() throws FileNotFoundException, IOException; - void initRestore() throws FileNotFoundException; void write(String name, File f) throws IOException; void write(String name, ByteArrayOutputStream fos) throws IOException; + byte[] read(String zipEntry) throws ZipException, IOException; + public void read(String zipEntry, File myFile) throws ZipException, IOException; + Enumeration getEntries() throws ZipException, IOException; } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupManager.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupManager.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupManager.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/BackupManager.java Tue Aug 8 00:18:05 2006 @@ -27,39 +27,44 @@ import org.apache.jackrabbit.core.RepositoryImpl; /** - * This class manages the backup/restore process. It is responsible to transmit it to the BackupIOHandler and to add the repository to the + * This class manages the backup/restore process. It is responsible to send to/fetch from the BackupIOHandler and to add the repository to the * BackupConfig. - * - * It extends Backup since it is based on the same semantics. However it is not at the same type as a ResourceBackup (indicated by different names) - * + * + * It extends Backup since it is based on the same semantics. However it is not the same type as a ResourceBackup + * (the different semantics are indicated by different names) + * * It uses a work folder to get first all backup/restore information, zip them and send them to the handler. - * + * * @author ntoper * */ public class BackupManager extends Backup { - - public BackupManager(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); - + + + public BackupManager(RepositoryImpl repo, BackupConfig conf, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login , password); + + //Initiate correctly all objects in allResources - Iterator it = this.conf.getAllResources().iterator(); - - while(it.hasNext()) { + Iterator it = this.getConf().getAllResources().iterator(); + while ( it.hasNext() ) { Backup b = (Backup) it.next(); - b.init(repo, conf); + b.init(repo, conf, login, password); } } - - - public static BackupManager create(RepositoryImpl impl, BackupConfig conf2) throws LoginException, RepositoryException { - return new BackupManager(impl, conf2); + + public BackupManager() { + super(); + } + + + public static BackupManager create(RepositoryImpl impl, BackupConfig conf2, String login, String password) throws LoginException, RepositoryException { + return new BackupManager(impl, conf2, login, password); } /** * Used to backup the repository and all subclasses. Call all classes when needed. * This class stores the backup config file also. (simplify its fetching and logical since it's not a configurable resource) * - * TODO visibility of the conf is huge: each ResourceBackup can get and set others resources modifiers. Is it really bad? * * @param The BackupIOHandler where the backup will be saved * @throws RepositoryException @@ -71,16 +76,16 @@ * It is responsible to initiate and close the zipFile. * Each backup method, use the BackupIOHandler to write the file directly. */ - - h.initBackup(); + + //We need to put those two Backup resources here for backup since they are handled differently + //for restore + this.addResource(new RepositoryBackup()); + this.addResource(new BackupConfigurationBackup()); + try { - - - Collection resources = this.conf.getAllResources(); - - + Collection resources = this.getConf().getAllResources(); Iterator it = resources.iterator(); - + while (it.hasNext()) { Backup b = (Backup) it.next(); b.backup(h); @@ -90,13 +95,51 @@ h.close(); } } - - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub - + /** + * TODO commment + * @param backup + * @throws RepositoryException + * @throws LoginException + */ + private void addResource(Backup backup) throws LoginException, RepositoryException { + String login = this.getCredentials().getUserID(); + String password = this.getCredentials().getPassword().toString(); + backup.init(this.getRepo(), this.getConf(), login, password); + this.getConf().addResource(backup); } - - + /** + * Same method as backup but for restore. + * TODO Comment + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + * + */ + public void restore(BackupIOHandler h) throws RepositoryException, IOException { + + /* + * There is a dissimetry in the restore operation compared to the backup one. + * It is because of the need to first restore the repository and launch it where during the backup we can + * backup the repository and the configuration file the same way as the other. + * + * (to make repository + backup file mandatory, they are added automatically in BAckupManager) + * + * + * Ignore any repository or backupConfig restore orders... + * + */ + try { + Collection resources = this.getConf().getAllResources(); + Iterator it = resources.iterator(); + while (it.hasNext()) { + Backup b = (Backup) it.next(); + b.restore(h); + } + } + finally { + h.close(); + } + } } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/LaunchBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/LaunchBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/LaunchBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/LaunchBackup.java Tue Aug 8 00:18:05 2006 @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.backup; +import java.io.File; import java.io.IOException; import javax.jcr.AccessDeniedException; @@ -23,6 +24,7 @@ import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.RepositoryImpl; +import org.apache.jackrabbit.core.config.ConfigurationException; import org.apache.jackrabbit.core.config.RepositoryConfig; /** @@ -34,41 +36,67 @@ * Date: 23-jun-06 */ public class LaunchBackup { + /** + * TODO where can I find the generic repository.xml? + * Path to the generic repository.xml + */ + + private static final String REPOSITORY_XML = "/home/ntoper/workspace/backup/"; + + /** + * The backupIOHandler used to handle IO + */ + private static BackupIOHandler h; + + /** + * Used to get a reference to the repository. + */ + private RepositoryImpl repo; + + /** + * The backupconfig object. + */ + private BackupConfig conf; + + /** + * The repositoryConfig object. + */ + private RepositoryConfig repoConf; + + /** + * The backupManager is used to launch all backup/restore operations. + */ + private BackupManager backup; - static BackupIOHandler h; - RepositoryImpl repo; - BackupConfig conf; - RepositoryConfig repoConf; - BackupManager backup; - - /** * The command line tool. * - * LaunchBackup --zip myzip.zip --size 2 --conf backup.xml --login nico --password mlypass backup repository.xml repository/ - * LaunchBackup --zip ./myzip.zip --size 2 --conf backup.xml --login nico --password restore repository.xml repository/ + * LaunchBackup --zip myzip.zip --conf backup.xml --login nico --password mlypass backup repository.xml repository/ + * LaunchBackup --zip ./myzip.zip --login nico --password p repository.xml restore + * LaunchBackup --zip ./myzip.zip -- conf restore.xml --login nico --password p restore repository.xml repository/ + * + * If backup.xml for restore, no repository + backupConfig restore Only partial restore * * --zip: where is the zip file (only implemented way to backup for now) - * --size in Go - * * --conf: path to the config file for the backup tool - * + * * backup/restore: whether you want a backup or a restore - * + * * repository.xml: path to the config file of the repository - * + * * repository/ is the name of the repository - * + * * * --help for help option - * @throws RepositoryException - * @throws IOException - * @throws IOException - * @throws IllegalAccessException - * @throws InstantiationException - * @throws ClassNotFoundException * + * @throws RepositoryException + * @throws IOException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + * @throws AccessDeniedException + * @throws IOException */ public static void main(String[] args) throws RepositoryException, AccessDeniedException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException { // I have to declare all var here so they are not resetted out of the for. @@ -82,69 +110,67 @@ //2 booleans in case the user specified nothing boolean isBackup = false; boolean isRestore = false; - + //Parse the command line. for (int i = 0; i < args.length; i++) { - + if ( args[i].equals("--help") || args.length == 0) { usage(); } - - if (args[i].equals("--zip")){ + + if (args[i].equals("--zip")) { zipFile = args[i + 1]; - //We put it here because later we might offer other possibilities than only zip - LaunchBackup.h = new ZipFileBackupIOHandler(zipFile); } - - if (args[i].equals("--conf")){ - + + if (args[i].equals("--conf")) { confFile = args[i + 1]; - } - - if (args[i].equals("--login")){ - + + if (args[i].equals("--login")) { login = args[i + 1]; - } - - if (args[i].equals("--password")){ - + + if (args[i].equals("--password")) { password = args[i + 1]; - } - - if (args[i].equals("backup") && isRestore == false ){ + + if (args[i].equals("backup") && !isRestore) { isBackup = true; repoConfFile = args[i + 1]; home = args[i + 2]; - } - - if (args[i].equals("restore") && isBackup == false ){ + + if (args[i].equals("restore") && !isBackup ) { isRestore = true; repoConfFile = args[i + 1]; home = args[i + 2]; - } + } } - + //Check if login and password are provided otherwise weird thing will happen if (login == null || password == null) { throw new LoginException(); } - + LaunchBackup launch = null; - + //We need to shutdown properly the repository whatever happens - try { + try { //Launch backup if (isBackup) { - launch = new LaunchBackup(repoConfFile, home, confFile, login, password); + launch = new LaunchBackup(repoConfFile, home, confFile, login, password); + LaunchBackup.h = new ZipBackupIOHandler(zipFile, true); launch.backup(h); - } + } //Launch restore + else if (isRestore && confFile == null) { + LaunchBackup.h = new ZipBackupIOHandler(zipFile, false); + launch = new LaunchBackup(repoConfFile, home, login, password); + launch.restore(h); + } else if (isRestore) { - launch = new LaunchBackup(); + LaunchBackup.h = new ZipBackupIOHandler(zipFile, false); + launch = new LaunchBackup(repoConfFile, home, confFile, login, password); launch.restore(h); } //Launch nothing (if nothing specified @@ -152,20 +178,20 @@ usage(); } } - finally - { - if (launch !=null) + finally { + if (launch != null) { launch.shutdown(); + } } } - + /** * Auxiliary method for main * */ - private static void usage(){ + private static void usage() { System.out.println("todo: cut and paste of the comment when the project is over"); System.exit(0); } @@ -173,35 +199,84 @@ /** * Constructor of LaunchBackup. Initiate the repository. * - * @param String filename: name of the configuration file - * @throws RepositoryException - * @throws IllegalAccessException - * @throws InstantiationException - * @throws ClassNotFoundException - * @throws IOException + * @param String repoConfFile: name of the configuration file + * @throws RepositoryException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + * @throws IOException + * */ public LaunchBackup(String repoConfFile, String home, String backupConfFile, String login, String password) throws RepositoryException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException { + //Launch first the repository this.repoConf = RepositoryConfig.create(repoConfFile, home); this.repo = RepositoryImpl.create(this.repoConf); //Create the backupConfig object - this.conf = BackupConfig.create(backupConfFile, repoConfFile, login, password); - this.backup = BackupManager.create(this.repo, this.conf); - + this.conf = BackupConfig.create(backupConfFile, repoConfFile); + this.backup = BackupManager.create(this.repo, this.conf, login, password); } - + /** - * Used for restore operations only + * Used for restore operations only. + * + * This constructor restores the repository! I don't see any other options since to restore we + * need the repository and what is inside. + * + * + * @param password + * @param login + * @param home + * @throws RepositoryException + * @throws IOException + * @throws IllegalAccessException + * @throws InstantiationException + * @throws ClassNotFoundException + * @throws * */ - - public LaunchBackup() { - // TODO Auto-generated constructor stub + public LaunchBackup(String repoConfFile, String home, String login, String password) throws RepositoryException, InstantiationException, IllegalAccessException, IOException, ClassNotFoundException { + /* + * There is a dissymetry there (due to design constraint: we wanted to be close of JR's way of working). + * We need to restore BackupConfiguration and the Repository and we need each other to create them. + */ + + //Extract BackupConfig + BackupConfigurationBackup b = new BackupConfigurationBackup(); + b.restore(h); + //RepoConfFile isn't the right one. We know it + BackupConfig bc; + try { + //We know we have restored it to backup.xml + //There is no other way, except to break the abstract class and create + //another restore methods. This seems fine and this way is unique/ + // If we have the issue again, we will evolve the design. + bc = BackupConfig.create("backup.xml", repoConfFile); + } catch (ConfigurationException e) { + throw new RepositoryException(); + } catch (ClassNotFoundException e) { + throw new RepositoryException(); + } catch (InstantiationException e) { + throw new RepositoryException(); + } + finally { + //We need to delete it anyway + File f = new File("backup.xml"); + f.delete(); + } + + //Restore repository + RepositoryBackup br = new RepositoryBackup(repoConfFile, home);; + br.setConf(bc); + br.restore(h); + RepositoryImpl repo = br.getRepo(); + + this.backup = BackupManager.create(repo, bc, login, password); + this.repo = this.backup.getRepo(); + this.conf = this.backup.getConf(); } - - /** * Backup a repository * @@ -215,13 +290,16 @@ *Restore a repository * * @param BackupIOHandler h a reference to the backup to restore + * @throws IOException + * @throws RepositoryException + * @throws IllegalAccessException */ - public void restore(BackupIOHandler h) { + public void restore(BackupIOHandler h) throws RepositoryException, IOException, IllegalAccessException { this.backup.restore(h); } - + private void shutdown() { - this.repo.shutdown(); + this.repo.shutdown(); } - + } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NamespaceBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NamespaceBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NamespaceBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NamespaceBackup.java Tue Aug 8 00:18:05 2006 @@ -16,18 +16,22 @@ */ package org.apache.jackrabbit.backup; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.HashMap; import javax.jcr.LoginException; +import javax.jcr.NamespaceException; import javax.jcr.NamespaceRegistry; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Workspace; +import org.apache.jackrabbit.core.NamespaceRegistryImpl; import org.apache.jackrabbit.core.RepositoryImpl; @@ -41,52 +45,54 @@ * */ public class NamespaceBackup extends Backup implements Serializable { - + /** * */ private static final long serialVersionUID = 4703796138774238005L; - + /** * This class holds all namespaces in a serializable way. We only put the relevant information. * (Do not change this class or you might lose backward compatibility; instead use another version) * */ private class Namespaces implements Serializable { - + private static final long serialVersionUID = 8384076353482950602L; - - HashMap h; + private HashMap h; + protected Namespaces() { + h = new HashMap(); + } - public Namespaces() { - h = new HashMap(); + protected void addNamespace(String uri, String prefix) { + h.put(uri, prefix); } - - public void addNamespace(String prefix, String uri) { - h.put(prefix, uri); + + protected String[] getAllUri() { + String[] s = new String[1]; + return (String[]) h.keySet().toArray(s); } + public String getPrefix(String uri) { + return (String) h.get(uri); + } } - /** + /** * @param repo * @param conf - * @throws RepositoryException - * @throws LoginException + * @throws RepositoryException + * @throws LoginException */ - public NamespaceBackup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); - - - + public NamespaceBackup(RepositoryImpl repo, BackupConfig conf, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login, password); } - + public NamespaceBackup() { super(); } - /* (non-Javadoc) * TODO where do I find the local ns? * TODO use a ByteArrayOutputStream? @@ -94,35 +100,49 @@ */ public void backup(BackupIOHandler h) throws RepositoryException, IOException { - Session s = this.getSession(); - Workspace wsp = s.getWorkspace(); - NamespaceRegistry ns = wsp.getNamespaceRegistry(); - - Namespaces myNs = new Namespaces(); - - String[] allPrefixes = ns.getPrefixes(); - - for (int i = 0; i < allPrefixes.length; i++) { - String prefix = allPrefixes[i]; - myNs.addNamespace(prefix, ns.getURI(prefix)); - } - - String name = this.getClass().toString(); - - ByteArrayOutputStream fos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(fos); - oos.writeObject(myNs); - h.write(name, fos); + Session s = this.getSession(); + Workspace wsp = s.getWorkspace(); + NamespaceRegistry ns = wsp.getNamespaceRegistry(); + + Namespaces myNs = new Namespaces(); + + String[] allPrefixes = ns.getPrefixes(); + + for (int i = 0; i < allPrefixes.length; i++) { + String prefix = allPrefixes[i]; + myNs.addNamespace(ns.getURI(prefix),prefix); + } + + String name = this.getClass().toString(); + + ByteArrayOutputStream fos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(fos); + oos.writeObject(myNs); + h.write(name, fos); } - + /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub - + public void restore(BackupIOHandler h) throws RepositoryException, IOException { + String name = this.getClass().toString(); + byte[] ns = h.read(name); + ByteArrayInputStream bis = new ByteArrayInputStream(ns); + ObjectInputStream ois = new ObjectInputStream(bis); + + try { + Namespaces allNs = (Namespaces) ois.readObject(); + String[] allUri = allNs.getAllUri(); + + Session s = this.getSession(); + Workspace wsp = s.getWorkspace(); + NamespaceRegistryImpl nsr = (NamespaceRegistryImpl) wsp.getNamespaceRegistry(); + + for (int i = 0; i < allUri.length; i++) { + nsr.safeRegisterNamespace(allNs.getPrefix(allUri[i]), allUri[i]); + } + } catch (ClassNotFoundException e) { + throw new RepositoryException(); + } } - - - } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeTypeBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeTypeBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeTypeBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeTypeBackup.java Tue Aug 8 00:18:05 2006 @@ -16,8 +16,12 @@ */ package org.apache.jackrabbit.backup; +import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.util.zip.ZipException; import javax.jcr.LoginException; import javax.jcr.NamespaceRegistry; @@ -27,11 +31,15 @@ import javax.jcr.nodetype.NoSuchNodeTypeException; import org.apache.jackrabbit.core.RepositoryImpl; +import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException; import org.apache.jackrabbit.core.nodetype.NodeTypeDef; import org.apache.jackrabbit.core.nodetype.NodeTypeManagerImpl; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; +import org.apache.jackrabbit.core.nodetype.xml.NodeTypeReader; import org.apache.jackrabbit.core.nodetype.xml.NodeTypeWriter; +import org.apache.jackrabbit.name.IllegalNameException; import org.apache.jackrabbit.name.QName; +import org.apache.jackrabbit.name.UnknownPrefixException; /** * @author ntoper @@ -45,56 +53,81 @@ * @throws RepositoryException * @throws LoginException */ - public NodeTypeBackup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); - } - + public NodeTypeBackup(RepositoryImpl repo, BackupConfig conf, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login, password); + } + public NodeTypeBackup() { super(); - } - + } /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#backup(org.apache.jackrabbit.backup.BackupIOHandler) */ public void backup(BackupIOHandler h) throws IOException, RepositoryException { - //Can we assume the default wsp always exist? Session s = this.getSession(); Workspace wsp = s.getWorkspace(); - + NodeTypeManagerImpl ntm = (NodeTypeManagerImpl) wsp.getNodeTypeManager(); NodeTypeRegistry ntreg = ntm.getNodeTypeRegistry(); NamespaceRegistry ns = wsp.getNamespaceRegistry(); NodeTypeDef[] ntd = getRegisteredNodesTypesDefs(ntreg); ByteArrayOutputStream out = new ByteArrayOutputStream(); NodeTypeWriter.write(out, ntd, ns); - h.write("NodeType", out); + h.write("NodeType", out); } - - + /** * Returns the nodes types definitions of all registered node types. * * @return the node type definition of all registered node types. - * @throws NoSuchNodeTypeException + * @throws NoSuchNodeTypeException */ private static NodeTypeDef[] getRegisteredNodesTypesDefs(NodeTypeRegistry ntreg) throws NoSuchNodeTypeException { - QName[] qn = ntreg.getRegisteredNodeTypes(); - NodeTypeDef[] ntd = new NodeTypeDef[qn.length]; - - for (int i=0; i < qn.length; i++) { - ntd[i] = ntreg.getNodeTypeDef(qn[i]); - } - return ntd; + QName[] qn = ntreg.getRegisteredNodeTypes(); + NodeTypeDef[] ntd = new NodeTypeDef[qn.length]; + + for (int i=0; i < qn.length; i++) { + ntd[i] = ntreg.getNodeTypeDef(qn[i]); + } + + return ntd; } - /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub + public void restore(BackupIOHandler h) throws ZipException, IOException, RepositoryException { + File f = new File(this.getConf().getWorkFolder() + "Node.xml"); + try { + h.read("NodeType", f); + FileInputStream is = new FileInputStream(f); + NodeTypeReader r = new NodeTypeReader(is); + NodeTypeDef[] ntds = r.getNodeTypeDefs(); + + Session s = this.getSession(); + Workspace wsp = s.getWorkspace(); + + NodeTypeManagerImpl ntm = (NodeTypeManagerImpl) wsp.getNodeTypeManager(); + NodeTypeRegistry ntreg = ntm.getNodeTypeRegistry(); + + for (int i = 0; i < ntds.length; i++) { + if (!ntreg.isRegistered(ntds[i].getName())) { + ntreg.registerNodeType(ntds[i]); + } + } + NamespaceRegistry ns = wsp.getNamespaceRegistry(); + + } catch (IllegalNameException e) { + new RepositoryException(); + } catch (UnknownPrefixException e) { + new RepositoryException(); + } catch (InvalidNodeTypeDefException e) { + new RepositoryException(); + } + finally { + f.delete(); + } } - } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeVersionHistoriesBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeVersionHistoriesBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeVersionHistoriesBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/NodeVersionHistoriesBackup.java Tue Aug 8 00:18:05 2006 @@ -17,29 +17,60 @@ package org.apache.jackrabbit.backup; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipException; +import javax.jcr.AccessDeniedException; +import javax.jcr.InvalidSerializedDataException; +import javax.jcr.ItemExistsException; import javax.jcr.LoginException; +import javax.jcr.NodeIterator; +import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.lock.LockException; +import javax.jcr.nodetype.ConstraintViolationException; +import javax.jcr.nodetype.NodeDefinition; +import javax.jcr.version.VersionException; +import org.apache.jackrabbit.core.ItemImpl; +import org.apache.jackrabbit.core.ItemManager; +import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.RepositoryImpl; +import org.apache.jackrabbit.core.SessionImpl; +import org.apache.jackrabbit.core.nodetype.NodeDef; +import org.apache.jackrabbit.core.nodetype.NodeDefImpl; +import org.apache.jackrabbit.core.nodetype.NodeDefinitionImpl; +import org.apache.jackrabbit.core.nodetype.NodeTypeDef; +import org.apache.jackrabbit.core.version.VersionManager; +import org.apache.jackrabbit.core.version.VersionManagerImpl; +import org.apache.jackrabbit.core.xml.ImportHandler; +import org.apache.jackrabbit.core.xml.SessionImporter; +import org.apache.jackrabbit.name.MalformedPathException; +import org.apache.jackrabbit.name.Path; +import org.apache.jackrabbit.name.PathFormat; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.XMLReaderFactory; /** * @author ntoper * */ public class NodeVersionHistoriesBackup extends Backup { - + /** * @param repo * @param conf * @throws RepositoryException * @throws LoginException */ - public NodeVersionHistoriesBackup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); + public NodeVersionHistoriesBackup(RepositoryImpl repo, BackupConfig conf, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login, password); // TODO Auto-generated constructor stub } @@ -47,15 +78,15 @@ super(); // TODO Auto-generated constructor stub } - + /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#backup(org.apache.jackrabbit.backup.BackupIOHandler) */ public void backup(BackupIOHandler h) throws RepositoryException, - IOException { + IOException { Session s = this.getSession(); - File temp = new File(this.conf.getWorkFolder() + "history.xml"); + File temp = new File(this.getConf().getWorkFolder() + "history.xml"); try { FileOutputStream out = new FileOutputStream(temp); @@ -65,15 +96,208 @@ finally { temp.delete(); } - } - + } + /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { + /* public void restore(BackupIOHandler h) throws ZipException, IOException, RepositoryException { + SessionImpl s = (SessionImpl) this.getSession(); + VersionManagerImpl versionMgr = (VersionManager) s.getVersionManager(); + File temp = new File(this.getConf().getWorkFolder() + "history.xml"); + try { + h.read("history.xml", temp); + FileInputStream in = new FileInputStream(temp); + + // this.getRepo().importXML("/jcr:system/jcr:versionStorage", in, 0 ); + } + finally { + temp.delete(); + } + + + + public void importXML(String parentAbsPath, InputStream in, int uuidBehavior) throws RepositoryException, IOException { + + Path p = VersionManagerImpl.getVersionStoragePath(); + SessionImpl s = (SessionImpl) this.getSystemSession("default"); + + //this.getItem() + ItemImpl item = s.getItemManager().getItem(p); + NodeImpl parent = (NodeImpl) item; + SessionImporter importer = new SessionImporter(parent, s, 3); + ImportHandler handler = new ImportHandler(importer, s.getNamespaceResolver(), this.getNamespaceRegistry()); + + try { + XMLReader parser = + XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); + parser.setContentHandler(handler); + parser.setErrorHandler(handler); + // being paranoid... + parser.setFeature("http://xml.org/sax/features/namespaces", true); + parser.setFeature("http://xml.org/sax/features/namespace-prefixes", + false); + + parser.parse(new InputSource(in)); + } catch (SAXException se) { + // check for wrapped repository exception + Exception e = se.getException(); + if (e != null && e instanceof RepositoryException) { + throw (RepositoryException) e; + } else { + String msg = "failed to parse XML stream"; + throw new InvalidSerializedDataException(msg, se); + } + } + + } + } + + SessionImpl s = (SessionImpl) this.getSession(); + Path p; + try { + p = PathFormat.parse("/jcr:system/jcr:versionStorage", s.getNamespaceResolver()).getNormalizedPath(); + } catch (MalformedPathException e) { + //Shouldn't happen or bug in the source code + throw new RepositoryException(); + } + ItemImpl item = s.getItemManager().getItem(p); + NodeImpl parent = (NodeImpl) item; + + //TODO Add a parameter to specify the UUIDBehavior? + SessionImporter importer = new SessionImporter(parent, s, 3); + ImportHandler handler = new ImportHandler(importer, s.getNamespaceResolver(), this.getRepo().getNamespaceRegistry()); + File temp = new File(this.getConf().getWorkFolder() + "history.xml"); + h.read("history.xml", temp); + FileInputStream in = new FileInputStream(temp); + + try { + XMLReader parser = + XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); + parser.setContentHandler(handler); + parser.setErrorHandler(handler); + // being paranoid... + parser.setFeature("http://xml.org/sax/features/namespaces", true); + parser.setFeature("http://xml.org/sax/features/namespace-prefixes", + false); + + parser.parse(new InputSource(in)); + } catch (SAXException se) { + // check for wrapped repository exception + Exception e = se.getException(); + if (e != null && e instanceof RepositoryException) { + throw (RepositoryException) e; + } else { + String msg = "failed to parse XML stream"; + throw new InvalidSerializedDataException(msg, se); + } + } finally { + temp.delete(); + } + //TODO find a way to put /jcr:system/jcr:versionStorage probably by instanciating as a repo/wsp the versioning pm + File temp = new File(this.getConf().getWorkFolder() + "history.xml"); + SessionImpl s = (SessionImpl) this.getSession(); + + + Path p = null; + try { + p = PathFormat.parse("/jcr:system/jcr:versionStorage", s.getNamespaceResolver()).getNormalizedPath(); + } catch (MalformedPathException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + //Unprotect the tree... + + ItemImpl item = s.getItemManager().getItem(p); + + NodeImpl parent = (NodeImpl) item; + unprotect(parent); + + + + + try { + + h.read("history.xml", temp); + FileInputStream iTemp = new FileInputStream(temp); + s.importXML("/", iTemp, 0); + } catch (PathNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ItemExistsException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ConstraintViolationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (VersionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvalidSerializedDataException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (LockException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + + } + finally { + temp.delete(); + } + + + + + }*/ + public void restore(BackupIOHandler h) throws RepositoryException, IOException { + File temp = new File(this.getConf().getWorkFolder() + "history.xml"); + SessionImpl s = (SessionImpl) this.getSession(); + + Path p = null; + try { + p = PathFormat.parse("/jcr:system/jcr:versionStorage", s.getNamespaceResolver()).getNormalizedPath(); + } catch (MalformedPathException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + //Unprotect the tree... + + ItemImpl item = s.getItemManager().getItem(p); + NodeImpl parent = (NodeImpl) item; + unprotect(parent); + + try { + h.read("history.xml", temp); + FileInputStream iTemp = new FileInputStream(temp); + s.importXML("/", iTemp, 0); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + + } + finally { + temp.delete(); + } } + + + private static void unprotect(NodeImpl parent) throws RepositoryException { + NodeDefinitionImpl def = (NodeDefinitionImpl) parent.getDefinition(); + NodeDefImpl nd = (NodeDefImpl) def.unwrap(); + //TODO After restore should we W protect the node? + nd.setProtected(false); + if (!def.isProtected()) + System.out.println(def.getName()); + + NodeIterator it = parent.getNodes(); + + while (it.hasNext()) { + unprotect((NodeImpl) it.nextNode()); + } + + } } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/RepositoryBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/RepositoryBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/RepositoryBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/RepositoryBackup.java Tue Aug 8 00:18:05 2006 @@ -16,19 +16,35 @@ */ package org.apache.jackrabbit.backup; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.util.HashMap; import java.util.Properties; +import java.util.zip.ZipException; import javax.jcr.LoginException; +import javax.jcr.NamespaceRegistry; import javax.jcr.RepositoryException; import org.apache.jackrabbit.core.NodeId; import org.apache.jackrabbit.core.NodeImpl; import org.apache.jackrabbit.core.RepositoryImpl; +import org.apache.jackrabbit.core.config.RepositoryConfig; +import org.apache.jackrabbit.core.fs.BasedFileSystem; +import org.apache.jackrabbit.core.fs.FileSystem; +import org.apache.jackrabbit.core.fs.FileSystemException; +import org.apache.jackrabbit.core.fs.FileSystemResource; +import org.apache.jackrabbit.core.nodetype.InvalidNodeTypeDefException; +import org.apache.jackrabbit.core.nodetype.NodeTypeDefStore; +import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; /** * @author ntoper @@ -36,63 +52,65 @@ */ public class RepositoryBackup extends Backup { - + private String repoConfFile; + private String home; + /** * @param repo * @param conf - * @throws RepositoryException - * @throws LoginException + * @throws RepositoryException + * @throws LoginException */ - public RepositoryBackup(RepositoryImpl repo, BackupConfig conf) throws LoginException, RepositoryException { - super(repo, conf); + public RepositoryBackup(RepositoryImpl repo, BackupConfig conf, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login, password); } - + public RepositoryBackup() { super(); } + public RepositoryBackup(String repoConfFile, String home) { + super(); + this.repoConfFile = repoConfFile; + this.home = home; + } /** * Backup the repository config file - * + * * TODO Backup properties? Metadata store? Other ressources? - * @throws IOException - * @throws RepositoryException - * - * + * @throws IOException + * @throws RepositoryException + * + * */ public void backup(BackupIOHandler h) throws IOException, RepositoryException { - - File file = this.conf.getRepoConfFile(); + + File file = this.getConf().getRepoConfFile(); //Backup repository.xml h.write("repository_xml", file); - - //Properties - Properties p = new Properties(); - String[] keys = repo.getDescriptorKeys(); - for (int i = 0; i < keys.length; i++) { - p.setProperty(keys[i], repo.getDescriptor(keys[i])); - } - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - p.store(bos,""); - h.write("repository_properties", bos); - - // Root node ID - NodeImpl nod = (NodeImpl) this.getSession().getRootNode(); - NodeId n = nod.getNodeId(); - - //We persist the string as a serialized object to avoid compatibility issue - String s = n.toString(); - ByteArrayOutputStream fos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(fos); - oos.writeObject(s); - h.write("repository_rootNode", fos); } - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub - + public void restore(BackupIOHandler h) throws ZipException, IOException, RepositoryException { + + //Restore repository.xml + File f = new File(this.repoConfFile); + h.read("repository_xml", f); + + // Launch the repository and launch it. + RepositoryConfig repoConf = RepositoryConfig.create(this.repoConfFile, this.home); + this.setRepo(RepositoryImpl.create(repoConf)); + + +// this.getRepo().setNodeTypeRegistry(createNodeTypeRegistry(nsReg, new BasedFileSystem(this.getRepo().getStore()), "/nodetypes")); + /* + * 1. Create a NodeTypeRegistry specific for the restore (redefines only the load built in types path) + * 2. Update the NodeTypeRegistry in repo + */ + + } -} + +} \ No newline at end of file Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceBackup.java Tue Aug 8 00:18:05 2006 @@ -17,15 +17,24 @@ package org.apache.jackrabbit.backup; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.zip.ZipException; -import javax.jcr.Item; +import javax.jcr.InvalidSerializedDataException; +import javax.jcr.ItemExistsException; import javax.jcr.LoginException; +import javax.jcr.NoSuchWorkspaceException; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; +import javax.jcr.Session; import javax.jcr.SimpleCredentials; +import javax.jcr.Workspace; +import javax.jcr.lock.LockException; +import javax.jcr.nodetype.ConstraintViolationException; +import javax.jcr.version.VersionException; import javax.xml.transform.OutputKeys; import javax.xml.transform.TransformerException; import javax.xml.transform.sax.SAXTransformerFactory; @@ -34,7 +43,10 @@ import org.apache.jackrabbit.core.RepositoryImpl; import org.apache.jackrabbit.core.SessionImpl; +import org.apache.jackrabbit.core.WorkspaceImpl; import org.apache.jackrabbit.core.xml.SysViewSAXEventGenerator; +import org.xml.sax.ContentHandler; +import org.xml.sax.InputSource; import org.xml.sax.SAXException; //TODO Wiki doc to update @@ -43,69 +55,107 @@ * */ public class WorkspaceBackup extends Backup { - - private static int called = 0; + private String wspName; - + /** * @param repo * @param conf * @throws RepositoryException * @throws LoginException */ - public WorkspaceBackup(RepositoryImpl repo, BackupConfig conf, String name) throws LoginException, RepositoryException { - super(repo, conf); + public WorkspaceBackup(RepositoryImpl repo, BackupConfig conf, String name, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login, password); this.wspName = name; } - public void init(RepositoryImpl repo, BackupConfig conf, String name) throws LoginException, RepositoryException { - super.init(repo, conf); + public void init(RepositoryImpl repo, BackupConfig conf, String name, String login, String password) throws LoginException, RepositoryException { + super.init(repo, conf, login, password); this.wspName = name; } - + /* (non-Javadoc) - * @see org.apache.jackrabbit.backup.Backup#backup(org.apache.jackrabbit.backup.BackupIOHandler) + * @see org.apache.jackrabbijcr:root/t.backup.Backup#backup(org.apache.jackrabbit.backup.BackupIOHandler) */ public void backup(BackupIOHandler h) throws RepositoryException, - IOException { - SessionImpl s = (SessionImpl) repo.login(new SimpleCredentials(this.conf.getLogin(), this.conf.getPassword().toCharArray()), this.wspName); - - SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); - File temp = new File(this.conf.getWorkFolder() + "wsp.xml"); - try { - TransformerHandler th = stf.newTransformerHandler(); - th.setResult(new StreamResult(new FileOutputStream(temp))); - th.getTransformer().setParameter(OutputKeys.METHOD, "xml"); - th.getTransformer().setParameter(OutputKeys.ENCODING, "UTF-8"); - th.getTransformer().setParameter(OutputKeys.INDENT, "no"); - - new SysViewSAXEventGenerator( - s.getRootNode(), false, false, th) { - protected void process(Node node, int level) - throws RepositoryException, SAXException { - if (!"/jcr:system".equals(node.getPath())) { - super.process(node, level); - } - } - }.serialize(); - h.write("export"+ called +".xml", temp); - } catch (TransformerException te) { - throw new RepositoryException(te); - } catch (SAXException se) { - throw new RepositoryException(se); - } finally { - temp.delete(); - called += 1; - } - + IOException { + SessionImpl s = (SessionImpl) this.getRepo().login(this.getCredentials(), this.wspName); + + SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); + File temp = new File(this.getConf().getWorkFolder() + "wsp.xml"); + try { + TransformerHandler th = stf.newTransformerHandler(); + th.setResult(new StreamResult(new FileOutputStream(temp))); + th.getTransformer().setParameter(OutputKeys.METHOD, "xml"); + th.getTransformer().setParameter(OutputKeys.ENCODING, "UTF-8"); + th.getTransformer().setParameter(OutputKeys.INDENT, "no"); + + new SysViewSAXEventGenerator( + s.getRootNode(), false, false, th) { + protected void process(Node node, int level) + throws RepositoryException, SAXException { + if (!"/jcr:system".equals(node.getPath())) { + super.process(node, level); + } + } + }.serialize(); + h.write("export_"+ this.wspName +".xml", temp); + } catch (TransformerException te) { + throw new RepositoryException(te); + } catch (SAXException se) { + throw new RepositoryException(se); + } finally { + temp.delete(); + } + } - + /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub - + public void restore(BackupIOHandler h) throws ZipException, IOException, LoginException, NoSuchWorkspaceException, RepositoryException { + //TODO put temp and constant in object's attribute. + + //Restore the SysView in a temp file + File wspXml = new File(this.getConf().getWorkFolder() + "/workspace.xml"); + File temp = new File(this.getConf().getWorkFolder() + "wsp.xml"); + + try { + FileInputStream fis = new FileInputStream(wspXml); + InputSource xml = new InputSource(fis); + + //Launch & register the wsp + //There is at least the default wsp. + SessionImpl s1 = (SessionImpl) this.getSession(); + Workspace wsp_def = s1.getWorkspace(); + + //Check if the workspace already exist (UC: partial restore) + String[] allWsp = wsp_def.getAccessibleWorkspaceNames(); + boolean isCreated = false; + + for (int i = 0; i < allWsp.length; i++) { + if (this.wspName.equals(allWsp[i])) { + isCreated = true; + break; + } + } + + if (!isCreated) { + ((WorkspaceImpl) wsp_def).createWorkspace(this.wspName, xml); + } + + h.read("export_"+ this.wspName +".xml", temp); + + SessionImpl s2 = (SessionImpl) this.getRepo().login(this.getCredentials(), this.wspName); + + FileInputStream iTemp = new FileInputStream(temp); + //TODO add a parameter in the conf file to manage UUIDBehavior + s2.importXML(s2.getRootNode().getPath(), iTemp, 3); + } + finally { + wspXml.delete(); + temp.delete(); + } } - + } Modified: jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceConfigBackup.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceConfigBackup.java?rev=429606&r1=429605&r2=429606&view=diff ============================================================================== --- jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceConfigBackup.java (original) +++ jackrabbit/trunk/contrib/backup/src/main/java/org/apache/jackrabbit/backup/WorkspaceConfigBackup.java Tue Aug 8 00:18:05 2006 @@ -18,16 +18,18 @@ import java.io.File; import java.io.IOException; +import java.util.zip.ZipException; import javax.jcr.LoginException; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.SimpleCredentials; + import org.apache.jackrabbit.core.RepositoryImpl; import org.apache.jackrabbit.core.WorkspaceImpl; +import org.apache.jackrabbit.core.config.ConfigurationException; +import org.apache.jackrabbit.core.config.RepositoryConfig; import org.apache.jackrabbit.core.config.WorkspaceConfig; -import org.apache.jackrabbit.backup.Backup; /** * @author ntoper @@ -35,22 +37,21 @@ */ public class WorkspaceConfigBackup extends Backup { - private static int called = 0; private String wspName; - + /** * @param repo * @param conf * @throws RepositoryException * @throws LoginException */ - public WorkspaceConfigBackup(RepositoryImpl repo, BackupConfig conf, String name) throws LoginException, RepositoryException { - super(repo, conf); + public WorkspaceConfigBackup(RepositoryImpl repo, BackupConfig conf, String name, String login, String password) throws LoginException, RepositoryException { + super(repo, conf, login, password); this.wspName = name; } - public void init(RepositoryImpl repo, BackupConfig conf, String name) throws LoginException, RepositoryException { - super.init(repo, conf); + public void init(RepositoryImpl repo, BackupConfig conf, String name, String login, String password) throws LoginException, RepositoryException { + super.init(repo, conf, login, password); this.wspName = name; } @@ -63,23 +64,23 @@ */ public void backup(BackupIOHandler h) throws RepositoryException, IOException { - Session s = repo.login(new SimpleCredentials(this.conf.getLogin(), this.conf.getPassword().toCharArray()), this.wspName); - + Session s = this.getRepo().login(this.getCredentials(), this.wspName); + WorkspaceImpl wsp = (WorkspaceImpl) s.getWorkspace(); WorkspaceConfig c = wsp.getConfig(); - + String home = c.getHomeDir(); File wspXml = new File (home + "/workspace.xml"); - h.write("WspConf" + called , wspXml); - called += 1; + h.write("WspConf_" + this.wspName , wspXml); } /* (non-Javadoc) * @see org.apache.jackrabbit.backup.Backup#restore(org.apache.jackrabbit.backup.BackupIOHandler) */ - public void restore(BackupIOHandler h) { - // TODO Auto-generated method stub + public void restore(BackupIOHandler h) throws ConfigurationException, ZipException, IOException { + //Replace workspace.xml if needed + File wspXml = new File(this.getConf().getWorkFolder() + "/workspace.xml"); + h.read("WspConf_" + this.wspName, wspXml); } - }