[exo-jcr-commits] exo-jcr SVN: r3512 - in jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository: creation and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Nov 22 11:03:14 EST 2010


Author: sergiykarpenko
Date: 2010-11-22 11:03:13 -0500 (Mon, 22 Nov 2010)
New Revision: 3512

Added:
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationException.java
   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
Log:
EXOJCR-929: RepositoryCreationServiceImpl partial implementation added

Added: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationException.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationException.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationException.java	2010-11-22 16:03:13 UTC (rev 3512)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.ext.repository.creation;
+
+/**
+ * Created by The eXo Platform SAS.
+ * 
+ * <br/>Date: 
+ *
+ * @author <a href="karpenko.sergiy at gmail.com">Karpenko Sergiy</a> 
+ * @version $Id: RepositoryCreationException.java 111 2008-11-11 11:11:11Z serg $
+ */
+public class RepositoryCreationException extends Exception
+{
+
+   /**
+    * {@inheritDoc}
+    */
+   public RepositoryCreationException(String message)
+   {
+      super(message);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public RepositoryCreationException(String message, Throwable cause)
+   {
+      super(message, cause);
+   }
+
+}

Added: 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	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationService.java	2010-11-22 16:03:13 UTC (rev 3512)
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.ext.repository.creation;
+
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+
+/**
+ * Created by The eXo Platform SAS.
+ * 
+ * <br/>Date: 
+ *
+ * @author <a href="karpenko.sergiy at gmail.com">Karpenko Sergiy</a> 
+ * @version $Id: RepositoryCreationService.java 111 2008-11-11 11:11:11Z serg $
+ */
+public interface RepositoryCreationService
+{
+   /**
+    * Reserves, validates and creates repository in a simplified form. 
+    * 
+    * 1. check possibility to create repository locally
+    *    - check existing, pending repository and datasources with same names
+    * 2. reserve name and put additional information (ex. ip and port of current machine)
+    * 3. check possibility to create repository on others nodes 
+    *    - sending to all cluster nodes information about new repository and waiting for answers
+    *    - all cluster nodes receive information and check possibility to create repository locally
+    *    - send response 
+    * 4. reserve name on all nodes of cluster
+    * 6. Check that name is reserved
+    * 7. Create repository locally from backup
+    *    - create related DB
+    *    - bind datasources
+    *    - restore repository from backup (in synchronous mode)
+    * 8. If need to do the same in cluster then send requests to others cluster nodes to create repository and waits for responses
+    * 9. On each others cluster nodes:
+    *   - bind datasources
+    *   - start repository   
+    *   - send response
+    * 10. Release lock (unreserve name)
+
+    * @param rEntry
+    * @param backupId
+    * @throws RepositoryCreationServiceException
+    *          if some exception occurred during repository creation or repository name is absent in reserved list
+    */
+   void createRepository(String backupId, RepositoryEntry rEntry) throws RepositoryConfigurationException,
+      RepositoryCreationException;
+
+   /**
+    * Reserve repository name to prevent repository creation with same name from other place in same time
+    * via this service.
+    * 
+    * 1. check possibility to create repository locally
+    *    - check existing, pending repository and datasources with same names
+    * 2. reserve name and put additional information (repository name token)
+    * 3. check possibility to create repository on others nodes 
+    *    - sending to all cluster nodes information about new repository and waiting for answers
+    *    - all cluster nodes receive information and check possibility to create repository locally
+    *    - send response 
+    * 4. reserve name on all nodes of cluster
+    *
+    * @param repositoryName
+    * @return repository token. Anyone obtaining a token can later create a repository of reserved name.
+    * @throws RepositoryCreationServiceException
+    *          if can't reserve name
+    */
+   String reserveRepositoryName(String repositoryName) throws RepositoryCreationException;
+
+   /**
+    * Creates  repository, using token of already reserved repository name. Good for cases, when repository creation should be delayed or 
+    * made asynchronously in dedicated thread. 
+    *
+    * 1. Check that name is reserved
+    * 2. Create repository locally from backup
+    *    - create related DB
+    *    - bind datasources
+    *    - restore repository from backup (in synchronous mode)
+    * 3. If need to do the same in cluster then send requests to others cluster nodes to create repository and waits for responses
+    * 4. On each others cluster nodes:
+    *   - bind datasources
+    *   - start repository   
+    *   - send response
+    * 5. Release lock (unreserve name)
+    * 
+    * @param rEntry
+    * @param backupId
+    * @param rToken
+    * @throws RepositoryCreationServiceException
+    *          if some exception occurred during repository creation or repository name is absent in reserved list
+    */
+   void createRepository(String backupId, RepositoryEntry rEntry, String rToken)
+      throws RepositoryConfigurationException, RepositoryCreationException;
+}

Added: 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	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/repository/creation/RepositoryCreationServiceImpl.java	2010-11-22 16:03:13 UTC (rev 3512)
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.ext.repository.creation;
+
+import org.exoplatform.services.database.creator.DBConnectionInfo;
+import org.exoplatform.services.database.creator.DBCreator;
+import org.exoplatform.services.database.creator.DBCreatorException;
+import org.exoplatform.services.jcr.RepositoryService;
+import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.ext.backup.BackupConfigurationException;
+import org.exoplatform.services.jcr.ext.backup.BackupManager;
+import org.exoplatform.services.jcr.ext.backup.BackupOperationException;
+import org.exoplatform.services.jcr.ext.backup.RepositoryBackupChainLog;
+import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.exoplatform.services.naming.InitialContextInitializer;
+import org.exoplatform.services.rpc.RPCService;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+import javax.xml.stream.XMLStreamException;
+
+/**
+ * Created by The eXo Platform SAS.
+ * 
+ * <br/>Date: 
+ *
+ * @author <a href="karpenko.sergiy at gmail.com">Karpenko Sergiy</a> 
+ * @version $Id: RepositoryCreationServiceImpl.java 111 2008-11-11 11:11:11Z serg $
+ */
+public class RepositoryCreationServiceImpl implements RepositoryCreationService
+{
+   /**
+    * The logger.
+    */
+   private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.RepositoryCreationSynchronizer");
+
+   private final RepositoryService repositoryService;
+
+   /**
+    * The RPC Service used to communicate with other nodes
+    */
+   private final RPCService rpcService;
+
+   private final BackupManager backupManager;
+
+   private final DBCreator dbCreator;
+
+   private final InitialContextInitializer initialContextInitializer;
+
+   private final Set<String> pendingRepositories = new HashSet<String>();
+
+   public RepositoryCreationServiceImpl(RepositoryService repositoryService, BackupManager backupManager,
+      DBCreator dbCreator, InitialContextInitializer initialContextInitializer, final RPCService rpcService)
+   {
+      this.repositoryService = repositoryService;
+      this.backupManager = backupManager;
+      this.rpcService = rpcService;
+      this.dbCreator = dbCreator;
+      this.initialContextInitializer = initialContextInitializer;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public void createRepository(String backupId, RepositoryEntry rEntry) throws RepositoryConfigurationException,
+      RepositoryCreationException
+   {
+      // TODO Auto-generated method stub
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public void createRepository(String backupId, RepositoryEntry rEntry, String rToken)
+      throws RepositoryConfigurationException, RepositoryCreationException
+   {
+      // check does token registered
+      if (!this.pendingRepositories.contains(rToken))
+      {
+         throw new RepositoryCreationException("Token " + rToken + " does not registered.");
+      }
+
+      // Prepare list of datasource names that must be binded to newly created databases.
+      Set<String> dataSourceNames = new HashSet<String>();
+      for (WorkspaceEntry wsEntry : rEntry.getWorkspaceEntries())
+      {
+
+         boolean isMultiDB =
+            Boolean.parseBoolean(wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.MULTIDB));
+         String dbSourceName = wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
+
+         if (isMultiDB && dataSourceNames.contains(dbSourceName))
+         {
+            throw new RepositoryCreationException("RepositoryEntry for new " + rToken
+               + " repository contains workspaces that marked as multiDB but have same datasource " + dbSourceName
+               + ".");
+         }
+
+         try
+         {
+            DataSource ds = (DataSource)initialContextInitializer.getInitialContext().lookup(dbSourceName);
+            if (ds != null)
+            {
+               throw new RepositoryConfigurationException("RepositoryEntry for new " + rToken
+                  + " repository contains already bibded datasource " + dbSourceName + ".");
+            }
+         }
+         catch (NamingException e)
+         {
+            throw new RepositoryConfigurationException(e.getMessage(), e);
+         }
+
+         dataSourceNames.add(dbSourceName);
+      }
+
+      // create and bind related database to each datasource name
+      for (String dataSource : dataSourceNames)
+      {
+         // 1) create related DB
+         Map<String, String> refAddr = new HashMap<String, String>();
+         try
+         {
+            DBConnectionInfo dbConnectionInfo = dbCreator.createDatabase(rToken + "_" + dataSource);
+            refAddr.put("driverClassName", dbConnectionInfo.getDriver());
+            refAddr.put("url", dbConnectionInfo.getUrl());
+            refAddr.put("username", dbConnectionInfo.getUsername());
+            refAddr.put("password", dbConnectionInfo.getPassword());
+         }
+         catch (DBCreatorException e)
+         {
+            throw new RepositoryCreationException("Can not create new database for " + rToken + " repository.", e);
+         }
+
+         // 2) bind data-source
+         try
+         {
+            //bind new data-source
+            initialContextInitializer.bind(dataSource, "javax.sql.DataSource",
+               "org.apache.commons.dbcp.BasicDataSourceFactory", null, refAddr);
+         }
+         catch (NamingException e)
+         {
+            throw new RepositoryCreationException(e.getMessage(), e);
+         }
+         catch (FileNotFoundException e)
+         {
+            throw new RepositoryCreationException(e.getMessage(), e);
+         }
+         catch (XMLStreamException e)
+         {
+            throw new RepositoryCreationException(e.getMessage(), e);
+         }
+      }
+
+      //3) restore repository from backup
+      RepositoryBackupChainLog backupChain = null;
+      for (RepositoryBackupChainLog chainLog : backupManager.getRepositoryBackupsLogs())
+      {
+         if (chainLog.getBackupId().equals(backupId))
+         {
+            backupChain = chainLog;
+            break;
+         }
+      }
+
+      if (backupChain == null)
+      {
+         throw new RepositoryCreationException("BackupChain by id " + backupId + " does not exists.");
+      }
+
+      File backLog = new File(backupChain.getLogFilePath());
+      if (backLog != null && backLog.exists())
+      {
+         try
+         {
+            backupManager.restore(backupChain, rEntry, false);
+         }
+         catch (BackupOperationException e)
+         {
+            throw new RepositoryCreationException(e.getLocalizedMessage(), e);
+         }
+         catch (BackupConfigurationException e)
+         {
+            throw new RepositoryCreationException(e.getLocalizedMessage(), e);
+         }
+         catch (RepositoryException e)
+         {
+            throw new RepositoryCreationException(e.getLocalizedMessage(), e);
+         }
+      }
+      else
+      {
+         throw new RepositoryCreationException("Backup log file by id " + backupId
+            + (backLog != null ? (" and file path=" + backLog.getAbsolutePath()) : "") + " do not exists.");
+      }
+      //TODO execute "clone repository" on other cluster nodes
+      // release tokens
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public String reserveRepositoryName(String repositoryName) throws RepositoryCreationException
+   {
+      pendingRepositories.add(repositoryName);
+      //TODO notify all cluster-nodes that repositoryName is reserved
+      return repositoryName;
+   }
+
+}



More information about the exo-jcr-commits mailing list