[exo-jcr-commits] exo-jcr SVN: r4599 - in jcr/trunk: exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Jul 5 09:49:29 EDT 2011


Author: tolusha
Date: 2011-07-05 09:49:29 -0400 (Tue, 05 Jul 2011)
New Revision: 4599

Modified:
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationService.java
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java
   jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/repository-creation-service.xml
Log:
EXOJCR-1396: check is repository in use on all cluster nodes before removing

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationService.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationService.java	2011-07-05 12:42:16 UTC (rev 4598)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationService.java	2011-07-05 13:49:29 UTC (rev 4599)
@@ -101,10 +101,9 @@
     * Remove previously created repository. 
     * 
     * @param repositoryName - the repository name to delete
-    * @param forceCloseSessions - indicates if need to close sessions before repository removing, if
-    * sessions are opened is it not possbile to remove repository and exception will be thrown
+    * @param forceRemove - force close all opened sessions 
     * @throws RepositoryCreationServiceException
     *          if some exception occurred during repository removing occurred
     */
-   void removeRepository(String repositoryName, boolean forceCloseSessions) throws RepositoryCreationException;
+   void removeRepository(String repositoryName, boolean forceRemove) throws RepositoryCreationException;
 }

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java	2011-07-05 12:42:16 UTC (rev 4598)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java	2011-07-05 13:49:29 UTC (rev 4599)
@@ -124,6 +124,8 @@
 
    private RemoteCommand removeRepository;
 
+   private RemoteCommand canRemoveRepository;
+
    /**
     * Constructor RepositoryCreationServiceImpl.
     */
@@ -136,7 +138,7 @@
    /**
     * Constructor RepositoryCreationServiceImpl.
     */
-   public RepositoryCreationServiceImpl(RepositoryService repositoryService, BackupManager backupManager,
+   public RepositoryCreationServiceImpl(final RepositoryService repositoryService, BackupManager backupManager,
       ExoContainerContext context, InitialContextInitializer initialContextInitializer, final RPCService rpcService)
    {
       this.repositoryService = repositoryService;
@@ -231,13 +233,27 @@
             public Serializable execute(Serializable[] args) throws Throwable
             {
                String repositoryName = (String)args[0];
-               boolean forceCloseSessions = (Boolean)args[1];
 
-               removeRepositoryLocally(repositoryName, forceCloseSessions);
+               removeRepositoryLocally(repositoryName);
 
                return null;
             }
          });
+
+         canRemoveRepository = rpcService.registerCommand(new RemoteCommand()
+         {
+            public String getId()
+            {
+               return "org.exoplatform.services.jcr.ext.repository.creation.RepositoryCreationServiceImpl-checkRepositoryInUse";
+            }
+
+            public Serializable execute(Serializable[] args) throws Throwable
+            {
+               String repositoryName = (String)args[0];
+               
+               return new Boolean(repositoryService.canRemoveRepository(repositoryName));
+            }
+         });
       }
       else
       {
@@ -729,21 +745,49 @@
          this.rpcService.unregisterCommand(createRepository);
          this.rpcService.unregisterCommand(startRepository);
          this.rpcService.unregisterCommand(removeRepository);
+         this.rpcService.unregisterCommand(canRemoveRepository);
       }
    }
 
    /**
     * {@inheritDoc}
     */
