[exo-jcr-commits] exo-jcr SVN: r4229 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl: backup and 3 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Apr 13 05:55:03 EDT 2011


Author: tolusha
Date: 2011-04-13 05:55:03 -0400 (Wed, 13 Apr 2011)
New Revision: 4229

Added:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java
Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
Log:
EXOJCR-1301: Allow to use external backup tools in a secure manner

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java	2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java	2011-04-13 09:55:03 UTC (rev 4229)
@@ -34,6 +34,7 @@
 import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
 import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
 import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
+import org.exoplatform.services.jcr.impl.backup.RepositorySuspendController;
 import org.exoplatform.services.jcr.impl.core.AddNamespacePluginHolder;
 import org.exoplatform.services.jcr.impl.core.LocationFactory;
 import org.exoplatform.services.jcr.impl.core.NamespaceDataPersister;
@@ -638,6 +639,8 @@
       {
          public Void run()
          {
+
+            registerComponentImplementation(RepositorySuspendController.class);
             registerComponentImplementation(IdGenerator.class);
 
             registerComponentImplementation(RepositoryIndexSearcherHolder.class);

Added: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/RepositorySuspendController.java	2011-04-13 09:55:03 UTC (rev 4229)
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.backup;
+
+import org.exoplatform.management.annotations.Managed;
+import org.exoplatform.management.annotations.ManagedDescription;
+import org.exoplatform.management.jmx.annotations.NameTemplate;
+import org.exoplatform.management.jmx.annotations.Property;
+import org.exoplatform.services.jcr.core.ManageableRepository;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.Startable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Allows via JMX suspend and resume repository's components.
+ * 
+ * @author <a href="mailto:anatoliy.bazko at gmail.com">Anatoliy Bazko</a>
+ * @version $Id: RepositorySuspendController.java 34360 2009-07-22 23:58:59Z tolusha $
+ */
+ at Managed
+ at NameTemplate(@Property(key = "service", value = "RepositorySuspendController"))
+public class RepositorySuspendController implements Startable
+{
+   /**
+    * Repository ONLINE state.
+    */
+   private final int ONLINE = 1;
+
+   /**
+    * Repository SUSPENDED state.
+    */
+   private final int SUSPENDED = 3;
+
+   /**
+    * Undefined state. 
+    */
+   private final int UNDEFINED = 4;
+
+   private final ManageableRepository repository;
+
+   /**
+    * Logger.
+    */
+   protected static Log log = ExoLogger.getLogger("exo.jcr.component.core.RepositorySuspendController");
+
+   /**
+    * RepositoryController constructor.
+    */
+   public RepositorySuspendController(ManageableRepository repository)
+   {
+      this.repository = repository;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Managed
+   @ManagedDescription("Suspend repository which means that allow only read operations. All writing threads will wait until resume operations invoked.")
+   public void suspend()
+   {
+      for (Suspendable component : getSuspendableComponents())
+      {
+         try
+         {
+            component.suspend();
+         }
+         catch (SuspendException e)
+         {
+            log.error("Can't suspend component", e);
+         }
+      }
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Managed
+   @ManagedDescription("Resume repository. All previously suspended threads continue working.")
+   public void resume()
+   {
+      List<Suspendable> components = getSuspendableComponents();
+      Collections.reverse(components);
+
+      for (Suspendable component : components)
+      {
+         try
+         {
+            if (component.isSuspended())
+            {
+               component.resume();
+            }
+         }
+         catch (ResumeException e)
+         {
+            log.error("Can't resume component", e);
+         }
+      }
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Managed
+   @ManagedDescription("Returns repository state.")
+   public int getState()
+   {
+      int state = ONLINE;
+      
+      boolean hasSuspendedComponents = false;
+      boolean hasOnlineComponents = false;
+
+      for (Suspendable component : getSuspendableComponents())
+      {
+         if (component.isSuspended())
+         {
+            hasSuspendedComponents = true;
+
+            if (hasOnlineComponents)
+            {
+               return UNDEFINED;
+            }
+
+            state = SUSPENDED;
+         }
+         else
+         {
+            hasOnlineComponents = true;
+            if (hasSuspendedComponents)
+            {
+               return UNDEFINED;
+            }
+         }
+      }
+
+      return state;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public void start()
+   {
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public void stop()
+   {
+   }
+
+   private List<Suspendable> getSuspendableComponents()
+   {
+      List<Suspendable> components = new ArrayList<Suspendable>();
+      for (String workspaceName : repository.getWorkspaceNames())
+      {
+         components.addAll(repository.getWorkspaceContainer(workspaceName).getComponentInstancesOfType(
+            Suspendable.class));
+      }
+
+      return components;
+   }
+}

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java	2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/Suspendable.java	2011-04-13 09:55:03 UTC (rev 4229)
@@ -25,17 +25,24 @@
 public interface Suspendable
 {
    /**
-    *  Suspend component.
+    * Suspend component.
     *  
-    *  @throws SuspendException of error occurred 
+    * @throws SuspendException of error occurred 
     */
    void suspend() throws SuspendException;
 
    /**
-    *  Resume component.
+    * Resume component.
     *  
-    *  @throws ResumeException of error occurred 
+    * @throws ResumeException of error occurred 
     */
    void resume() throws ResumeException;
 
+   /**
+    * Indicates if component is suspended or not.
+    * 
+    * @return
+    */
+   boolean isSuspended();
+
 }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java	2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java	2011-04-13 09:55:03 UTC (rev 4229)
@@ -1056,6 +1056,14 @@
    }
 
    /**
+    * {@inheritDoc}
+    */
+   public boolean isSuspended()
+   {
+      return isSuspended;
+   }
+
+   /**
     * Switches index into online or offline modes.
     * 
     * @param isOnline

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java	2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java	2011-04-13 09:55:03 UTC (rev 4229)
@@ -515,6 +515,11 @@
    protected CountDownLatch latcher = null;
 
    /**
+    * Indicates if component suspended or not.
+    */
+   protected boolean isSuspended = false;
+
+   /**
     * Working constructor.
     * 
     * @throws RepositoryConfigurationException
@@ -3090,6 +3095,8 @@
    {
       latcher = new CountDownLatch(1);
       close();
+
+      isSuspended = true;
    }
 
    /**
@@ -3103,6 +3110,8 @@
          doInit();
 
          latcher.countDown();
+
+         isSuspended = false;
       }
       catch (IOException e)
       {
@@ -3115,6 +3124,14 @@
    }
 
    /**
+    * {@inheritDoc}
+    */
+   public boolean isSuspended()
+   {
+      return isSuspended;
+   }
+
+   /**
     * If component is suspended need to wait resuming and not allow
     * execute query on closed index.
     * 
@@ -3122,7 +3139,7 @@
     */
    private void waitForResuming() throws IOException
    {
-      if (latcher != null && latcher.getCount() != 0)
+      if (isSuspended)
       {
          try
          {

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java	2011-04-12 13:53:48 UTC (rev 4228)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java	2011-04-13 09:55:03 UTC (rev 4229)
@@ -1148,6 +1148,14 @@
       isResponsibleForResuming = false;
    }
 
+   /**
+    * {@inheritDoc}
+    */
+   public boolean isSuspended()
+   {
+      return isSuspended;
+   }
+
    private void suspendLocally() throws SuspendException
    {
       if (isSuspended)



More information about the exo-jcr-commits mailing list