[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