[exo-jcr-commits] exo-jcr SVN: r5868 - in jcr/branches/1.15.x: exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Thu Mar 15 06:48:05 EDT 2012
Author: areshetnyak
Date: 2012-03-15 06:48:05 -0400 (Thu, 15 Mar 2012)
New Revision: 5868
Modified:
jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
Log:
EXOJCR-1786 : The repository container is unregenerate all components and remove this container from parent container on fail on instantiation of repository container.
Modified: jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2012-03-15 10:16:50 UTC (rev 5867)
+++ jcr/branches/1.15.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2012-03-15 10:48:05 UTC (rev 5868)
@@ -72,6 +72,7 @@
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
import java.util.List;
import javax.jcr.NamespaceRegistry;
@@ -150,11 +151,21 @@
public Void run()
{
context.setName(parent.getContext().getName() + "-" + name);
- parent.registerComponentInstance(name, RepositoryContainer.this);
+ try
+ {
+ parent.registerComponentInstance(name, RepositoryContainer.this);
+ registerComponents();
+ }
+ catch (Throwable t)
+ {
+ unregisterAllComponents();
+ parent.unregisterComponent(name);
+ throw new IllegalStateException("Can not register repository container " + name
+ + " in parent container.", t);
+ }
return null;
}
});
- registerComponents();
}
/**
@@ -172,26 +183,7 @@
public RepositoryContainer(final ExoContainer parent, RepositoryEntry config) throws RepositoryException,
RepositoryConfigurationException
{
-
- super(new MX4JComponentAdapterFactory(), parent);
-
- // Defaults:
- if (config.getAccessControl() == null)
- config.setAccessControl(AccessControlPolicy.OPTIONAL);
-
- this.config = config;
- this.name = config.getName();
- SecurityHelper.doPrivilegedAction(new PrivilegedAction<Void>()
- {
- public Void run()
- {
- context.setName(parent.getContext().getName() + "-" + name);
- parent.registerComponentInstance(name, RepositoryContainer.this);
- return null;
- }
- });
-
- registerComponents();
+ this(parent, config, new ArrayList<ComponentPlugin>());
}
public LocationFactory getLocationFactory()
Modified: jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java
===================================================================
--- jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java 2012-03-15 10:16:50 UTC (rev 5867)
+++ jcr/branches/1.15.x/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/AbstractBackupUseCasesTest.java 2012-03-15 10:48:05 UTC (rev 5868)
@@ -19,6 +19,7 @@
import org.apache.commons.collections.map.HashedMap;
import org.exoplatform.commons.utils.PrivilegedFileHelper;
import org.exoplatform.commons.utils.PrivilegedSystemHelper;
+import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
@@ -1457,7 +1458,269 @@
checkConent(repositoryService.getRepository(repository.getConfiguration().getName()), repository
.getConfiguration().getSystemWorkspaceName());
}
+
+ public void testCreateRepositoryAfterFailRestoreOnSystemWS() throws Exception
+ {
+ // create repository
+ RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
+ String dsName = helper.createDatasource();
+ RepositoryEntry repoEntry = helper.createRepositoryEntry(false, null, dsName);
+ service.createRepository(repoEntry);
+ ManageableRepository repository = service.getRepository(repoEntry.getName());
+
+ WorkspaceEntry wsEntry = helper.createWorkspaceEntry(false, dsName);
+ helper.addWorkspace(repository, wsEntry);
+ service.getConfig().retain();
+
+ addConent(repository, repository.getConfiguration().getSystemWorkspaceName());
+
+ // backup
+ File backDir = new File("target/backup/" + IdGenerator.generate());
+ backDir.mkdirs();
+
+ RepositoryBackupConfig config = new RepositoryBackupConfig();
+ config.setRepository(repository.getConfiguration().getName());
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+ config.setBackupDir(backDir);
+
+ RepositoryBackupChain bch = backup.startBackup(config);
+ waitEndOfBackup(bch);
+ backup.stopBackup(bch);
+
+ File backLog = new File(bch.getLogFilePath());
+ assertTrue(backLog.exists());
+
+ // copy repository entry and set new ata source
+ RepositoryEntry newRepoEntry = helper.copyRepositoryEntry(repoEntry);
+ String newDSName = helper.createDatasource();
+ for (WorkspaceEntry ws : newRepoEntry.getWorkspaceEntries())
+ {
+ for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+ {
+ SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+ if (spe.getName().equals("source-name"))
+ {
+ ws.getContainer().getParameters().set(i, new SimpleParameterEntry(spe.getName(), newDSName));
+ break;
+ }
+ }
+ }
+
+ // create repository entry with name of data source name is wrong in system workspace
+ RepositoryEntry wrongRepoEntry = helper.copyRepositoryEntry(repoEntry);
+ for (WorkspaceEntry ws : wrongRepoEntry.getWorkspaceEntries())
+ {
+ if (repository.getConfiguration().getSystemWorkspaceName().equals(ws.getName()))
+ {
+ for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+ {
+ SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+ if (spe.getName().equals("source-name"))
+ {
+ ws.getContainer().getParameters().set(i,
+ new SimpleParameterEntry(spe.getName(), spe.getValue() + "_wrong"));
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ // remove existed repository
+ removeRepositoryFully(repository.getConfiguration().getName());
+
+ // wrong restore
+ try
+ {
+ backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false);
+ fail();
+ }
+ catch (Exception e)
+ {
+ //ok
+ }
+
+ // restore
+ long timeOfRestore = System.currentTimeMillis();
+ backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false);
+ log.info("Total time of restore the repository = " + ((System.currentTimeMillis() - timeOfRestore)) + "ms.");
+ checkConent(repositoryService.getRepository(newRepoEntry.getName()), newRepoEntry.getSystemWorkspaceName());
+ }
+
+ public void testCreateRepositoryAfterFailRestoreOnNonSystemWS() throws Exception
+ {
+ // create repository
+ RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
+ String dsName = helper.createDatasource();
+ RepositoryEntry repoEntry = helper.createRepositoryEntry(false, null, dsName);
+ service.createRepository(repoEntry);
+
+ ManageableRepository repository = service.getRepository(repoEntry.getName());
+
+ WorkspaceEntry wsEntry = helper.createWorkspaceEntry(false, dsName);
+ helper.addWorkspace(repository, wsEntry);
+ service.getConfig().retain();
+
+ addConent(repository, wsEntry.getName());
+
+ // backup
+ File backDir = new File("target/backup/" + IdGenerator.generate());
+ backDir.mkdirs();
+
+ RepositoryBackupConfig config = new RepositoryBackupConfig();
+ config.setRepository(repository.getConfiguration().getName());
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+ config.setBackupDir(backDir);
+
+ RepositoryBackupChain bch = backup.startBackup(config);
+ waitEndOfBackup(bch);
+ backup.stopBackup(bch);
+
+ File backLog = new File(bch.getLogFilePath());
+ assertTrue(backLog.exists());
+
+ // copy repository entry and set new ata source
+ RepositoryEntry newRepoEntry = helper.copyRepositoryEntry(repoEntry);
+ String newDSName = helper.createDatasource();
+ for (WorkspaceEntry ws : newRepoEntry.getWorkspaceEntries())
+ {
+ for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+ {
+ SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+ if (spe.getName().equals("source-name"))
+ {
+ ws.getContainer().getParameters().set(i, new SimpleParameterEntry(spe.getName(), newDSName));
+ break;
+ }
+ }
+ }
+
+ // create repository entry with name of data source name is wrong in second workspace
+ RepositoryEntry wrongRepoEntry = helper.copyRepositoryEntry(repoEntry);
+ for (WorkspaceEntry ws : wrongRepoEntry.getWorkspaceEntries())
+ {
+ if (wsEntry.getName().equals(ws.getName()))
+ {
+ for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+ {
+ SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+ if (spe.getName().equals("source-name"))
+ {
+ ws.getContainer().getParameters().set(i,
+ new SimpleParameterEntry(spe.getName(), spe.getValue() + "_wrong"));
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ // remove existed repository
+ removeRepositoryFully(repository.getConfiguration().getName());
+
+ // wrong restore
+ try
+ {
+ backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false);
+ fail();
+ }
+ catch (Exception e)
+ {
+ //ok
+ }
+
+ // restore
+ long timeOfRestore = System.currentTimeMillis();
+ backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false);
+ log.info("Total time of restore the repository = " + ((System.currentTimeMillis() - timeOfRestore)) + "ms.");
+ checkConent(repositoryService.getRepository(newRepoEntry.getName()), wsEntry.getName());
+ }
+
+ public void testCreateRepositoryAfterFailRestoreWithFailConfiguration() throws Exception
+ {
+ // create repository
+ RepositoryService service = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
+ String dsName = helper.createDatasource();
+ RepositoryEntry repoEntry = helper.createRepositoryEntry(false, null, dsName);
+ service.createRepository(repoEntry);
+
+ ManageableRepository repository = service.getRepository(repoEntry.getName());
+
+ WorkspaceEntry wsEntry = helper.createWorkspaceEntry(false, dsName);
+ helper.addWorkspace(repository, wsEntry);
+ service.getConfig().retain();
+
+ addConent(repository, wsEntry.getName());
+
+ // backup
+ File backDir = new File("target/backup/" + IdGenerator.generate());
+ backDir.mkdirs();
+
+ RepositoryBackupConfig config = new RepositoryBackupConfig();
+ config.setRepository(repository.getConfiguration().getName());
+ config.setBackupType(BackupManager.FULL_BACKUP_ONLY);
+ config.setBackupDir(backDir);
+
+ RepositoryBackupChain bch = backup.startBackup(config);
+ waitEndOfBackup(bch);
+ backup.stopBackup(bch);
+
+ File backLog = new File(bch.getLogFilePath());
+ assertTrue(backLog.exists());
+
+ // copy repository entry and set new data source
+ RepositoryEntry newRepoEntry = helper.copyRepositoryEntry(repoEntry);
+ String newDSName = helper.createDatasource();
+ for (WorkspaceEntry ws : newRepoEntry.getWorkspaceEntries())
+ {
+ for (int i = 0; i < ws.getContainer().getParameters().size(); i++)
+ {
+ SimpleParameterEntry spe = ws.getContainer().getParameters().get(i);
+
+ if (spe.getName().equals("source-name"))
+ {
+ ws.getContainer().getParameters().set(i, new SimpleParameterEntry(spe.getName(), newDSName));
+ break;
+ }
+ }
+ }
+
+ // create repository entry with name of data source name is wrong in second workspace
+ RepositoryEntry wrongRepoEntry = helper.copyRepositoryEntry(repoEntry);
+ for (WorkspaceEntry ws : wrongRepoEntry.getWorkspaceEntries())
+ {
+ if (wsEntry.getName().equals(ws.getName()))
+ {
+ ws.getContainer().setType("wrong parameter");
+ }
+ }
+
+ // remove existed repository
+ removeRepositoryFully(repository.getConfiguration().getName());
+
+ // wrong restore
+ try
+ {
+ backup.restore(new RepositoryBackupChainLog(backLog), wrongRepoEntry, false);
+ fail();
+ }
+ catch (Exception e)
+ {
+ //ok
+ }
+
+ // restore
+ long timeOfRestore = System.currentTimeMillis();
+ backup.restore(new RepositoryBackupChainLog(backLog), newRepoEntry, false);
+ log.info("Total time of restore the repository = " + ((System.currentTimeMillis() - timeOfRestore)) + "ms.");
+ checkConent(repositoryService.getRepository(newRepoEntry.getName()), wsEntry.getName());
+ }
+
/**
* Set new backup directory in RepositoryBackupChainLog
*
More information about the exo-jcr-commits
mailing list