-   public void removeRepository(String repositoryName, boolean forceCloseSessions) throws RepositoryCreationException
+   public void removeRepository(String repositoryName, boolean forceRemove) throws RepositoryCreationException
    {
       if (rpcService != null)
       {
          try
          {
-            List<Object> results =
-               rpcService.executeCommandOnAllNodes(removeRepository, true, repositoryName, forceCloseSessions);
+            if (!forceRemove)
+            {
+               List<Object> results = rpcService.executeCommandOnAllNodes(canRemoveRepository, true, repositoryName);
+               for (Object result : results)
+               {
+                  if (result != null)
+                  {
+                     if (result instanceof Throwable)
+                     {
+                        throw new RepositoryCreationException("It is not possible to check is repository "
+                           + repositoryName + " in usage or not", (Throwable)result);
+                     }
+                     else if (result instanceof Boolean)
+                     {
+                        if (!(Boolean)result)
+                        {
+                           throw new RepositoryCreationException("Can't remove repository " + repositoryName
+                              + ". The repository in use.");
+                        }
+                     }
+                     else
+                     {
+                        throw new RepositoryCreationException(
+                           "checkRepositoryInUse command returned uknown result type");
+                     }
+                  }
+               }
+            }
 
+            List<Object> results = rpcService.executeCommandOnAllNodes(removeRepository, true, repositoryName);
             for (Object result : results)
             {
                if (result != null)
@@ -767,7 +811,23 @@
       }
       else
       {
-         removeRepositoryLocally(repositoryName, forceCloseSessions);
+         if (!forceRemove)
+         {
+            try
+            {
+               if (!repositoryService.canRemoveRepository(repositoryName))
+               {
+                  throw new RepositoryCreationException("Can't remove repository " + repositoryName
+                     + ". The repository in use.");
+               }
+            }
+            catch (RepositoryException e)
+            {
+               throw new RepositoryCreationException("It is not possible to check is repository " + repositoryName + " in usage or not", e);
+            }
+         }
+
+         removeRepositoryLocally(repositoryName);
       }
    }
 
@@ -776,11 +836,9 @@
     * 
     * @param repositoryName
     *          the repository name
-    * @param forceCloseSessions - indicates if need to close session before repository removing, if
-    * sessions are opened is it not possbile to remove repository and exception will be throw          
     * @throws RepositoryCreationException
     */
-   protected void removeRepositoryLocally(String repositoryName, boolean forceCloseSessions)
+   protected void removeRepositoryLocally(String repositoryName)
       throws RepositoryCreationException
    {
       try
@@ -789,16 +847,13 @@
          ManageableRepository repositorty = repositoryService.getRepository(repositoryName);
          Set<String> datasources = extractDataSourceNames(repositorty.getConfiguration(), false);
 
-         if (forceCloseSessions)
+         // close all opened sessions
+         for (String workspaceName : repositorty.getWorkspaceNames())
          {
-            // close all opened sessions
-            for (String workspaceName : repositorty.getWorkspaceNames())
-            {
-               WorkspaceContainerFacade wc = repositorty.getWorkspaceContainer(workspaceName);
-               SessionRegistry sessionRegistry = (SessionRegistry)wc.getComponent(SessionRegistry.class);
+            WorkspaceContainerFacade wc = repositorty.getWorkspaceContainer(workspaceName);
+            SessionRegistry sessionRegistry = (SessionRegistry)wc.getComponent(SessionRegistry.class);
 
-               sessionRegistry.closeSessions(workspaceName);
-            }
+            sessionRegistry.closeSessions(workspaceName);
          }
 
          // remove repository from configuration

Modified: jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/repository-creation-service.xml
===================================================================
--- jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/repository-creation-service.xml	2011-07-05 12:42:16 UTC (rev 4598)
+++ jcr/trunk/exo.jcr.docs/exo.jcr.docs.developer/en/src/main/docbook/en-US/modules/jcr/repository-creation-service.xml	2011-07-05 13:49:29 UTC (rev 4599)
@@ -220,12 +220,12 @@
     * Remove previously created repository. 
     * 
     * @param repositoryName - the repository name to delete
-    * @param forceCloseSessions - indicates if need to close session before repository removing, if
-    * sessions are opened is it not possbile to remove repository and exception will be thrown
+    * @param forceRemove - force close all opened sessions 
     * @throws RepositoryCreationServiceException
     *          if some exception occurred during repository removing occurred
     */
-   void removeRepository(String repositoryName, boolean forceCloseSessions) throws RepositoryCreationException;
+   void removeRepository(String repositoryName, boolean forceRemove) throws RepositoryCreationException;
+
 }</programlisting>
   </section>
 



More information about the exo-jcr-commits mailing list