DNA SVN: r398 - in trunk/connectors/dna-connector-federation/src/main: resources/org/jboss/dna/connector/federation and 1 other directory.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-08-07 11:38:59 -0400 (Thu, 07 Aug 2008)
New Revision: 398
Modified:
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederationI18n.java
trunk/connectors/dna-connector-federation/src/main/resources/org/jboss/dna/connector/federation/FederationI18n.properties
Log:
DNA-115 - Create federation service
http://jira.jboss.com/jira/browse/DNA-115
Added some exception handling in FederatedRepositorySource to better explain a ClastCastException when looking up objects out of JNDI.
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-08-06 19:59:12 UTC (rev 397)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-08-07 15:38:59 UTC (rev 398)
@@ -525,16 +525,20 @@
@Override
protected synchronized RepositoryConnection createConnection() throws RepositorySourceException {
if (getName() == null) {
- throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("name"));
+ I18n msg = FederationI18n.propertyIsRequired;
+ throw new RepositorySourceException(getName(), msg.text("name"));
}
if (getExecutionContextFactoryJndiName() == null) {
- throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("execution context factory JNDI name"));
+ I18n msg = FederationI18n.propertyIsRequired;
+ throw new RepositorySourceException(getName(), msg.text("execution context factory JNDI name"));
}
if (getSecurityDomain() == null) {
- throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("security domain"));
+ I18n msg = FederationI18n.propertyIsRequired;
+ throw new RepositorySourceException(getName(), msg.text("security domain"));
}
if (getRepositorySourceRegistryJndiName() == null) {
- throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("repository source registry JNDI name"));
+ I18n msg = FederationI18n.propertyIsRequired;
+ throw new RepositorySourceException(getName(), msg.text("repository source registry JNDI name"));
}
// Find the repository ...
FederatedRepository repository = getRepository();
@@ -569,12 +573,21 @@
Context jndiContext = getContext();
if (jndiName != null && jndiName.trim().length() != 0) {
// Look for an existing repository in JNDI ...
+ Object object = null;
try {
if (jndiContext == null) jndiContext = new InitialContext();
- repository = (FederatedRepository)jndiContext.lookup(jndiName);
+ object = jndiContext.lookup(jndiName);
+ if (object != null) repository = (FederatedRepository)object;
+ } catch (ClassCastException err) {
+ I18n msg = FederationI18n.objectFoundInJndiWasNotOfExpectedType;
+ String className = object != null ? object.getClass().getName() : "null";
+ throw new RepositorySourceException(getName(), msg.text(jndiName,
+ this.getName(),
+ FederatedRepository.class.getName(),
+ className), err);
} catch (Throwable err) {
I18n msg = FederationI18n.unableToFindFederatedRepositoryInJndi;
- throw new RepositorySourceException(msg.text(this.sourceName, jndiName), err);
+ throw new RepositorySourceException(getName(), msg.text(this.sourceName, jndiName), err);
}
}
@@ -595,17 +608,26 @@
Context context = getContext();
String jndiName = getExecutionContextFactoryJndiName();
if (jndiName != null && jndiName.trim().length() != 0) {
+ Object object = null;
try {
if (context == null) context = new InitialContext();
- factory = (ExecutionContextFactory)context.lookup(jndiName);
+ object = context.lookup(jndiName);
+ if (object != null) factory = (ExecutionContextFactory)object;
+ } catch (ClassCastException err) {
+ I18n msg = FederationI18n.objectFoundInJndiWasNotOfExpectedType;
+ String className = object != null ? object.getClass().getName() : "null";
+ throw new RepositorySourceException(getName(), msg.text(jndiName,
+ this.getName(),
+ ExecutionContextFactory.class.getName(),
+ className), err);
} catch (Throwable err) {
I18n msg = FederationI18n.unableToFindExecutionContextFactoryInJndi;
- throw new RepositorySourceException(msg.text(this.sourceName, jndiName), err);
+ throw new RepositorySourceException(getName(), msg.text(this.sourceName, jndiName), err);
}
}
if (factory == null) {
I18n msg = FederationI18n.unableToFindExecutionContextFactoryInJndi;
- throw new RepositorySourceException(msg.text(this.sourceName, jndiName));
+ throw new RepositorySourceException(getName(), msg.text(this.sourceName, jndiName));
}
String securityDomain = getSecurityDomain();
CallbackHandler handler = createCallbackHandler();
@@ -613,7 +635,7 @@
return factory.create(securityDomain, handler);
} catch (LoginException e) {
I18n msg = FederationI18n.unableToCreateExecutionContext;
- throw new RepositorySourceException(msg.text(this.sourceName, jndiName, securityDomain), e);
+ throw new RepositorySourceException(getName(), msg.text(this.sourceName, jndiName, securityDomain), e);
}
}
@@ -622,17 +644,26 @@
Context context = getContext();
String jndiName = getRepositorySourceRegistryJndiName();
if (jndiName != null && jndiName.trim().length() != 0) {
+ Object object = null;
try {
if (context == null) context = new InitialContext();
- factories = (RepositorySourceRegistry)context.lookup(jndiName);
+ object = context.lookup(jndiName);
+ if (object != null) factories = (RepositorySourceRegistry)object;
+ } catch (ClassCastException err) {
+ I18n msg = FederationI18n.objectFoundInJndiWasNotOfExpectedType;
+ String className = object != null ? object.getClass().getName() : "null";
+ throw new RepositorySourceException(getName(), msg.text(jndiName,
+ this.getName(),
+ RepositorySourceRegistry.class.getName(),
+ className), err);
} catch (Throwable err) {
I18n msg = FederationI18n.unableToFindRepositoryConnectionFactoriesInJndi;
- throw new RepositorySourceException(msg.text(this.sourceName, jndiName), err);
+ throw new RepositorySourceException(getName(), msg.text(this.sourceName, jndiName), err);
}
}
if (factories == null) {
I18n msg = FederationI18n.noRepositoryConnectionFactories;
- throw new RepositorySourceException(msg.text(this.repositoryName));
+ throw new RepositorySourceException(getName(), msg.text(this.repositoryName));
}
return factories;
}
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederationI18n.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederationI18n.java 2008-08-06 19:59:12 UTC (rev 397)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederationI18n.java 2008-08-07 15:38:59 UTC (rev 398)
@@ -38,6 +38,7 @@
public static I18n unableToFindExecutionContextFactoryInJndi;
public static I18n unableToCreateExecutionContext;
public static I18n unableToFindRepositoryConnectionFactoriesInJndi;
+ public static I18n objectFoundInJndiWasNotOfExpectedType;
public static I18n noRepositoryConnectionFactories;
public static I18n federatedRepositoryCannotBeFound;
public static I18n unableToAuthenticateConnectionToFederatedRepository;
Modified: trunk/connectors/dna-connector-federation/src/main/resources/org/jboss/dna/connector/federation/FederationI18n.properties
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/resources/org/jboss/dna/connector/federation/FederationI18n.properties 2008-08-06 19:59:12 UTC (rev 397)
+++ trunk/connectors/dna-connector-federation/src/main/resources/org/jboss/dna/connector/federation/FederationI18n.properties 2008-08-07 15:38:59 UTC (rev 398)
@@ -27,6 +27,7 @@
unableToFindExecutionContextFactoryInJndi = Unable to find an ExecutionContextFactory instance in JNDI under "{1}" when creating connection to federated source "{0}"
unableToCreateExecutionContext = Unable to create ExecutionContext for connection to federated source "{0}" when using factory in JNDI under "{1}" and security domain "{2}"
unableToFindRepositoryConnectionFactoriesInJndi = Unable to find an RepositoryConnectionFactories instance in JNDI under "{1}" when creating connection to federated source "{0}"
+objectFoundInJndiWasNotOfExpectedType = Object in JNDI at {0} found by FederatedRepositorySource {1} was expected to be a {2} but instead was a {2}
noRepositoryConnectionFactories = No RepositoryConnectionFactories instance was specified directly or indirectly found in JNDI when creating connection to federated source "{0}"
federatedRepositoryCannotBeFound = The federated repository "{0}" cannot be found
unableToAuthenticateConnectionToFederatedRepository = Unable to authenticate "{1}" for repository "{0}"
15 years, 10 months
DNA SVN: r397 - in trunk/connectors/dna-connector-federation/src: test/java/org/jboss/dna/connector/federation and 1 other directory.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-08-06 15:59:12 -0400 (Wed, 06 Aug 2008)
New Revision: 397
Modified:
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java
Log:
DNA-115 - Create federation service
http://jira.jboss.com/jira/browse/DNA-115
Simplified how the FederatedRepositorySource implements the JNDI Referenceable interface by also implementing JNDI's ObjectFactory and eliminating the inner class.
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-08-06 19:51:05 UTC (rev 396)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-08-06 19:59:12 UTC (rev 397)
@@ -78,7 +78,7 @@
* @author Randall Hauch
*/
@ThreadSafe
-public class FederatedRepositorySource extends AbstractRepositorySource {
+public class FederatedRepositorySource extends AbstractRepositorySource implements ObjectFactory {
/**
*/
@@ -823,7 +823,7 @@
*/
public synchronized Reference getReference() {
String className = getClass().getName();
- String factoryClassName = NamingContextObjectFactory.class.getName();
+ String factoryClassName = this.getClass().getName();
Reference ref = new Reference(className, factoryClassName, null);
if (getRepositoryName() != null) {
@@ -869,62 +869,56 @@
return ref;
}
- public static class NamingContextObjectFactory implements ObjectFactory {
-
- public NamingContextObjectFactory() {
- }
-
- /**
- * {@inheritDoc}
- */
- public Object getObjectInstance( Object obj,
- javax.naming.Name name,
- Context nameCtx,
- Hashtable<?, ?> environment ) throws Exception {
- if (obj instanceof Reference) {
- Map<String, String> values = new HashMap<String, String>();
- Reference ref = (Reference)obj;
- Enumeration<?> en = ref.getAll();
- while (en.hasMoreElements()) {
- RefAddr subref = (RefAddr)en.nextElement();
- if (subref instanceof StringRefAddr) {
- String key = subref.getType();
- Object value = subref.getContent();
- if (value != null) values.put(key, value.toString());
- }
+ /**
+ * {@inheritDoc}
+ */
+ public Object getObjectInstance( Object obj,
+ javax.naming.Name name,
+ Context nameCtx,
+ Hashtable<?, ?> environment ) throws Exception {
+ if (obj instanceof Reference) {
+ Map<String, String> values = new HashMap<String, String>();
+ Reference ref = (Reference)obj;
+ Enumeration<?> en = ref.getAll();
+ while (en.hasMoreElements()) {
+ RefAddr subref = (RefAddr)en.nextElement();
+ if (subref instanceof StringRefAddr) {
+ String key = subref.getType();
+ Object value = subref.getContent();
+ if (value != null) values.put(key, value.toString());
}
- String repositoryName = values.get(FederatedRepositorySource.REPOSITORY_NAME);
- String sourceName = values.get(FederatedRepositorySource.SOURCE_NAME);
- String username = values.get(FederatedRepositorySource.USERNAME);
- String password = values.get(FederatedRepositorySource.PASSWORD);
- String configurationSourceName = values.get(FederatedRepositorySource.CONFIGURATION_SOURCE_NAME);
- String projectionRules = values.get(FederatedRepositorySource.CONFIGURATION_SOURCE_PROJECTION_RULES);
- String connectionFactoriesJndiName = values.get(FederatedRepositorySource.REPOSITORY_SOURCE_REGISTRY_JNDI_NAME);
- String environmentJndiName = values.get(FederatedRepositorySource.EXECUTION_CONTEXT_FACTORY_JNDI_NAME);
- String repositoryJndiName = values.get(FederatedRepositorySource.REPOSITORY_JNDI_NAME);
- String securityDomain = values.get(FederatedRepositorySource.SECURITY_DOMAIN);
- String retryLimit = values.get(FederatedRepositorySource.RETRY_LIMIT);
+ }
+ String repositoryName = values.get(FederatedRepositorySource.REPOSITORY_NAME);
+ String sourceName = values.get(FederatedRepositorySource.SOURCE_NAME);
+ String username = values.get(FederatedRepositorySource.USERNAME);
+ String password = values.get(FederatedRepositorySource.PASSWORD);
+ String configurationSourceName = values.get(FederatedRepositorySource.CONFIGURATION_SOURCE_NAME);
+ String projectionRules = values.get(FederatedRepositorySource.CONFIGURATION_SOURCE_PROJECTION_RULES);
+ String connectionFactoriesJndiName = values.get(FederatedRepositorySource.REPOSITORY_SOURCE_REGISTRY_JNDI_NAME);
+ String environmentJndiName = values.get(FederatedRepositorySource.EXECUTION_CONTEXT_FACTORY_JNDI_NAME);
+ String repositoryJndiName = values.get(FederatedRepositorySource.REPOSITORY_JNDI_NAME);
+ String securityDomain = values.get(FederatedRepositorySource.SECURITY_DOMAIN);
+ String retryLimit = values.get(FederatedRepositorySource.RETRY_LIMIT);
- // Create the source instance ...
- FederatedRepositorySource source = new FederatedRepositorySource();
- if (repositoryName != null) source.setRepositoryName(repositoryName);
- if (sourceName != null) source.setName(sourceName);
- if (username != null) source.setUsername(username);
- if (password != null) source.setPassword(password);
- if (configurationSourceName != null) source.setConfigurationSourceName(configurationSourceName);
- if (projectionRules != null) {
- List<String> rules = StringUtil.splitLines(projectionRules);
- source.setConfigurationSourceProjectionRules(rules.toArray(new String[rules.size()]));
- }
- if (connectionFactoriesJndiName != null) source.setRepositorySourceRegistryJndiName(connectionFactoriesJndiName);
- if (environmentJndiName != null) source.setExecutionContextFactoryJndiName(environmentJndiName);
- if (repositoryJndiName != null) source.setRepositoryJndiName(repositoryJndiName);
- if (securityDomain != null) source.setSecurityDomain(securityDomain);
- if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
- return source;
+ // Create the source instance ...
+ FederatedRepositorySource source = new FederatedRepositorySource();
+ if (repositoryName != null) source.setRepositoryName(repositoryName);
+ if (sourceName != null) source.setName(sourceName);
+ if (username != null) source.setUsername(username);
+ if (password != null) source.setPassword(password);
+ if (configurationSourceName != null) source.setConfigurationSourceName(configurationSourceName);
+ if (projectionRules != null) {
+ List<String> rules = StringUtil.splitLines(projectionRules);
+ source.setConfigurationSourceProjectionRules(rules.toArray(new String[rules.size()]));
}
- return null;
+ if (connectionFactoriesJndiName != null) source.setRepositorySourceRegistryJndiName(connectionFactoriesJndiName);
+ if (environmentJndiName != null) source.setExecutionContextFactoryJndiName(environmentJndiName);
+ if (repositoryJndiName != null) source.setRepositoryJndiName(repositoryJndiName);
+ if (securityDomain != null) source.setSecurityDomain(securityDomain);
+ if (retryLimit != null) source.setRetryLimit(Integer.parseInt(retryLimit));
+ return source;
}
+ return null;
}
/**
Modified: trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java 2008-08-06 19:51:05 UTC (rev 396)
+++ trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java 2008-08-06 19:59:12 UTC (rev 397)
@@ -37,6 +37,7 @@
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import org.jboss.dna.spi.DnaLexicon;
@@ -272,7 +273,7 @@
Reference ref = source.getReference();
assertThat(ref.getClassName(), is(FederatedRepositorySource.class.getName()));
- assertThat(ref.getFactoryClassName(), is(FederatedRepositorySource.NamingContextObjectFactory.class.getName()));
+ assertThat(ref.getFactoryClassName(), is(FederatedRepositorySource.class.getName()));
Map<String, Object> refAttributes = new HashMap<String, Object>();
Enumeration<RefAddr> enumeration = ref.getAll();
@@ -300,7 +301,7 @@
assertThat(refAttributes.isEmpty(), is(true));
// Recreate the object, use a newly constructed source ...
- FederatedRepositorySource.NamingContextObjectFactory factory = new FederatedRepositorySource.NamingContextObjectFactory();
+ ObjectFactory factory = new FederatedRepositorySource();
Name name = mock(Name.class);
Context context = mock(Context.class);
Hashtable<?, ?> env = new Hashtable<Object, Object>();
15 years, 10 months
DNA SVN: r396 - trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-08-06 15:51:05 -0400 (Wed, 06 Aug 2008)
New Revision: 396
Added:
trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectorI18nTest.java
Log:
DNA-83 - Federate content from JBoss Cache instance(s)
http://jira.jboss.com/jira/browse/DNA-83
Added a unit test class for the JBossCacheConnectorI18n class.
Added: trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectorI18nTest.java
===================================================================
--- trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectorI18nTest.java (rev 0)
+++ trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectorI18nTest.java 2008-08-06 19:51:05 UTC (rev 396)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.connector.jbosscache;
+
+import org.jboss.dna.common.AbstractI18nTest;
+
+/**
+ * @author Randall Hauch
+ */
+public class JBossCacheConnectorI18nTest extends AbstractI18nTest {
+
+ public JBossCacheConnectorI18nTest() {
+ super(JBossCacheConnectorI18n.class);
+ }
+}
Property changes on: trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectorI18nTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
15 years, 10 months
DNA SVN: r395 - trunk/dna-spi/src/test/java/org/jboss/dna/spi.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-08-06 15:50:32 -0400 (Wed, 06 Aug 2008)
New Revision: 395
Modified:
trunk/dna-spi/src/test/java/org/jboss/dna/spi/SpiI18nTest.java
Log:
Added standard JBoss header.
Modified: trunk/dna-spi/src/test/java/org/jboss/dna/spi/SpiI18nTest.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/SpiI18nTest.java 2008-08-06 19:38:46 UTC (rev 394)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/SpiI18nTest.java 2008-08-06 19:50:32 UTC (rev 395)
@@ -1,5 +1,23 @@
/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
*
+ * 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.jboss.dna.spi;
15 years, 10 months
DNA SVN: r394 - in trunk: connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor and 15 other directories.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-08-06 15:38:46 -0400 (Wed, 06 Aug 2008)
New Revision: 394
Added:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceRegistry.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperation.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperations.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java
Removed:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/ManagedRepositoryConnectionFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionFactories.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryOperation.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryOperations.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/
Modified:
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConnection.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/FederatingCommandExecutor.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/SingleProjectionCommandExecutor.java
trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryConnectionTest.java
trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java
trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryTest.java
trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionPathRuleTest.java
trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionTest.java
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryConnection.java
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java
trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java
trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectionTest.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositorySourceManager.java
trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java
trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutor.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/CommandExecutor.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/DelegatingCommandExecutor.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/LoggingCommandExecutor.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/NoOpCommandExecutor.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutorTest.java
Log:
DNA-192 - Clean up the repository connector SPI
http://jira.jboss.com/jira/browse/DNA-192
Renamed the "org.jboss.dna.spi.graph.connection" package to "org.jboss.dna.spi.connector", and removed the notion of a RepositoryConnectionFactory and a ManagedRepositoryConnectionFactory. Instead, RepositorySource now defines all of the methods previously inherited, and RepositoryConnectionPool no longer inherits any interfaces and defines its own ConnectionFactory interface that only it uses. RepositoryConnectionFactories was renamed to RepositorySourceRegistry, and its single method was changed to use RepositorySource rather than a RepositoryConnectionFactory. AbstractRepositorySource now properly implements Serializable methods to rebuild the pool upon deserialization. Several of the RepositoryOperation interfaces were moved to the test source, since they're only used in the test harness.
Numerous files were touched because of the package and class renaming/refactoring.
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepository.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -31,11 +31,11 @@
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.connector.federation.executor.FederatingCommandExecutor;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
/**
* The component that represents a single federated repository. The federated repository uses a set of {@link RepositorySource
@@ -48,7 +48,7 @@
public class FederatedRepository {
private final ExecutionContext context;
- private final RepositoryConnectionFactories connectionFactories;
+ private final RepositorySourceRegistry sources;
private FederatedRepositoryConfig config;
private final AtomicInteger openExecutors = new AtomicInteger(0);
private final CountDownLatch shutdownLatch = new CountDownLatch(1);
@@ -59,18 +59,18 @@
* Create a federated repository instance.
*
* @param context the execution context
- * @param connectionFactories the set of connection factories that should be used
+ * @param sources the registry of {@link RepositorySource} instances that should be used
* @param config the configuration for this repository
* @throws IllegalArgumentException if any of the parameters are null, or if the name is blank
*/
public FederatedRepository( ExecutionContext context,
- RepositoryConnectionFactories connectionFactories,
+ RepositorySourceRegistry sources,
FederatedRepositoryConfig config ) {
- ArgCheck.isNotNull(connectionFactories, "connectionFactories");
+ ArgCheck.isNotNull(sources, "sources");
ArgCheck.isNotNull(context, "context");
ArgCheck.isNotNull(config, "config");
this.context = context;
- this.connectionFactories = connectionFactories;
+ this.sources = sources;
this.config = config;
}
@@ -91,10 +91,10 @@
}
/**
- * @return connectionFactories
+ * @return the sources
*/
- protected RepositoryConnectionFactories getConnectionFactories() {
- return connectionFactories;
+ protected RepositorySourceRegistry getRepositorySourceRegistry() {
+ return sources;
}
/**
@@ -232,7 +232,7 @@
String sourceName ) {
FederatedRepositoryConfig config = this.getConfiguration();
return new FederatingCommandExecutor(context, sourceName, config.getCacheProjection(), config.getDefaultCachePolicy(),
- config.getSourceProjections(), getConnectionFactories());
+ config.getSourceProjections(), getRepositorySourceRegistry());
}
/**
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConfig.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -30,7 +30,7 @@
import org.jboss.dna.common.collection.ThreadSafeProblems;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.cache.CachePolicy;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySource;
/**
* The configuration of a federated repository. The configuration defines, among other things, the set of
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConnection.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConnection.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositoryConnection.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -27,11 +27,11 @@
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
import org.jboss.dna.spi.graph.commands.GraphCommand;
import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
/**
* @author Randall Hauch
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/FederatedRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -52,6 +52,12 @@
import org.jboss.dna.spi.ExecutionContextFactory;
import org.jboss.dna.spi.cache.BasicCachePolicy;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.AbstractRepositorySource;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceCapabilities;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
import org.jboss.dna.spi.graph.InvalidPathException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.NameFactory;
@@ -67,12 +73,6 @@
import org.jboss.dna.spi.graph.commands.impl.BasicCompositeCommand;
import org.jboss.dna.spi.graph.commands.impl.BasicGetChildrenCommand;
import org.jboss.dna.spi.graph.commands.impl.BasicGetNodeCommand;
-import org.jboss.dna.spi.graph.connection.AbstractRepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositorySourceCapabilities;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* @author Randall Hauch
@@ -92,7 +92,7 @@
protected static final String PASSWORD = "password";
protected static final String CONFIGURATION_SOURCE_NAME = "configurationSourceName";
protected static final String CONFIGURATION_SOURCE_PROJECTION_RULES = "configurationSourceProjectionRules";
- protected static final String CONNECTION_FACTORIES_JNDI_NAME = "connectionFactoriesJndiName";
+ protected static final String REPOSITORY_SOURCE_REGISTRY_JNDI_NAME = "repositorySourceRegistryJndiName";
protected static final String EXECUTION_CONTEXT_FACTORY_JNDI_NAME = "executionContextFacotryJndiName";
protected static final String REPOSITORY_JNDI_NAME = "repositoryJndiName";
protected static final String SECURITY_DOMAIN = "securityDomain";
@@ -107,7 +107,7 @@
private String password;
private String configurationSourceName;
private String[] configurationSourceProjectionRules = DEFAULT_CONFIGURATION_SOURCE_PROJECTION_RULES;
- private String connectionFactoriesJndiName;
+ private String repositorySourceRegistryJndiName;
private String executionContextFactoryJndiName;
private String securityDomain;
private String repositoryJndiName;
@@ -149,7 +149,7 @@
*
* @param sourceName the name of this repository source
* @see #setConfigurationSourceName(String)
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setConfigurationSourceProjectionRules(String[])
* @see #setPassword(String)
* @see #setUsername(String)
@@ -219,8 +219,8 @@
/**
* Get the name of a {@link RepositorySource} instance that should be used by the {@link FederatedRepository federated
- * repository} as the configuration repository. The instance will be retrieved from the {@link RepositoryConnectionFactories}
- * instance {@link #getConnectionFactoriesJndiName() found in JDNI}.
+ * repository} as the configuration repository. The instance will be retrieved from the {@link RepositorySourceRegistry}
+ * instance {@link #getRepositorySourceRegistryJndiName() found in JDNI}.
* <p>
* This is a required property (unless the {@link #getRepositoryJndiName() federated repository is to be found in JDNI}).
* </p>
@@ -228,7 +228,7 @@
* @param sourceName the name of the {@link RepositorySource} instance that should be used for the configuration, or null if
* the federated repository instance is to be found in JNDI
* @see #getConfigurationSourceName()
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setConfigurationSourceProjectionRules(String[])
* @see #setPassword(String)
* @see #setUsername(String)
@@ -270,7 +270,7 @@
* @param projectionRules the string array of projection rules, or null if the projection rules haven't yet been set or if the
* federated repository instance is to be found in JNDI
* @see #setConfigurationSourceProjectionRules(String[])
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setConfigurationSourceName(String)
* @see #setPassword(String)
* @see #setUsername(String)
@@ -316,7 +316,7 @@
* @see #getExecutionContextFactoryJndiName()
* @see #setConfigurationSourceName(String)
* @see #setConfigurationSourceProjectionRules(String[])
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setPassword(String)
* @see #setUsername(String)
* @see #setRepositoryName(String)
@@ -329,32 +329,32 @@
}
/**
- * Get the name in JNDI where the {@link RepositoryConnectionFactories} instance that can be used by the
+ * Get the name in JNDI where the {@link RepositorySourceRegistry} instance that can be used by the
* {@link FederatedRepository federated repository} can find any {@link RepositorySource} sources it needs, including those
* used for {@link Projection sources} and that used for it's {@link #getConfigurationSourceName() configuration}.
* <p>
* This is a required property (unless the {@link #getRepositoryJndiName() federated repository is to be found in JDNI}).
* </p>
*
- * @return the JNDI name where the {@link RepositoryConnectionFactories} instance can be found, or null if the federated
- * repository instance is to be found in JNDI
- * @see #setConnectionFactoriesJndiName(String)
+ * @return the JNDI name where the {@link RepositorySourceRegistry} instance can be found, or null if the federated repository
+ * instance is to be found in JNDI
+ * @see #setRepositorySourceRegistryJndiName(String)
*/
- public String getConnectionFactoriesJndiName() {
- return connectionFactoriesJndiName;
+ public String getRepositorySourceRegistryJndiName() {
+ return repositorySourceRegistryJndiName;
}
/**
- * Set the name in JNDI where the {@link RepositoryConnectionFactories} instance that can be used by the
+ * Set the name in JNDI where the {@link RepositorySourceRegistry} instance that can be used by the
* {@link FederatedRepository federated repository} can find any {@link RepositorySource} sources it needs, including those
* used for {@link Projection sources} and that used for it's {@link #getConfigurationSourceName() configuration}.
* <p>
* This is a required property (unless the {@link #getRepositoryJndiName() federated repository is to be found in JDNI}).
* </p>
*
- * @param jndiName the JNDI name where the {@link RepositoryConnectionFactories} instance can be found, or null if the
- * federated repository instance is to be found in JNDI
- * @see #getConnectionFactoriesJndiName()
+ * @param jndiName the JNDI name where the {@link RepositorySourceRegistry} instance can be found, or null if the federated
+ * repository instance is to be found in JNDI
+ * @see #getRepositorySourceRegistryJndiName()
* @see #setConfigurationSourceName(String)
* @see #setConfigurationSourceProjectionRules(String[])
* @see #setPassword(String)
@@ -363,10 +363,10 @@
* @see #setExecutionContextFactoryJndiName(String)
* @see #setName(String)
*/
- public synchronized void setConnectionFactoriesJndiName( String jndiName ) {
- if (this.connectionFactoriesJndiName == jndiName || this.connectionFactoriesJndiName != null
- && this.connectionFactoriesJndiName.equals(jndiName)) return; // unchanged
- this.connectionFactoriesJndiName = jndiName;
+ public synchronized void setRepositorySourceRegistryJndiName( String jndiName ) {
+ if (this.repositorySourceRegistryJndiName == jndiName || this.repositorySourceRegistryJndiName != null
+ && this.repositorySourceRegistryJndiName.equals(jndiName)) return; // unchanged
+ this.repositorySourceRegistryJndiName = jndiName;
changeRepositoryConfig();
}
@@ -418,7 +418,7 @@
* @see #setConfigurationSourceProjectionRules(String[])
* @see #setPassword(String)
* @see #setUsername(String)
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setExecutionContextFactoryJndiName(String)
* @see #setName(String)
*/
@@ -455,7 +455,7 @@
* @see #setConfigurationSourceProjectionRules(String[])
* @see #setPassword(String)
* @see #setRepositoryName(String)
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setExecutionContextFactoryJndiName(String)
* @see #setName(String)
*/
@@ -490,7 +490,7 @@
* @see #setConfigurationSourceProjectionRules(String[])
* @see #setUsername(String)
* @see #setRepositoryName(String)
- * @see #setConnectionFactoriesJndiName(String)
+ * @see #setRepositorySourceRegistryJndiName(String)
* @see #setExecutionContextFactoryJndiName(String)
* @see #setName(String)
*/
@@ -503,16 +503,16 @@
/**
* This method is called to signal that some aspect of the configuration has changed. If a {@link #getRepository() repository}
* instance has been created, it's configuration is
- * {@link #getRepositoryConfiguration(ExecutionContext, RepositoryConnectionFactories) rebuilt} and updated. Nothing is done,
+ * {@link #getRepositoryConfiguration(ExecutionContext, RepositorySourceRegistry) rebuilt} and updated. Nothing is done,
* however, if there is currently no {@link #getRepository() repository}.
*/
protected synchronized void changeRepositoryConfig() {
if (this.repository != null) {
- // Find in JNDI the repository connection factories and the environment ...
+ // Find in JNDI the repository source registry and the environment ...
ExecutionContext context = getExecutionContext();
- RepositoryConnectionFactories factories = getRepositoryConnectionFactories();
+ RepositorySourceRegistry registry = getRepositorySourceRegistry();
// Compute a new repository config and set it on the repository ...
- FederatedRepositoryConfig newConfig = getRepositoryConfiguration(context, factories);
+ FederatedRepositoryConfig newConfig = getRepositoryConfiguration(context, registry);
this.repository.setConfiguration(newConfig);
}
}
@@ -520,7 +520,7 @@
/**
* {@inheritDoc}
*
- * @see org.jboss.dna.spi.graph.connection.AbstractRepositorySource#createConnection()
+ * @see org.jboss.dna.spi.connector.AbstractRepositorySource#createConnection()
*/
@Override
protected synchronized RepositoryConnection createConnection() throws RepositorySourceException {
@@ -533,8 +533,8 @@
if (getSecurityDomain() == null) {
throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("security domain"));
}
- if (getConnectionFactoriesJndiName() == null) {
- throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("connection factories JNDI name"));
+ if (getRepositorySourceRegistryJndiName() == null) {
+ throw new RepositorySourceException(FederationI18n.propertyIsRequired.text("repository source registry JNDI name"));
}
// Find the repository ...
FederatedRepository repository = getRepository();
@@ -555,7 +555,7 @@
* <ol>
* <li>If a {@link FederatedRepository} already was obtained from a prior call, the same instance is returned.</li>
* <li>A {@link FederatedRepository} is created using a {@link FederatedRepositoryConfig} is created from this instance's
- * properties and {@link ExecutionContext} and {@link RepositoryConnectionFactories} instances obtained from JNDI.</li>
+ * properties and {@link ExecutionContext} and {@link RepositorySourceRegistry} instances obtained from JNDI.</li>
* <li></li>
* <li></li>
* </ol>
@@ -579,12 +579,12 @@
}
if (repository == null) {
- // Find in JNDI the repository connection factories and the environment ...
+ // Find in JNDI the repository source registry and the environment ...
ExecutionContext context = getExecutionContext();
- RepositoryConnectionFactories factories = getRepositoryConnectionFactories();
+ RepositorySourceRegistry registry = getRepositorySourceRegistry();
// And create the configuration and the repository ...
- FederatedRepositoryConfig config = getRepositoryConfiguration(context, factories);
- repository = new FederatedRepository(context, factories, config);
+ FederatedRepositoryConfig config = getRepositoryConfiguration(context, registry);
+ repository = new FederatedRepository(context, registry, config);
}
}
return repository;
@@ -617,14 +617,14 @@
}
}
- protected RepositoryConnectionFactories getRepositoryConnectionFactories() {
- RepositoryConnectionFactories factories = null;
+ protected RepositorySourceRegistry getRepositorySourceRegistry() {
+ RepositorySourceRegistry factories = null;
Context context = getContext();
- String jndiName = getConnectionFactoriesJndiName();
+ String jndiName = getRepositorySourceRegistryJndiName();
if (jndiName != null && jndiName.trim().length() != 0) {
try {
if (context == null) context = new InitialContext();
- factories = (RepositoryConnectionFactories)context.lookup(jndiName);
+ factories = (RepositorySourceRegistry)context.lookup(jndiName);
} catch (Throwable err) {
I18n msg = FederationI18n.unableToFindRepositoryConnectionFactoriesInJndi;
throw new RepositorySourceException(msg.text(this.sourceName, jndiName), err);
@@ -667,12 +667,11 @@
* <i>not</i> modify the state of this instance.
*
* @param context the execution context that should be used to read the configuration; may not be null
- * @param factories the factories from which can be obtained the RepositoryConnectionFactory instances for each name source;
- * may not be null
+ * @param registry the registry from which {@link RepositorySource} instances can be obtained; may not be null
* @return a configuration reflecting the current state of this instance
*/
protected synchronized FederatedRepositoryConfig getRepositoryConfiguration( ExecutionContext context,
- RepositoryConnectionFactories factories ) {
+ RepositorySourceRegistry registry ) {
Problems problems = new SimpleProblems();
ValueFactories valueFactories = context.getValueFactories();
PathFactory pathFactory = valueFactories.getPathFactory();
@@ -695,10 +694,10 @@
} else if (configurationProjection.isSimple()) {
// There is just a single projection for the configuration repository, so just use an executor that
// translates the paths using the projection
- executor = new SingleProjectionCommandExecutor(context, configurationSourceName, configurationProjection, factories);
+ executor = new SingleProjectionCommandExecutor(context, configurationSourceName, configurationProjection, registry);
} else {
// The configuration repository has more than one projection, so we need to merge the results
- executor = new FederatingCommandExecutor(context, configurationSourceName, projections, factories);
+ executor = new FederatingCommandExecutor(context, configurationSourceName, projections, registry);
}
// Wrap the executor with a logging executor ...
executor = new LoggingCommandExecutor(executor, Logger.getLogger(getClass()), Logger.Level.INFO);
@@ -854,8 +853,8 @@
}
ref.add(new StringRefAddr(CONFIGURATION_SOURCE_PROJECTION_RULES, sb.toString()));
}
- if (getConnectionFactoriesJndiName() != null) {
- ref.add(new StringRefAddr(CONNECTION_FACTORIES_JNDI_NAME, getConnectionFactoriesJndiName()));
+ if (getRepositorySourceRegistryJndiName() != null) {
+ ref.add(new StringRefAddr(REPOSITORY_SOURCE_REGISTRY_JNDI_NAME, getRepositorySourceRegistryJndiName()));
}
if (getExecutionContextFactoryJndiName() != null) {
ref.add(new StringRefAddr(EXECUTION_CONTEXT_FACTORY_JNDI_NAME, getExecutionContextFactoryJndiName()));
@@ -900,7 +899,7 @@
String password = values.get(FederatedRepositorySource.PASSWORD);
String configurationSourceName = values.get(FederatedRepositorySource.CONFIGURATION_SOURCE_NAME);
String projectionRules = values.get(FederatedRepositorySource.CONFIGURATION_SOURCE_PROJECTION_RULES);
- String connectionFactoriesJndiName = values.get(FederatedRepositorySource.CONNECTION_FACTORIES_JNDI_NAME);
+ String connectionFactoriesJndiName = values.get(FederatedRepositorySource.REPOSITORY_SOURCE_REGISTRY_JNDI_NAME);
String environmentJndiName = values.get(FederatedRepositorySource.EXECUTION_CONTEXT_FACTORY_JNDI_NAME);
String repositoryJndiName = values.get(FederatedRepositorySource.REPOSITORY_JNDI_NAME);
String securityDomain = values.get(FederatedRepositorySource.SECURITY_DOMAIN);
@@ -917,7 +916,7 @@
List<String> rules = StringUtil.splitLines(projectionRules);
source.setConfigurationSourceProjectionRules(rules.toArray(new String[rules.size()]));
}
- if (connectionFactoriesJndiName != null) source.setConnectionFactoriesJndiName(connectionFactoriesJndiName);
+ if (connectionFactoriesJndiName != null) source.setRepositorySourceRegistryJndiName(connectionFactoriesJndiName);
if (environmentJndiName != null) source.setExecutionContextFactoryJndiName(environmentJndiName);
if (repositoryJndiName != null) source.setRepositoryJndiName(repositoryJndiName);
if (securityDomain != null) source.setSecurityDomain(securityDomain);
@@ -959,7 +958,7 @@
/**
* {@inheritDoc}
*
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#getCapabilities()
+ * @see org.jboss.dna.spi.connector.RepositorySource#getCapabilities()
*/
public RepositorySourceCapabilities getCapabilities() {
return new Capabilities();
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/Projection.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -39,10 +39,10 @@
import org.jboss.dna.common.util.HashCode;
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySource;
import org.jboss.dna.spi.graph.NamespaceRegistry;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
/**
* A projection of content from a source into the integrated/federated repository. Each project consists of a set of {@link Rule
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/FederatingCommandExecutor.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/FederatingCommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/FederatingCommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -42,6 +42,10 @@
import org.jboss.dna.spi.DnaLexicon;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
import org.jboss.dna.spi.graph.DateTime;
import org.jboss.dna.spi.graph.DateTimeFactory;
import org.jboss.dna.spi.graph.Name;
@@ -59,11 +63,6 @@
import org.jboss.dna.spi.graph.commands.impl.BasicCreateNodeCommand;
import org.jboss.dna.spi.graph.commands.impl.BasicGetChildrenCommand;
import org.jboss.dna.spi.graph.commands.impl.BasicGetNodeCommand;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
import org.jboss.dna.spi.graph.impl.BasicSingleValueProperty;
/**
@@ -78,7 +77,7 @@
private final Projection cacheProjection;
private final List<Projection> sourceProjections;
private final Set<String> sourceNames;
- private final RepositoryConnectionFactories connectionFactories;
+ private final RepositorySourceRegistry sourceRegistry;
private final MergeStrategy mergingStrategy;
/** The set of all connections, including the cache connection */
private final Map<String, RepositoryConnection> connectionsBySourceName;
@@ -89,19 +88,19 @@
* Create a command executor that federates (merges) the information from multiple sources described by the source
* projections. The resulting command executor does not first consult a cache for the merged information; if a cache is
* desired, see
- * {@link #FederatingCommandExecutor(ExecutionContext, String, Projection, CachePolicy, List, RepositoryConnectionFactories)
+ * {@link #FederatingCommandExecutor(ExecutionContext, String, Projection, CachePolicy, List, RepositorySourceRegistry)
* constructor} that takes a {@link Projection cache projection}.
*
* @param context the execution context in which the executor will be run; may not be null
* @param sourceName the name of the {@link RepositorySource} that is making use of this executor; may not be null or empty
* @param sourceProjections the source projections; may not be null
- * @param connectionFactories the factory for connection factory instances
+ * @param sourceRegistry the registry of {@link RepositorySource} instances
*/
public FederatingCommandExecutor( ExecutionContext context,
String sourceName,
List<Projection> sourceProjections,
- RepositoryConnectionFactories connectionFactories ) {
- this(context, sourceName, null, null, sourceProjections, connectionFactories);
+ RepositorySourceRegistry sourceRegistry ) {
+ this(context, sourceName, null, null, sourceProjections, sourceRegistry);
}
/**
@@ -117,22 +116,22 @@
* @param defaultCachePolicy the default caching policy that outlines the length of time that information should be cached, or
* null if there is no cache or no specific cache policy
* @param sourceProjections the source projections; may not be null
- * @param connectionFactories the factory for connection factory instances
+ * @param sourceRegistry the registry of {@link RepositorySource} instances
*/
public FederatingCommandExecutor( ExecutionContext context,
String sourceName,
Projection cacheProjection,
CachePolicy defaultCachePolicy,
List<Projection> sourceProjections,
- RepositoryConnectionFactories connectionFactories ) {
+ RepositorySourceRegistry sourceRegistry ) {
super(context, sourceName);
assert sourceProjections != null;
- assert connectionFactories != null;
+ assert sourceRegistry != null;
assert cacheProjection != null ? defaultCachePolicy != null : defaultCachePolicy == null;
this.cacheProjection = cacheProjection;
this.defaultCachePolicy = defaultCachePolicy;
this.sourceProjections = sourceProjections;
- this.connectionFactories = connectionFactories;
+ this.sourceRegistry = sourceRegistry;
this.connectionsBySourceName = new HashMap<String, RepositoryConnection>();
this.uuidPropertyName = context.getValueFactories().getNameFactory().create(DnaLexicon.PropertyNames.UUID);
this.mergePlanPropertyName = context.getValueFactories().getNameFactory().create(DnaLexicon.PropertyNames.MERGE_PLAN);
@@ -182,9 +181,9 @@
String sourceName = projection.getSourceName();
RepositoryConnection connection = connectionsBySourceName.get(sourceName);
if (connection == null) {
- RepositoryConnectionFactory connectionFactory = connectionFactories.getConnectionFactory(sourceName);
- if (connectionFactory != null) {
- connection = connectionFactory.getConnection();
+ RepositorySource source = sourceRegistry.getRepositorySource(sourceName);
+ if (source != null) {
+ connection = source.getConnection();
}
connectionsBySourceName.put(sourceName, connection);
}
Modified: trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/SingleProjectionCommandExecutor.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/SingleProjectionCommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/SingleProjectionCommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -25,6 +25,10 @@
import net.jcip.annotations.NotThreadSafe;
import org.jboss.dna.connector.federation.Projection;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
import org.jboss.dna.spi.graph.DateTime;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
@@ -39,11 +43,6 @@
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
import org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* @author Randall Hauch
@@ -53,7 +52,7 @@
private final Projection projection;
private final PathFactory pathFactory;
- private final RepositoryConnectionFactories factories;
+ private final RepositorySourceRegistry registry;
private RepositoryConnection connection;
/**
@@ -61,13 +60,13 @@
* @param sourceName the name of the {@link RepositorySource} that is making use of this executor; may not be null or empty
* @param projection the projection used for the cached information; may not be null and must have exactly one
* {@link Projection#getRules() rule}
- * @param connectionFactories the factory for connection factory instances
+ * @param sourceRegistry the registry of {@link RepositorySource} instances
*/
public SingleProjectionCommandExecutor( ExecutionContext context,
String sourceName,
Projection projection,
- RepositoryConnectionFactories connectionFactories ) {
- this(context, sourceName, null, projection, connectionFactories);
+ RepositorySourceRegistry sourceRegistry ) {
+ this(context, sourceName, null, projection, sourceRegistry);
}
/**
@@ -76,19 +75,19 @@
* @param now the current time; may be null if the system time is to be used
* @param projection the projection used for the cached information; may not be null and must have exactly one
* {@link Projection#getRules() rule}
- * @param connectionFactories the factory for connection factory instances
+ * @param sourceRegistry the registry of {@link RepositorySource} instances
*/
public SingleProjectionCommandExecutor( ExecutionContext context,
String sourceName,
DateTime now,
Projection projection,
- RepositoryConnectionFactories connectionFactories ) {
+ RepositorySourceRegistry sourceRegistry ) {
super(context, sourceName, now);
- assert connectionFactories != null;
+ assert sourceRegistry != null;
assert projection != null;
assert projection.getRules().size() == 1;
this.projection = projection;
- this.factories = connectionFactories;
+ this.registry = sourceRegistry;
this.pathFactory = context.getValueFactories().getPathFactory();
assert this.pathFactory != null;
}
@@ -96,8 +95,8 @@
protected RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException {
if (connection == null) {
// Create a connection ...
- RepositoryConnectionFactory connectionFactory = this.factories.getConnectionFactory(this.projection.getSourceName());
- connection = connectionFactory.getConnection();
+ RepositorySource source = this.registry.getRepositorySource(this.projection.getSourceName());
+ connection = source.getConnection();
}
return connection;
}
@@ -194,7 +193,8 @@
public void execute( MoveBranchCommand command ) throws RepositorySourceException, InterruptedException {
Path pathInSource = getPathInSource(command.getPath());
Path newPathInSource = getPathInSource(command.getNewPath());
- getConnection().execute(this.getExecutionContext(), new ProjectedMoveBranchCommand(command, pathInSource, newPathInSource));
+ getConnection().execute(this.getExecutionContext(),
+ new ProjectedMoveBranchCommand(command, pathInSource, newPathInSource));
}
/**
@@ -217,7 +217,8 @@
public void execute( CopyBranchCommand command ) throws RepositorySourceException, InterruptedException {
Path pathInSource = getPathInSource(command.getPath());
Path newPathInSource = getPathInSource(command.getNewPath());
- getConnection().execute(this.getExecutionContext(), new ProjectedCopyBranchCommand(command, pathInSource, newPathInSource));
+ getConnection().execute(this.getExecutionContext(),
+ new ProjectedCopyBranchCommand(command, pathInSource, newPathInSource));
}
/**
Modified: trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryConnectionTest.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryConnectionTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryConnectionTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -30,10 +30,10 @@
import static org.mockito.Mockito.verify;
import java.util.concurrent.TimeUnit;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
import org.jboss.dna.spi.graph.commands.GraphCommand;
import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
Modified: trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositorySourceTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -42,12 +42,12 @@
import org.jboss.dna.spi.DnaLexicon;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.ExecutionContextFactory;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
-import org.jboss.dna.spi.graph.connection.SimpleRepository;
-import org.jboss.dna.spi.graph.connection.SimpleRepositorySource;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
+import org.jboss.dna.spi.connector.SimpleRepository;
+import org.jboss.dna.spi.connector.SimpleRepositorySource;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -66,7 +66,7 @@
private String username;
private String credentials;
private String executionContextFactoryJndiName;
- private String connectionFactoriesJndiName;
+ private String repositorySourceRegistryJndiName;
private String configurationSourceName;
private String securityDomain;
private SimpleRepository configRepository;
@@ -77,7 +77,7 @@
@Mock
private Context jndiContext;
@Mock
- private RepositoryConnectionFactories connectionFactories;
+ private RepositorySourceRegistry sourceRegistry;
@Mock
private ExecutionContextFactory executionContextFactory;
@@ -90,7 +90,7 @@
context = new BasicExecutionContext();
context.getNamespaceRegistry().register(DnaLexicon.NAMESPACE_PREFIX, DnaLexicon.NAMESPACE_URI);
executionContextFactoryJndiName = "context factory jndi name";
- connectionFactoriesJndiName = "connection factories jndi name";
+ repositorySourceRegistryJndiName = "repository source registry jndi name";
configurationSourceName = "configuration source name";
repositoryName = "Test Repository";
securityDomain = "security domain";
@@ -103,7 +103,7 @@
source.setPassword(credentials);
source.setConfigurationSourceName(configurationSourceName);
source.setConfigurationSourceProjectionRules(new String[] {"/dna:system/dna:federation/ => /dna:repositories/Test Repository"});
- source.setConnectionFactoriesJndiName(connectionFactoriesJndiName);
+ source.setRepositorySourceRegistryJndiName(repositorySourceRegistryJndiName);
source.setExecutionContextFactoryJndiName(executionContextFactoryJndiName);
source.setContext(jndiContext);
source.setSecurityDomain(securityDomain);
@@ -122,9 +122,9 @@
configRepositorySource = new SimpleRepositorySource();
configRepositorySource.setRepositoryName(configRepository.getRepositoryName());
configRepositorySource.setName(configurationSourceName);
- stub(connectionFactories.getConnectionFactory(configurationSourceName)).toReturn(configRepositorySource);
+ stub(sourceRegistry.getRepositorySource(configurationSourceName)).toReturn(configRepositorySource);
stub(jndiContext.lookup(executionContextFactoryJndiName)).toReturn(executionContextFactory);
- stub(jndiContext.lookup(connectionFactoriesJndiName)).toReturn(connectionFactories);
+ stub(jndiContext.lookup(repositorySourceRegistryJndiName)).toReturn(sourceRegistry);
stub(executionContextFactory.create(eq(securityDomain), anyCallbackHandler())).toReturn(context);
}
@@ -266,7 +266,7 @@
source.setName("Some source");
source.setConfigurationSourceName("config source");
source.setConfigurationSourceProjectionRules(new String[] {"/dna:system => /a/b/c"});
- source.setConnectionFactoriesJndiName("connection factories jndi name");
+ source.setRepositorySourceRegistryJndiName("repository source registry jndi name");
source.setRepositoryJndiName("repository jndi name");
source.setExecutionContextFactoryJndiName("env jndi name");
@@ -290,8 +290,8 @@
is(source.getConfigurationSourceName()));
assertThat((String)refAttributes.remove(FederatedRepositorySource.CONFIGURATION_SOURCE_PROJECTION_RULES),
is("/dna:system => /a/b/c"));
- assertThat((String)refAttributes.remove(FederatedRepositorySource.CONNECTION_FACTORIES_JNDI_NAME),
- is(source.getConnectionFactoriesJndiName()));
+ assertThat((String)refAttributes.remove(FederatedRepositorySource.REPOSITORY_SOURCE_REGISTRY_JNDI_NAME),
+ is(source.getRepositorySourceRegistryJndiName()));
assertThat((String)refAttributes.remove(FederatedRepositorySource.EXECUTION_CONTEXT_FACTORY_JNDI_NAME),
is(source.getExecutionContextFactoryJndiName()));
assertThat((String)refAttributes.remove(FederatedRepositorySource.REPOSITORY_JNDI_NAME),
@@ -314,7 +314,7 @@
assertThat(recoveredSource.getRetryLimit(), is(source.getRetryLimit()));
assertThat(recoveredSource.getConfigurationSourceName(), is(source.getConfigurationSourceName()));
assertThat(recoveredSource.getConfigurationSourceProjectionRules(), is(source.getConfigurationSourceProjectionRules()));
- assertThat(recoveredSource.getConnectionFactoriesJndiName(), is(source.getConnectionFactoriesJndiName()));
+ assertThat(recoveredSource.getRepositorySourceRegistryJndiName(), is(source.getRepositorySourceRegistryJndiName()));
assertThat(recoveredSource.getExecutionContextFactoryJndiName(), is(source.getExecutionContextFactoryJndiName()));
assertThat(recoveredSource.getRepositoryJndiName(), is(source.getRepositoryJndiName()));
assertThat(recoveredSource.getSecurityDomain(), is(source.getSecurityDomain()));
Modified: trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryTest.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/FederatedRepositoryTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -28,9 +28,9 @@
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.hasItems;
import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
@@ -50,15 +50,13 @@
@Mock
private RepositorySourceListener listener2;
@Mock
- private RepositoryConnectionFactories connectionFactories;
+ private RepositorySourceRegistry registry;
- // private RepositoryConnectionPool connectionPool;
-
@Before
public void beforeEach() {
MockitoAnnotations.initMocks(this);
context = new BasicExecutionContext();
- repository = new FederatedRepository(context, connectionFactories, config);
+ repository = new FederatedRepository(context, registry, config);
}
@Test
Modified: trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionPathRuleTest.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionPathRuleTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionPathRuleTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -29,10 +29,10 @@
import org.jboss.dna.common.text.TextEncoder;
import org.jboss.dna.common.text.UrlEncoder;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
import org.jboss.dna.spi.graph.NamespaceRegistry;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
import org.junit.Before;
import org.junit.Test;
Modified: trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionTest.java
===================================================================
--- trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-federation/src/test/java/org/jboss/dna/connector/federation/ProjectionTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -27,9 +27,9 @@
import static org.mockito.Mockito.stub;
import java.util.Set;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
Modified: trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryConnection.java
===================================================================
--- trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryConnection.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryConnection.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -26,12 +26,12 @@
import javax.transaction.xa.XAResource;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
import org.jboss.dna.spi.graph.commands.ActsAsUpdate;
import org.jboss.dna.spi.graph.commands.GraphCommand;
import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
/**
* @author Randall Hauch
Modified: trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java
===================================================================
--- trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -40,14 +40,13 @@
import net.jcip.annotations.GuardedBy;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.cache.CachePolicy;
-import org.jboss.dna.spi.graph.connection.AbstractRepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositorySourceCapabilities;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
+import org.jboss.dna.spi.connector.AbstractRepositorySource;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceCapabilities;
+import org.jboss.dna.spi.connector.RepositorySourceException;
/**
* @author Randall Hauch
- * @author John Verhaeg
*/
public class InMemoryRepositorySource extends AbstractRepositorySource implements ObjectFactory {
@@ -96,7 +95,6 @@
private String jndiName;
private UUID rootNodeUuid = UUID.randomUUID();
private CachePolicy defaultCachePolicy;
- // private String configurationName;
private transient InMemoryRepository repository;
/**
@@ -225,7 +223,7 @@
/**
* {@inheritDoc}
*
- * @see org.jboss.dna.spi.graph.connection.AbstractRepositorySource#createConnection()
+ * @see org.jboss.dna.spi.connector.AbstractRepositorySource#createConnection()
*/
@Override
protected synchronized RepositoryConnection createConnection() throws RepositorySourceException {
@@ -265,7 +263,7 @@
/**
* {@inheritDoc}
*
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#getCapabilities()
+ * @see org.jboss.dna.spi.connector.RepositorySource#getCapabilities()
*/
public RepositorySourceCapabilities getCapabilities() {
return new Capabilities();
Modified: trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java
===================================================================
--- trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -32,6 +32,9 @@
import org.jboss.cache.Node;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.NameFactory;
import org.jboss.dna.spi.graph.Path;
@@ -53,9 +56,6 @@
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
import org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor;
import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
/**
* @author Randall Hauch
Modified: trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java
===================================================================
--- trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -45,10 +45,10 @@
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.DnaLexicon;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.AbstractRepositorySource;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceCapabilities;
import org.jboss.dna.spi.graph.Name;
-import org.jboss.dna.spi.graph.connection.AbstractRepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositorySourceCapabilities;
/**
* @author Randall Hauch
@@ -282,7 +282,7 @@
/**
* {@inheritDoc}
*
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#getCapabilities()
+ * @see org.jboss.dna.spi.connector.RepositorySource#getCapabilities()
*/
public RepositorySourceCapabilities getCapabilities() {
return new Capabilities();
Modified: trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectionTest.java
===================================================================
--- trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectionTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/connectors/dna-connector-jbosscache/src/test/java/org/jboss/dna/connector/jbosscache/JBossCacheConnectionTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -42,12 +42,12 @@
import org.jboss.dna.spi.DnaLexicon;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
import org.jboss.dna.spi.graph.PathNotFoundException;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
-import org.jboss.dna.spi.graph.connection.RepositorySourceListener;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositoryService.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -45,6 +45,7 @@
import org.jboss.dna.repository.services.AdministeredService;
import org.jboss.dna.repository.services.ServiceAdministrator;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySource;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.NameFactory;
import org.jboss.dna.spi.graph.Path;
@@ -58,8 +59,6 @@
import org.jboss.dna.spi.graph.commands.impl.BasicCompositeCommand;
import org.jboss.dna.spi.graph.commands.impl.BasicGetChildrenCommand;
import org.jboss.dna.spi.graph.commands.impl.BasicGetNodeCommand;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
/**
* @author Randall Hauch
@@ -197,8 +196,7 @@
NameFactory nameFactory = valueFactories.getNameFactory();
final String configurationSourceName = configurationProjection.getSourceName();
- RepositoryConnectionFactory factory = sources.getConnectionFactory(configurationSourceName);
- if (factory == null) {
+ if (sources.getRepositorySource(configurationSourceName) == null) {
throw new FederationException(RepositoryI18n.unableToFindRepositorySourceWithName.text(configurationSourceName));
}
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositorySourceManager.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositorySourceManager.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/RepositorySourceManager.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -29,15 +29,14 @@
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.jboss.dna.repository.services.AbstractServiceAdministrator;
import org.jboss.dna.repository.services.ServiceAdministrator;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
-import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceRegistry;
/**
* @author Randall Hauch
*/
-public class RepositorySourceManager implements RepositoryConnectionFactories {
+public class RepositorySourceManager implements RepositorySourceRegistry {
/**
* The administrative component for this service.
@@ -89,29 +88,35 @@
private final ServiceAdministrator administrator = new Administrator();
private final ReadWriteLock sourcesLock = new ReentrantReadWriteLock();
private final CopyOnWriteArrayList<RepositorySource> sources = new CopyOnWriteArrayList<RepositorySource>();
- private RepositoryConnectionFactories delegate;
+ private RepositorySourceRegistry delegate;
/**
* Create a new manager instance.
*
- * @param delegate the factories object that this instance should delegate to in the event that a source is not found in this
+ * @param delegate the registry to which this instance should delegate in the event that a source is not found in this
* manager; may be null if there is no delegate
*/
- public RepositorySourceManager( RepositoryConnectionFactories delegate ) {
+ public RepositorySourceManager( RepositorySourceRegistry delegate ) {
this.delegate = delegate;
}
/**
- * @return delegate
+ * Get the delegate registry.
+ *
+ * @return the registry to which this instance should delegate in the event that a source is not found in this manager, or
+ * null if there is no delegate
*/
- public RepositoryConnectionFactories getDelegate() {
+ public RepositorySourceRegistry getDelegate() {
return delegate;
}
/**
- * @param delegate Sets delegate to the specified value.
+ * Set the delegate registry.
+ *
+ * @param delegate the registry to which this instance should delegate in the event that a source is not found in this
+ * manager; may be null if there is no delegate
*/
- public void setDelegate( RepositoryConnectionFactories delegate ) {
+ public void setDelegate( RepositorySourceRegistry delegate ) {
this.delegate = delegate;
}
@@ -305,17 +310,17 @@
/**
* {@inheritDoc}
*
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories#getConnectionFactory(java.lang.String)
+ * @see org.jboss.dna.spi.connector.RepositorySourceRegistry#getRepositorySource(java.lang.String)
*/
- public RepositoryConnectionFactory getConnectionFactory( String sourceName ) {
+ public RepositorySource getRepositorySource( String sourceName ) {
try {
this.sourcesLock.readLock().lock();
for (RepositorySource existingSource : this.sources) {
if (existingSource.getName().equals(sourceName)) return existingSource;
}
- RepositoryConnectionFactories delegate = this.delegate;
+ RepositorySourceRegistry delegate = this.delegate;
if (delegate != null) {
- return delegate.getConnectionFactory(sourceName);
+ return delegate.getRepositorySource(sourceName);
}
} finally {
this.sourcesLock.readLock().unlock();
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/util/BasicJcrExecutionContext.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -22,10 +22,10 @@
package org.jboss.dna.repository.util;
import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
import org.jboss.dna.spi.graph.NamespaceRegistry;
import org.jboss.dna.spi.graph.PropertyFactory;
import org.jboss.dna.spi.graph.ValueFactories;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
/**
* @author Randall Hauch
Modified: trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java
===================================================================
--- trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-repository/src/test/java/org/jboss/dna/repository/RepositoryServiceTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -41,13 +41,13 @@
import org.jboss.dna.repository.services.ServiceAdministrator;
import org.jboss.dna.spi.DnaLexicon;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.SimpleRepository;
+import org.jboss.dna.spi.connector.SimpleRepositorySource;
import org.jboss.dna.spi.graph.NamespaceRegistry;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
import org.jboss.dna.spi.graph.PropertyFactory;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
-import org.jboss.dna.spi.graph.connection.SimpleRepository;
-import org.jboss.dna.spi.graph.connection.SimpleRepositorySource;
import org.jboss.dna.spi.graph.impl.BasicNamespaceRegistry;
import org.jboss.dna.spi.graph.impl.BasicPropertyFactory;
import org.jboss.dna.spi.graph.impl.StandardValueFactories;
@@ -98,7 +98,7 @@
configRepositorySource = new SimpleRepositorySource();
configRepositorySource.setRepositoryName(configRepository.getRepositoryName());
configRepositorySource.setName(configSourceName);
- stub(sources.getConnectionFactory(configSourceName)).toReturn(configRepositorySource);
+ stub(sources.getRepositorySource(configSourceName)).toReturn(configRepositorySource);
stub(context.getValueFactories()).toReturn(valueFactories);
stub(context.getPropertyFactory()).toReturn(propertyFactory);
stub(context.getNamespaceRegistry()).toReturn(registry);
@@ -158,14 +158,14 @@
@Test( expected = FederationException.class )
public void shouldFailToStartUpIfConfigurationRepositorySourceIsNotFound() {
- stub(sources.getConnectionFactory(configSourceName)).toReturn(null);
+ stub(sources.getRepositorySource(configSourceName)).toReturn(null);
service.getAdministrator().start();
}
@Test( expected = FederationException.class )
public void shouldFailToStartUpIfUnableToConnectToConfigurationRepository() throws Exception {
RepositorySource mockSource = mock(RepositorySource.class);
- stub(sources.getConnectionFactory(configSourceName)).toReturn(mockSource);
+ stub(sources.getRepositorySource(configSourceName)).toReturn(mockSource);
stub(mockSource.getConnection()).toThrow(new UnsupportedOperationException());
service.getAdministrator().start();
}
@@ -173,7 +173,7 @@
@Test( expected = FederationException.class )
public void shouldFailToStartUpIfInterruptedWhileConnectingToConfigurationRepository() throws Exception {
RepositorySource mockSource = mock(RepositorySource.class);
- stub(sources.getConnectionFactory(configSourceName)).toReturn(mockSource);
+ stub(sources.getRepositorySource(configSourceName)).toReturn(mockSource);
stub(mockSource.getConnection()).toThrow(new InterruptedException());
service.getAdministrator().start();
}
@@ -207,21 +207,21 @@
// and verify that the sources were added to the manager...
assertThat(sources.getSources().size(), is(4));
- assertThat(sources.getConnectionFactory("source A"), is(instanceOf(SimpleRepositorySource.class)));
- assertThat(sources.getConnectionFactory("source B"), is(instanceOf(SimpleRepositorySource.class)));
- assertThat(sources.getConnectionFactory("source C"), is(instanceOf(SimpleRepositorySource.class)));
+ assertThat(sources.getRepositorySource("source A"), is(instanceOf(SimpleRepositorySource.class)));
+ assertThat(sources.getRepositorySource("source B"), is(instanceOf(SimpleRepositorySource.class)));
+ assertThat(sources.getRepositorySource("source C"), is(instanceOf(SimpleRepositorySource.class)));
- SimpleRepositorySource sourceA = (SimpleRepositorySource)sources.getConnectionFactory("source A");
+ SimpleRepositorySource sourceA = (SimpleRepositorySource)sources.getRepositorySource("source A");
assertThat(sourceA.getName(), is("source A"));
assertThat(sourceA.getRepositoryName(), is("sourceReposA"));
assertThat(sourceA.getRetryLimit(), is(3));
- SimpleRepositorySource sourceB = (SimpleRepositorySource)sources.getConnectionFactory("source B");
+ SimpleRepositorySource sourceB = (SimpleRepositorySource)sources.getRepositorySource("source B");
assertThat(sourceB.getName(), is("source B"));
assertThat(sourceB.getRepositoryName(), is("sourceReposB"));
assertThat(sourceB.getRetryLimit(), is(SimpleRepositorySource.DEFAULT_RETRY_LIMIT));
- SimpleRepositorySource sourceC = (SimpleRepositorySource)sources.getConnectionFactory("source C");
+ SimpleRepositorySource sourceC = (SimpleRepositorySource)sources.getRepositorySource("source C");
assertThat(sourceC.getName(), is("source C"));
assertThat(sourceC.getRepositoryName(), is("sourceReposC"));
assertThat(sourceC.getRetryLimit(), is(SimpleRepositorySource.DEFAULT_RETRY_LIMIT));
@@ -236,7 +236,7 @@
service.getAdministrator().start();
// and verify that the configuration source was obtained from the manager ...
- verify(sources, times(2)).getConnectionFactory(configSourceName); // once for checking source, second for getting
+ verify(sources, times(2)).getRepositorySource(configSourceName); // once for checking source, second for getting
// and verify that the sources were never added to the manager...
verifyNoMoreInteractions(sources);
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector (from rev 389, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection)
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/AbstractRepositorySource.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,203 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import net.jcip.annotations.ThreadSafe;
-
-/**
- * An abstract implementation of {@link RepositorySource} that may serve as a foundation for most implementations, since it
- * automatically manages the {@link RepositoryConnection connections} using an internal {@link ManagedRepositoryConnectionFactory pool}.
- *
- * @author Randall Hauch
- */
-@ThreadSafe
-public abstract class AbstractRepositorySource implements RepositorySource {
-
- /**
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * The default limit is {@value} for retrying {@link RepositoryConnection connection} calls to the underlying source.
- */
- public static final int DEFAULT_RETRY_LIMIT = 0;
-
- private final AtomicInteger retryLimit = new AtomicInteger(DEFAULT_RETRY_LIMIT);
- private final RepositoryConnectionPool connections;
- private final RepositoryConnectionFactory connectionFactory;
-
- /**
- * Create a new instance of the repository source, relying upon the {@link #createConnection()} method to do the actual
- * creation of the {@link RepositoryConnection connections}.
- */
- protected AbstractRepositorySource() {
- this(null);
- }
-
- /**
- * Create a new instance of the repository source, relying upon the supplied factory to do the actual creation of the
- * {@link RepositoryConnection connections}. If the supplied factory is null, then this class will use the
- * {@link #createConnection()} method to do the actual creation of the {@link RepositoryConnection connections}.
- *
- * @param factory the connection factory that creates the connections, or null if the {@link #createConnection()} method
- * should be used to create connections
- */
- protected AbstractRepositorySource( RepositoryConnectionFactory factory ) {
- this.connectionFactory = factory != null ? factory : new ConnectionFactory();
- this.connections = new RepositoryConnectionPool(this.connectionFactory);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#getRetryLimit()
- */
- public int getRetryLimit() {
- return retryLimit.get();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#setRetryLimit(int)
- */
- public void setRetryLimit( int limit ) {
- retryLimit.set(limit < 0 ? 0 : limit);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isRunning()
- */
- public boolean isRunning() {
- return this.connections.isRunning();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isShutdown()
- */
- public boolean isShutdown() {
- return this.connections.isShutdown();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory#getConnection()
- */
- public RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException {
- return this.connections.getConnection();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#shutdown()
- */
- public void shutdown() {
- this.connections.shutdown();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#shutdownNow()
- */
- public void shutdownNow() {
- this.connections.shutdownNow();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isTerminated()
- */
- public boolean isTerminated() {
- return this.connections.isTerminated();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isTerminating()
- */
- public boolean isTerminating() {
- return this.connections.isTerminating();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#awaitTermination(long, java.util.concurrent.TimeUnit)
- */
- public boolean awaitTermination( long timeout,
- TimeUnit unit ) throws InterruptedException {
- return this.connections.awaitTermination(timeout, unit);
- }
-
- /**
- * Method to create a new {@link RepositoryConnection} instance. This method is called only when this instance was
- * {@link #AbstractRepositorySource(RepositoryConnectionFactory) constructed} with a null {@link RepositoryConnectionFactory}
- * reference. This makes it easy for subclasses to simply override this method can not be required to implement a separate
- * connection factory.
- *
- * @return the new connection
- * @throws RepositorySourceException
- * @throws InterruptedException
- */
- protected RepositoryConnection createConnection() throws RepositorySourceException, InterruptedException {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Class that is used by the {@link AbstractRepositorySource} and it's pool to create connections as needed, by delegating to
- * the {@link AbstractRepositorySource}'s {@link AbstractRepositorySource#createConnection()} method.
- *
- * @author Randall Hauch
- */
- protected class ConnectionFactory implements RepositoryConnectionFactory {
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory#getConnection()
- */
- public RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException {
- return AbstractRepositorySource.this.createConnection();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory#getName()
- */
- public String getName() {
- return AbstractRepositorySource.this.getName();
- }
-
- }
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/AbstractRepositorySource.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/AbstractRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,221 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import net.jcip.annotations.ThreadSafe;
+
+/**
+ * An abstract implementation of {@link RepositorySource} that may serve as a foundation for most implementations, since it
+ * automatically manages the {@link RepositoryConnection connections} using an internal {@link RepositoryConnectionPool pool}.
+ *
+ * @author Randall Hauch
+ */
+@ThreadSafe
+public abstract class AbstractRepositorySource implements RepositorySource {
+
+ /**
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * The default limit is {@value} for retrying {@link RepositoryConnection connection} calls to the underlying source.
+ */
+ public static final int DEFAULT_RETRY_LIMIT = 0;
+
+ private final AtomicInteger retryLimit = new AtomicInteger(DEFAULT_RETRY_LIMIT);
+ private RepositoryConnectionPool.ConnectionFactory connectionFactory;
+ private transient RepositoryConnectionPool connections;
+
+ /**
+ * Create a new instance of the repository source. This constructor calls relying upon the {@link #createConnectionFactory()}
+ * method, which creation of the {@link RepositoryConnection connections}.
+ */
+ protected AbstractRepositorySource() {
+ this.connectionFactory = createConnectionFactory();
+ assert this.connectionFactory != null;
+ this.connections = new RepositoryConnectionPool(this.connectionFactory);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#getRetryLimit()
+ */
+ public int getRetryLimit() {
+ return retryLimit.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#setRetryLimit(int)
+ */
+ public void setRetryLimit( int limit ) {
+ retryLimit.set(limit < 0 ? 0 : limit);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#isRunning()
+ */
+ public boolean isRunning() {
+ return this.connections.isRunning();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#isShutdown()
+ */
+ public boolean isShutdown() {
+ return this.connections.isShutdown();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#getConnection()
+ */
+ public RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException {
+ return this.connections.getConnection();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#shutdown()
+ */
+ public void shutdown() {
+ this.connections.shutdown();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#shutdownNow()
+ */
+ public void shutdownNow() {
+ this.connections.shutdownNow();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#isTerminated()
+ */
+ public boolean isTerminated() {
+ return this.connections.isTerminated();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#isTerminating()
+ */
+ public boolean isTerminating() {
+ return this.connections.isTerminating();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#awaitTermination(long, java.util.concurrent.TimeUnit)
+ */
+ public boolean awaitTermination( long timeout,
+ TimeUnit unit ) throws InterruptedException {
+ return this.connections.awaitTermination(timeout, unit);
+ }
+
+ private void writeObject( java.io.ObjectOutputStream out ) throws IOException {
+ out.writeInt(this.getRetryLimit());
+ // Write out the pool's state, since the pool is not serializable ...
+ out.writeLong(connections.getKeepAliveTime(TimeUnit.NANOSECONDS));
+ out.writeInt(connections.getCorePoolSize());
+ out.writeInt(connections.getMaximumPoolSize());
+ out.writeInt(connections.getMaxFailedAttemptsBeforeError());
+ out.writeBoolean(connections.getValidateConnectionBeforeUse());
+ out.writeLong(connections.getPingTimeoutInNanos());
+ }
+
+ private void readObject( java.io.ObjectInputStream in ) throws IOException {
+ setRetryLimit(in.readInt());
+ connectionFactory = createConnectionFactory();
+ // Read the pool state parameters ...
+ final long keepAliveTimeInNanos = in.readLong();
+ final int corePoolSize = in.readInt();
+ final int maxPoolSize = in.readInt();
+ final int maxFailedAttemptsBeforeError = in.readInt();
+ final boolean validateConnections = in.readBoolean();
+ final long pingTimeoutInNanos = in.readLong();
+ // Create a new pool and set it's parameters ...
+ connections = new RepositoryConnectionPool(connectionFactory, corePoolSize, maxPoolSize, keepAliveTimeInNanos,
+ TimeUnit.NANOSECONDS);
+ connections.setMaxFailedAttemptsBeforeError(maxFailedAttemptsBeforeError);
+ connections.setValidateConnectionBeforeUse(validateConnections);
+ connections.setPingTimeout(pingTimeoutInNanos, TimeUnit.NANOSECONDS);
+ }
+
+ /**
+ * Create a connection factory that should be used. The default implementation returns a factory that delegates to the
+ * {@link #createConnection()} method, which should be overridden.
+ *
+ * @return the connection factory; never null
+ */
+ protected RepositoryConnectionPool.ConnectionFactory createConnectionFactory() {
+ return new RepositoryConnectionPool.ConnectionFactory() {
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnectionPool.ConnectionFactory#createConnection()
+ */
+ public RepositoryConnection createConnection() throws RepositorySourceException, InterruptedException {
+ return AbstractRepositorySource.this.createConnection();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnectionPool#getSourceName()
+ */
+ public String getSourceName() {
+ return AbstractRepositorySource.this.getName();
+ }
+ };
+ }
+
+ /**
+ * Method to create a new {@link RepositoryConnection} instance. This method is called by the
+ * {@link RepositoryConnectionPool.ConnectionFactory} returned by the default implementation of
+ * {@link #createConnectionFactory()}. If the {@link #createConnectionFactory()} method is overridden, this method will not be
+ * called.
+ *
+ * @return the new connection
+ * @throws RepositorySourceException
+ * @throws InterruptedException
+ */
+ protected abstract RepositoryConnection createConnection() throws RepositorySourceException, InterruptedException;
+
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/BasicExecutionContext.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,108 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import javax.security.auth.Subject;
-import org.jboss.dna.common.util.ArgCheck;
-import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.graph.NamespaceRegistry;
-import org.jboss.dna.spi.graph.PropertyFactory;
-import org.jboss.dna.spi.graph.ValueFactories;
-import org.jboss.dna.spi.graph.impl.BasicNamespaceRegistry;
-import org.jboss.dna.spi.graph.impl.BasicPropertyFactory;
-import org.jboss.dna.spi.graph.impl.StandardValueFactories;
-
-/**
- * @author Randall Hauch
- */
-public class BasicExecutionContext implements ExecutionContext {
-
- private final Subject subject;
- private final PropertyFactory propertyFactory;
- private final ValueFactories valueFactories;
- private final NamespaceRegistry namespaceRegistry;
-
- public BasicExecutionContext() {
- this(new Subject(), new BasicNamespaceRegistry());
- }
-
- public BasicExecutionContext( NamespaceRegistry namespaceRegistry ) {
- this(new Subject(), namespaceRegistry, null, null);
- }
-
- public BasicExecutionContext( NamespaceRegistry namespaceRegistry,
- ValueFactories valueFactories,
- PropertyFactory propertyFactory ) {
- this(new Subject(), namespaceRegistry, valueFactories, propertyFactory);
- }
-
- public BasicExecutionContext( Subject subject ) {
- this(subject, new BasicNamespaceRegistry());
- }
-
- public BasicExecutionContext( Subject subject,
- NamespaceRegistry namespaceRegistry ) {
- this(subject, namespaceRegistry, null, null);
- }
-
- public BasicExecutionContext( Subject subject,
- NamespaceRegistry namespaceRegistry,
- ValueFactories valueFactories,
- PropertyFactory propertyFactory ) {
- ArgCheck.isNotNull(subject, "subject");
- ArgCheck.isNotNull(namespaceRegistry, "namespace registry");
- this.subject = subject;
- this.namespaceRegistry = namespaceRegistry;
- this.valueFactories = valueFactories != null ? valueFactories : new StandardValueFactories(this.namespaceRegistry);
- this.propertyFactory = propertyFactory != null ? propertyFactory : new BasicPropertyFactory(this.valueFactories);
- }
-
- /**
- * {@inheritDoc}
- */
- public NamespaceRegistry getNamespaceRegistry() {
- return this.namespaceRegistry;
- }
-
- /**
- * {@inheritDoc}
- */
- public ValueFactories getValueFactories() {
- return this.valueFactories;
- }
-
- /**
- * {@inheritDoc}
- */
- public PropertyFactory getPropertyFactory() {
- return this.propertyFactory;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.ExecutionContext#getSubject()
- */
- public Subject getSubject() {
- return this.subject;
- }
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/BasicExecutionContext.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/BasicExecutionContext.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,161 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.graph.NamespaceRegistry;
+import org.jboss.dna.spi.graph.PropertyFactory;
+import org.jboss.dna.spi.graph.ValueFactories;
+import org.jboss.dna.spi.graph.impl.BasicNamespaceRegistry;
+import org.jboss.dna.spi.graph.impl.BasicPropertyFactory;
+import org.jboss.dna.spi.graph.impl.StandardValueFactories;
+
+/**
+ * @author Randall Hauch
+ * @author John Verhaeg
+ */
+public class BasicExecutionContext implements ExecutionContext {
+
+ private final LoginContext loginContext;
+ private final AccessControlContext accessControlContext;
+ private final Subject subject;
+ private final PropertyFactory propertyFactory;
+ private final ValueFactories valueFactories;
+ private final NamespaceRegistry namespaceRegistry;
+
+ public BasicExecutionContext() {
+ this(new BasicNamespaceRegistry());
+ }
+
+ public BasicExecutionContext( NamespaceRegistry namespaceRegistry ) {
+ this(namespaceRegistry, null, null);
+ }
+
+ public BasicExecutionContext( LoginContext loginContext ) {
+ this(loginContext, new BasicNamespaceRegistry());
+ }
+
+ public BasicExecutionContext( AccessControlContext accessControlContext ) {
+ this(accessControlContext, new BasicNamespaceRegistry());
+ }
+
+ public BasicExecutionContext( LoginContext loginContext,
+ NamespaceRegistry namespaceRegistry ) {
+ this(loginContext, namespaceRegistry, null, null);
+ }
+
+ public BasicExecutionContext( AccessControlContext accessControlContext,
+ NamespaceRegistry namespaceRegistry ) {
+ this(accessControlContext, namespaceRegistry, null, null);
+ }
+
+ public BasicExecutionContext( NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ this(null, null, namespaceRegistry, valueFactories, propertyFactory);
+ }
+
+ public BasicExecutionContext( LoginContext loginContext,
+ NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ this(loginContext, null, namespaceRegistry, valueFactories, propertyFactory);
+ }
+
+ public BasicExecutionContext( AccessControlContext accessControlContext,
+ NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ this(null, accessControlContext, namespaceRegistry, valueFactories, propertyFactory);
+ }
+
+ private BasicExecutionContext( LoginContext loginContext,
+ AccessControlContext accessControlContext,
+ NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ this.loginContext = loginContext;
+ this.accessControlContext = accessControlContext;
+ if (loginContext == null) {
+ this.subject = Subject.getSubject(accessControlContext == null ? AccessController.getContext() : accessControlContext);
+ } else {
+ this.subject = loginContext.getSubject();
+ }
+ this.namespaceRegistry = namespaceRegistry;
+ this.valueFactories = valueFactories != null ? valueFactories : new StandardValueFactories(this.namespaceRegistry);
+ this.propertyFactory = propertyFactory != null ? propertyFactory : new BasicPropertyFactory(this.valueFactories);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getAccessControlContext()
+ */
+ public AccessControlContext getAccessControlContext() {
+ return accessControlContext;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getLoginContext()
+ */
+ public LoginContext getLoginContext() {
+ return loginContext;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NamespaceRegistry getNamespaceRegistry() {
+ return namespaceRegistry;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public PropertyFactory getPropertyFactory() {
+ return propertyFactory;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getSubject()
+ */
+ public Subject getSubject() {
+ return subject;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public ValueFactories getValueFactories() {
+ return valueFactories;
+ }
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/ManagedRepositoryConnectionFactory.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/ManagedRepositoryConnectionFactory.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/ManagedRepositoryConnectionFactory.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,111 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Randall Hauch
- */
-public interface ManagedRepositoryConnectionFactory extends RepositoryConnectionFactory {
-
- /**
- * Initiates an orderly shutdown in which connections that are currently in use are allowed to be used and closed as normal,
- * but no new connections will be created. Invocation has no additional effect if already shut down.
- * <p>
- * Once the pool has been shutdown, it may not be used to {@link #getConnection() get connections}.
- * </p>
- *
- * @throws SecurityException if a security manager exists and shutting down this pool may manipulate threads that the caller
- * is not permitted to modify because it does not hold {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
- * or the security manager's <tt>checkAccess</tt> method denies access.
- * @see #shutdownNow()
- */
- void shutdown();
-
- /**
- * Attempts to close all connections, including those connections currently in use, and prevent the use of other connections.
- *
- * @throws SecurityException if a security manager exists and shutting down this pool may manipulate threads that the caller
- * is not permitted to modify because it does not hold {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
- * or the security manager's <tt>checkAccess</tt> method denies access.
- * @see #shutdown()
- */
- void shutdownNow();
-
- /**
- * Return whether this connection pool is running and is able to {@link #getConnection() provide connections}. Note that this
- * method is effectively <code>!isShutdown()</code>.
- *
- * @return true if this pool is running, or false otherwise
- * @see #isShutdown()
- * @see #isTerminated()
- * @see #isTerminating()
- */
- boolean isRunning();
-
- /**
- * Return whether this connection pool is in the process of shutting down or has already been shut down. A result of
- * <code>true</code> signals that the pool may no longer be used. Note that this method is effectively
- * <code>!isRunning()</code>.
- *
- * @return true if this pool has been shut down, or false otherwise
- * @see #isShutdown()
- * @see #isTerminated()
- * @see #isTerminating()
- */
- boolean isShutdown();
-
- /**
- * Returns true if this pool is in the process of terminating after {@link #shutdown()} or {@link #shutdownNow()} has been
- * called but has not completely terminated. This method may be useful for debugging. A return of <tt>true</tt> reported a
- * sufficient period after shutdown may indicate that submitted tasks have ignored or suppressed interruption, causing this
- * executor not to properly terminate.
- *
- * @return true if terminating but not yet terminated, or false otherwise
- * @see #isTerminated()
- */
- boolean isTerminating();
-
- /**
- * Return true if this pool has completed its termination and no longer has any open connections.
- *
- * @return true if terminated, or false otherwise
- * @see #isTerminating()
- */
- boolean isTerminated();
-
- /**
- * Method that can be called after {@link #shutdown()} or {@link #shutdownNow()} to wait until all connections in use at the
- * time those methods were called have been closed normally. This method accepts a maximum time duration, after which it will
- * return even if all connections have not been closed.
- *
- * @param timeout the maximum time to wait for all connections to be closed and returned to the pool
- * @param unit the time unit for <code>timeout</code>
- * @return true if the pool was terminated in the supplied time (or was already terminated), or false if the timeout occurred
- * before all the connections were closed
- * @throws InterruptedException if the thread was interrupted
- */
- boolean awaitTermination( long timeout,
- TimeUnit unit ) throws InterruptedException;
-
-}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnection.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,99 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.concurrent.TimeUnit;
-import javax.transaction.xa.XAResource;
-import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.cache.CachePolicy;
-import org.jboss.dna.spi.graph.commands.GraphCommand;
-
-/**
- * A connection to a repository source.
- * <p>
- * These connections need not support concurrent operations by multiple threads, since the federation engine never uses them this
- * way.
- * </p>
- *
- * @author Randall Hauch
- */
-public interface RepositoryConnection {
-
- /**
- * Get the name for this repository source. This value should be the same as that {@link RepositorySource#getName() returned}
- * by the same {@link RepositorySource} that created this connection.
- *
- * @return the identifier; never null or empty
- */
- String getSourceName();
-
- /**
- * Return the transactional resource associated with this connection. The transaction manager will use this resource to manage
- * the participation of this connection in a distributed transaction.
- *
- * @return the XA resource, or null if this connection is not aware of distributed transactions
- */
- XAResource getXAResource();
-
- /**
- * Ping the underlying system to determine if the connection is still valid and alive.
- *
- * @param time the length of time to wait before timing out
- * @param unit the time unit to use; may not be null
- * @return true if this connection is still valid and can still be used, or false otherwise
- * @throws InterruptedException if the thread has been interrupted during the operation
- */
- boolean ping( long time,
- TimeUnit unit ) throws InterruptedException;
-
- /**
- * Set the listener that is to receive notifications to changes to content within this source.
- *
- * @param listener the new listener, or null if no component is interested in the change notifications
- */
- void setListener( RepositorySourceListener listener );
-
- /**
- * Get the default cache policy for this repository. If none is provided, a global cache policy will be used.
- *
- * @return the default cache policy
- */
- CachePolicy getDefaultCachePolicy();
-
- /**
- * Execute the supplied commands against this repository source.
- *
- * @param context the environment in which the commands are being executed; never null
- * @param commands the commands to be executed; never null
- * @throws RepositorySourceException if there is a problem loading the node data
- * @throws InterruptedException if the thread has been interrupted during the operation
- */
- void execute( ExecutionContext context,
- GraphCommand... commands ) throws RepositorySourceException, InterruptedException;
-
- /**
- * Close this connection to signal that it is no longer needed and that any accumulated resources are to be released.
- *
- * @throws InterruptedException if the thread has been interrupted while the close was in progress
- */
- void close() throws InterruptedException;
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnection.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnection.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,100 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.util.concurrent.TimeUnit;
+import javax.transaction.xa.XAResource;
+import net.jcip.annotations.NotThreadSafe;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.graph.commands.GraphCommand;
+
+/**
+ * A connection to a repository source.
+ * <p>
+ * These connections need not support concurrent operations by multiple threads.
+ * </p>
+ *
+ * @author Randall Hauch
+ */
+@NotThreadSafe
+public interface RepositoryConnection {
+
+ /**
+ * Get the name for this repository source. This value should be the same as that {@link RepositorySource#getName() returned}
+ * by the same {@link RepositorySource} that created this connection.
+ *
+ * @return the identifier; never null or empty
+ */
+ String getSourceName();
+
+ /**
+ * Return the transactional resource associated with this connection. The transaction manager will use this resource to manage
+ * the participation of this connection in a distributed transaction.
+ *
+ * @return the XA resource, or null if this connection is not aware of distributed transactions
+ */
+ XAResource getXAResource();
+
+ /**
+ * Ping the underlying system to determine if the connection is still valid and alive.
+ *
+ * @param time the length of time to wait before timing out
+ * @param unit the time unit to use; may not be null
+ * @return true if this connection is still valid and can still be used, or false otherwise
+ * @throws InterruptedException if the thread has been interrupted during the operation
+ */
+ boolean ping( long time,
+ TimeUnit unit ) throws InterruptedException;
+
+ /**
+ * Set the listener that is to receive notifications to changes to content within this source.
+ *
+ * @param listener the new listener, or null if no component is interested in the change notifications
+ */
+ void setListener( RepositorySourceListener listener );
+
+ /**
+ * Get the default cache policy for this repository. If none is provided, a global cache policy will be used.
+ *
+ * @return the default cache policy
+ */
+ CachePolicy getDefaultCachePolicy();
+
+ /**
+ * Execute the supplied commands against this repository source.
+ *
+ * @param context the environment in which the commands are being executed; never null
+ * @param commands the commands to be executed; never null
+ * @throws RepositorySourceException if there is a problem loading the node data
+ * @throws InterruptedException if the thread has been interrupted during the operation
+ */
+ void execute( ExecutionContext context,
+ GraphCommand... commands ) throws RepositorySourceException, InterruptedException;
+
+ /**
+ * Close this connection to signal that it is no longer needed and that any accumulated resources are to be released.
+ *
+ * @throws InterruptedException if the thread has been interrupted while the close was in progress
+ */
+ void close() throws InterruptedException;
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionFactories.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionFactories.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionFactories.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,32 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-
-/**
- * @author Randall Hauch
- */
-public interface RepositoryConnectionFactories {
-
- RepositoryConnectionFactory getConnectionFactory( String sourceName );
-
-}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionFactory.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionFactory.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionFactory.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-/**
- * @author Randall Hauch
- */
-public interface RepositoryConnectionFactory {
-
- /**
- * Get the name for this repository source.
- * @return the name; never null or empty
- */
- String getName();
-
- /**
- * Get a connection from this factory.
- * @return a connection
- * @throws RepositorySourceException if there is a problem obtaining a connection
- * @throws InterruptedException if the thread is interrupted while attempting to get a connection
- * @throws IllegalStateException if the factory is not in a state to create or return connections
- */
- RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException;
-}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionPool.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,969 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-import javax.transaction.xa.XAResource;
-import net.jcip.annotations.GuardedBy;
-import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.common.util.ArgCheck;
-import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.SpiI18n;
-import org.jboss.dna.spi.cache.CachePolicy;
-import org.jboss.dna.spi.graph.commands.GraphCommand;
-
-/**
- * @author Randall Hauch
- */
-@ThreadSafe
-public class RepositoryConnectionPool implements ManagedRepositoryConnectionFactory {
-
- /**
- * The core pool size for default-constructed pools is {@value} .
- */
- public static final int DEFAULT_CORE_POOL_SIZE = 1;
-
- /**
- * The maximum pool size for default-constructed pools is {@value} .
- */
- public static final int DEFAULT_MAXIMUM_POOL_SIZE = 10;
-
- /**
- * The keep-alive time for connections in default-constructed pools is {@value} seconds.
- */
- public static final long DEFAULT_KEEP_ALIVE_TIME_IN_SECONDS = 30;
-
- /**
- * Permission for checking shutdown
- */
- private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");
-
- /**
- * The factory that this pool uses to create new connections.
- */
- private final RepositoryConnectionFactory connectionFactory;
-
- /**
- * Lock held on updates to poolSize, corePoolSize, maximumPoolSize, and workers set.
- */
- private final ReentrantLock mainLock = new ReentrantLock();
-
- /**
- * Wait condition to support awaitTermination
- */
- private final Condition termination = mainLock.newCondition();
-
- /**
- * Set containing all connections that are available for use.
- */
- @GuardedBy( "mainLock" )
- private final BlockingQueue<ConnectionWrapper> availableConnections = new LinkedBlockingQueue<ConnectionWrapper>();
-
- /**
- * The connections that are currently in use.
- */
- @GuardedBy( "mainLock" )
- private final Set<ConnectionWrapper> inUseConnections = new HashSet<ConnectionWrapper>();
-
- /**
- * Timeout in nanoseconds for idle connections waiting to be used. Threads use this timeout only when there are more than
- * corePoolSize present. Otherwise they wait forever to be used.
- */
- private volatile long keepAliveTime;
-
- /**
- * The target pool size, updated only while holding mainLock, but volatile to allow concurrent readability even during
- * updates.
- */
- @GuardedBy( "mainLock" )
- private volatile int corePoolSize;
-
- /**
- * Maximum pool size, updated only while holding mainLock but volatile to allow concurrent readability even during updates.
- */
- @GuardedBy( "mainLock" )
- private volatile int maximumPoolSize;
-
- /**
- * Current pool size, updated only while holding mainLock but volatile to allow concurrent readability even during updates.
- */
- @GuardedBy( "mainLock" )
- private volatile int poolSize;
-
- /**
- * Lifecycle state, updated only while holding mainLock but volatile to allow concurrent readability even during updates.
- */
- @GuardedBy( "mainLock" )
- private volatile int runState;
-
- // Special values for runState
- /** Normal, not-shutdown mode */
- static final int RUNNING = 0;
- /** Controlled shutdown mode */
- static final int SHUTDOWN = 1;
- /** Immediate shutdown mode */
- static final int STOP = 2;
- /** Final state */
- static final int TERMINATED = 3;
-
- /**
- * Flag specifying whether a connection should be validated before returning it from the {@link #getConnection()} method.
- */
- private final AtomicBoolean validateConnectionBeforeUse = new AtomicBoolean(false);
-
- /**
- * The time in nanoseconds that ping should wait before timing out and failing.
- */
- private final AtomicLong pingTimeout = new AtomicLong(0);
-
- /**
- * The number of times an attempt to obtain a connection should fail with invalid connections before throwing an exception.
- */
- private final AtomicInteger maxFailedAttemptsBeforeError = new AtomicInteger(10);
-
- private final AtomicLong totalConnectionsCreated = new AtomicLong(0);
-
- private final AtomicLong totalConnectionsUsed = new AtomicLong(0);
-
- private final Logger logger = Logger.getLogger(this.getClass());
-
- /**
- * Create the pool to use the supplied connection factory, which is typically a {@link RepositorySource}. This constructor
- * uses the {@link #DEFAULT_CORE_POOL_SIZE default core pool size}, {@link #DEFAULT_MAXIMUM_POOL_SIZE default maximum pool
- * size}, and {@link #DEFAULT_KEEP_ALIVE_TIME_IN_SECONDS default keep-alive time (in seconds)}.
- *
- * @param connectionFactory the factory for connections
- * @throws IllegalArgumentException if the connection factory is null or any of the supplied arguments are invalid
- */
- public RepositoryConnectionPool( RepositoryConnectionFactory connectionFactory ) {
- this(connectionFactory, DEFAULT_CORE_POOL_SIZE, DEFAULT_MAXIMUM_POOL_SIZE, DEFAULT_KEEP_ALIVE_TIME_IN_SECONDS,
- TimeUnit.SECONDS);
- }
-
- /**
- * Create the pool to use the supplied connection factory, which is typically a {@link RepositorySource}.
- *
- * @param connectionFactory the factory for connections
- * @param corePoolSize the number of connections to keep in the pool, even if they are idle.
- * @param maximumPoolSize the maximum number of connections to allow in the pool.
- * @param keepAliveTime when the number of connection is greater than the core, this is the maximum time that excess idle
- * connections will be kept before terminating.
- * @param unit the time unit for the keepAliveTime argument.
- * @throws IllegalArgumentException if the connection factory is null or any of the supplied arguments are invalid
- */
- public RepositoryConnectionPool( RepositoryConnectionFactory connectionFactory,
- int corePoolSize,
- int maximumPoolSize,
- long keepAliveTime,
- TimeUnit unit ) {
- ArgCheck.isNonNegative(corePoolSize, "corePoolSize");
- ArgCheck.isPositive(maximumPoolSize, "maximumPoolSize");
- ArgCheck.isNonNegative(keepAliveTime, "keepAliveTime");
- ArgCheck.isNotNull(connectionFactory, "repository connection factory");
- if (maximumPoolSize < corePoolSize) {
- throw new IllegalArgumentException(SpiI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
- }
- this.connectionFactory = connectionFactory;
- this.corePoolSize = corePoolSize;
- this.maximumPoolSize = maximumPoolSize;
- this.keepAliveTime = unit.toNanos(keepAliveTime);
- this.setPingTimeout(100, TimeUnit.MILLISECONDS);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory#getName()
- */
- public String getName() {
- return this.connectionFactory.getName();
- }
-
- // -------------------------------------------------
- // Property settings ...
- // -------------------------------------------------
-
- /**
- * @return validateConnectionBeforeUse
- */
- public boolean getValidateConnectionBeforeUse() {
- return this.validateConnectionBeforeUse.get();
- }
-
- /**
- * @param validateConnectionBeforeUse Sets validateConnectionBeforeUse to the specified value.
- */
- public void setValidateConnectionBeforeUse( boolean validateConnectionBeforeUse ) {
- this.validateConnectionBeforeUse.set(validateConnectionBeforeUse);
- }
-
- /**
- * @return pingTimeout
- */
- public long getPingTimeoutInNanos() {
- return this.pingTimeout.get();
- }
-
- /**
- * @param pingTimeout the time to wait for a ping to complete
- * @param unit the time unit of the time argument
- */
- public void setPingTimeout( long pingTimeout,
- TimeUnit unit ) {
- ArgCheck.isNonNegative(pingTimeout, "time");
- this.pingTimeout.set(unit.toNanos(pingTimeout));
- }
-
- /**
- * @return maxFailedAttemptsBeforeError
- */
- public int getMaxFailedAttemptsBeforeError() {
- return this.maxFailedAttemptsBeforeError.get();
- }
-
- /**
- * @param maxFailedAttemptsBeforeError Sets maxFailedAttemptsBeforeError to the specified value.
- */
- public void setMaxFailedAttemptsBeforeError( int maxFailedAttemptsBeforeError ) {
- this.maxFailedAttemptsBeforeError.set(maxFailedAttemptsBeforeError);
- }
-
- /**
- * Sets the time limit for which connections may remain idle before being closed. If there are more than the core number of
- * connections currently in the pool, after waiting this amount of time without being used, excess threads will be terminated.
- * This overrides any value set in the constructor.
- *
- * @param time the time to wait. A time value of zero will cause excess connections to terminate immediately after being
- * returned.
- * @param unit the time unit of the time argument
- * @throws IllegalArgumentException if time less than zero
- * @see #getKeepAliveTime
- */
- public void setKeepAliveTime( long time,
- TimeUnit unit ) {
- ArgCheck.isNonNegative(time, "time");
- this.keepAliveTime = unit.toNanos(time);
- }
-
- /**
- * Returns the connection keep-alive time, which is the amount of time which connections in excess of the core pool size may
- * remain idle before being closed.
- *
- * @param unit the desired time unit of the result
- * @return the time limit
- * @see #setKeepAliveTime
- */
- public long getKeepAliveTime( TimeUnit unit ) {
- assert unit != null;
- return unit.convert(keepAliveTime, TimeUnit.NANOSECONDS);
- }
-
- /**
- * @return maximumPoolSize
- */
- public int getMaximumPoolSize() {
- return this.maximumPoolSize;
- }
-
- /**
- * Sets the maximum allowed number of connections. This overrides any value set in the constructor. If the new value is
- * smaller than the current value, excess existing but unused connections will be closed.
- *
- * @param maximumPoolSize the new maximum
- * @throws IllegalArgumentException if maximumPoolSize less than zero or the {@link #getCorePoolSize() core pool size}
- * @see #getMaximumPoolSize
- */
- public void setMaximumPoolSize( int maximumPoolSize ) {
- ArgCheck.isPositive(maximumPoolSize, "maximum pool size");
- if (maximumPoolSize < corePoolSize) {
- throw new IllegalArgumentException(SpiI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
- }
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- int extra = this.maximumPoolSize - maximumPoolSize;
- this.maximumPoolSize = maximumPoolSize;
- if (extra > 0 && poolSize > maximumPoolSize) {
- // Drain the extra connections from those available ...
- drainUnusedConnections(extra);
- }
- } finally {
- mainLock.unlock();
- }
- }
-
- /**
- * Returns the core number of connections.
- *
- * @return the core number of connections
- * @see #setCorePoolSize(int)
- */
- public int getCorePoolSize() {
- return this.corePoolSize;
- }
-
- /**
- * Sets the core number of connections. This overrides any value set in the constructor. If the new value is smaller than the
- * current value, excess existing and unused connections will be closed. If larger, new connections will, if needed, be
- * created.
- *
- * @param corePoolSize the new core size
- * @throws RepositorySourceException if there was an error obtaining the new connection
- * @throws InterruptedException if the thread was interrupted during the operation
- * @throws IllegalArgumentException if <tt>corePoolSize</tt> less than zero
- * @see #getCorePoolSize()
- */
- public void setCorePoolSize( int corePoolSize ) throws RepositorySourceException, InterruptedException {
- ArgCheck.isNonNegative(corePoolSize, "core pool size");
- if (maximumPoolSize < corePoolSize) {
- throw new IllegalArgumentException(SpiI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
- }
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- int extra = this.corePoolSize - corePoolSize;
- this.corePoolSize = corePoolSize;
- if (extra < 0) {
- // Add connections ...
- addConnectionsIfUnderCorePoolSize();
- } else if (extra > 0 && poolSize > corePoolSize) {
- // Drain the extra connections from those available ...
- drainUnusedConnections(extra);
- }
- } finally {
- mainLock.unlock();
- }
- }
-
- // -------------------------------------------------
- // Statistics ...
- // -------------------------------------------------
-
- /**
- * Returns the current number of connections in the pool, including those that are checked out (in use) and those that are not
- * being used.
- *
- * @return the number of connections
- */
- public int getPoolSize() {
- return poolSize;
- }
-
- /**
- * Returns the approximate number of connections that are currently checked out from the pool.
- *
- * @return the number of checked-out connections
- */
- public int getInUseCount() {
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- return this.inUseConnections.size();
- } finally {
- mainLock.unlock();
- }
- }
-
- /**
- * Get the total number of connections that have been created by this pool.
- *
- * @return the total number of connections created by this pool
- */
- public long getTotalConnectionsCreated() {
- return this.totalConnectionsCreated.get();
- }
-
- /**
- * Get the total number of times connections have been {@link #getConnection()} used.
- *
- * @return the total number
- */
- public long getTotalConnectionsUsed() {
- return this.totalConnectionsUsed.get();
- }
-
- // -------------------------------------------------
- // State management methods ...
- // -------------------------------------------------
-
- /**
- * Starts a core connection, causing it to idly wait for use. This overrides the default policy of starting core connections
- * only when they are {@link #getConnection() needed}. This method will return <tt>false</tt> if all core connections have
- * already been started.
- *
- * @return true if a connection was started
- * @throws RepositorySourceException if there was an error obtaining the new connection
- * @throws InterruptedException if the thread was interrupted during the operation
- */
- public boolean prestartCoreConnection() throws RepositorySourceException, InterruptedException {
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- return addConnectionIfUnderCorePoolSize();
- } finally {
- mainLock.unlock();
- }
- }
-
- /**
- * Starts all core connections, causing them to idly wait for use. This overrides the default policy of starting core
- * connections only when they are {@link #getConnection() needed}.
- *
- * @return the number of connections started.
- * @throws RepositorySourceException if there was an error obtaining the new connection
- * @throws InterruptedException if the thread was interrupted during the operation
- */
- public int prestartAllCoreConnections() throws RepositorySourceException, InterruptedException {
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- return addConnectionsIfUnderCorePoolSize();
- } finally {
- mainLock.unlock();
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#shutdown()
- */
- public void shutdown() {
- // Fail if caller doesn't have modifyThread permission. We
- // explicitly check permissions directly because we can't trust
- // implementations of SecurityManager to correctly override
- // the "check access" methods such that our documented
- // security policy is implemented.
- SecurityManager security = System.getSecurityManager();
- if (security != null) java.security.AccessController.checkPermission(shutdownPerm);
-
- this.logger.debug("Shutting down repository connection pool for {0}", getName());
- boolean fullyTerminated = false;
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- int state = this.runState;
- if (state == RUNNING) {
- // don't override shutdownNow
- this.runState = SHUTDOWN;
- }
-
- // Kill the maintenance thread ...
-
- // Remove and close all available connections ...
- if (!this.availableConnections.isEmpty()) {
- // Drain the extra connections from those available ...
- drainUnusedConnections(this.availableConnections.size());
- }
-
- // If there are no connections being used, trigger full termination now ...
- if (this.inUseConnections.isEmpty()) {
- fullyTerminated = true;
- this.logger.trace("Signalling termination of repository connection pool for {0}", getName());
- runState = TERMINATED;
- termination.signalAll();
- this.logger.debug("Terminated repository connection pool for {0}", getName());
- }
- // Otherwise the last connection that is closed will transition the runState to TERMINATED ...
- } finally {
- mainLock.unlock();
- }
- if (fullyTerminated) terminated();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#shutdownNow()
- */
- public void shutdownNow() {
- // Almost the same code as shutdown()
- SecurityManager security = System.getSecurityManager();
- if (security != null) java.security.AccessController.checkPermission(shutdownPerm);
-
- this.logger.debug("Shutting down (immediately) repository connection pool for {0}", getName());
- boolean fullyTerminated = false;
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- int state = this.runState;
- if (state != TERMINATED) {
- // don't override shutdownNow
- this.runState = STOP;
- }
-
- // Kill the maintenance thread ...
-
- // Remove and close all available connections ...
- if (!this.availableConnections.isEmpty()) {
- // Drain the extra connections from those available ...
- drainUnusedConnections(this.availableConnections.size());
- }
-
- // If there are connections being used, close them now ...
- if (!this.inUseConnections.isEmpty()) {
- for (ConnectionWrapper connectionInUse : this.inUseConnections) {
- try {
- this.logger.trace("Closing repository connection to {0}", getName());
- connectionInUse.getOriginal().close();
- } catch (InterruptedException e) {
- // Ignore this ...
- }
- }
- this.poolSize -= this.inUseConnections.size();
- // The last connection that is closed will transition the runState to TERMINATED ...
- } else {
- // There are no connections in use, so trigger full termination now ...
- fullyTerminated = true;
- this.logger.trace("Signalling termination of repository connection pool for {0}", getName());
- runState = TERMINATED;
- termination.signalAll();
- this.logger.debug("Terminated repository connection pool for {0}", getName());
- }
-
- } finally {
- mainLock.unlock();
- }
- if (fullyTerminated) terminated();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isRunning()
- */
- public boolean isRunning() {
- return runState == RUNNING;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isShutdown()
- */
- public boolean isShutdown() {
- return runState != RUNNING;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isTerminating()
- */
- public boolean isTerminating() {
- return runState == STOP;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#isTerminated()
- */
- public boolean isTerminated() {
- return runState == TERMINATED;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.ManagedRepositoryConnectionFactory#awaitTermination(long,
- * java.util.concurrent.TimeUnit)
- */
- public boolean awaitTermination( long timeout,
- TimeUnit unit ) throws InterruptedException {
- long nanos = unit.toNanos(timeout);
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- for (;;) {
- // this.logger.debug("---> Run state = {}; condition = {}", runState, termination);
- if (runState == TERMINATED) return true;
- if (nanos <= 0) return false;
- nanos = termination.awaitNanos(nanos);
- // this.logger.debug("---> Done waiting: run state = {}; condition = {}", runState, termination);
- }
- } finally {
- mainLock.unlock();
- }
- }
-
- /**
- * Method invoked when the pool has terminated. Default implementation does nothing. Note: To properly nest multiple
- * overridings, subclasses should generally invoke <tt>super.terminated</tt> within this method.
- */
- protected void terminated() {
- }
-
- /**
- * Invokes <tt>shutdown</tt> when this pool is no longer referenced.
- */
- @Override
- protected void finalize() {
- shutdown();
- }
-
- // -------------------------------------------------
- // Connection management methods ...
- // -------------------------------------------------
-
- /**
- * {@inheritDoc}
- */
- public RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException {
- int attemptsAllowed = this.maxFailedAttemptsBeforeError.get();
- ConnectionWrapper connection = null;
- // Do this until we get a good connection ...
- int attemptsRemaining = attemptsAllowed;
- while (connection == null && attemptsRemaining > 0) {
- --attemptsRemaining;
- ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- // If we're shutting down the pool, then just close the connection ...
- if (this.runState != RUNNING) {
- throw new IllegalStateException(SpiI18n.repositoryConnectionPoolIsNotRunning.text());
- }
- // If there are fewer total connections than the core size ...
- if (this.poolSize < this.corePoolSize) {
- // Immediately create a wrapped connection and return it ...
- connection = newWrappedConnection();
- }
- // Peek to see if there is a connection available ...
- else if (this.availableConnections.peek() != null) {
- // There is, so take it and return it ...
- connection = this.availableConnections.take();
- }
- // There is no connection available. If there are fewer total connections than the maximum size ...
- else if (this.poolSize < this.maximumPoolSize) {
- // Immediately create a wrapped connection and return it ...
- connection = newWrappedConnection();
- }
- if (connection != null) {
- this.inUseConnections.add(connection);
- }
- } finally {
- mainLock.unlock();
- }
- if (connection == null) {
- // There are not enough connections, so wait in line for the next available connection ...
- this.logger.trace("Waiting for a repository connection from pool {0}", getName());
- connection = this.availableConnections.take();
- mainLock = this.mainLock;
- mainLock.lock();
- try {
- if (connection != null) {
- this.inUseConnections.add(connection);
- }
- } finally {
- mainLock.unlock();
- }
- this.logger.trace("Recieved a repository connection from pool {0}", getName());
- }
- if (connection != null && this.validateConnectionBeforeUse.get()) {
- connection = validateConnection(connection);
- }
- }
- if (connection == null) {
- // We were unable to obtain a usable connection, so fail ...
- throw new RepositorySourceException(SpiI18n.unableToObtainValidRepositoryAfterAttempts.text(attemptsAllowed));
- }
- this.totalConnectionsUsed.incrementAndGet();
- return connection;
- }
-
- /**
- * This method is automatically called by the {@link ConnectionWrapper} when it is {@link ConnectionWrapper#close() closed}.
- *
- * @param wrapper the wrapper to the connection that is being returned to the pool
- */
- protected void returnConnection( ConnectionWrapper wrapper ) {
- assert wrapper != null;
- ConnectionWrapper wrapperToClose = null;
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- // Remove the connection from the in-use set ...
- boolean removed = this.inUseConnections.remove(wrapper);
- assert removed;
-
- // If we're shutting down the pool, then just close the connection ...
- if (this.runState != RUNNING) {
- wrapperToClose = wrapper;
- }
- // If there are more connections than the maximum size...
- else if (this.poolSize > this.maximumPoolSize) {
- // Immediately close this connection ...
- wrapperToClose = wrapper;
- }
- // Attempt to make the connection available (this should generally work, unless there is an upper limit
- // to the number of available connections) ...
- else if (!this.availableConnections.offer(new ConnectionWrapper(wrapper.getOriginal()))) {
- // The pool of available connection is full, so release it ...
- wrapperToClose = wrapper;
- }
- } finally {
- mainLock.unlock();
- }
- // Close the connection if we're supposed to (do it outside of the main lock)...
- if (wrapperToClose != null) {
- try {
- closeConnection(wrapper);
- } catch (InterruptedException e) {
- // catch this, as there's not much we can do and the caller doesn't care or know how to handle it
- this.logger.trace(e, "Interrupted while closing a repository connection");
- }
- }
- }
-
- /**
- * Validate the supplied connection, returning the connection if valid or null if the connection is not valid.
- *
- * @param connection the connection to be validated; may not be null
- * @return the validated connection, or null if the connection did not validate and was removed from the pool
- */
- protected ConnectionWrapper validateConnection( ConnectionWrapper connection ) {
- assert connection != null;
- ConnectionWrapper invalidConnection = null;
- try {
- if (!connection.ping(this.pingTimeout.get(), TimeUnit.NANOSECONDS)) {
- invalidConnection = connection;
- }
- } catch (InterruptedException e) {
- // catch this, as there's not much we can do and the caller doesn't care or know how to handle it
- this.logger.trace(e, "Interrupted while pinging a repository connection");
- invalidConnection = connection;
- } finally {
- if (invalidConnection != null) {
- connection = null;
- returnConnection(invalidConnection);
- }
- }
- return connection;
- }
-
- /**
- * Obtain a new connection wrapped in a {@link ConnectionWrapper}. This method does not check whether creating the new
- * connection would violate the {@link #maximumPoolSize maximum pool size} nor does it add the new connection to the
- * {@link #availableConnections available connections} (as the caller may want it immediately), but it does increment the
- * {@link #poolSize pool size}.
- *
- * @return the connection wrapper with a new connection
- * @throws RepositorySourceException if there was an error obtaining the new connection
- * @throws InterruptedException if the thread was interrupted during the operation
- */
- @GuardedBy( "mainLock" )
- protected ConnectionWrapper newWrappedConnection() throws RepositorySourceException, InterruptedException {
- RepositoryConnection connection = this.connectionFactory.getConnection();
- ++this.poolSize;
- this.totalConnectionsCreated.incrementAndGet();
- return new ConnectionWrapper(connection);
- }
-
- /**
- * Close a connection that is in the pool but no longer in the {@link #availableConnections available connections}. This
- * method does decrement the {@link #poolSize pool size}.
- *
- * @param wrapper the wrapper for the connection to be closed
- * @throws InterruptedException if the thread was interrupted during the operation
- */
- protected void closeConnection( ConnectionWrapper wrapper ) throws InterruptedException {
- assert wrapper != null;
- RepositoryConnection original = wrapper.getOriginal();
- assert original != null;
- try {
- this.logger.debug("Closing repository connection to {0}", getName());
- original.close();
- } finally {
- final ReentrantLock mainLock = this.mainLock;
- try {
- mainLock.lock();
- // No matter what reduce the pool size count
- --this.poolSize;
- // And if shutting down and this was the last connection being used...
- if (this.runState == SHUTDOWN && this.poolSize <= 0) {
- // then signal anybody that has called "awaitTermination(...)"
- this.logger.trace("Signalling termination of repository connection pool for {0}", getName());
- this.runState = TERMINATED;
- this.termination.signalAll();
- this.logger.trace("Terminated repository connection pool for {0}", getName());
-
- // fall through to call terminate() outside of lock.
- }
- } finally {
- mainLock.unlock();
- }
- }
- }
-
- @GuardedBy( "mainLock" )
- protected int drainUnusedConnections( int count ) {
- if (count <= 0) return 0;
- this.logger.trace("Draining up to {0} unused repository connections to {1}", count, getName());
- // Drain the extra connections from those available ...
- Collection<ConnectionWrapper> extraConnections = new LinkedList<ConnectionWrapper>();
- this.availableConnections.drainTo(extraConnections, count);
- for (ConnectionWrapper connection : extraConnections) {
- try {
- this.logger.trace("Closing repository connection to {0}", getName());
- connection.getOriginal().close();
- } catch (InterruptedException e) {
- // Ignore this ...
- }
- }
- int numClosed = extraConnections.size();
- this.poolSize -= numClosed;
- this.logger.trace("Drained {0} unused connections", numClosed);
- return numClosed;
- }
-
- @GuardedBy( "mainLock" )
- protected boolean addConnectionIfUnderCorePoolSize() throws RepositorySourceException, InterruptedException {
- // Add connection ...
- if (this.poolSize < this.corePoolSize) {
- this.availableConnections.offer(newWrappedConnection());
- this.logger.trace("Added connection to {0} in undersized pool", getName());
- return true;
- }
- return false;
- }
-
- @GuardedBy( "mainLock" )
- protected int addConnectionsIfUnderCorePoolSize() throws RepositorySourceException, InterruptedException {
- // Add connections ...
- int n = 0;
- while (this.poolSize < this.corePoolSize) {
- this.availableConnections.offer(newWrappedConnection());
- ++n;
- }
- this.logger.trace("Added {0} connection(s) to {1} in undersized pool", n, getName());
- return n;
- }
-
- protected class ConnectionWrapper implements RepositoryConnection {
-
- private final RepositoryConnection original;
- private final long timeCreated;
- private long lastUsed;
- private boolean closed = false;
-
- protected ConnectionWrapper( RepositoryConnection connection ) {
- assert connection != null;
- this.original = connection;
- this.timeCreated = System.currentTimeMillis();
- }
-
- /**
- * @return original
- */
- protected RepositoryConnection getOriginal() {
- return this.original;
- }
-
- /**
- * @return lastUsed
- */
- public long getTimeLastUsed() {
- return this.lastUsed;
- }
-
- /**
- * @return timeCreated
- */
- public long getTimeCreated() {
- return this.timeCreated;
- }
-
- /**
- * {@inheritDoc}
- */
- public String getSourceName() {
- return this.original.getSourceName();
- }
-
- /**
- * {@inheritDoc}
- */
- public XAResource getXAResource() {
- if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
- return this.original.getXAResource();
- }
-
- /**
- * {@inheritDoc}
- */
- public CachePolicy getDefaultCachePolicy() {
- if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
- return this.original.getDefaultCachePolicy();
- }
-
- /**
- * {@inheritDoc}
- */
- public void execute( ExecutionContext context,
- GraphCommand... commands ) throws RepositorySourceException, InterruptedException {
- if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
- this.original.execute(context, commands);
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean ping( long time,
- TimeUnit unit ) throws InterruptedException {
- if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
- return this.original.ping(time, unit);
- }
-
- /**
- * {@inheritDoc}
- */
- public void close() throws InterruptedException {
- if (!closed) {
- this.lastUsed = System.currentTimeMillis();
- this.original.close();
- this.closed = true;
- returnConnection(this);
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void setListener( RepositorySourceListener listener ) {
- if (!closed) this.original.setListener(listener);
- }
-
- }
-
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionPool.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryConnectionPool.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,1032 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import javax.transaction.xa.XAResource;
+import net.jcip.annotations.GuardedBy;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.Logger;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.graph.commands.GraphCommand;
+
+/**
+ * A reusable implementation of a managed pool of connections that is optimized for safe concurrent operations.
+ *
+ * @author Randall Hauch
+ */
+@ThreadSafe
+public class RepositoryConnectionPool {
+
+ /**
+ * A factory that is used by the connection pool to create new connections.
+ *
+ * @author Randall Hauch
+ */
+ public interface ConnectionFactory {
+
+ /**
+ * Get the name for the source that owns the pool.
+ *
+ * @return the name; never null or empty
+ */
+ String getSourceName();
+
+ /**
+ * Create a new connection to the underlying source.
+ *
+ * @return the new connection
+ * @throws RepositorySourceException if there is a problem obtaining a connection
+ * @throws InterruptedException if the thread is interrupted while attempting to get a connection
+ */
+ RepositoryConnection createConnection() throws RepositorySourceException, InterruptedException;
+ }
+
+ /**
+ * The core pool size for default-constructed pools is {@value} .
+ */
+ public static final int DEFAULT_CORE_POOL_SIZE = 1;
+
+ /**
+ * The maximum pool size for default-constructed pools is {@value} .
+ */
+ public static final int DEFAULT_MAXIMUM_POOL_SIZE = 10;
+
+ /**
+ * The keep-alive time for connections in default-constructed pools is {@value} seconds.
+ */
+ public static final long DEFAULT_KEEP_ALIVE_TIME_IN_SECONDS = 30;
+
+ /**
+ * Permission for checking shutdown
+ */
+ private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");
+
+ /**
+ * The factory that this pool uses to create new connections.
+ */
+ private final ConnectionFactory connectionFactory;
+
+ /**
+ * Lock held on updates to poolSize, corePoolSize, maximumPoolSize, and workers set.
+ */
+ private final ReentrantLock mainLock = new ReentrantLock();
+
+ /**
+ * Wait condition to support awaitTermination
+ */
+ private final Condition termination = mainLock.newCondition();
+
+ /**
+ * Set containing all connections that are available for use.
+ */
+ @GuardedBy( "mainLock" )
+ private final BlockingQueue<ConnectionWrapper> availableConnections = new LinkedBlockingQueue<ConnectionWrapper>();
+
+ /**
+ * The connections that are currently in use.
+ */
+ @GuardedBy( "mainLock" )
+ private final Set<ConnectionWrapper> inUseConnections = new HashSet<ConnectionWrapper>();
+
+ /**
+ * Timeout in nanoseconds for idle connections waiting to be used. Threads use this timeout only when there are more than
+ * corePoolSize present. Otherwise they wait forever to be used.
+ */
+ private volatile long keepAliveTime;
+
+ /**
+ * The target pool size, updated only while holding mainLock, but volatile to allow concurrent readability even during
+ * updates.
+ */
+ @GuardedBy( "mainLock" )
+ private volatile int corePoolSize;
+
+ /**
+ * Maximum pool size, updated only while holding mainLock but volatile to allow concurrent readability even during updates.
+ */
+ @GuardedBy( "mainLock" )
+ private volatile int maximumPoolSize;
+
+ /**
+ * Current pool size, updated only while holding mainLock but volatile to allow concurrent readability even during updates.
+ */
+ @GuardedBy( "mainLock" )
+ private volatile int poolSize;
+
+ /**
+ * Lifecycle state, updated only while holding mainLock but volatile to allow concurrent readability even during updates.
+ */
+ @GuardedBy( "mainLock" )
+ private volatile int runState;
+
+ // Special values for runState
+ /** Normal, not-shutdown mode */
+ static final int RUNNING = 0;
+ /** Controlled shutdown mode */
+ static final int SHUTDOWN = 1;
+ /** Immediate shutdown mode */
+ static final int STOP = 2;
+ /** Final state */
+ static final int TERMINATED = 3;
+
+ /**
+ * Flag specifying whether a connection should be validated before returning it from the {@link #getConnection()} method.
+ */
+ private final AtomicBoolean validateConnectionBeforeUse = new AtomicBoolean(false);
+
+ /**
+ * The time in nanoseconds that ping should wait before timing out and failing.
+ */
+ private final AtomicLong pingTimeout = new AtomicLong(0);
+
+ /**
+ * The number of times an attempt to obtain a connection should fail with invalid connections before throwing an exception.
+ */
+ private final AtomicInteger maxFailedAttemptsBeforeError = new AtomicInteger(10);
+
+ private final AtomicLong totalConnectionsCreated = new AtomicLong(0);
+
+ private final AtomicLong totalConnectionsUsed = new AtomicLong(0);
+
+ private final Logger logger = Logger.getLogger(this.getClass());
+
+ /**
+ * Create the pool to use the supplied connection factory, which is typically a {@link RepositorySource}. This constructor
+ * uses the {@link #DEFAULT_CORE_POOL_SIZE default core pool size}, {@link #DEFAULT_MAXIMUM_POOL_SIZE default maximum pool
+ * size}, and {@link #DEFAULT_KEEP_ALIVE_TIME_IN_SECONDS default keep-alive time (in seconds)}.
+ *
+ * @param connectionFactory the factory for connections
+ * @throws IllegalArgumentException if the connection factory is null or any of the supplied arguments are invalid
+ */
+ public RepositoryConnectionPool( ConnectionFactory connectionFactory ) {
+ this(connectionFactory, DEFAULT_CORE_POOL_SIZE, DEFAULT_MAXIMUM_POOL_SIZE, DEFAULT_KEEP_ALIVE_TIME_IN_SECONDS,
+ TimeUnit.SECONDS);
+ }
+
+ /**
+ * Create the pool to use the supplied connection factory, which is typically a {@link RepositorySource}.
+ *
+ * @param connectionFactory the factory for connections
+ * @param corePoolSize the number of connections to keep in the pool, even if they are idle.
+ * @param maximumPoolSize the maximum number of connections to allow in the pool.
+ * @param keepAliveTime when the number of connection is greater than the core, this is the maximum time that excess idle
+ * connections will be kept before terminating.
+ * @param unit the time unit for the keepAliveTime argument.
+ * @throws IllegalArgumentException if the connection factory is null or any of the supplied arguments are invalid
+ */
+ public RepositoryConnectionPool( ConnectionFactory connectionFactory,
+ int corePoolSize,
+ int maximumPoolSize,
+ long keepAliveTime,
+ TimeUnit unit ) {
+ ArgCheck.isNonNegative(corePoolSize, "corePoolSize");
+ ArgCheck.isPositive(maximumPoolSize, "maximumPoolSize");
+ ArgCheck.isNonNegative(keepAliveTime, "keepAliveTime");
+ ArgCheck.isNotNull(connectionFactory, "repository connection factory");
+ if (maximumPoolSize < corePoolSize) {
+ throw new IllegalArgumentException(SpiI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
+ }
+ this.connectionFactory = connectionFactory;
+ this.corePoolSize = corePoolSize;
+ this.maximumPoolSize = maximumPoolSize;
+ this.keepAliveTime = unit.toNanos(keepAliveTime);
+ this.setPingTimeout(100, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * Get the name of this pool, which delegates to the connection factory.
+ *
+ * @return the name of the source
+ */
+ protected String getSourceName() {
+ return connectionFactory.getSourceName();
+ }
+
+ // -------------------------------------------------
+ // Property settings ...
+ // -------------------------------------------------
+
+ /**
+ * @return validateConnectionBeforeUse
+ */
+ public boolean getValidateConnectionBeforeUse() {
+ return this.validateConnectionBeforeUse.get();
+ }
+
+ /**
+ * @param validateConnectionBeforeUse Sets validateConnectionBeforeUse to the specified value.
+ */
+ public void setValidateConnectionBeforeUse( boolean validateConnectionBeforeUse ) {
+ this.validateConnectionBeforeUse.set(validateConnectionBeforeUse);
+ }
+
+ /**
+ * @return pingTimeout
+ */
+ public long getPingTimeoutInNanos() {
+ return this.pingTimeout.get();
+ }
+
+ /**
+ * @param pingTimeout the time to wait for a ping to complete
+ * @param unit the time unit of the time argument
+ */
+ public void setPingTimeout( long pingTimeout,
+ TimeUnit unit ) {
+ ArgCheck.isNonNegative(pingTimeout, "time");
+ this.pingTimeout.set(unit.toNanos(pingTimeout));
+ }
+
+ /**
+ * @return maxFailedAttemptsBeforeError
+ */
+ public int getMaxFailedAttemptsBeforeError() {
+ return this.maxFailedAttemptsBeforeError.get();
+ }
+
+ /**
+ * @param maxFailedAttemptsBeforeError Sets maxFailedAttemptsBeforeError to the specified value.
+ */
+ public void setMaxFailedAttemptsBeforeError( int maxFailedAttemptsBeforeError ) {
+ this.maxFailedAttemptsBeforeError.set(maxFailedAttemptsBeforeError);
+ }
+
+ /**
+ * Sets the time limit for which connections may remain idle before being closed. If there are more than the core number of
+ * connections currently in the pool, after waiting this amount of time without being used, excess threads will be terminated.
+ * This overrides any value set in the constructor.
+ *
+ * @param time the time to wait. A time value of zero will cause excess connections to terminate immediately after being
+ * returned.
+ * @param unit the time unit of the time argument
+ * @throws IllegalArgumentException if time less than zero
+ * @see #getKeepAliveTime
+ */
+ public void setKeepAliveTime( long time,
+ TimeUnit unit ) {
+ ArgCheck.isNonNegative(time, "time");
+ this.keepAliveTime = unit.toNanos(time);
+ }
+
+ /**
+ * Returns the connection keep-alive time, which is the amount of time which connections in excess of the core pool size may
+ * remain idle before being closed.
+ *
+ * @param unit the desired time unit of the result
+ * @return the time limit
+ * @see #setKeepAliveTime
+ */
+ public long getKeepAliveTime( TimeUnit unit ) {
+ assert unit != null;
+ return unit.convert(keepAliveTime, TimeUnit.NANOSECONDS);
+ }
+
+ /**
+ * @return maximumPoolSize
+ */
+ public int getMaximumPoolSize() {
+ return this.maximumPoolSize;
+ }
+
+ /**
+ * Sets the maximum allowed number of connections. This overrides any value set in the constructor. If the new value is
+ * smaller than the current value, excess existing but unused connections will be closed.
+ *
+ * @param maximumPoolSize the new maximum
+ * @throws IllegalArgumentException if maximumPoolSize less than zero or the {@link #getCorePoolSize() core pool size}
+ * @see #getMaximumPoolSize
+ */
+ public void setMaximumPoolSize( int maximumPoolSize ) {
+ ArgCheck.isPositive(maximumPoolSize, "maximum pool size");
+ if (maximumPoolSize < corePoolSize) {
+ throw new IllegalArgumentException(SpiI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
+ }
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ int extra = this.maximumPoolSize - maximumPoolSize;
+ this.maximumPoolSize = maximumPoolSize;
+ if (extra > 0 && poolSize > maximumPoolSize) {
+ // Drain the extra connections from those available ...
+ drainUnusedConnections(extra);
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ }
+
+ /**
+ * Returns the core number of connections.
+ *
+ * @return the core number of connections
+ * @see #setCorePoolSize(int)
+ */
+ public int getCorePoolSize() {
+ return this.corePoolSize;
+ }
+
+ /**
+ * Sets the core number of connections. This overrides any value set in the constructor. If the new value is smaller than the
+ * current value, excess existing and unused connections will be closed. If larger, new connections will, if needed, be
+ * created.
+ *
+ * @param corePoolSize the new core size
+ * @throws RepositorySourceException if there was an error obtaining the new connection
+ * @throws InterruptedException if the thread was interrupted during the operation
+ * @throws IllegalArgumentException if <tt>corePoolSize</tt> less than zero
+ * @see #getCorePoolSize()
+ */
+ public void setCorePoolSize( int corePoolSize ) throws RepositorySourceException, InterruptedException {
+ ArgCheck.isNonNegative(corePoolSize, "core pool size");
+ if (maximumPoolSize < corePoolSize) {
+ throw new IllegalArgumentException(SpiI18n.maximumPoolSizeMayNotBeSmallerThanCorePoolSize.text());
+ }
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ int extra = this.corePoolSize - corePoolSize;
+ this.corePoolSize = corePoolSize;
+ if (extra < 0) {
+ // Add connections ...
+ addConnectionsIfUnderCorePoolSize();
+ } else if (extra > 0 && poolSize > corePoolSize) {
+ // Drain the extra connections from those available ...
+ drainUnusedConnections(extra);
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ }
+
+ // -------------------------------------------------
+ // Statistics ...
+ // -------------------------------------------------
+
+ /**
+ * Returns the current number of connections in the pool, including those that are checked out (in use) and those that are not
+ * being used.
+ *
+ * @return the number of connections
+ */
+ public int getPoolSize() {
+ return poolSize;
+ }
+
+ /**
+ * Returns the approximate number of connections that are currently checked out from the pool.
+ *
+ * @return the number of checked-out connections
+ */
+ public int getInUseCount() {
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ return this.inUseConnections.size();
+ } finally {
+ mainLock.unlock();
+ }
+ }
+
+ /**
+ * Get the total number of connections that have been created by this pool.
+ *
+ * @return the total number of connections created by this pool
+ */
+ public long getTotalConnectionsCreated() {
+ return this.totalConnectionsCreated.get();
+ }
+
+ /**
+ * Get the total number of times connections have been {@link #getConnection()} used.
+ *
+ * @return the total number
+ */
+ public long getTotalConnectionsUsed() {
+ return this.totalConnectionsUsed.get();
+ }
+
+ // -------------------------------------------------
+ // State management methods ...
+ // -------------------------------------------------
+
+ /**
+ * Starts a core connection, causing it to idly wait for use. This overrides the default policy of starting core connections
+ * only when they are {@link #getConnection() needed}. This method will return <tt>false</tt> if all core connections have
+ * already been started.
+ *
+ * @return true if a connection was started
+ * @throws RepositorySourceException if there was an error obtaining the new connection
+ * @throws InterruptedException if the thread was interrupted during the operation
+ */
+ public boolean prestartCoreConnection() throws RepositorySourceException, InterruptedException {
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ return addConnectionIfUnderCorePoolSize();
+ } finally {
+ mainLock.unlock();
+ }
+ }
+
+ /**
+ * Starts all core connections, causing them to idly wait for use. This overrides the default policy of starting core
+ * connections only when they are {@link #getConnection() needed}.
+ *
+ * @return the number of connections started.
+ * @throws RepositorySourceException if there was an error obtaining the new connection
+ * @throws InterruptedException if the thread was interrupted during the operation
+ */
+ public int prestartAllCoreConnections() throws RepositorySourceException, InterruptedException {
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ return addConnectionsIfUnderCorePoolSize();
+ } finally {
+ mainLock.unlock();
+ }
+ }
+
+ /**
+ * Initiates an orderly shutdown of the pool in which connections that are currently in use are allowed to be used and closed
+ * as normal, but no new connections will be created. Invocation has no additional effect if already shut down.
+ * <p>
+ * Once the pool has been shutdown, it may not be used to {@link #getConnection() get connections}.
+ * </p>
+ *
+ * @throws SecurityException if a security manager exists and shutting down this pool may manipulate threads that the caller
+ * is not permitted to modify because it does not hold {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+ * or the security manager's <tt>checkAccess</tt> method denies access.
+ * @see #shutdownNow()
+ */
+ public void shutdown() {
+ // Fail if caller doesn't have modifyThread permission. We
+ // explicitly check permissions directly because we can't trust
+ // implementations of SecurityManager to correctly override
+ // the "check access" methods such that our documented
+ // security policy is implemented.
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) java.security.AccessController.checkPermission(shutdownPerm);
+
+ this.logger.debug("Shutting down repository connection pool for {0}", getSourceName());
+ boolean fullyTerminated = false;
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ int state = this.runState;
+ if (state == RUNNING) {
+ // don't override shutdownNow
+ this.runState = SHUTDOWN;
+ }
+
+ // Kill the maintenance thread ...
+
+ // Remove and close all available connections ...
+ if (!this.availableConnections.isEmpty()) {
+ // Drain the extra connections from those available ...
+ drainUnusedConnections(this.availableConnections.size());
+ }
+
+ // If there are no connections being used, trigger full termination now ...
+ if (this.inUseConnections.isEmpty()) {
+ fullyTerminated = true;
+ this.logger.trace("Signalling termination of repository connection pool for {0}", getSourceName());
+ runState = TERMINATED;
+ termination.signalAll();
+ this.logger.debug("Terminated repository connection pool for {0}", getSourceName());
+ }
+ // Otherwise the last connection that is closed will transition the runState to TERMINATED ...
+ } finally {
+ mainLock.unlock();
+ }
+ if (fullyTerminated) terminated();
+ }
+
+ /**
+ * Attempts to close all connections in the pool, including those connections currently in use, and prevent the use of other
+ * connections.
+ *
+ * @throws SecurityException if a security manager exists and shutting down this pool may manipulate threads that the caller
+ * is not permitted to modify because it does not hold {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+ * or the security manager's <tt>checkAccess</tt> method denies access.
+ * @see #shutdown()
+ */
+ public void shutdownNow() {
+ // Almost the same code as shutdown()
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) java.security.AccessController.checkPermission(shutdownPerm);
+
+ this.logger.debug("Shutting down (immediately) repository connection pool for {0}", getSourceName());
+ boolean fullyTerminated = false;
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ int state = this.runState;
+ if (state != TERMINATED) {
+ // don't override shutdownNow
+ this.runState = STOP;
+ }
+
+ // Kill the maintenance thread ...
+
+ // Remove and close all available connections ...
+ if (!this.availableConnections.isEmpty()) {
+ // Drain the extra connections from those available ...
+ drainUnusedConnections(this.availableConnections.size());
+ }
+
+ // If there are connections being used, close them now ...
+ if (!this.inUseConnections.isEmpty()) {
+ for (ConnectionWrapper connectionInUse : this.inUseConnections) {
+ try {
+ this.logger.trace("Closing repository connection to {0}", getSourceName());
+ connectionInUse.getOriginal().close();
+ } catch (InterruptedException e) {
+ // Ignore this ...
+ }
+ }
+ this.poolSize -= this.inUseConnections.size();
+ // The last connection that is closed will transition the runState to TERMINATED ...
+ } else {
+ // There are no connections in use, so trigger full termination now ...
+ fullyTerminated = true;
+ this.logger.trace("Signalling termination of repository connection pool for {0}", getSourceName());
+ runState = TERMINATED;
+ termination.signalAll();
+ this.logger.debug("Terminated repository connection pool for {0}", getSourceName());
+ }
+
+ } finally {
+ mainLock.unlock();
+ }
+ if (fullyTerminated) terminated();
+ }
+
+ /**
+ * Return whether this connection pool is running and is able to {@link #getConnection() provide connections}. Note that this
+ * method is effectively <code>!isShutdown()</code>.
+ *
+ * @return true if this pool is running, or false otherwise
+ * @see #isShutdown()
+ * @see #isTerminated()
+ * @see #isTerminating()
+ */
+ public boolean isRunning() {
+ return runState == RUNNING;
+ }
+
+ /**
+ * Return whether this connection pool is in the process of shutting down or has already been shut down. A result of
+ * <code>true</code> signals that the pool may no longer be used. Note that this method is effectively
+ * <code>!isRunning()</code>.
+ *
+ * @return true if this pool has been shut down, or false otherwise
+ * @see #isShutdown()
+ * @see #isTerminated()
+ * @see #isTerminating()
+ */
+ public boolean isShutdown() {
+ return runState != RUNNING;
+ }
+
+ /**
+ * Returns true if this pool is in the process of terminating after {@link #shutdown()} or {@link #shutdownNow()} has been
+ * called but has not completely terminated. This method may be useful for debugging. A return of <tt>true</tt> reported a
+ * sufficient period after shutdown may indicate that submitted tasks have ignored or suppressed interruption, causing this
+ * executor not to properly terminate.
+ *
+ * @return true if terminating but not yet terminated, or false otherwise
+ * @see #isTerminated()
+ */
+ public boolean isTerminating() {
+ return runState == STOP;
+ }
+
+ /**
+ * Return true if this pool has completed its termination and no longer has any open connections.
+ *
+ * @return true if terminated, or false otherwise
+ * @see #isTerminating()
+ */
+ public boolean isTerminated() {
+ return runState == TERMINATED;
+ }
+
+ /**
+ * Method that can be called after {@link #shutdown()} or {@link #shutdownNow()} to wait until all connections in use at the
+ * time those methods were called have been closed normally. This method accepts a maximum time duration, after which it will
+ * return even if all connections have not been closed.
+ *
+ * @param timeout the maximum time to wait for all connections to be closed and returned to the pool
+ * @param unit the time unit for <code>timeout</code>
+ * @return true if the pool was terminated in the supplied time (or was already terminated), or false if the timeout occurred
+ * before all the connections were closed
+ * @throws InterruptedException if the thread was interrupted
+ */
+ public boolean awaitTermination( long timeout,
+ TimeUnit unit ) throws InterruptedException {
+ long nanos = unit.toNanos(timeout);
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ for (;;) {
+ // this.logger.debug("---> Run state = {}; condition = {}", runState, termination);
+ if (runState == TERMINATED) return true;
+ if (nanos <= 0) return false;
+ nanos = termination.awaitNanos(nanos);
+ // this.logger.debug("---> Done waiting: run state = {}; condition = {}", runState, termination);
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ }
+
+ /**
+ * Method invoked when the pool has terminated. Default implementation does nothing. Note: To properly nest multiple
+ * overridings, subclasses should generally invoke <tt>super.terminated</tt> within this method.
+ */
+ protected void terminated() {
+ }
+
+ /**
+ * Invokes <tt>shutdown</tt> when this pool is no longer referenced.
+ */
+ @Override
+ protected void finalize() {
+ shutdown();
+ }
+
+ // -------------------------------------------------
+ // Connection management methods ...
+ // -------------------------------------------------
+
+ /**
+ * Get a connection from the pool. This method either returns an unused connection if one is available, creates a connection
+ * if there is still room in the pool, or blocks until a connection becomes available if the pool already contains the maximum
+ * number of connections and all connections are currently being used.
+ *
+ * @return a connection
+ * @throws RepositorySourceException if there is a problem obtaining a connection
+ * @throws InterruptedException if the thread is interrupted while attempting to get a connection
+ * @throws IllegalStateException if the factory is not in a state to create or return connections
+ */
+ public RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException {
+ int attemptsAllowed = this.maxFailedAttemptsBeforeError.get();
+ ConnectionWrapper connection = null;
+ // Do this until we get a good connection ...
+ int attemptsRemaining = attemptsAllowed;
+ while (connection == null && attemptsRemaining > 0) {
+ --attemptsRemaining;
+ ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ // If we're shutting down the pool, then just close the connection ...
+ if (this.runState != RUNNING) {
+ throw new IllegalStateException(SpiI18n.repositoryConnectionPoolIsNotRunning.text());
+ }
+ // If there are fewer total connections than the core size ...
+ if (this.poolSize < this.corePoolSize) {
+ // Immediately create a wrapped connection and return it ...
+ connection = newWrappedConnection();
+ }
+ // Peek to see if there is a connection available ...
+ else if (this.availableConnections.peek() != null) {
+ // There is, so take it and return it ...
+ connection = this.availableConnections.take();
+ }
+ // There is no connection available. If there are fewer total connections than the maximum size ...
+ else if (this.poolSize < this.maximumPoolSize) {
+ // Immediately create a wrapped connection and return it ...
+ connection = newWrappedConnection();
+ }
+ if (connection != null) {
+ this.inUseConnections.add(connection);
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ if (connection == null) {
+ // There are not enough connections, so wait in line for the next available connection ...
+ this.logger.trace("Waiting for a repository connection from pool {0}", getSourceName());
+ connection = this.availableConnections.take();
+ mainLock = this.mainLock;
+ mainLock.lock();
+ try {
+ if (connection != null) {
+ this.inUseConnections.add(connection);
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ this.logger.trace("Recieved a repository connection from pool {0}", getSourceName());
+ }
+ if (connection != null && this.validateConnectionBeforeUse.get()) {
+ connection = validateConnection(connection);
+ }
+ }
+ if (connection == null) {
+ // We were unable to obtain a usable connection, so fail ...
+ throw new RepositorySourceException(SpiI18n.unableToObtainValidRepositoryAfterAttempts.text(attemptsAllowed));
+ }
+ this.totalConnectionsUsed.incrementAndGet();
+ return connection;
+ }
+
+ /**
+ * This method is automatically called by the {@link ConnectionWrapper} when it is {@link ConnectionWrapper#close() closed}.
+ *
+ * @param wrapper the wrapper to the connection that is being returned to the pool
+ */
+ protected void returnConnection( ConnectionWrapper wrapper ) {
+ assert wrapper != null;
+ ConnectionWrapper wrapperToClose = null;
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ // Remove the connection from the in-use set ...
+ boolean removed = this.inUseConnections.remove(wrapper);
+ assert removed;
+
+ // If we're shutting down the pool, then just close the connection ...
+ if (this.runState != RUNNING) {
+ wrapperToClose = wrapper;
+ }
+ // If there are more connections than the maximum size...
+ else if (this.poolSize > this.maximumPoolSize) {
+ // Immediately close this connection ...
+ wrapperToClose = wrapper;
+ }
+ // Attempt to make the connection available (this should generally work, unless there is an upper limit
+ // to the number of available connections) ...
+ else if (!this.availableConnections.offer(new ConnectionWrapper(wrapper.getOriginal()))) {
+ // The pool of available connection is full, so release it ...
+ wrapperToClose = wrapper;
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ // Close the connection if we're supposed to (do it outside of the main lock)...
+ if (wrapperToClose != null) {
+ try {
+ closeConnection(wrapper);
+ } catch (InterruptedException e) {
+ // catch this, as there's not much we can do and the caller doesn't care or know how to handle it
+ this.logger.trace(e, "Interrupted while closing a repository connection");
+ }
+ }
+ }
+
+ /**
+ * Validate the supplied connection, returning the connection if valid or null if the connection is not valid.
+ *
+ * @param connection the connection to be validated; may not be null
+ * @return the validated connection, or null if the connection did not validate and was removed from the pool
+ */
+ protected ConnectionWrapper validateConnection( ConnectionWrapper connection ) {
+ assert connection != null;
+ ConnectionWrapper invalidConnection = null;
+ try {
+ if (!connection.ping(this.pingTimeout.get(), TimeUnit.NANOSECONDS)) {
+ invalidConnection = connection;
+ }
+ } catch (InterruptedException e) {
+ // catch this, as there's not much we can do and the caller doesn't care or know how to handle it
+ this.logger.trace(e, "Interrupted while pinging a repository connection");
+ invalidConnection = connection;
+ } finally {
+ if (invalidConnection != null) {
+ connection = null;
+ returnConnection(invalidConnection);
+ }
+ }
+ return connection;
+ }
+
+ /**
+ * Obtain a new connection wrapped in a {@link ConnectionWrapper}. This method does not check whether creating the new
+ * connection would violate the {@link #maximumPoolSize maximum pool size} nor does it add the new connection to the
+ * {@link #availableConnections available connections} (as the caller may want it immediately), but it does increment the
+ * {@link #poolSize pool size}.
+ *
+ * @return the connection wrapper with a new connection
+ * @throws RepositorySourceException if there was an error obtaining the new connection
+ * @throws InterruptedException if the thread was interrupted during the operation
+ */
+ @GuardedBy( "mainLock" )
+ protected ConnectionWrapper newWrappedConnection() throws RepositorySourceException, InterruptedException {
+ RepositoryConnection connection = this.connectionFactory.createConnection();
+ ++this.poolSize;
+ this.totalConnectionsCreated.incrementAndGet();
+ return new ConnectionWrapper(connection);
+ }
+
+ /**
+ * Close a connection that is in the pool but no longer in the {@link #availableConnections available connections}. This
+ * method does decrement the {@link #poolSize pool size}.
+ *
+ * @param wrapper the wrapper for the connection to be closed
+ * @throws InterruptedException if the thread was interrupted during the operation
+ */
+ protected void closeConnection( ConnectionWrapper wrapper ) throws InterruptedException {
+ assert wrapper != null;
+ RepositoryConnection original = wrapper.getOriginal();
+ assert original != null;
+ try {
+ this.logger.debug("Closing repository connection to {0}", getSourceName());
+ original.close();
+ } finally {
+ final ReentrantLock mainLock = this.mainLock;
+ try {
+ mainLock.lock();
+ // No matter what reduce the pool size count
+ --this.poolSize;
+ // And if shutting down and this was the last connection being used...
+ if (this.runState == SHUTDOWN && this.poolSize <= 0) {
+ // then signal anybody that has called "awaitTermination(...)"
+ this.logger.trace("Signalling termination of repository connection pool for {0}", getSourceName());
+ this.runState = TERMINATED;
+ this.termination.signalAll();
+ this.logger.trace("Terminated repository connection pool for {0}", getSourceName());
+
+ // fall through to call terminate() outside of lock.
+ }
+ } finally {
+ mainLock.unlock();
+ }
+ }
+ }
+
+ @GuardedBy( "mainLock" )
+ protected int drainUnusedConnections( int count ) {
+ if (count <= 0) return 0;
+ this.logger.trace("Draining up to {0} unused repository connections to {1}", count, getSourceName());
+ // Drain the extra connections from those available ...
+ Collection<ConnectionWrapper> extraConnections = new LinkedList<ConnectionWrapper>();
+ this.availableConnections.drainTo(extraConnections, count);
+ for (ConnectionWrapper connection : extraConnections) {
+ try {
+ this.logger.trace("Closing repository connection to {0}", getSourceName());
+ connection.getOriginal().close();
+ } catch (InterruptedException e) {
+ // Ignore this ...
+ }
+ }
+ int numClosed = extraConnections.size();
+ this.poolSize -= numClosed;
+ this.logger.trace("Drained {0} unused connections", numClosed);
+ return numClosed;
+ }
+
+ @GuardedBy( "mainLock" )
+ protected boolean addConnectionIfUnderCorePoolSize() throws RepositorySourceException, InterruptedException {
+ // Add connection ...
+ if (this.poolSize < this.corePoolSize) {
+ this.availableConnections.offer(newWrappedConnection());
+ this.logger.trace("Added connection to {0} in undersized pool", getSourceName());
+ return true;
+ }
+ return false;
+ }
+
+ @GuardedBy( "mainLock" )
+ protected int addConnectionsIfUnderCorePoolSize() throws RepositorySourceException, InterruptedException {
+ // Add connections ...
+ int n = 0;
+ while (this.poolSize < this.corePoolSize) {
+ this.availableConnections.offer(newWrappedConnection());
+ ++n;
+ }
+ this.logger.trace("Added {0} connection(s) to {1} in undersized pool", n, getSourceName());
+ return n;
+ }
+
+ protected class ConnectionWrapper implements RepositoryConnection {
+
+ private final RepositoryConnection original;
+ private final long timeCreated;
+ private long lastUsed;
+ private boolean closed = false;
+
+ protected ConnectionWrapper( RepositoryConnection connection ) {
+ assert connection != null;
+ this.original = connection;
+ this.timeCreated = System.currentTimeMillis();
+ }
+
+ /**
+ * @return original
+ */
+ protected RepositoryConnection getOriginal() {
+ return this.original;
+ }
+
+ /**
+ * @return lastUsed
+ */
+ public long getTimeLastUsed() {
+ return this.lastUsed;
+ }
+
+ /**
+ * @return timeCreated
+ */
+ public long getTimeCreated() {
+ return this.timeCreated;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getSourceName() {
+ return this.original.getSourceName();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public XAResource getXAResource() {
+ if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
+ return this.original.getXAResource();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public CachePolicy getDefaultCachePolicy() {
+ if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
+ return this.original.getDefaultCachePolicy();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute( ExecutionContext context,
+ GraphCommand... commands ) throws RepositorySourceException, InterruptedException {
+ if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
+ this.original.execute(context, commands);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean ping( long time,
+ TimeUnit unit ) throws InterruptedException {
+ if (closed) throw new IllegalStateException(SpiI18n.closedConnectionMayNotBeUsed.text());
+ return this.original.ping(time, unit);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void close() throws InterruptedException {
+ if (!closed) {
+ this.lastUsed = System.currentTimeMillis();
+ this.original.close();
+ this.closed = true;
+ returnConnection(this);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setListener( RepositorySourceListener listener ) {
+ if (!closed) this.original.setListener(listener);
+ }
+
+ }
+
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryOperation.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryOperation.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryOperation.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,68 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import org.jboss.dna.spi.ExecutionContext;
-
-/**
- * An operation that runs against a repository connection.
- *
- * @author Randall Hauch
- * @param <T> the type of result returned by the client
- */
-public interface RepositoryOperation<T> {
-
- /**
- * Get the name of this operation.
- *
- * @return the operation's name
- */
- String getName();
-
- /**
- * Run the operation using the supplied connection.
- *
- * @param context the environment in which this operation is executing; may not be null
- * @param connection the connection; may not be null
- * @return the result of the operation
- * @throws RepositorySourceException if there is a problem with the connection
- * @throws InterruptedException if this thread was interrupted
- */
- T run( ExecutionContext context,
- RepositoryConnection connection ) throws RepositorySourceException, InterruptedException;
-
- /**
- * A factory interface for creating repository operations.
- *
- * @param <T> the type of result for the operations
- * @author Randall Hauch
- */
- public static interface Factory<T> {
-
- /**
- * Create a repository operation that returns the result of type T.
- *
- * @return the operation
- */
- RepositoryOperation<T> create();
- }
-}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryOperations.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryOperations.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositoryOperations.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,171 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.Callable;
-import org.jboss.dna.common.util.ArgCheck;
-import org.jboss.dna.common.util.LogContext;
-import org.jboss.dna.spi.ExecutionContext;
-
-/**
- * @author Randall Hauch
- */
-public class RepositoryOperations {
-
- /**
- * Call the supplied operation, using a connection from this pool.
- *
- * @param <T> the return type for the operation
- * @param context the context in which the operation is to execute; may not be null
- * @param connectionFactory the factory for the connection to use
- * @param operation the operation to be run using a new connection obtained from the factory
- * @return the results from the operation
- * @throws RepositorySourceException if there was an error obtaining the new connection
- * @throws InterruptedException if the thread was interrupted during the operation
- * @throws IllegalArgumentException if the operation is null
- * @see #createCallable(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, Iterable)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation...)
- */
- public static <T> T call( ExecutionContext context,
- RepositoryConnectionFactory connectionFactory,
- RepositoryOperation<T> operation ) throws RepositorySourceException, InterruptedException {
- ArgCheck.isNotNull(operation, "repository operation");
- // Get a connection ...
- T result = null;
- LogContext.set("context", operation.getName());
- RepositoryConnection conn = connectionFactory.getConnection();
- try {
- // And run the client with the connection ...
- result = operation.run(context, conn);
- } finally {
- conn.close();
- }
- LogContext.clear();
- return result;
- }
-
- /**
- * Return a callable object that, when run, performs the supplied repository operation against a connection obtained from the
- * supplied factory.
- *
- * @param <T> the return type for the operation
- * @param context the context in which the operation is to execute; may not be null
- * @param connectionFactory the factory for the connection to use
- * @param operation the operation to be run using a new connection obtained from the factory
- * @return the callable
- * @see #call(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, Iterable)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation...)
- */
- public static <T> Callable<T> createCallable( final ExecutionContext context,
- final RepositoryConnectionFactory connectionFactory,
- final RepositoryOperation<T> operation ) {
- ArgCheck.isNotNull(operation, "repository operation");
- return new Callable<T>() {
-
- /**
- * Execute by getting a connection from this pool, running the client, and return the connection to the pool.
- *
- * @return the operation's result
- * @throws Exception
- */
- public T call() throws Exception {
- return RepositoryOperations.call(context, connectionFactory, operation);
- }
- };
- }
-
- /**
- * Return a collection of callable objects that, when run, perform the supplied repository operations against connections in
- * this pool.
- *
- * @param <T> the return type for the operations
- * @param context the context in which the operation is to execute; may not be null
- * @param connectionFactory the factory for the connection to use
- * @param operations the operations to be run using connections from the factory
- * @return the collection of callables
- * @see #call(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallable(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, Iterable)
- */
- public static <T> List<Callable<T>> createCallables( final ExecutionContext context,
- final RepositoryConnectionFactory connectionFactory,
- final RepositoryOperation<T>... operations ) {
- List<Callable<T>> callables = new ArrayList<Callable<T>>();
- for (final RepositoryOperation<T> operation : operations) {
- callables.add(createCallable(context, connectionFactory, operation));
- }
- return callables;
- }
-
- /**
- * Return a collection of callable objects that, when run, perform the supplied repository operations against connections in
- * this pool.
- *
- * @param <T> the return type for the operations
- * @param context the context in which the operation is to execute; may not be null
- * @param connectionFactory the factory for the connection to use
- * @param operations the operations to be run using connections from the factory
- * @return the collection of callables
- * @see #call(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallable(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation...)
- */
- public static <T> List<Callable<T>> createCallables( final ExecutionContext context,
- final RepositoryConnectionFactory connectionFactory,
- Iterable<RepositoryOperation<T>> operations ) {
- List<Callable<T>> callables = new ArrayList<Callable<T>>();
- for (final RepositoryOperation<T> operation : operations) {
- callables.add(createCallable(context, connectionFactory, operation));
- }
- return callables;
- }
-
- /**
- * Return a collection of callable objects that, when run, perform the supplied repository operations against connections in
- * this pool.
- *
- * @param <T> the return type for the operations
- * @param context the context in which the operation is to execute; may not be null
- * @param connectionFactory the factory for the connection to use
- * @param operations the operations to be run using connections from the factory
- * @return the collection of callables
- * @see #call(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallable(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation)
- * @see #createCallables(ExecutionContext, RepositoryConnectionFactory, RepositoryOperation...)
- */
- public static <T> List<Callable<T>> createCallables( final ExecutionContext context,
- final RepositoryConnectionFactory connectionFactory,
- Iterator<RepositoryOperation<T>> operations ) {
- List<Callable<T>> callables = new ArrayList<Callable<T>>();
- while (operations.hasNext()) {
- final RepositoryOperation<T> operation = operations.next();
- callables.add(createCallable(context, connectionFactory, operation));
- }
- return callables;
- }
-
-}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySource.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,75 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.io.Serializable;
-import javax.naming.Referenceable;
-
-/**
- * A repository source is a description of a resource that can be used to access or store repository information. This class
- * serves as a factory for {@link RepositoryConnection} instances and provides some basic configuration information.
- * <p>
- * Typically this interface is implemented by classes that provide standard-style getters and setters for the various properties
- * necessary for proper configuration via reflection or introspection. This interface expects nor defines any such properties,
- * leaving that entirely to the implementation classes.
- * </p>
- * <p>
- * Implementations should also provide a no-arg constructor so that it is possible to easily create instances and initialize using
- * the standard getters and setters. One example where this is required is when a RepositorySource instance is recorded in a
- * repository (e.g., in a configuration area), and needs to be reinstantiated.
- * </p>
- * <p>
- * Objects that implement this <code>RepositorySource</code> interface are typically registered with a naming service such as Java
- * Naming and Directory Interface<sup><font size=-3>TM</font></sup> (JNDI). This interface extends both {@link Referenceable} and
- * {@link Serializable} so that such objects can be stored in any JNDI naming context and enable proper system recovery,
- * </p>
- *
- * @author Randall Hauch
- */
-public interface RepositorySource extends ManagedRepositoryConnectionFactory, Referenceable, Serializable {
-
- /**
- * Get the maximum number of retries that may be performed on a given operation when using {@link #getConnection()
- * connections} created by this source. This value does not constitute a minimum number of retries; in fact, the connection
- * user is not required to retry any operations.
- *
- * @return the maximum number of allowable retries, or 0 if the source has no limit
- */
- int getRetryLimit();
-
- /**
- * Set the maximum number of retries that may be performed on a given operation when using {@link #getConnection()
- * connections} created by this source. This value does not constitute a minimum number of retries; in fact, the connection
- * user is not required to retry any operations.
- *
- * @param limit the maximum number of allowable retries, or 0 if the source has no limit
- */
- void setRetryLimit( int limit );
-
- /**
- * Get the capabilities for this source.
- *
- * @return the capabilities for this source; never null
- */
- RepositorySourceCapabilities getCapabilities();
-
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySource.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,178 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.io.Serializable;
+import java.util.concurrent.TimeUnit;
+import javax.naming.Referenceable;
+
+/**
+ * A repository source is a description of a resource that can be used to access or store repository information. This class
+ * serves as a factory for {@link RepositoryConnection} instances and provides some basic configuration information.
+ * <p>
+ * Typically this interface is implemented by classes that provide standard-style getters and setters for the various properties
+ * necessary for proper configuration via reflection or introspection. This interface expects nor defines any such properties,
+ * leaving that entirely to the implementation classes.
+ * </p>
+ * <p>
+ * Implementations should also provide a no-arg constructor so that it is possible to easily create instances and initialize using
+ * the standard getters and setters. One example where this is required is when a RepositorySource instance is recorded in a
+ * repository (e.g., in a configuration area), and needs to be reinstantiated.
+ * </p>
+ * <p>
+ * Objects that implement this <code>RepositorySource</code> interface are typically registered with a naming service such as Java
+ * Naming and Directory Interface<sup><font size=-3>TM</font></sup> (JNDI). This interface extends both {@link Referenceable} and
+ * {@link Serializable} so that such objects can be stored in any JNDI naming context and enable proper system recovery,
+ * </p>
+ * <p>
+ * Pooling connections is not done above or outside of the RepositorySource implementations. Therefore, if an implementation would
+ * benefit from pooling connections, it should use a pool within the implementation (and expose any pool parameters as desired).
+ * If this is the case, the implementation class may benefit from subclassing {@link AbstractRepositorySource} (which manages a
+ * pool of connections).
+ * </p>
+ *
+ * @author Randall Hauch
+ */
+public interface RepositorySource extends Referenceable, Serializable {
+
+ /**
+ * Get the name for this repository source.
+ *
+ * @return the name; never null or empty
+ */
+ String getName();
+
+ /**
+ * Get a connection from this source.
+ *
+ * @return a connection
+ * @throws RepositorySourceException if there is a problem obtaining a connection
+ * @throws InterruptedException if the thread is interrupted while attempting to get a connection
+ * @throws IllegalStateException if the factory is not in a state to create or return connections
+ */
+ RepositoryConnection getConnection() throws RepositorySourceException, InterruptedException;
+
+ /**
+ * Initiates an orderly shutdown in which connections that are currently in use are allowed to be used and closed as normal,
+ * but no new connections will be created. Invocation has no additional effect if already shut down.
+ * <p>
+ * Once the source has been shutdown, it may not be used to {@link #getConnection() get connections}.
+ * </p>
+ *
+ * @throws SecurityException if a security manager exists and shutting down this pool may manipulate threads that the caller
+ * is not permitted to modify because it does not hold {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+ * or the security manager's <tt>checkAccess</tt> method denies access.
+ * @see #shutdownNow()
+ */
+ void shutdown();
+
+ /**
+ * Attempts to close all connections, including those connections currently in use, and prevent the use of other connections.
+ *
+ * @throws SecurityException if a security manager exists and shutting down this pool may manipulate threads that the caller
+ * is not permitted to modify because it does not hold {@link java.lang.RuntimePermission}<tt>("modifyThread")</tt>,
+ * or the security manager's <tt>checkAccess</tt> method denies access.
+ * @see #shutdown()
+ */
+ void shutdownNow();
+
+ /**
+ * Return whether this source is running and is able to {@link #getConnection() provide connections}. Note that this method is
+ * effectively <code>!isShutdown()</code>.
+ *
+ * @return true if this source is running, or false otherwise
+ * @see #isShutdown()
+ * @see #isTerminated()
+ * @see #isTerminating()
+ */
+ boolean isRunning();
+
+ /**
+ * Return whether this source is in the process of shutting down or has already been shut down. A result of <code>true</code>
+ * signals that the pool may no longer be used. Note that this method is effectively <code>!isRunning()</code>.
+ *
+ * @return true if this source has been shut down, or false otherwise
+ * @see #isShutdown()
+ * @see #isTerminated()
+ * @see #isTerminating()
+ */
+ boolean isShutdown();
+
+ /**
+ * Returns true if this source is in the process of terminating after {@link #shutdown()} or {@link #shutdownNow()} has been
+ * called but has not completely terminated. This method may be useful for debugging. A return of <tt>true</tt> reported a
+ * sufficient period after shutdown may indicate that submitted tasks have ignored or suppressed interruption, causing this
+ * executor not to properly terminate.
+ *
+ * @return true if terminating but not yet terminated, or false otherwise
+ * @see #isTerminated()
+ */
+ boolean isTerminating();
+
+ /**
+ * Return true if this pool has completed its termination and no longer has any open connections.
+ *
+ * @return true if terminated, or false otherwise
+ * @see #isTerminating()
+ */
+ boolean isTerminated();
+
+ /**
+ * Method that can be called after {@link #shutdown()} or {@link #shutdownNow()} to wait until all connections in use at the
+ * time those methods were called have been closed normally. This method accepts a maximum time duration, after which it will
+ * return even if all connections have not been closed.
+ *
+ * @param timeout the maximum time to wait for all connections to be closed and returned to the pool
+ * @param unit the time unit for <code>timeout</code>
+ * @return true if the pool was terminated in the supplied time (or was already terminated), or false if the timeout occurred
+ * before all the connections were closed
+ * @throws InterruptedException if the thread was interrupted
+ */
+ boolean awaitTermination( long timeout,
+ TimeUnit unit ) throws InterruptedException;
+
+ /**
+ * Get the maximum number of retries that may be performed on a given operation when using {@link #getConnection()
+ * connections} created by this source. This value does not constitute a minimum number of retries; in fact, the connection
+ * user is not required to retry any operations.
+ *
+ * @return the maximum number of allowable retries, or 0 if the source has no limit
+ */
+ int getRetryLimit();
+
+ /**
+ * Set the maximum number of retries that may be performed on a given operation when using {@link #getConnection()
+ * connections} created by this source. This value does not constitute a minimum number of retries; in fact, the connection
+ * user is not required to retry any operations.
+ *
+ * @param limit the maximum number of allowable retries, or 0 if the source has no limit
+ */
+ void setRetryLimit( int limit );
+
+ /**
+ * Get the capabilities for this source.
+ *
+ * @return the capabilities for this source; never null
+ */
+ RepositorySourceCapabilities getCapabilities();
+
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySourceCapabilities.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,44 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-/**
- * The capabilities of a {@link RepositorySource}.
- *
- * @author Randall Hauch
- */
-public interface RepositorySourceCapabilities {
-
- /**
- * Return whether the source supports same name siblings. If not, then no two siblings may share the same name.
- *
- * @return true if same name siblings are supported, or false otherwise
- */
- boolean supportsSameNameSiblings();
-
- /**
- * Return whether the source supports updates.
- *
- * @return true if updates are supported, or false if the source only supports reads.
- */
- boolean supportsUpdates();
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySourceCapabilities.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceCapabilities.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+/**
+ * The capabilities of a {@link RepositorySource}.
+ *
+ * @author Randall Hauch
+ */
+public interface RepositorySourceCapabilities {
+
+ /**
+ * Return whether the source supports same name siblings. If not, then no two siblings may share the same name.
+ *
+ * @return true if same name siblings are supported, or false otherwise
+ */
+ boolean supportsSameNameSiblings();
+
+ /**
+ * Return whether the source supports updates.
+ *
+ * @return true if updates are supported, or false if the source only supports reads.
+ */
+ boolean supportsUpdates();
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySourceException.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,84 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-/**
- * @author Randall Hauch
- */
-public class RepositorySourceException extends RuntimeException {
-
- /**
- */
- private static final long serialVersionUID = -7704170453962924565L;
- private final String sourceName;
-
- /**
- * @param sourceName the identifier of the source from which this exception eminates
- */
- public RepositorySourceException( String sourceName ) {
- this.sourceName = sourceName;
- }
-
- /**
- * @param sourceName the identifier of the source from which this exception eminates
- * @param message
- */
- public RepositorySourceException( String sourceName, String message ) {
- super(message);
- this.sourceName = sourceName;
- }
-
- /**
- * @param sourceName the identifier of the source from which this exception eminates
- * @param cause
- */
- public RepositorySourceException( String sourceName, Throwable cause ) {
- super(cause);
- this.sourceName = sourceName;
- }
-
- /**
- * @param sourceName the identifier of the source from which this exception eminates
- * @param message
- * @param cause
- */
- public RepositorySourceException( String sourceName, String message, Throwable cause ) {
- super(message, cause);
- this.sourceName = sourceName;
- }
-
- /**
- * @return sourceName
- */
- public String getSourceName() {
- return this.sourceName;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String toString() {
- return super.toString();
- }
-
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySourceException.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceException.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,84 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+/**
+ * @author Randall Hauch
+ */
+public class RepositorySourceException extends RuntimeException {
+
+ /**
+ */
+ private static final long serialVersionUID = -7704170453962924565L;
+ private final String sourceName;
+
+ /**
+ * @param sourceName the identifier of the source from which this exception eminates
+ */
+ public RepositorySourceException( String sourceName ) {
+ this.sourceName = sourceName;
+ }
+
+ /**
+ * @param sourceName the identifier of the source from which this exception eminates
+ * @param message
+ */
+ public RepositorySourceException( String sourceName, String message ) {
+ super(message);
+ this.sourceName = sourceName;
+ }
+
+ /**
+ * @param sourceName the identifier of the source from which this exception eminates
+ * @param cause
+ */
+ public RepositorySourceException( String sourceName, Throwable cause ) {
+ super(cause);
+ this.sourceName = sourceName;
+ }
+
+ /**
+ * @param sourceName the identifier of the source from which this exception eminates
+ * @param message
+ * @param cause
+ */
+ public RepositorySourceException( String sourceName, String message, Throwable cause ) {
+ super(message, cause);
+ this.sourceName = sourceName;
+ }
+
+ /**
+ * @return sourceName
+ */
+ public String getSourceName() {
+ return this.sourceName;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return super.toString();
+ }
+
+}
Deleted: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySourceListener.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,30 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-/**
- * @author Randall Hauch
- */
-public interface RepositorySourceListener {
-
- void notify( String sourceName, Object... events );
-}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java (from rev 393, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositorySourceListener.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceListener.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,30 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+/**
+ * @author Randall Hauch
+ */
+public interface RepositorySourceListener {
+
+ void notify( String sourceName, Object... events );
+}
Copied: trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceRegistry.java (from rev 389, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionFactories.java)
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceRegistry.java (rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/connector/RepositorySourceRegistry.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,39 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+/**
+ * An interface for any collection of {@link RepositorySource} instances that are accessed by their name.
+ *
+ * @author Randall Hauch
+ */
+public interface RepositorySourceRegistry {
+
+ /**
+ * Obtain a {@link RepositorySource} given its name.
+ *
+ * @param sourceName the name of the source to obtain
+ * @return the source, or null if no such source could be found (or created)
+ */
+ RepositorySource getRepositorySource( String sourceName );
+
+}
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutor.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -22,6 +22,8 @@
package org.jboss.dna.spi.graph.commands.executor;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceException;
import org.jboss.dna.spi.graph.DateTime;
import org.jboss.dna.spi.graph.commands.CompositeCommand;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
@@ -35,8 +37,6 @@
import org.jboss.dna.spi.graph.commands.MoveBranchCommand;
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
-import org.jboss.dna.spi.graph.connection.RepositoryConnection;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* Abstract implementation of the {@link CommandExecutor} interface that provides implementations for all methods, making this a
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/CommandExecutor.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/CommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/CommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -21,6 +21,7 @@
*/
package org.jboss.dna.spi.graph.commands.executor;
+import org.jboss.dna.spi.connector.RepositorySourceException;
import org.jboss.dna.spi.graph.commands.CompositeCommand;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
import org.jboss.dna.spi.graph.commands.CopyNodeCommand;
@@ -33,7 +34,6 @@
import org.jboss.dna.spi.graph.commands.MoveBranchCommand;
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* @author Randall Hauch
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/DelegatingCommandExecutor.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/DelegatingCommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/DelegatingCommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -21,6 +21,7 @@
*/
package org.jboss.dna.spi.graph.commands.executor;
+import org.jboss.dna.spi.connector.RepositorySourceException;
import org.jboss.dna.spi.graph.commands.CompositeCommand;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
import org.jboss.dna.spi.graph.commands.CopyNodeCommand;
@@ -33,7 +34,6 @@
import org.jboss.dna.spi.graph.commands.MoveBranchCommand;
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* @author Randall Hauch
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/LoggingCommandExecutor.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/LoggingCommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/LoggingCommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -23,6 +23,7 @@
import org.jboss.dna.common.util.Logger;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.connector.RepositorySourceException;
import org.jboss.dna.spi.graph.commands.CompositeCommand;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
import org.jboss.dna.spi.graph.commands.CopyNodeCommand;
@@ -35,7 +36,6 @@
import org.jboss.dna.spi.graph.commands.MoveBranchCommand;
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* @author Randall Hauch
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/NoOpCommandExecutor.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/NoOpCommandExecutor.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/executor/NoOpCommandExecutor.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -22,6 +22,8 @@
package org.jboss.dna.spi.graph.commands.executor;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceException;
import org.jboss.dna.spi.graph.DateTime;
import org.jboss.dna.spi.graph.commands.CompositeCommand;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
@@ -35,8 +37,6 @@
import org.jboss.dna.spi.graph.commands.MoveBranchCommand;
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
-import org.jboss.dna.spi.graph.connection.RepositorySource;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
/**
* @author Randall Hauch
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector (from rev 389, trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection)
Deleted: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionPoolTest.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,219 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.jboss.dna.spi.graph.connection.RepositorySourceLoadHarness.runLoadTest;
-import static org.junit.Assert.assertThat;
-import java.util.List;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import org.jboss.dna.spi.ExecutionContext;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-/**
- * @author Randall Hauch
- */
-public class RepositoryConnectionPoolTest {
-
- private RepositoryConnectionPool pool;
- private TimeDelayingRepositorySource repositorySource;
- private ExecutionContext context;
-
- @Before
- public void beforeEach() {
- this.repositorySource = new TimeDelayingRepositorySource("source 1");
- this.pool = new RepositoryConnectionPool(this.repositorySource, 1, 1, 100, TimeUnit.SECONDS);
- this.context = null;
- }
-
- @After
- public void afterEach() throws Exception {
- pool.shutdown();
- pool.awaitTermination(2, TimeUnit.SECONDS);
- }
-
- @Test
- public void shouldBeCreatedInRunningState() {
- assertThat(pool.isShutdown(), is(false));
- assertThat(pool.isTerminating(), is(false));
- assertThat(pool.isTerminated(), is(false));
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
- }
-
- @Test
- public void shouldShutdownWhenNoConnectionsWereCreatedOrUsed() throws InterruptedException {
- assertThat(pool.isShutdown(), is(false));
- assertThat(pool.isTerminating(), is(false));
- assertThat(pool.isTerminated(), is(false));
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
-
- for (int i = 0; i != 4; ++i) {
- pool.shutdown();
- assertThat(pool.isShutdown() || pool.isTerminating() || pool.isTerminated(), is(true));
- pool.awaitTermination(2, TimeUnit.SECONDS);
- assertThat(pool.isTerminated(), is(true));
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
- }
- }
-
- @Test
- public void shouldCreateConnectionAndRecoverWhenClosed() throws RepositorySourceException, InterruptedException {
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
-
- RepositoryConnection conn = pool.getConnection();
- assertThat(conn, is(notNullValue()));
- assertThat(pool.getTotalConnectionsCreated(), is(1l));
- assertThat(pool.getTotalConnectionsUsed(), is(1l));
- assertThat(pool.getPoolSize(), is(1));
-
- conn.close();
-
- assertThat(pool.getTotalConnectionsCreated(), is(1l));
- assertThat(pool.getTotalConnectionsUsed(), is(1l));
- assertThat(pool.getPoolSize(), is(1));
- }
-
- @Test
- public void shouldAllowShutdownToBeCalledMultipleTimesEvenWhenShutdown()
- throws RepositorySourceException, InterruptedException {
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
-
- RepositoryConnection conn = pool.getConnection();
- assertThat(conn, is(notNullValue()));
- assertThat(pool.getTotalConnectionsCreated(), is(1l));
- assertThat(pool.getTotalConnectionsUsed(), is(1l));
- assertThat(pool.getPoolSize(), is(1));
-
- conn.close();
-
- assertThat(pool.getTotalConnectionsCreated(), is(1l));
- assertThat(pool.getTotalConnectionsUsed(), is(1l));
- assertThat(pool.getPoolSize(), is(1));
-
- pool.shutdown();
- pool.shutdown();
- pool.awaitTermination(2, TimeUnit.SECONDS);
- assertThat(pool.isTerminated(), is(true));
- assertThat(pool.getTotalConnectionsCreated(), is(1l));
- assertThat(pool.getTotalConnectionsUsed(), is(1l));
- pool.shutdown();
- pool.awaitTermination(2, TimeUnit.SECONDS);
- pool.shutdown();
- pool.awaitTermination(2, TimeUnit.SECONDS);
- }
-
- @Test( expected = IllegalStateException.class )
- public void shouldNotCreateConnectionIfPoolIsNotRunning() throws RepositorySourceException, InterruptedException {
- pool.shutdown();
- pool.awaitTermination(2, TimeUnit.SECONDS);
- assertThat(pool.isTerminated(), is(true));
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
- pool.getConnection(); // this should fail with illegal state
- }
-
- @Test
- public void shouldAllowConnectionsToBeClosedMoreThanOnceWithNoIllEffects()
- throws RepositorySourceException, InterruptedException {
- assertThat(pool.getTotalConnectionsCreated(), is(0l));
- assertThat(pool.getTotalConnectionsUsed(), is(0l));
-
- RepositoryConnection conn = pool.getConnection();
- assertThat(conn, is(notNullValue()));
- assertThat(pool.getTotalConnectionsCreated(), is(1l));
- assertThat(pool.getTotalConnectionsUsed(), is(1l));
- assertThat(pool.getPoolSize(), is(1));
-
- conn.close();
- conn.close();
- }
-
- @Test
- public void shouldBlockClientsWhenNotEnoughConnections() throws Exception {
- int numConnectionsInPool = 1;
- int numClients = 2;
- RepositoryConnectionPool pool = new RepositoryConnectionPool(repositorySource);
- pool.setCorePoolSize(numConnectionsInPool);
- pool.setMaximumPoolSize(numConnectionsInPool);
- RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(10);
- runLoadTest(context, pool, numClients, 100, TimeUnit.MILLISECONDS, operationFactory);
- pool.shutdown();
- pool.awaitTermination(4, TimeUnit.SECONDS);
- }
-
- @Test
- public void shouldLimitClientsToRunSequentiallyWithOneConnectionInPool() throws Exception {
- int numConnectionsInPool = 1;
- int numClients = 3;
- RepositoryConnectionPool pool = new RepositoryConnectionPool(repositorySource);
- pool.setCorePoolSize(numConnectionsInPool);
- pool.setMaximumPoolSize(numConnectionsInPool);
- RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(10);
- runLoadTest(context, pool, numClients, 100, TimeUnit.MILLISECONDS, operationFactory);
- pool.shutdown();
- pool.awaitTermination(4, TimeUnit.SECONDS);
- }
-
- @Test
- public void shouldClientsToRunConncurrentlyWithTwoConnectionsInPool() throws Exception {
- int numConnectionsInPool = 2;
- int numClients = 10;
- RepositoryConnectionPool pool = new RepositoryConnectionPool(repositorySource);
- pool.setCorePoolSize(numConnectionsInPool);
- pool.setMaximumPoolSize(numConnectionsInPool);
- RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(10);
- runLoadTest(context, pool, numClients, 100, TimeUnit.MILLISECONDS, operationFactory);
- pool.shutdown();
- pool.awaitTermination(4, TimeUnit.SECONDS);
- }
-
- @Ignore( "doesn't run on hudson" )
- @Test
- public void shouldClientsToRunConncurrentlyWithMultipleConnectionInPool() throws Exception {
- int numConnectionsInPool = 10;
- int numClients = 50;
- RepositoryConnectionPool pool = new RepositoryConnectionPool(repositorySource);
- pool.setCorePoolSize(numConnectionsInPool);
- pool.setMaximumPoolSize(numConnectionsInPool);
- RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(20);
- List<Future<Integer>> results = runLoadTest(context, pool, numClients, 200, TimeUnit.MILLISECONDS, operationFactory);
- int total = 0;
- for (Future<Integer> result : results) {
- assertThat(result.isDone(), is(true));
- if (result.isDone()) total += result.get();
- }
- assertThat(total, is(20 * numClients));
- pool.shutdown();
- pool.awaitTermination(4, TimeUnit.SECONDS);
- }
-
-}
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java (from rev 393, trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/RepositoryConnectionPoolTest.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryConnectionPoolTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,232 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import static org.jboss.dna.spi.connector.RepositorySourceLoadHarness.runLoadTest;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.junit.Assert.assertThat;
+import java.util.List;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositoryConnectionPool;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Randall Hauch
+ */
+public class RepositoryConnectionPoolTest {
+
+ private RepositoryConnectionPool pool;
+ private RepositoryConnectionPool.ConnectionFactory connectionFactory;
+ private ExecutionContext context;
+
+ @Before
+ public void beforeEach() {
+ final RepositorySource repositorySource = new TimeDelayingRepositorySource("source 1");
+ this.connectionFactory = new RepositoryConnectionPool.ConnectionFactory() {
+ public RepositoryConnection createConnection() throws RepositorySourceException, InterruptedException {
+ return repositorySource.getConnection();
+ }
+
+ public String getSourceName() {
+ return repositorySource.getName();
+ }
+ };
+ this.pool = new RepositoryConnectionPool(this.connectionFactory, 1, 1, 100, TimeUnit.SECONDS);
+ this.context = null;
+ }
+
+ @After
+ public void afterEach() throws Exception {
+ pool.shutdown();
+ pool.awaitTermination(2, TimeUnit.SECONDS);
+ }
+
+ @Test
+ public void shouldBeCreatedInRunningState() {
+ assertThat(pool.isShutdown(), is(false));
+ assertThat(pool.isTerminating(), is(false));
+ assertThat(pool.isTerminated(), is(false));
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+ }
+
+ @Test
+ public void shouldShutdownWhenNoConnectionsWereCreatedOrUsed() throws InterruptedException {
+ assertThat(pool.isShutdown(), is(false));
+ assertThat(pool.isTerminating(), is(false));
+ assertThat(pool.isTerminated(), is(false));
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+
+ for (int i = 0; i != 4; ++i) {
+ pool.shutdown();
+ assertThat(pool.isShutdown() || pool.isTerminating() || pool.isTerminated(), is(true));
+ pool.awaitTermination(2, TimeUnit.SECONDS);
+ assertThat(pool.isTerminated(), is(true));
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+ }
+ }
+
+ @Test
+ public void shouldCreateConnectionAndRecoverWhenClosed() throws RepositorySourceException, InterruptedException {
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+
+ RepositoryConnection conn = pool.getConnection();
+ assertThat(conn, is(notNullValue()));
+ assertThat(pool.getTotalConnectionsCreated(), is(1l));
+ assertThat(pool.getTotalConnectionsUsed(), is(1l));
+ assertThat(pool.getPoolSize(), is(1));
+
+ conn.close();
+
+ assertThat(pool.getTotalConnectionsCreated(), is(1l));
+ assertThat(pool.getTotalConnectionsUsed(), is(1l));
+ assertThat(pool.getPoolSize(), is(1));
+ }
+
+ @Test
+ public void shouldAllowShutdownToBeCalledMultipleTimesEvenWhenShutdown()
+ throws RepositorySourceException, InterruptedException {
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+
+ RepositoryConnection conn = pool.getConnection();
+ assertThat(conn, is(notNullValue()));
+ assertThat(pool.getTotalConnectionsCreated(), is(1l));
+ assertThat(pool.getTotalConnectionsUsed(), is(1l));
+ assertThat(pool.getPoolSize(), is(1));
+
+ conn.close();
+
+ assertThat(pool.getTotalConnectionsCreated(), is(1l));
+ assertThat(pool.getTotalConnectionsUsed(), is(1l));
+ assertThat(pool.getPoolSize(), is(1));
+
+ pool.shutdown();
+ pool.shutdown();
+ pool.awaitTermination(2, TimeUnit.SECONDS);
+ assertThat(pool.isTerminated(), is(true));
+ assertThat(pool.getTotalConnectionsCreated(), is(1l));
+ assertThat(pool.getTotalConnectionsUsed(), is(1l));
+ pool.shutdown();
+ pool.awaitTermination(2, TimeUnit.SECONDS);
+ pool.shutdown();
+ pool.awaitTermination(2, TimeUnit.SECONDS);
+ }
+
+ @Test( expected = IllegalStateException.class )
+ public void shouldNotCreateConnectionIfPoolIsNotRunning() throws RepositorySourceException, InterruptedException {
+ pool.shutdown();
+ pool.awaitTermination(2, TimeUnit.SECONDS);
+ assertThat(pool.isTerminated(), is(true));
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+ pool.getConnection(); // this should fail with illegal state
+ }
+
+ @Test
+ public void shouldAllowConnectionsToBeClosedMoreThanOnceWithNoIllEffects()
+ throws RepositorySourceException, InterruptedException {
+ assertThat(pool.getTotalConnectionsCreated(), is(0l));
+ assertThat(pool.getTotalConnectionsUsed(), is(0l));
+
+ RepositoryConnection conn = pool.getConnection();
+ assertThat(conn, is(notNullValue()));
+ assertThat(pool.getTotalConnectionsCreated(), is(1l));
+ assertThat(pool.getTotalConnectionsUsed(), is(1l));
+ assertThat(pool.getPoolSize(), is(1));
+
+ conn.close();
+ conn.close();
+ }
+
+ @Test
+ public void shouldBlockClientsWhenNotEnoughConnections() throws Exception {
+ int numConnectionsInPool = 1;
+ int numClients = 2;
+ RepositoryConnectionPool pool = new RepositoryConnectionPool(connectionFactory);
+ pool.setCorePoolSize(numConnectionsInPool);
+ pool.setMaximumPoolSize(numConnectionsInPool);
+ RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(10);
+ runLoadTest(context, pool, numClients, 100, TimeUnit.MILLISECONDS, operationFactory);
+ pool.shutdown();
+ pool.awaitTermination(4, TimeUnit.SECONDS);
+ }
+
+ @Test
+ public void shouldLimitClientsToRunSequentiallyWithOneConnectionInPool() throws Exception {
+ int numConnectionsInPool = 1;
+ int numClients = 3;
+ RepositoryConnectionPool pool = new RepositoryConnectionPool(connectionFactory);
+ pool.setCorePoolSize(numConnectionsInPool);
+ pool.setMaximumPoolSize(numConnectionsInPool);
+ RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(10);
+ runLoadTest(context, pool, numClients, 100, TimeUnit.MILLISECONDS, operationFactory);
+ pool.shutdown();
+ pool.awaitTermination(4, TimeUnit.SECONDS);
+ }
+
+ @Test
+ public void shouldClientsToRunConncurrentlyWithTwoConnectionsInPool() throws Exception {
+ int numConnectionsInPool = 2;
+ int numClients = 10;
+ RepositoryConnectionPool pool = new RepositoryConnectionPool(connectionFactory);
+ pool.setCorePoolSize(numConnectionsInPool);
+ pool.setMaximumPoolSize(numConnectionsInPool);
+ RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(10);
+ runLoadTest(context, pool, numClients, 100, TimeUnit.MILLISECONDS, operationFactory);
+ pool.shutdown();
+ pool.awaitTermination(4, TimeUnit.SECONDS);
+ }
+
+ @Ignore( "doesn't run on hudson" )
+ @Test
+ public void shouldClientsToRunConncurrentlyWithMultipleConnectionInPool() throws Exception {
+ int numConnectionsInPool = 10;
+ int numClients = 50;
+ RepositoryConnectionPool pool = new RepositoryConnectionPool(connectionFactory);
+ pool.setCorePoolSize(numConnectionsInPool);
+ pool.setMaximumPoolSize(numConnectionsInPool);
+ RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(20);
+ List<Future<Integer>> results = runLoadTest(context, pool, numClients, 200, TimeUnit.MILLISECONDS, operationFactory);
+ int total = 0;
+ for (Future<Integer> result : results) {
+ assertThat(result.isDone(), is(true));
+ if (result.isDone()) total += result.get();
+ }
+ assertThat(total, is(20 * numClients));
+ pool.shutdown();
+ pool.awaitTermination(4, TimeUnit.SECONDS);
+ }
+
+}
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperation.java (from rev 389, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryOperation.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperation.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperation.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+
+/**
+ * An operation that runs against a repository connection.
+ *
+ * @author Randall Hauch
+ * @param <T> the type of result returned by the client
+ */
+public interface RepositoryOperation<T> {
+
+ /**
+ * Get the name of this operation.
+ *
+ * @return the operation's name
+ */
+ String getName();
+
+ /**
+ * Run the operation using the supplied connection.
+ *
+ * @param context the environment in which this operation is executing; may not be null
+ * @param connection the connection; may not be null
+ * @return the result of the operation
+ * @throws RepositorySourceException if there is a problem with the connection
+ * @throws InterruptedException if this thread was interrupted
+ */
+ T run( ExecutionContext context,
+ RepositoryConnection connection ) throws RepositorySourceException, InterruptedException;
+
+ /**
+ * A factory interface for creating repository operations.
+ *
+ * @param <T> the type of result for the operations
+ * @author Randall Hauch
+ */
+ public static interface Factory<T> {
+
+ /**
+ * Create a repository operation that returns the result of type T.
+ *
+ * @return the operation
+ */
+ RepositoryOperation<T> create();
+ }
+}
Property changes on: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperation.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperations.java (from rev 389, trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/RepositoryOperations.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperations.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperations.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,174 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.common.util.LogContext;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositoryConnectionPool;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+
+/**
+ * @author Randall Hauch
+ */
+public class RepositoryOperations {
+
+ /**
+ * Call the supplied operation, using a connection from this pool.
+ *
+ * @param <T> the return type for the operation
+ * @param context the context in which the operation is to execute; may not be null
+ * @param pool the pool to use
+ * @param operation the operation to be run using a new connection obtained from the factory
+ * @return the results from the operation
+ * @throws RepositorySourceException if there was an error obtaining the new connection
+ * @throws InterruptedException if the thread was interrupted during the operation
+ * @throws IllegalArgumentException if the operation is null
+ * @see #createCallable(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, Iterable)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, RepositoryOperation...)
+ */
+ public static <T> T call( ExecutionContext context,
+ RepositoryConnectionPool pool,
+ RepositoryOperation<T> operation ) throws RepositorySourceException, InterruptedException {
+ ArgCheck.isNotNull(operation, "repository operation");
+ // Get a connection ...
+ T result = null;
+ LogContext.set("context", operation.getName());
+ RepositoryConnection conn = pool.getConnection();
+ try {
+ // And run the client with the connection ...
+ result = operation.run(context, conn);
+ } finally {
+ conn.close();
+ }
+ LogContext.clear();
+ return result;
+ }
+
+ /**
+ * Return a callable object that, when run, performs the supplied repository operation against a connection obtained from the
+ * supplied factory.
+ *
+ * @param <T> the return type for the operation
+ * @param context the context in which the operation is to execute; may not be null
+ * @param pool the pool to use
+ * @param operation the operation to be run using a new connection obtained from the factory
+ * @return the callable
+ * @see #call(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, Iterable)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, RepositoryOperation...)
+ */
+ public static <T> Callable<T> createCallable( final ExecutionContext context,
+ final RepositoryConnectionPool pool,
+ final RepositoryOperation<T> operation ) {
+ ArgCheck.isNotNull(operation, "repository operation");
+ return new Callable<T>() {
+
+ /**
+ * Execute by getting a connection from this pool, running the client, and return the connection to the pool.
+ *
+ * @return the operation's result
+ * @throws Exception
+ */
+ public T call() throws Exception {
+ return RepositoryOperations.call(context, pool, operation);
+ }
+ };
+ }
+
+ /**
+ * Return a collection of callable objects that, when run, perform the supplied repository operations against connections in
+ * this pool.
+ *
+ * @param <T> the return type for the operations
+ * @param context the context in which the operation is to execute; may not be null
+ * @param pool the pool to use
+ * @param operations the operations to be run using connections from the factory
+ * @return the collection of callables
+ * @see #call(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallable(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, Iterable)
+ */
+ public static <T> List<Callable<T>> createCallables( final ExecutionContext context,
+ final RepositoryConnectionPool pool,
+ final RepositoryOperation<T>... operations ) {
+ List<Callable<T>> callables = new ArrayList<Callable<T>>();
+ for (final RepositoryOperation<T> operation : operations) {
+ callables.add(createCallable(context, pool, operation));
+ }
+ return callables;
+ }
+
+ /**
+ * Return a collection of callable objects that, when run, perform the supplied repository operations against connections in
+ * this pool.
+ *
+ * @param <T> the return type for the operations
+ * @param context the context in which the operation is to execute; may not be null
+ * @param pool the pool to use
+ * @param operations the operations to be run using connections from the factory
+ * @return the collection of callables
+ * @see #call(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallable(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, RepositoryOperation...)
+ */
+ public static <T> List<Callable<T>> createCallables( final ExecutionContext context,
+ final RepositoryConnectionPool pool,
+ Iterable<RepositoryOperation<T>> operations ) {
+ List<Callable<T>> callables = new ArrayList<Callable<T>>();
+ for (final RepositoryOperation<T> operation : operations) {
+ callables.add(createCallable(context, pool, operation));
+ }
+ return callables;
+ }
+
+ /**
+ * Return a collection of callable objects that, when run, perform the supplied repository operations against connections in
+ * this pool.
+ *
+ * @param <T> the return type for the operations
+ * @param context the context in which the operation is to execute; may not be null
+ * @param pool the pool to use
+ * @param operations the operations to be run using connections from the factory
+ * @return the collection of callables
+ * @see #call(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallable(ExecutionContext, RepositoryConnectionPool, RepositoryOperation)
+ * @see #createCallables(ExecutionContext, RepositoryConnectionPool, RepositoryOperation...)
+ */
+ public static <T> List<Callable<T>> createCallables( final ExecutionContext context,
+ final RepositoryConnectionPool pool,
+ Iterator<RepositoryOperation<T>> operations ) {
+ List<Callable<T>> callables = new ArrayList<Callable<T>>();
+ while (operations.hasNext()) {
+ final RepositoryOperation<T> operation = operations.next();
+ callables.add(createCallable(context, pool, operation));
+ }
+ return callables;
+ }
+
+}
Property changes on: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositoryOperations.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/RepositorySourceLoadHarness.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,246 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import org.jboss.dna.common.i18n.MockI18n;
-import org.jboss.dna.common.util.Logger;
-import org.jboss.dna.spi.ExecutionContext;
-
-/**
- * A test harness for using repository connections under load.
- *
- * @author Randall Hauch
- */
-public class RepositorySourceLoadHarness {
-
- public static Future<Integer> execute( RepositoryConnectionFactory connectionFactory,
- ExecutionContext context,
- long maxTime,
- TimeUnit maxTimeUnit ) throws InterruptedException {
- int numTimes = 1;
- int numClients = 1;
- RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(numTimes);
- List<Future<Integer>> results = runLoadTest(context,
- connectionFactory,
- numClients,
- maxTime,
- maxTimeUnit,
- operationFactory);
- return results.get(0);
- }
-
- public static <T> List<Future<T>> runLoadTest( ExecutionContext context,
- RepositoryConnectionFactory connectionFactory,
- int numClients,
- long maxTime,
- TimeUnit maxTimeUnit,
- RepositoryOperation.Factory<T> clientFactory ) throws InterruptedException {
- // Create the clients ...
- Collection<RepositoryOperation<T>> clients = new ArrayList<RepositoryOperation<T>>();
- for (int i = 0; i != numClients; ++i) {
- clients.add(clientFactory.create());
- }
-
- // and run the test ...
- return runLoadTest(context, connectionFactory, maxTime, maxTimeUnit, clients);
- }
-
- public static <T> List<Future<T>> runLoadTest( ExecutionContext context,
- RepositoryConnectionFactory connectionFactory,
- long maxTime,
- TimeUnit maxTimeUnit,
- RepositoryOperation<T>... clients ) throws InterruptedException {
- // Create the client collection ...
- Collection<RepositoryOperation<T>> clientCollection = new ArrayList<RepositoryOperation<T>>();
- for (RepositoryOperation<T> client : clients) {
- if (client != null) clientCollection.add(client);
- }
- // and run the test ...
- return runLoadTest(context, connectionFactory, maxTime, maxTimeUnit, clientCollection);
- }
-
- public static <T> List<Future<T>> runLoadTest( ExecutionContext context,
- RepositoryConnectionFactory connectionFactory,
- long maxTime,
- TimeUnit maxTimeUnit,
- Collection<RepositoryOperation<T>> clients ) throws InterruptedException {
- assert connectionFactory != null;
- assert clients != null;
- assert clients.size() > 0;
-
- // Create an Executor Service, using a thread factory that makes the first 'n' thread all wait for each other ...
- ExecutorService clientPool = null;
- if (clients.size() == 1) {
- clientPool = Executors.newSingleThreadExecutor();
- } else {
- final ThreadFactory threadFactory = new TestThreadFactory(clients.size());
- clientPool = Executors.newFixedThreadPool(clients.size(), threadFactory);
- }
-
- try {
- // Wrap each client by a callable and by another that uses a latch ...
- List<Callable<T>> callables = RepositoryOperations.createCallables(context, connectionFactory, clients);
-
- // Run the tests ...
- List<Future<T>> futures = clientPool.invokeAll(callables, maxTime, maxTimeUnit);
- return futures;
- } finally {
- // Shut down the pool of clients ...
- clientPool.shutdown();
- if (!clientPool.awaitTermination(5, TimeUnit.SECONDS)) {
- String msg = "Unable to shutdown clients after 5 seconds";
- Logger.getLogger(RepositorySourceLoadHarness.class).error(MockI18n.passthrough, msg);
- }
- }
-
- }
-
- /**
- * A thread factory that makes an initial set of threads wait until all of those threads are created and ready. This is useful
- * in testing to ensure that the first threads created don't get a jump start.
- *
- * @author Randall Hauch
- */
- protected static class TestThreadFactory implements ThreadFactory {
-
- protected final int totalNumberOfThreads;
- protected final CountDownLatch latch;
-
- public TestThreadFactory( int numberOfThreadsToWait ) {
- this.latch = new CountDownLatch(numberOfThreadsToWait);
- this.totalNumberOfThreads = numberOfThreadsToWait;
- }
-
- /**
- * {@inheritDoc}
- */
- public Thread newThread( Runnable runnable ) {
- return new Thread(runnable) {
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void run() {
- if (totalNumberOfThreads > 1) {
- // There are other threads, and we want to synchronize with them ...
- try {
- // Count down the number of threads that are to reach this point (if 0, this doesn't do anything)
- latch.countDown();
- // Wait for all threads to reach this point ...
- latch.await();
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- super.run();
- }
- };
- }
- }
-
- /**
- * Return an operation factory that produces {@link RepositoryOperation} instances that each call
- * {@link RepositoryConnection#execute(ExecutionContext, org.jboss.dna.spi.graph.commands.GraphCommand...)} the supplied
- * number of times, intermixed with random math operations and {@link Thread#yield() yielding}.
- *
- * @param callsPerOperation the number of <code>load</code> calls per RepositoryOperation
- * @return the factory
- */
- public static RepositoryOperation.Factory<Integer> createMultipleLoadOperationFactory( final int callsPerOperation ) {
- return new RepositoryOperation.Factory<Integer>() {
-
- public RepositoryOperation<Integer> create() {
- return new CallLoadMultipleTimes(callsPerOperation);
- }
- };
- }
-
- public static class CallLoadMultipleTimes implements RepositoryOperation<Integer> {
-
- private final int count;
-
- public CallLoadMultipleTimes( int count ) {
- Logger.getLogger(RepositorySourceLoadHarness.class).debug("Creating repository operation to call {0} times", count);
- this.count = count;
- }
-
- /**
- * {@inheritDoc}
- */
- public String getName() {
- return Thread.currentThread().getName() + "-CallLoadMultipleTimes";
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryOperation#run(org.jboss.dna.spi.ExecutionContext,
- * org.jboss.dna.spi.graph.connection.RepositoryConnection)
- */
- public Integer run( ExecutionContext context,
- RepositoryConnection connection ) throws RepositorySourceException, InterruptedException {
- Logger.getLogger(RepositorySourceLoadHarness.class).debug("Running {0} operation", this.getClass().getSimpleName());
- int total = count;
- for (int i = 0; i != count; ++i) {
- // Add two random numbers ...
- int int1 = random(this.hashCode() ^ (int)System.nanoTime() * i);
- if (i % 2 == 0) {
- Thread.yield();
- }
- connection.execute(context);
- int int2 = random(this.hashCode() ^ (int)System.nanoTime() + i);
- total += Math.min(Math.abs(Math.max(int1, int2) + int1 * int2 / 3), count);
- }
- Logger.getLogger(RepositorySourceLoadHarness.class).debug("Finishing {0} operation", this.getClass().getSimpleName());
- return total < count ? total : count; // should really always return count
- }
- }
-
- /**
- * A "random-enough" number generator that is cheap and that has no synchronization issues (like some other random number
- * generators).
- * <p>
- * This was taken from <a href="http://wwww.jcip.org">Java Concurrency In Practice</a> (page 253).
- * </p>
- *
- * @param seed the seed, typically based on a hash code and nanoTime
- * @return a number that is "random enough"
- */
- public static int random( int seed ) {
- seed ^= (seed << 6);
- seed ^= (seed >>> 21);
- seed ^= (seed << 7);
- return seed;
- }
-
-}
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java (from rev 393, trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/RepositorySourceLoadHarness.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/RepositorySourceLoadHarness.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,244 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import org.jboss.dna.common.i18n.MockI18n;
+import org.jboss.dna.common.util.Logger;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositoryConnectionPool;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+
+/**
+ * A test harness for using repository connections under load.
+ *
+ * @author Randall Hauch
+ */
+public class RepositorySourceLoadHarness {
+
+ public static Future<Integer> execute( RepositoryConnectionPool pool,
+ ExecutionContext context,
+ long maxTime,
+ TimeUnit maxTimeUnit ) throws InterruptedException {
+ int numTimes = 1;
+ int numClients = 1;
+ RepositoryOperation.Factory<Integer> operationFactory = RepositorySourceLoadHarness.createMultipleLoadOperationFactory(numTimes);
+ List<Future<Integer>> results = runLoadTest(context, pool, numClients, maxTime, maxTimeUnit, operationFactory);
+ return results.get(0);
+ }
+
+ public static <T> List<Future<T>> runLoadTest( ExecutionContext context,
+ RepositoryConnectionPool pool,
+ int numClients,
+ long maxTime,
+ TimeUnit maxTimeUnit,
+ RepositoryOperation.Factory<T> clientFactory ) throws InterruptedException {
+ // Create the clients ...
+ Collection<RepositoryOperation<T>> clients = new ArrayList<RepositoryOperation<T>>();
+ for (int i = 0; i != numClients; ++i) {
+ clients.add(clientFactory.create());
+ }
+
+ // and run the test ...
+ return runLoadTest(context, pool, maxTime, maxTimeUnit, clients);
+ }
+
+ public static <T> List<Future<T>> runLoadTest( ExecutionContext context,
+ RepositoryConnectionPool pool,
+ long maxTime,
+ TimeUnit maxTimeUnit,
+ RepositoryOperation<T>... clients ) throws InterruptedException {
+ // Create the client collection ...
+ Collection<RepositoryOperation<T>> clientCollection = new ArrayList<RepositoryOperation<T>>();
+ for (RepositoryOperation<T> client : clients) {
+ if (client != null) clientCollection.add(client);
+ }
+ // and run the test ...
+ return runLoadTest(context, pool, maxTime, maxTimeUnit, clientCollection);
+ }
+
+ public static <T> List<Future<T>> runLoadTest( ExecutionContext context,
+ RepositoryConnectionPool pool,
+ long maxTime,
+ TimeUnit maxTimeUnit,
+ Collection<RepositoryOperation<T>> clients ) throws InterruptedException {
+ assert pool != null;
+ assert clients != null;
+ assert clients.size() > 0;
+
+ // Create an Executor Service, using a thread factory that makes the first 'n' thread all wait for each other ...
+ ExecutorService clientPool = null;
+ if (clients.size() == 1) {
+ clientPool = Executors.newSingleThreadExecutor();
+ } else {
+ final ThreadFactory threadFactory = new TestThreadFactory(clients.size());
+ clientPool = Executors.newFixedThreadPool(clients.size(), threadFactory);
+ }
+
+ try {
+ // Wrap each client by a callable and by another that uses a latch ...
+ List<Callable<T>> callables = RepositoryOperations.createCallables(context, pool, clients);
+
+ // Run the tests ...
+ List<Future<T>> futures = clientPool.invokeAll(callables, maxTime, maxTimeUnit);
+ return futures;
+ } finally {
+ // Shut down the pool of clients ...
+ clientPool.shutdown();
+ if (!clientPool.awaitTermination(5, TimeUnit.SECONDS)) {
+ String msg = "Unable to shutdown clients after 5 seconds";
+ Logger.getLogger(RepositorySourceLoadHarness.class).error(MockI18n.passthrough, msg);
+ }
+ }
+
+ }
+
+ /**
+ * A thread factory that makes an initial set of threads wait until all of those threads are created and ready. This is useful
+ * in testing to ensure that the first threads created don't get a jump start.
+ *
+ * @author Randall Hauch
+ */
+ protected static class TestThreadFactory implements ThreadFactory {
+
+ protected final int totalNumberOfThreads;
+ protected final CountDownLatch latch;
+
+ public TestThreadFactory( int numberOfThreadsToWait ) {
+ this.latch = new CountDownLatch(numberOfThreadsToWait);
+ this.totalNumberOfThreads = numberOfThreadsToWait;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Thread newThread( Runnable runnable ) {
+ return new Thread(runnable) {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void run() {
+ if (totalNumberOfThreads > 1) {
+ // There are other threads, and we want to synchronize with them ...
+ try {
+ // Count down the number of threads that are to reach this point (if 0, this doesn't do anything)
+ latch.countDown();
+ // Wait for all threads to reach this point ...
+ latch.await();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ super.run();
+ }
+ };
+ }
+ }
+
+ /**
+ * Return an operation factory that produces {@link RepositoryOperation} instances that each call
+ * {@link RepositoryConnection#execute(ExecutionContext, org.jboss.dna.spi.graph.commands.GraphCommand...)} the supplied
+ * number of times, intermixed with random math operations and {@link Thread#yield() yielding}.
+ *
+ * @param callsPerOperation the number of <code>load</code> calls per RepositoryOperation
+ * @return the factory
+ */
+ public static RepositoryOperation.Factory<Integer> createMultipleLoadOperationFactory( final int callsPerOperation ) {
+ return new RepositoryOperation.Factory<Integer>() {
+
+ public RepositoryOperation<Integer> create() {
+ return new CallLoadMultipleTimes(callsPerOperation);
+ }
+ };
+ }
+
+ public static class CallLoadMultipleTimes implements RepositoryOperation<Integer> {
+
+ private final int count;
+
+ public CallLoadMultipleTimes( int count ) {
+ Logger.getLogger(RepositorySourceLoadHarness.class).debug("Creating repository operation to call {0} times", count);
+ this.count = count;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getName() {
+ return Thread.currentThread().getName() + "-CallLoadMultipleTimes";
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryOperation#run(org.jboss.dna.spi.ExecutionContext,
+ * org.jboss.dna.spi.connector.RepositoryConnection)
+ */
+ public Integer run( ExecutionContext context,
+ RepositoryConnection connection ) throws RepositorySourceException, InterruptedException {
+ Logger.getLogger(RepositorySourceLoadHarness.class).debug("Running {0} operation", this.getClass().getSimpleName());
+ int total = count;
+ for (int i = 0; i != count; ++i) {
+ // Add two random numbers ...
+ int int1 = random(this.hashCode() ^ (int)System.nanoTime() * i);
+ if (i % 2 == 0) {
+ Thread.yield();
+ }
+ connection.execute(context);
+ int int2 = random(this.hashCode() ^ (int)System.nanoTime() + i);
+ total += Math.min(Math.abs(Math.max(int1, int2) + int1 * int2 / 3), count);
+ }
+ Logger.getLogger(RepositorySourceLoadHarness.class).debug("Finishing {0} operation", this.getClass().getSimpleName());
+ return total < count ? total : count; // should really always return count
+ }
+ }
+
+ /**
+ * A "random-enough" number generator that is cheap and that has no synchronization issues (like some other random number
+ * generators).
+ * <p>
+ * This was taken from <a href="http://wwww.jcip.org">Java Concurrency In Practice</a> (page 253).
+ * </p>
+ *
+ * @param seed the seed, typically based on a hash code and nanoTime
+ * @return a number that is "random enough"
+ */
+ public static int random( int seed ) {
+ seed ^= (seed << 6);
+ seed ^= (seed >>> 21);
+ seed ^= (seed << 7);
+ return seed;
+ }
+
+}
Deleted: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepository.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,202 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.spi.DnaLexicon;
-import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.graph.Name;
-import org.jboss.dna.spi.graph.NameFactory;
-import org.jboss.dna.spi.graph.Path;
-import org.jboss.dna.spi.graph.PathFactory;
-import org.jboss.dna.spi.graph.Property;
-import org.jboss.dna.spi.graph.PropertyFactory;
-
-/**
- * A very simple repository that maintains properties for nodes identified by a path, and computes the children based upon the set
- * of paths registered in the {@link #getData() data}.
- * <p>
- * Note that the repository does not automatically rename same-name siblings when nodes are
- * {@link #delete(ExecutionContext, String) deleted} or {@link #create(ExecutionContext, String) explicitly} or
- * {@link #setProperty(ExecutionContext, String, String, Object...) implicitly} created.
- * </p>
- *
- * @author Randall Hauch
- */
-@ThreadSafe
-public class SimpleRepository {
-
- public static final String DEFAULT_UUID_PROPERTY_NAME = DnaLexicon.PropertyNames.UUID;
-
- private static final ConcurrentMap<String, SimpleRepository> repositoriesByName = new ConcurrentHashMap<String, SimpleRepository>();
-
- public static SimpleRepository get( String name ) {
- return repositoriesByName.get(name);
- }
-
- public static void shutdownAll() {
- for (SimpleRepository repository : repositoriesByName.values()) {
- repository.shutdown();
- }
- }
-
- private ConcurrentMap<Path, Map<Name, Property>> data = new ConcurrentHashMap<Path, Map<Name, Property>>();
- private final String repositoryName;
- private String uuidPropertyName = DEFAULT_UUID_PROPERTY_NAME;
- private boolean shutdown = false;
-
- public SimpleRepository( String repositoryName ) {
- this.repositoryName = repositoryName;
- if (repositoriesByName.putIfAbsent(repositoryName, this) != null) {
- throw new IllegalArgumentException("Repository \"" + repositoryName + "\" already exists and may not be recreated");
- }
- }
-
- /**
- * @return repositoryName
- */
- public String getRepositoryName() {
- return repositoryName;
- }
-
- /**
- * @return uuidPropertyName
- */
- public String getUuidPropertyName() {
- return uuidPropertyName;
- }
-
- /**
- * @param uuidPropertyName Sets uuidPropertyName to the specified value.
- */
- public void setUuidPropertyName( String uuidPropertyName ) {
- if (uuidPropertyName == null || uuidPropertyName.trim().length() == 0) uuidPropertyName = DEFAULT_UUID_PROPERTY_NAME;
- this.uuidPropertyName = uuidPropertyName;
- }
-
- /**
- * Get the current modifiable map of property data
- *
- * @return data
- */
- public ConcurrentMap<Path, Map<Name, Property>> getData() {
- return data;
- }
-
- /**
- * Utility method to help set the property on the node given by the supplied path. If the node does not exist, it will be
- * created.
- *
- * @param context the execution context; may not be null
- * @param path the path to the node; may not be null
- * @param propertyName the property name; may not be null
- * @param values the values of the property
- * @return this repository, for method chaining
- */
- public SimpleRepository setProperty( ExecutionContext context,
- String path,
- String propertyName,
- Object... values ) {
- PathFactory pathFactory = context.getValueFactories().getPathFactory();
- NameFactory nameFactory = context.getValueFactories().getNameFactory();
- PropertyFactory propertyFactory = context.getPropertyFactory();
- Path pathObj = pathFactory.create(path);
- create(context, pathObj.getAncestor().getString(context.getNamespaceRegistry()));
- Property property = propertyFactory.create(nameFactory.create(propertyName), values);
- Map<Name, Property> properties = new HashMap<Name, Property>();
- Map<Name, Property> existingProperties = data.putIfAbsent(pathObj, properties);
- if (existingProperties == null) existingProperties = properties;
- existingProperties.put(property.getName(), property);
- return this;
- }
-
- /**
- * Create the node if it does not exist.
- *
- * @param context the execution context; may not be null
- * @param path the path to the node; may not be null
- * @return this repository, for method chaining
- */
- public SimpleRepository create( ExecutionContext context,
- String path ) {
- PathFactory pathFactory = context.getValueFactories().getPathFactory();
- Path pathObj = pathFactory.create(path);
- Path ancestorPath = pathObj.getAncestor();
- while (!ancestorPath.isRoot()) {
- data.putIfAbsent(ancestorPath, new HashMap<Name, Property>());
- ancestorPath = ancestorPath.getAncestor();
- }
- data.putIfAbsent(pathObj, new HashMap<Name, Property>());
- Name uuidName = context.getValueFactories().getNameFactory().create(this.getUuidPropertyName());
- UUID uuid = context.getValueFactories().getUuidFactory().create();
- Property uuidProperty = context.getPropertyFactory().create(uuidName, uuid);
- data.get(pathObj).put(uuidProperty.getName(), uuidProperty);
- return this;
- }
-
- /**
- * Delete the branch rooted at the supplied path, if it exists.
- *
- * @param context the execution context; may not be null
- * @param path the path to the branch's top node; may not be null
- * @return this repository, for method chaining
- */
- public SimpleRepository delete( ExecutionContext context,
- String path ) {
- PathFactory pathFactory = context.getValueFactories().getPathFactory();
- Path pathObj = pathFactory.create(path);
- List<Path> pathsToRemove = new LinkedList<Path>();
- for (Path nodePath : data.keySet()) {
- if (nodePath.equals(pathObj) || nodePath.isDecendantOf(pathObj)) {
- pathsToRemove.add(nodePath);
- }
- }
- for (Path pathToRemove : pathsToRemove) {
- data.remove(pathToRemove);
- }
- return this;
- }
-
- /**
- * @param data new new map of property data
- */
- public void setData( ConcurrentMap<Path, Map<Name, Property>> data ) {
- this.data = data;
- }
-
- public boolean isShutdown() {
- return shutdown;
- }
-
- public void shutdown() {
- shutdown = true;
- repositoriesByName.remove(this.repositoryName);
- }
-
-}
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java (from rev 393, trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepository.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepository.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,202 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.spi.DnaLexicon;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.graph.Name;
+import org.jboss.dna.spi.graph.NameFactory;
+import org.jboss.dna.spi.graph.Path;
+import org.jboss.dna.spi.graph.PathFactory;
+import org.jboss.dna.spi.graph.Property;
+import org.jboss.dna.spi.graph.PropertyFactory;
+
+/**
+ * A very simple repository that maintains properties for nodes identified by a path, and computes the children based upon the set
+ * of paths registered in the {@link #getData() data}.
+ * <p>
+ * Note that the repository does not automatically rename same-name siblings when nodes are
+ * {@link #delete(ExecutionContext, String) deleted} or {@link #create(ExecutionContext, String) explicitly} or
+ * {@link #setProperty(ExecutionContext, String, String, Object...) implicitly} created.
+ * </p>
+ *
+ * @author Randall Hauch
+ */
+@ThreadSafe
+public class SimpleRepository {
+
+ public static final String DEFAULT_UUID_PROPERTY_NAME = DnaLexicon.PropertyNames.UUID;
+
+ private static final ConcurrentMap<String, SimpleRepository> repositoriesByName = new ConcurrentHashMap<String, SimpleRepository>();
+
+ public static SimpleRepository get( String name ) {
+ return repositoriesByName.get(name);
+ }
+
+ public static void shutdownAll() {
+ for (SimpleRepository repository : repositoriesByName.values()) {
+ repository.shutdown();
+ }
+ }
+
+ private ConcurrentMap<Path, Map<Name, Property>> data = new ConcurrentHashMap<Path, Map<Name, Property>>();
+ private final String repositoryName;
+ private String uuidPropertyName = DEFAULT_UUID_PROPERTY_NAME;
+ private boolean shutdown = false;
+
+ public SimpleRepository( String repositoryName ) {
+ this.repositoryName = repositoryName;
+ if (repositoriesByName.putIfAbsent(repositoryName, this) != null) {
+ throw new IllegalArgumentException("Repository \"" + repositoryName + "\" already exists and may not be recreated");
+ }
+ }
+
+ /**
+ * @return repositoryName
+ */
+ public String getRepositoryName() {
+ return repositoryName;
+ }
+
+ /**
+ * @return uuidPropertyName
+ */
+ public String getUuidPropertyName() {
+ return uuidPropertyName;
+ }
+
+ /**
+ * @param uuidPropertyName Sets uuidPropertyName to the specified value.
+ */
+ public void setUuidPropertyName( String uuidPropertyName ) {
+ if (uuidPropertyName == null || uuidPropertyName.trim().length() == 0) uuidPropertyName = DEFAULT_UUID_PROPERTY_NAME;
+ this.uuidPropertyName = uuidPropertyName;
+ }
+
+ /**
+ * Get the current modifiable map of property data
+ *
+ * @return data
+ */
+ public ConcurrentMap<Path, Map<Name, Property>> getData() {
+ return data;
+ }
+
+ /**
+ * Utility method to help set the property on the node given by the supplied path. If the node does not exist, it will be
+ * created.
+ *
+ * @param context the execution context; may not be null
+ * @param path the path to the node; may not be null
+ * @param propertyName the property name; may not be null
+ * @param values the values of the property
+ * @return this repository, for method chaining
+ */
+ public SimpleRepository setProperty( ExecutionContext context,
+ String path,
+ String propertyName,
+ Object... values ) {
+ PathFactory pathFactory = context.getValueFactories().getPathFactory();
+ NameFactory nameFactory = context.getValueFactories().getNameFactory();
+ PropertyFactory propertyFactory = context.getPropertyFactory();
+ Path pathObj = pathFactory.create(path);
+ create(context, pathObj.getAncestor().getString(context.getNamespaceRegistry()));
+ Property property = propertyFactory.create(nameFactory.create(propertyName), values);
+ Map<Name, Property> properties = new HashMap<Name, Property>();
+ Map<Name, Property> existingProperties = data.putIfAbsent(pathObj, properties);
+ if (existingProperties == null) existingProperties = properties;
+ existingProperties.put(property.getName(), property);
+ return this;
+ }
+
+ /**
+ * Create the node if it does not exist.
+ *
+ * @param context the execution context; may not be null
+ * @param path the path to the node; may not be null
+ * @return this repository, for method chaining
+ */
+ public SimpleRepository create( ExecutionContext context,
+ String path ) {
+ PathFactory pathFactory = context.getValueFactories().getPathFactory();
+ Path pathObj = pathFactory.create(path);
+ Path ancestorPath = pathObj.getAncestor();
+ while (!ancestorPath.isRoot()) {
+ data.putIfAbsent(ancestorPath, new HashMap<Name, Property>());
+ ancestorPath = ancestorPath.getAncestor();
+ }
+ data.putIfAbsent(pathObj, new HashMap<Name, Property>());
+ Name uuidName = context.getValueFactories().getNameFactory().create(this.getUuidPropertyName());
+ UUID uuid = context.getValueFactories().getUuidFactory().create();
+ Property uuidProperty = context.getPropertyFactory().create(uuidName, uuid);
+ data.get(pathObj).put(uuidProperty.getName(), uuidProperty);
+ return this;
+ }
+
+ /**
+ * Delete the branch rooted at the supplied path, if it exists.
+ *
+ * @param context the execution context; may not be null
+ * @param path the path to the branch's top node; may not be null
+ * @return this repository, for method chaining
+ */
+ public SimpleRepository delete( ExecutionContext context,
+ String path ) {
+ PathFactory pathFactory = context.getValueFactories().getPathFactory();
+ Path pathObj = pathFactory.create(path);
+ List<Path> pathsToRemove = new LinkedList<Path>();
+ for (Path nodePath : data.keySet()) {
+ if (nodePath.equals(pathObj) || nodePath.isDecendantOf(pathObj)) {
+ pathsToRemove.add(nodePath);
+ }
+ }
+ for (Path pathToRemove : pathsToRemove) {
+ data.remove(pathToRemove);
+ }
+ return this;
+ }
+
+ /**
+ * @param data new new map of property data
+ */
+ public void setData( ConcurrentMap<Path, Map<Name, Property>> data ) {
+ this.data = data;
+ }
+
+ public boolean isShutdown() {
+ return shutdown;
+ }
+
+ public void shutdown() {
+ shutdown = true;
+ repositoriesByName.remove(this.repositoryName);
+ }
+
+}
Deleted: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepositorySource.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,316 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import javax.naming.Reference;
-import javax.transaction.xa.XAResource;
-import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.cache.CachePolicy;
-import org.jboss.dna.spi.graph.InvalidPathException;
-import org.jboss.dna.spi.graph.Name;
-import org.jboss.dna.spi.graph.Path;
-import org.jboss.dna.spi.graph.Property;
-import org.jboss.dna.spi.graph.commands.GetChildrenCommand;
-import org.jboss.dna.spi.graph.commands.GetPropertiesCommand;
-import org.jboss.dna.spi.graph.commands.GraphCommand;
-import org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor;
-import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
-
-/**
- * A {@link RepositorySource} for a {@link SimpleRepository simple repository}.
- *
- * @author Randall Hauch
- */
-@ThreadSafe
-public class SimpleRepositorySource extends AbstractRepositorySource {
-
- private static final long serialVersionUID = 1L;
-
- private String repositoryName;
- private String name;
-
- public SimpleRepositorySource() {
- super();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory#getName()
- */
- public String getName() {
- return name;
- }
-
- /**
- * @param name Sets name to the specified value.
- */
- public void setName( String name ) {
- this.name = name;
- }
-
- /**
- * @return repositoryName
- */
- public String getRepositoryName() {
- return repositoryName;
- }
-
- /**
- * @param repositoryName Sets repositoryName to the specified value.
- */
- public void setRepositoryName( String repositoryName ) {
- this.repositoryName = repositoryName;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see javax.naming.Referenceable#getReference()
- */
- public Reference getReference() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see java.lang.Object#hashCode()
- */
- @Override
- public int hashCode() {
- return name.hashCode();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see java.lang.Object#equals(java.lang.Object)
- */
- @Override
- public boolean equals( Object obj ) {
- if (obj == this) return true;
- if (obj instanceof SimpleRepositorySource) {
- SimpleRepositorySource that = (SimpleRepositorySource)obj;
- if (!this.getName().equals(that.getName())) return false;
- if (!this.getRepositoryName().equals(that.getRepositoryName())) return false;
- return true;
- }
- return false;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#getCapabilities()
- */
- public RepositorySourceCapabilities getCapabilities() {
- return new Capabilities();
- }
-
- protected class Capabilities implements RepositorySourceCapabilities {
- public boolean supportsSameNameSiblings() {
- return true;
- }
-
- public boolean supportsUpdates() {
- return true;
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.AbstractRepositorySource#createConnection()
- */
- @Override
- protected synchronized RepositoryConnection createConnection() throws RepositorySourceException {
- String reposName = this.getRepositoryName();
- SimpleRepository repository = SimpleRepository.get(reposName);
- if (repository == null) {
- throw new RepositorySourceException(this.getName(), "Unable to find repository \"" + reposName + "\"");
- }
- return new Connection(repository);
- }
-
- protected class Connection implements RepositoryConnection {
-
- private RepositorySourceListener listener;
- private final SimpleRepository repository;
-
- protected Connection( SimpleRepository repository ) {
- assert repository != null;
- this.repository = repository;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#close()
- */
- public void close() {
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#execute(org.jboss.dna.spi.ExecutionContext,
- * org.jboss.dna.spi.graph.commands.GraphCommand[])
- */
- public void execute( ExecutionContext context,
- GraphCommand... commands ) throws RepositorySourceException, InterruptedException {
- assert context != null;
- if (repository.isShutdown()) {
- throw new RepositorySourceException(getName(), "The repository \"" + repository.getRepositoryName()
- + "\" is no longer available");
- }
- // Now execute the commands ...
- CommandExecutor executor = new Executor(this.repository, context, this.getSourceName());
- for (GraphCommand command : commands) {
- executor.execute(command);
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#getDefaultCachePolicy()
- */
- public CachePolicy getDefaultCachePolicy() {
- return null;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#getSourceName()
- */
- public String getSourceName() {
- return SimpleRepositorySource.this.getName();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#getXAResource()
- */
- public XAResource getXAResource() {
- return null;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#ping(long, java.util.concurrent.TimeUnit)
- */
- public boolean ping( long time,
- TimeUnit unit ) {
- return true;
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositoryConnection#setListener(org.jboss.dna.spi.graph.connection.RepositorySourceListener)
- */
- public void setListener( RepositorySourceListener listener ) {
- this.listener = listener;
- }
-
- /**
- * @return listener
- */
- public RepositorySourceListener getListener() {
- return listener;
- }
-
- }
-
- protected class Executor extends AbstractCommandExecutor {
- private final SimpleRepository repository;
- private final Name uuidPropertyName;
-
- protected Executor( SimpleRepository repository,
- ExecutionContext context,
- String sourceName ) {
- super(context, sourceName);
- this.repository = repository;
- this.uuidPropertyName = context.getValueFactories().getNameFactory().create(this.repository.getUuidPropertyName());
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor#execute(org.jboss.dna.spi.graph.commands.GetChildrenCommand)
- */
- @Override
- public void execute( GetChildrenCommand command ) throws RepositorySourceException {
- Path targetPath = command.getPath();
- Map<Path, Map<Name, Property>> data = repository.getData();
- if (data.get(targetPath) == null) {
- command.setError(new InvalidPathException("Non-existant node: " + targetPath));
- return;
- }
- // Iterate through all of the properties, looking for any paths that are children of the path ...
- List<Path.Segment> childSegments = new LinkedList<Path.Segment>();
- for (Path path : data.keySet()) {
- if (path.getAncestor().equals(targetPath)) {
- childSegments.add(path.getLastSegment());
- }
- }
- // This does not store children order, so sort ...
- Collections.sort(childSegments);
- for (Path.Segment childSegment : childSegments) {
- Map<Name, Property> properties = repository.getData().get(targetPath);
- Property uuidProperty = properties.get(uuidPropertyName);
- command.addChild(childSegment, uuidProperty);
- }
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor#execute(org.jboss.dna.spi.graph.commands.GetPropertiesCommand)
- */
- @Override
- public void execute( GetPropertiesCommand command ) throws RepositorySourceException {
- Path targetPath = command.getPath();
- Map<Name, Property> properties = repository.getData().get(targetPath);
- if (properties == null) {
- command.setError(new InvalidPathException("Non-existant node: " + targetPath));
- return;
- }
- for (Property property : properties.values()) {
- if (!property.getName().equals(this.uuidPropertyName)) {
- command.setProperty(property);
- }
- }
- }
- }
-
-}
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java (from rev 393, trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepositorySource.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/SimpleRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,322 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.naming.Reference;
+import javax.transaction.xa.XAResource;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.AbstractRepositorySource;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceCapabilities;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
+import org.jboss.dna.spi.graph.InvalidPathException;
+import org.jboss.dna.spi.graph.Name;
+import org.jboss.dna.spi.graph.Path;
+import org.jboss.dna.spi.graph.Property;
+import org.jboss.dna.spi.graph.commands.GetChildrenCommand;
+import org.jboss.dna.spi.graph.commands.GetPropertiesCommand;
+import org.jboss.dna.spi.graph.commands.GraphCommand;
+import org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor;
+import org.jboss.dna.spi.graph.commands.executor.CommandExecutor;
+
+/**
+ * A {@link RepositorySource} for a {@link SimpleRepository simple repository}.
+ *
+ * @author Randall Hauch
+ */
+@ThreadSafe
+public class SimpleRepositorySource extends AbstractRepositorySource {
+
+ private static final long serialVersionUID = 1L;
+
+ private String repositoryName;
+ private String name;
+
+ public SimpleRepositorySource() {
+ super();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#getName()
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name Sets name to the specified value.
+ */
+ public void setName( String name ) {
+ this.name = name;
+ }
+
+ /**
+ * @return repositoryName
+ */
+ public String getRepositoryName() {
+ return repositoryName;
+ }
+
+ /**
+ * @param repositoryName Sets repositoryName to the specified value.
+ */
+ public void setRepositoryName( String repositoryName ) {
+ this.repositoryName = repositoryName;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see javax.naming.Referenceable#getReference()
+ */
+ public Reference getReference() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals( Object obj ) {
+ if (obj == this) return true;
+ if (obj instanceof SimpleRepositorySource) {
+ SimpleRepositorySource that = (SimpleRepositorySource)obj;
+ if (!this.getName().equals(that.getName())) return false;
+ if (!this.getRepositoryName().equals(that.getRepositoryName())) return false;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#getCapabilities()
+ */
+ public RepositorySourceCapabilities getCapabilities() {
+ return new Capabilities();
+ }
+
+ protected class Capabilities implements RepositorySourceCapabilities {
+ public boolean supportsSameNameSiblings() {
+ return true;
+ }
+
+ public boolean supportsUpdates() {
+ return true;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.AbstractRepositorySource#createConnection()
+ */
+ @Override
+ protected synchronized RepositoryConnection createConnection() throws RepositorySourceException {
+ String reposName = this.getRepositoryName();
+ SimpleRepository repository = SimpleRepository.get(reposName);
+ if (repository == null) {
+ throw new RepositorySourceException(this.getName(), "Unable to find repository \"" + reposName + "\"");
+ }
+ return new Connection(repository);
+ }
+
+ protected class Connection implements RepositoryConnection {
+
+ private RepositorySourceListener listener;
+ private final SimpleRepository repository;
+
+ protected Connection( SimpleRepository repository ) {
+ assert repository != null;
+ this.repository = repository;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#close()
+ */
+ public void close() {
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#execute(org.jboss.dna.spi.ExecutionContext,
+ * org.jboss.dna.spi.graph.commands.GraphCommand[])
+ */
+ public void execute( ExecutionContext context,
+ GraphCommand... commands ) throws RepositorySourceException, InterruptedException {
+ assert context != null;
+ if (repository.isShutdown()) {
+ throw new RepositorySourceException(getName(), "The repository \"" + repository.getRepositoryName()
+ + "\" is no longer available");
+ }
+ // Now execute the commands ...
+ CommandExecutor executor = new Executor(this.repository, context, this.getSourceName());
+ for (GraphCommand command : commands) {
+ executor.execute(command);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#getDefaultCachePolicy()
+ */
+ public CachePolicy getDefaultCachePolicy() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#getSourceName()
+ */
+ public String getSourceName() {
+ return SimpleRepositorySource.this.getName();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#getXAResource()
+ */
+ public XAResource getXAResource() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#ping(long, java.util.concurrent.TimeUnit)
+ */
+ public boolean ping( long time,
+ TimeUnit unit ) {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositoryConnection#setListener(org.jboss.dna.spi.connector.RepositorySourceListener)
+ */
+ public void setListener( RepositorySourceListener listener ) {
+ this.listener = listener;
+ }
+
+ /**
+ * @return listener
+ */
+ public RepositorySourceListener getListener() {
+ return listener;
+ }
+
+ }
+
+ protected class Executor extends AbstractCommandExecutor {
+ private final SimpleRepository repository;
+ private final Name uuidPropertyName;
+
+ protected Executor( SimpleRepository repository,
+ ExecutionContext context,
+ String sourceName ) {
+ super(context, sourceName);
+ this.repository = repository;
+ this.uuidPropertyName = context.getValueFactories().getNameFactory().create(this.repository.getUuidPropertyName());
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor#execute(org.jboss.dna.spi.graph.commands.GetChildrenCommand)
+ */
+ @Override
+ public void execute( GetChildrenCommand command ) throws RepositorySourceException {
+ Path targetPath = command.getPath();
+ Map<Path, Map<Name, Property>> data = repository.getData();
+ if (data.get(targetPath) == null) {
+ command.setError(new InvalidPathException("Non-existant node: " + targetPath));
+ return;
+ }
+ // Iterate through all of the properties, looking for any paths that are children of the path ...
+ List<Path.Segment> childSegments = new LinkedList<Path.Segment>();
+ for (Path path : data.keySet()) {
+ if (path.getAncestor().equals(targetPath)) {
+ childSegments.add(path.getLastSegment());
+ }
+ }
+ // This does not store children order, so sort ...
+ Collections.sort(childSegments);
+ for (Path.Segment childSegment : childSegments) {
+ Map<Name, Property> properties = repository.getData().get(targetPath);
+ Property uuidProperty = properties.get(uuidPropertyName);
+ command.addChild(childSegment, uuidProperty);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.commands.executor.AbstractCommandExecutor#execute(org.jboss.dna.spi.graph.commands.GetPropertiesCommand)
+ */
+ @Override
+ public void execute( GetPropertiesCommand command ) throws RepositorySourceException {
+ Path targetPath = command.getPath();
+ Map<Name, Property> properties = repository.getData().get(targetPath);
+ if (properties == null) {
+ command.setError(new InvalidPathException("Non-existant node: " + targetPath));
+ return;
+ }
+ for (Property property : properties.values()) {
+ if (!property.getName().equals(this.uuidPropertyName)) {
+ command.setProperty(property);
+ }
+ }
+ }
+ }
+
+}
Deleted: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/TimeDelayingRepositorySource.java 2008-08-06 16:39:00 UTC (rev 389)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -1,329 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.jboss.dna.spi.graph.connection;
-
-import static org.mockito.Mockito.mock;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import javax.naming.Reference;
-import javax.transaction.xa.XAResource;
-import net.jcip.annotations.ThreadSafe;
-import org.jboss.dna.spi.ExecutionContext;
-import org.jboss.dna.spi.cache.CachePolicy;
-import org.jboss.dna.spi.graph.commands.GraphCommand;
-
-/**
- * A simple {@link RepositorySource} that simulates an imaginary source with a built-in delay mechanism.
- *
- * @author Randall Hauch
- */
-@ThreadSafe
-public class TimeDelayingRepositorySource extends AbstractRepositorySource {
-
- /**
- */
- private static final long serialVersionUID = -2756725117087437347L;
- private String name;
- private final AtomicInteger connectionsOpenedCount = new AtomicInteger(0);
- private final AtomicInteger connectionsClosedCount = new AtomicInteger(0);
- private final Set<Connection> openConnections = new CopyOnWriteArraySet<Connection>();
- private final AtomicLong loadCount = new AtomicLong(0);
- private final AtomicLong loadDelay = new AtomicLong(0);
- private final AtomicLong pingCount = new AtomicLong(0);
- private final AtomicLong pingDelay = new AtomicLong(0);
- private CachePolicy defaultCachePolicy;
-
- public TimeDelayingRepositorySource( String identifier ) {
- super();
- this.name = identifier;
- }
-
- /**
- * {@inheritDoc}
- */
- public String getName() {
- return this.name;
- }
-
- /**
- * @param name the identifier
- */
- public void setName( String name ) {
- this.name = name;
- }
-
- public CachePolicy getDefaultCachePolicy() {
- return defaultCachePolicy;
- }
-
- public void setDefaultCachePolicy( CachePolicy defaultCachePolicy ) {
- this.defaultCachePolicy = defaultCachePolicy;
- }
-
- /**
- * @return loadCount
- */
- public long getTotalExecuteCount() {
- return this.loadCount.get();
- }
-
- /**
- * @return pingCount
- */
- public long getTotalPingCount() {
- return this.pingCount.get();
- }
-
- /**
- * @return loadDelay
- */
- public long getConnectionExecuteDelayInMillis() {
- return this.loadDelay.get();
- }
-
- public void setConnectionExecuteDelay( long time,
- TimeUnit unit ) {
- this.loadDelay.set(unit.toMillis(time));
- }
-
- /**
- * @return pingDelay
- */
- public long getConnectionPingDelayInMillis() {
- return this.pingDelay.get();
- }
-
- public void setConnectionPingDelay( long time,
- TimeUnit unit ) {
- this.pingDelay.set(unit.toMillis(time));
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.AbstractRepositorySource#createConnection()
- */
- @Override
- protected RepositoryConnection createConnection() throws RepositorySourceException {
- int connectionNumber = this.connectionsOpenedCount.incrementAndGet();
- String connectionName = "Connection " + connectionNumber;
- XAResource xaResource = newXaResource(connectionName);
- Connection c = newConnection(connectionName, xaResource);
- this.openConnections.add(c);
- return c;
- }
-
- /**
- * Factory method that can be overridden by subclasses. This method implementation simply creates a mock {@link XAResource}.
- *
- * @param connectionName the name of the connection
- * @return the XAResource, or null if this source does not support XA
- */
- protected XAResource newXaResource( String connectionName ) {
- return mock(XAResource.class);
- }
-
- /**
- * Factory method that can be overridden by subclasses. This method implementation creates a new {@link Connection} that uses
- * standard bean properties for the various delays and counts.
- *
- * @param connectionName
- * @param xaResource
- * @return a new Connection
- * @throws RepositorySourceException
- */
- protected Connection newConnection( String connectionName,
- XAResource xaResource ) throws RepositorySourceException {
- Connection c = new Connection(connectionName, this.loadDelay.get(), this.pingDelay.get());
- c.setXaResource(xaResource);
- return c;
- }
-
- protected void close( Connection conn ) {
- if (conn != null && this.openConnections.remove(conn)) {
- this.connectionsClosedCount.incrementAndGet();
- this.loadCount.addAndGet(conn.getLoadCount());
- this.pingCount.addAndGet(conn.getPingCount());
- }
- }
-
- public int getOpenConnectionCount() {
- return this.openConnections.size();
- }
-
- public int getTotalConnectionsCreated() {
- return this.connectionsOpenedCount.get();
- }
-
- public int getTotalConnectionsClosed() {
- return this.connectionsClosedCount.get();
- }
-
- /**
- * {@inheritDoc}
- */
- public Reference getReference() {
- throw new UnsupportedOperationException();
- }
-
- /**
- * {@inheritDoc}
- *
- * @see org.jboss.dna.spi.graph.connection.RepositorySource#getCapabilities()
- */
- public RepositorySourceCapabilities getCapabilities() {
- return new Capabilities();
- }
-
- protected class Capabilities implements RepositorySourceCapabilities {
- public boolean supportsSameNameSiblings() {
- return true;
- }
-
- public boolean supportsUpdates() {
- return true;
- }
- }
-
- public class Connection implements RepositoryConnection {
-
- private final String connectionName;
- private final AtomicBoolean closed = new AtomicBoolean(false);
- private final AtomicBoolean loadResponse = new AtomicBoolean(true);
- private final AtomicBoolean pingResponse = new AtomicBoolean(true);
- private final AtomicLong closeCount = new AtomicLong(0);
- private final AtomicLong loadCount = new AtomicLong(0);
- private final AtomicLong loadDelay;
- private final AtomicLong pingCount = new AtomicLong(0);
- private final AtomicLong pingDelay;
- private final AtomicReference<XAResource> xaResource = new AtomicReference<XAResource>();
-
- protected Connection( String connectionName,
- long loadDelay,
- long pingDelay ) {
- assert connectionName != null && connectionName.trim().length() != 0;
- this.loadDelay = new AtomicLong(loadDelay);
- this.pingDelay = new AtomicLong(pingDelay);
- this.connectionName = connectionName;
- }
-
- public String getConnectionName() {
- return this.connectionName;
- }
-
- /**
- * {@inheritDoc}
- */
- public void close() {
- this.closeCount.incrementAndGet();
- this.closed.set(true);
- TimeDelayingRepositorySource.this.close(this);
- }
-
- /**
- * {@inheritDoc}
- */
- public String getSourceName() {
- return TimeDelayingRepositorySource.this.getName();
- }
-
- /**
- * {@inheritDoc}
- */
- public CachePolicy getDefaultCachePolicy() {
- return TimeDelayingRepositorySource.this.getDefaultCachePolicy();
- }
-
- /**
- * {@inheritDoc}
- */
- public XAResource getXAResource() {
- return this.xaResource.get();
- }
-
- public void setXaResource( XAResource xaResource ) {
- this.xaResource.set(xaResource);
- }
-
- /**
- * {@inheritDoc}
- */
- public void execute( ExecutionContext context,
- GraphCommand... commands ) throws InterruptedException {
- long delay = this.loadDelay.get();
- if (delay > 0l) Thread.sleep(delay);
- this.loadCount.incrementAndGet();
- }
-
- public void setLoadResponse( boolean response ) {
- this.loadResponse.set(response);
- }
-
- public void setLoadDelay( long time,
- TimeUnit unit ) {
- this.loadDelay.set(unit.toMillis(time));
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean ping( long time,
- TimeUnit unit ) throws InterruptedException {
- Thread.sleep(this.pingDelay.get());
- return this.pingResponse.get();
- }
-
- public void setPingResponse( boolean pingResponse ) {
- this.pingResponse.set(pingResponse);
- }
-
- public void setPingDelay( long time,
- TimeUnit unit ) {
- this.pingDelay.set(unit.toMillis(time));
- }
-
- public long getPingCount() {
- return this.pingCount.get();
- }
-
- public long getLoadCount() {
- return this.loadCount.get();
- }
-
- public long getCloseCount() {
- return this.closeCount.get();
- }
-
- /**
- * {@inheritDoc}
- */
- public void setListener( RepositorySourceListener listener ) {
- }
-
- }
-
-}
Copied: trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java (from rev 393, trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/TimeDelayingRepositorySource.java)
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java (rev 0)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/connector/TimeDelayingRepositorySource.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -0,0 +1,335 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.jboss.dna.spi.connector;
+
+import static org.mockito.Mockito.mock;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+import javax.naming.Reference;
+import javax.transaction.xa.XAResource;
+import net.jcip.annotations.ThreadSafe;
+import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.cache.CachePolicy;
+import org.jboss.dna.spi.connector.AbstractRepositorySource;
+import org.jboss.dna.spi.connector.RepositoryConnection;
+import org.jboss.dna.spi.connector.RepositorySource;
+import org.jboss.dna.spi.connector.RepositorySourceCapabilities;
+import org.jboss.dna.spi.connector.RepositorySourceException;
+import org.jboss.dna.spi.connector.RepositorySourceListener;
+import org.jboss.dna.spi.graph.commands.GraphCommand;
+
+/**
+ * A simple {@link RepositorySource} that simulates an imaginary source with a built-in delay mechanism.
+ *
+ * @author Randall Hauch
+ */
+@ThreadSafe
+public class TimeDelayingRepositorySource extends AbstractRepositorySource {
+
+ /**
+ */
+ private static final long serialVersionUID = -2756725117087437347L;
+ private String name;
+ private final AtomicInteger connectionsOpenedCount = new AtomicInteger(0);
+ private final AtomicInteger connectionsClosedCount = new AtomicInteger(0);
+ private final Set<Connection> openConnections = new CopyOnWriteArraySet<Connection>();
+ private final AtomicLong loadCount = new AtomicLong(0);
+ private final AtomicLong loadDelay = new AtomicLong(0);
+ private final AtomicLong pingCount = new AtomicLong(0);
+ private final AtomicLong pingDelay = new AtomicLong(0);
+ private CachePolicy defaultCachePolicy;
+
+ public TimeDelayingRepositorySource( String identifier ) {
+ super();
+ this.name = identifier;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getName() {
+ return this.name;
+ }
+
+ /**
+ * @param name the identifier
+ */
+ public void setName( String name ) {
+ this.name = name;
+ }
+
+ public CachePolicy getDefaultCachePolicy() {
+ return defaultCachePolicy;
+ }
+
+ public void setDefaultCachePolicy( CachePolicy defaultCachePolicy ) {
+ this.defaultCachePolicy = defaultCachePolicy;
+ }
+
+ /**
+ * @return loadCount
+ */
+ public long getTotalExecuteCount() {
+ return this.loadCount.get();
+ }
+
+ /**
+ * @return pingCount
+ */
+ public long getTotalPingCount() {
+ return this.pingCount.get();
+ }
+
+ /**
+ * @return loadDelay
+ */
+ public long getConnectionExecuteDelayInMillis() {
+ return this.loadDelay.get();
+ }
+
+ public void setConnectionExecuteDelay( long time,
+ TimeUnit unit ) {
+ this.loadDelay.set(unit.toMillis(time));
+ }
+
+ /**
+ * @return pingDelay
+ */
+ public long getConnectionPingDelayInMillis() {
+ return this.pingDelay.get();
+ }
+
+ public void setConnectionPingDelay( long time,
+ TimeUnit unit ) {
+ this.pingDelay.set(unit.toMillis(time));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.AbstractRepositorySource#createConnection()
+ */
+ @Override
+ protected RepositoryConnection createConnection() throws RepositorySourceException {
+ int connectionNumber = this.connectionsOpenedCount.incrementAndGet();
+ String connectionName = "Connection " + connectionNumber;
+ XAResource xaResource = newXaResource(connectionName);
+ Connection c = newConnection(connectionName, xaResource);
+ this.openConnections.add(c);
+ return c;
+ }
+
+ /**
+ * Factory method that can be overridden by subclasses. This method implementation simply creates a mock {@link XAResource}.
+ *
+ * @param connectionName the name of the connection
+ * @return the XAResource, or null if this source does not support XA
+ */
+ protected XAResource newXaResource( String connectionName ) {
+ return mock(XAResource.class);
+ }
+
+ /**
+ * Factory method that can be overridden by subclasses. This method implementation creates a new {@link Connection} that uses
+ * standard bean properties for the various delays and counts.
+ *
+ * @param connectionName
+ * @param xaResource
+ * @return a new Connection
+ * @throws RepositorySourceException
+ */
+ protected Connection newConnection( String connectionName,
+ XAResource xaResource ) throws RepositorySourceException {
+ Connection c = new Connection(connectionName, this.loadDelay.get(), this.pingDelay.get());
+ c.setXaResource(xaResource);
+ return c;
+ }
+
+ protected void close( Connection conn ) {
+ if (conn != null && this.openConnections.remove(conn)) {
+ this.connectionsClosedCount.incrementAndGet();
+ this.loadCount.addAndGet(conn.getLoadCount());
+ this.pingCount.addAndGet(conn.getPingCount());
+ }
+ }
+
+ public int getOpenConnectionCount() {
+ return this.openConnections.size();
+ }
+
+ public int getTotalConnectionsCreated() {
+ return this.connectionsOpenedCount.get();
+ }
+
+ public int getTotalConnectionsClosed() {
+ return this.connectionsClosedCount.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Reference getReference() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.connector.RepositorySource#getCapabilities()
+ */
+ public RepositorySourceCapabilities getCapabilities() {
+ return new Capabilities();
+ }
+
+ protected class Capabilities implements RepositorySourceCapabilities {
+ public boolean supportsSameNameSiblings() {
+ return true;
+ }
+
+ public boolean supportsUpdates() {
+ return true;
+ }
+ }
+
+ public class Connection implements RepositoryConnection {
+
+ private final String connectionName;
+ private final AtomicBoolean closed = new AtomicBoolean(false);
+ private final AtomicBoolean loadResponse = new AtomicBoolean(true);
+ private final AtomicBoolean pingResponse = new AtomicBoolean(true);
+ private final AtomicLong closeCount = new AtomicLong(0);
+ private final AtomicLong loadCount = new AtomicLong(0);
+ private final AtomicLong loadDelay;
+ private final AtomicLong pingCount = new AtomicLong(0);
+ private final AtomicLong pingDelay;
+ private final AtomicReference<XAResource> xaResource = new AtomicReference<XAResource>();
+
+ protected Connection( String connectionName,
+ long loadDelay,
+ long pingDelay ) {
+ assert connectionName != null && connectionName.trim().length() != 0;
+ this.loadDelay = new AtomicLong(loadDelay);
+ this.pingDelay = new AtomicLong(pingDelay);
+ this.connectionName = connectionName;
+ }
+
+ public String getConnectionName() {
+ return this.connectionName;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void close() {
+ this.closeCount.incrementAndGet();
+ this.closed.set(true);
+ TimeDelayingRepositorySource.this.close(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getSourceName() {
+ return TimeDelayingRepositorySource.this.getName();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public CachePolicy getDefaultCachePolicy() {
+ return TimeDelayingRepositorySource.this.getDefaultCachePolicy();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public XAResource getXAResource() {
+ return this.xaResource.get();
+ }
+
+ public void setXaResource( XAResource xaResource ) {
+ this.xaResource.set(xaResource);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute( ExecutionContext context,
+ GraphCommand... commands ) throws InterruptedException {
+ long delay = this.loadDelay.get();
+ if (delay > 0l) Thread.sleep(delay);
+ this.loadCount.incrementAndGet();
+ }
+
+ public void setLoadResponse( boolean response ) {
+ this.loadResponse.set(response);
+ }
+
+ public void setLoadDelay( long time,
+ TimeUnit unit ) {
+ this.loadDelay.set(unit.toMillis(time));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean ping( long time,
+ TimeUnit unit ) throws InterruptedException {
+ Thread.sleep(this.pingDelay.get());
+ return this.pingResponse.get();
+ }
+
+ public void setPingResponse( boolean pingResponse ) {
+ this.pingResponse.set(pingResponse);
+ }
+
+ public void setPingDelay( long time,
+ TimeUnit unit ) {
+ this.pingDelay.set(unit.toMillis(time));
+ }
+
+ public long getPingCount() {
+ return this.pingCount.get();
+ }
+
+ public long getLoadCount() {
+ return this.loadCount.get();
+ }
+
+ public long getCloseCount() {
+ return this.closeCount.get();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setListener( RepositorySourceListener listener ) {
+ }
+
+ }
+
+}
Modified: trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutorTest.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutorTest.java 2008-08-06 19:25:58 UTC (rev 393)
+++ trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/commands/executor/AbstractCommandExecutorTest.java 2008-08-06 19:38:46 UTC (rev 394)
@@ -33,6 +33,8 @@
import java.util.Collections;
import java.util.List;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.connector.BasicExecutionContext;
+import org.jboss.dna.spi.connector.RepositorySourceException;
import org.jboss.dna.spi.graph.commands.CompositeCommand;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
import org.jboss.dna.spi.graph.commands.CopyNodeCommand;
@@ -45,8 +47,6 @@
import org.jboss.dna.spi.graph.commands.MoveBranchCommand;
import org.jboss.dna.spi.graph.commands.RecordBranchCommand;
import org.jboss.dna.spi.graph.commands.SetPropertiesCommand;
-import org.jboss.dna.spi.graph.connection.BasicExecutionContext;
-import org.jboss.dna.spi.graph.connection.RepositorySourceException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
15 years, 10 months
DNA SVN: r393 - trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers.
by dna-commits@lists.jboss.org
Author: jverhaeg(a)redhat.com
Date: 2008-08-06 15:25:58 -0400 (Wed, 06 Aug 2008)
New Revision: 393
Modified:
trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java
Log:
DNA-193: Added methods to ExecutionContext, ExecutionContextFactory, and implementations to support JAAS login and access control contexts.
Modified: trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java
===================================================================
--- trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java 2008-08-06 19:23:19 UTC (rev 392)
+++ trunk/dna-repository/src/main/java/org/jboss/dna/repository/sequencers/SequencingService.java 2008-08-06 19:25:58 UTC (rev 393)
@@ -21,6 +21,7 @@
*/
package org.jboss.dna.repository.sequencers;
+import java.security.AccessControlContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -39,6 +40,7 @@
import javax.jcr.Session;
import javax.jcr.observation.Event;
import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
import net.jcip.annotations.Immutable;
import net.jcip.annotations.ThreadSafe;
import org.jboss.dna.common.component.ClassLoaderFactory;
@@ -636,27 +638,42 @@
};
}
- protected synchronized void recordSession( Session session ) {
- if (session != null) sessions.add(session);
+ public synchronized void close() {
+ if (this.closed.get()) return;
+ this.closed.set(true);
+ for (Session session : sessions) {
+ if (session != null) session.logout();
+ }
}
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getAccessControlContext()
*/
- public NamespaceRegistry getNamespaceRegistry() {
- return this.delegate.getNamespaceRegistry();
+ public AccessControlContext getAccessControlContext() {
+ return delegate.getAccessControlContext();
}
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getLoginContext()
*/
- public ValueFactories getValueFactories() {
- return this.delegate.getValueFactories();
+ public LoginContext getLoginContext() {
+ return delegate.getLoginContext();
}
/**
* {@inheritDoc}
*/
+ public NamespaceRegistry getNamespaceRegistry() {
+ return this.delegate.getNamespaceRegistry();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public PropertyFactory getPropertyFactory() {
return this.delegate.getPropertyFactory();
}
@@ -670,26 +687,29 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getSubject()
*/
+ public Subject getSubject() {
+ return this.delegate.getSubject();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public JcrTools getTools() {
return SequencingService.this.getExecutionContext().getTools();
}
/**
* {@inheritDoc}
- *
- * @see org.jboss.dna.spi.ExecutionContext#getSubject()
*/
- public Subject getSubject() {
- return this.delegate.getSubject();
+ public ValueFactories getValueFactories() {
+ return this.delegate.getValueFactories();
}
- public synchronized void close() {
- if (this.closed.get()) return;
- this.closed.set(true);
- for (Session session : sessions) {
- if (session != null) session.logout();
- }
+ protected synchronized void recordSession( Session session ) {
+ if (session != null) sessions.add(session);
}
}
15 years, 10 months
DNA SVN: r392 - in trunk: dna-spi/src/main/java/org/jboss/dna/spi and 1 other directories.
by dna-commits@lists.jboss.org
Author: jverhaeg(a)redhat.com
Date: 2008-08-06 15:23:19 -0400 (Wed, 06 Aug 2008)
New Revision: 392
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContext.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContextFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContexts.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/BasicExecutionContext.java
trunk/pom.xml
Log:
DNA-193: Added methods to ExecutionContext, ExecutionContextFactory, and implementations to support JAAS login and access control contexts.
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContext.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContext.java 2008-08-06 19:06:37 UTC (rev 391)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContext.java 2008-08-06 19:23:19 UTC (rev 392)
@@ -21,7 +21,9 @@
*/
package org.jboss.dna.spi;
+import java.security.AccessControlContext;
import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
import org.jboss.dna.spi.graph.NamespaceRegistry;
import org.jboss.dna.spi.graph.Property;
import org.jboss.dna.spi.graph.PropertyFactory;
@@ -29,10 +31,21 @@
/**
* @author Randall Hauch
+ * @author John Verhaeg
*/
public interface ExecutionContext {
/**
+ * @return the access control context; may be <code>null</code>
+ */
+ AccessControlContext getAccessControlContext();
+
+ /**
+ * @return the login context; may be <code>null</code>
+ */
+ LoginContext getLoginContext();
+
+ /**
* Get the factories that should be used to create values for {@link Property properties}.
*
* @return the property value factory; never null
@@ -59,5 +72,4 @@
* @return the subject; never null
*/
Subject getSubject();
-
}
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContextFactory.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContextFactory.java 2008-08-06 19:06:37 UTC (rev 391)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContextFactory.java 2008-08-06 19:23:19 UTC (rev 392)
@@ -21,6 +21,8 @@
*/
package org.jboss.dna.spi;
+import java.security.AccessControlContext;
+import java.security.AccessController;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginContext;
@@ -28,14 +30,33 @@
import javax.security.auth.spi.LoginModule;
/**
- * A factory for creating {@link ExecutionContext} instances. Each execution context is affiliated with a JAAS
- * {@link Subject}, and thus the factory methods take the same parameters that the JAAS {@link LoginContext} take.
+ * A factory for creating {@link ExecutionContext} instances. Each execution context is affiliated with a JAAS {@link Subject},
+ * and thus the factory methods take the same parameters that the JAAS {@link LoginContext} take.
*
* @author Randall Hauch
+ * @author John Verhaeg
*/
public interface ExecutionContextFactory {
/**
+ * Creates an {@link ExecutionContext} using a snapshot of the {@link AccessControlContext access control context} obtained
+ * from the current calling context.
+ *
+ * @return the execution context; never <code>null</code>.
+ * @see AccessController#getContext()
+ */
+ ExecutionContext create();
+
+ /**
+ * Creates an {@link ExecutionContext} using the supplied {@link AccessControlContext access control context}.
+ *
+ * @param accessControlContext An access control context.
+ * @return the execution context; never <code>null</code>.
+ * @throws IllegalArgumentException if <code>accessControlContext</code> is <code>null</code>.
+ */
+ ExecutionContext create( AccessControlContext accessControlContext );
+
+ /**
* Create an {@link ExecutionContext} for the supplied {@link LoginContext}.
*
* @param loginContext the JAAS login context
@@ -62,7 +83,7 @@
* unknown
*/
ExecutionContext create( String name,
- Subject subject ) throws LoginException;
+ Subject subject ) throws LoginException;
/**
* @param name the name of the JAAS login context
@@ -72,7 +93,7 @@
* <code>callbackHandler</code> is null
*/
ExecutionContext create( String name,
- CallbackHandler callbackHandler ) throws LoginException;
+ CallbackHandler callbackHandler ) throws LoginException;
/**
* @param name the name of the JAAS login context
@@ -84,7 +105,7 @@
* or if the <code>callbackHandler</code> is null
*/
ExecutionContext create( String name,
- Subject subject,
- CallbackHandler callbackHandler ) throws LoginException;
+ Subject subject,
+ CallbackHandler callbackHandler ) throws LoginException;
}
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContexts.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContexts.java 2008-08-06 19:06:37 UTC (rev 391)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/ExecutionContexts.java 2008-08-06 19:23:19 UTC (rev 392)
@@ -21,7 +21,9 @@
*/
package org.jboss.dna.spi;
+import java.security.AccessControlContext;
import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.graph.NameFactory;
import org.jboss.dna.spi.graph.NamespaceRegistry;
@@ -34,6 +36,7 @@
* Utility methods for creating various execution contexts with replacement factories or components.
*
* @author Randall Hauch
+ * @author John Verhaeg
*/
public class ExecutionContexts {
@@ -146,6 +149,24 @@
/**
* {@inheritDoc}
*
+ * @see org.jboss.dna.spi.ExecutionContext#getAccessControlContext()
+ */
+ public AccessControlContext getAccessControlContext() {
+ return delegate.getAccessControlContext();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getLoginContext()
+ */
+ public LoginContext getLoginContext() {
+ return delegate.getLoginContext();
+ }
+
+ /**
+ * {@inheritDoc}
+ *
* @see org.jboss.dna.spi.ExecutionContext#getNamespaceRegistry()
*/
public NamespaceRegistry getNamespaceRegistry() {
@@ -188,6 +209,5 @@
protected ExecutionContext getDelegate() {
return delegate;
}
-
}
}
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/BasicExecutionContext.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/BasicExecutionContext.java 2008-08-06 19:06:37 UTC (rev 391)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/connection/BasicExecutionContext.java 2008-08-06 19:23:19 UTC (rev 392)
@@ -21,7 +21,10 @@
*/
package org.jboss.dna.spi.graph.connection;
+import java.security.AccessControlContext;
+import java.security.AccessController;
import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.graph.NamespaceRegistry;
@@ -33,44 +36,76 @@
/**
* @author Randall Hauch
+ * @author John Verhaeg
*/
public class BasicExecutionContext implements ExecutionContext {
+ private final LoginContext loginContext;
+ private final AccessControlContext accessControlContext;
private final Subject subject;
private final PropertyFactory propertyFactory;
private final ValueFactories valueFactories;
private final NamespaceRegistry namespaceRegistry;
public BasicExecutionContext() {
- this(new Subject(), new BasicNamespaceRegistry());
+ this(new BasicNamespaceRegistry());
}
public BasicExecutionContext( NamespaceRegistry namespaceRegistry ) {
- this(new Subject(), namespaceRegistry, null, null);
+ this(namespaceRegistry, null, null);
}
- public BasicExecutionContext( NamespaceRegistry namespaceRegistry,
- ValueFactories valueFactories,
- PropertyFactory propertyFactory ) {
- this(new Subject(), namespaceRegistry, valueFactories, propertyFactory);
+ public BasicExecutionContext( LoginContext loginContext ) {
+ this(loginContext, new BasicNamespaceRegistry());
}
- public BasicExecutionContext( Subject subject ) {
- this(subject, new BasicNamespaceRegistry());
+ public BasicExecutionContext( AccessControlContext accessControlContext ) {
+ this(accessControlContext, new BasicNamespaceRegistry());
}
- public BasicExecutionContext( Subject subject,
+ public BasicExecutionContext( LoginContext loginContext,
NamespaceRegistry namespaceRegistry ) {
- this(subject, namespaceRegistry, null, null);
+ this(loginContext, namespaceRegistry, null, null);
}
- public BasicExecutionContext( Subject subject,
+ public BasicExecutionContext( AccessControlContext accessControlContext,
+ NamespaceRegistry namespaceRegistry ) {
+ this(accessControlContext, namespaceRegistry, null, null);
+ }
+
+ public BasicExecutionContext( NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ this(null, null, namespaceRegistry, valueFactories, propertyFactory);
+ }
+
+ public BasicExecutionContext( LoginContext loginContext,
NamespaceRegistry namespaceRegistry,
ValueFactories valueFactories,
PropertyFactory propertyFactory ) {
- ArgCheck.isNotNull(subject, "subject");
- ArgCheck.isNotNull(namespaceRegistry, "namespace registry");
- this.subject = subject;
+ this(loginContext, null, namespaceRegistry, valueFactories, propertyFactory);
+ }
+
+ public BasicExecutionContext( AccessControlContext accessControlContext,
+ NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ this(null, accessControlContext, namespaceRegistry, valueFactories, propertyFactory);
+ }
+
+ private BasicExecutionContext( LoginContext loginContext,
+ AccessControlContext accessControlContext,
+ NamespaceRegistry namespaceRegistry,
+ ValueFactories valueFactories,
+ PropertyFactory propertyFactory ) {
+ ArgCheck.isNotNull(namespaceRegistry, "namespaceRegistry");
+ this.loginContext = loginContext;
+ this.accessControlContext = accessControlContext;
+ if (loginContext == null) {
+ this.subject = Subject.getSubject(accessControlContext == null ? AccessController.getContext() : accessControlContext);
+ } else {
+ this.subject = loginContext.getSubject();
+ }
this.namespaceRegistry = namespaceRegistry;
this.valueFactories = valueFactories != null ? valueFactories : new StandardValueFactories(this.namespaceRegistry);
this.propertyFactory = propertyFactory != null ? propertyFactory : new BasicPropertyFactory(this.valueFactories);
@@ -78,23 +113,34 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getAccessControlContext()
*/
- public NamespaceRegistry getNamespaceRegistry() {
- return this.namespaceRegistry;
+ public AccessControlContext getAccessControlContext() {
+ return accessControlContext;
}
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.ExecutionContext#getLoginContext()
*/
- public ValueFactories getValueFactories() {
- return this.valueFactories;
+ public LoginContext getLoginContext() {
+ return loginContext;
}
/**
* {@inheritDoc}
*/
+ public NamespaceRegistry getNamespaceRegistry() {
+ return namespaceRegistry;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public PropertyFactory getPropertyFactory() {
- return this.propertyFactory;
+ return propertyFactory;
}
/**
@@ -103,6 +149,13 @@
* @see org.jboss.dna.spi.ExecutionContext#getSubject()
*/
public Subject getSubject() {
- return this.subject;
+ return subject;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public ValueFactories getValueFactories() {
+ return valueFactories;
+ }
}
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2008-08-06 19:06:37 UTC (rev 391)
+++ trunk/pom.xml 2008-08-06 19:23:19 UTC (rev 392)
@@ -343,6 +343,11 @@
<artifactId>dna-repository</artifactId>
<version>${dna-version}</version>
</dependency>
+ <dependency>
+ <groupId>org.jboss.dna</groupId>
+ <artifactId>dna-jcr</artifactId>
+ <version>${dna-version}</version>
+ </dependency>
<dependency>
<groupId>org.jboss.dna</groupId>
<artifactId>dna-connector-federation</artifactId>
15 years, 10 months
DNA SVN: r391 - trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory.
by dna-commits@lists.jboss.org
Author: jverhaeg(a)redhat.com
Date: 2008-08-06 15:06:37 -0400 (Wed, 06 Aug 2008)
New Revision: 391
Modified:
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java
Log:
Removed "configurationName" since "name" already existed
Modified: trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java
===================================================================
--- trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java 2008-08-06 19:05:34 UTC (rev 390)
+++ trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepositorySource.java 2008-08-06 19:06:37 UTC (rev 391)
@@ -47,6 +47,7 @@
/**
* @author Randall Hauch
+ * @author John Verhaeg
*/
public class InMemoryRepositorySource extends AbstractRepositorySource implements ObjectFactory {
@@ -95,7 +96,7 @@
private String jndiName;
private UUID rootNodeUuid = UUID.randomUUID();
private CachePolicy defaultCachePolicy;
- private String configurationName;
+ // private String configurationName;
private transient InMemoryRepository repository;
/**
@@ -228,10 +229,10 @@
*/
@Override
protected synchronized RepositoryConnection createConnection() throws RepositorySourceException {
- if (this.repository == null) {
- repository = new InMemoryRepository(configurationName, this.rootNodeUuid);
+ if (repository == null) {
+ repository = new InMemoryRepository(name, rootNodeUuid);
}
- return new InMemoryRepositoryConnection(this, this.repository);
+ return new InMemoryRepositoryConnection(this, repository);
}
/**
15 years, 10 months
DNA SVN: r389 - trunk/docs/reference/en.
by dna-commits@lists.jboss.org
Author: rhauch
Date: 2008-08-06 12:39:00 -0400 (Wed, 06 Aug 2008)
New Revision: 389
Modified:
trunk/docs/reference/en/master.xml
Log:
DNA-71 - Document development tools and environment
http://jira.jboss.com/jira/browse/DNA-71
Added to the Reference Guide a placeholder for a chapter about development tools and development environment. Formatted DocBook source file.
Modified: trunk/docs/reference/en/master.xml
===================================================================
--- trunk/docs/reference/en/master.xml 2008-08-06 16:31:28 UTC (rev 388)
+++ trunk/docs/reference/en/master.xml 2008-08-06 16:39:00 UTC (rev 389)
@@ -1,25 +1,14 @@
-<!--
- ~ JBoss, Home of Professional Open Source.
- ~
- ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- ~ indicated by the @author tags or express copyright attribution
- ~ statements applied by the authors. All third-party contributions are
- ~ distributed under license by Red Hat Middleware LLC.
- ~
- ~ This copyrighted material is made available to anyone wishing to use, modify,
- ~ copy, or redistribute it subject to the terms and conditions of the GNU
- ~ Lesser General Public License, as published by the Free Software Foundation.
- ~
- ~ 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 Lesser General Public License
- ~ for more details.
- ~
- ~ You should have received a copy of the GNU Lesser General Public License
- ~ along with this distribution; if not, write to:
- ~ Free Software Foundation, Inc.
- ~ 51 Franklin Street, Fifth Floor
- ~ Boston, MA 02110-1301 USA
+
+ <!--
+ ~ JBoss, Home of Professional Open Source. ~ ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as ~
+ indicated by the @author tags or express copyright attribution ~ statements applied by the authors. All third-party
+ contributions are ~ distributed under license by Red Hat Middleware LLC. ~ ~ This copyrighted material is made available to
+ anyone wishing to use, modify, ~ copy, or redistribute it subject to the terms and conditions of the GNU ~ Lesser General
+ Public License, as published by the Free Software Foundation. ~ ~ 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 Lesser General Public License ~ for more details. ~ ~ You should have received a copy of the GNU Lesser
+ General Public License ~ along with this distribution; if not, write to: ~ Free Software Foundation, Inc. ~ 51 Franklin
+ Street, Fifth Floor ~ Boston, MA 02110-1301 USA
-->
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
<!ENTITY % RH-ENTITIES SYSTEM "Common_Config/rh-entities.ent">
@@ -57,10 +46,13 @@
</bookinfo>
<preface id="preface" revision="1">
<title>Target audience</title>
- <para>This guide is for the developers of JBoss DNA and those users that want to have a better understanding of
- how JBoss DNA works or how to extend the functionality. For a higher-level introduction to JBoss DNA, see
- the <ulink url="http://www.jboss.org/file-access/default/members/dna/freezone/docs/0.2/ma...">Getting Started</ulink> document.</para>
<para>
+ This guide is for the developers of JBoss DNA and those users that want to have a better understanding of how JBoss DNA
+ works or how to extend the functionality. For a higher-level introduction to JBoss DNA, see the
+ <ulink url="http://www.jboss.org/file-access/default/members/dna/freezone/docs/0.2/ma...">Getting Started</ulink>
+ document.
+ </para>
+ <para>
If you have any questions or comments, please feel free to contact JBoss DNA's
<ulink url="mailto:dna-users@jboss.org">user mailing list</ulink>
or use the
@@ -75,9 +67,9 @@
same thing.
</para>
</preface>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
+ <!--
+ ====================================== Chapter ===============================================
+ -->
<chapter id="introduction">
<title>Introduction to JBoss DNA</title>
<para>There are a lot of choices for how applications can store information persistently so that it can be accessed at a
@@ -159,84 +151,105 @@
</para>
<sect1 id="roadmap">
<title>Project roadmap</title>
- <para>The roadmap for JBoss DNA is managed in the project's <ulink url="https://jira.jboss.org/jira/browse/DNA">JIRA instance</ulink>.
- The roadmap shows the different tasks, requirements, issues and other activities that have been targeted to each of the upcoming releases.
- (The <ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">roadmap report</ulink>
- always shows the next three releases.)</para>
- <para>By convention, JIRA issues not immediately targeted to a release will be reviewed periodically to determine the appropriate release
- where they can be targeted. Any issue that is reviewed and that does not fit in a known release will be targeted to the
- <ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">Future Releases</ulink>
- bucket. This should be reviewed periodically and at least at the beginning of each release cycle, with the goal of targeting most
- of the issues to specific releases.</para>
- </sect1>
+ <para>
+ The roadmap for JBoss DNA is managed in the project's
+ <ulink url="https://jira.jboss.org/jira/browse/DNA">JIRA instance</ulink>
+ . The roadmap shows the different tasks, requirements, issues and other activities that have been targeted to each of the
+ upcoming releases. (The
+ <ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">roadmap report</ulink>
+ always shows the next three releases.)
+ </para>
+ <para>
+ By convention, JIRA issues not immediately targeted to a release will be reviewed periodically to determine the
+ appropriate release where they can be targeted. Any issue that is reviewed and that does not fit in a known release will
+ be targeted to the
+ <ulink url="https://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.s...">Future Releases</ulink>
+ bucket. This should be reviewed periodically and at least at the beginning of each release cycle, with the goal of
+ targeting most of the issues to specific releases.
+ </para>
+ </sect1>
<sect1 id="modules">
<title>JBoss DNA modules</title>
- <para>JBoss DNA consists of the following modules:
- <itemizedlist>
+ <para>
+ JBoss DNA consists of the following modules:
+ <itemizedlist>
<listitem>
<para>
<emphasis role="strong">dna-common</emphasis>
- is a low-level library of common utilities and frameworks, including logging, progress monitoring, internationalization/localization,
- text translators, component management, and class loader factories.
+ is a low-level library of common utilities and frameworks, including logging, progress monitoring,
+ internationalization/localization, text translators, component management, and class loader factories.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-spi</emphasis>
- defines the Service Provider Interface (SPI) for DNA, including the repository connectors, sequencers, graph interfaces, and MIME type detectors.
+ defines the Service Provider Interface (SPI) for DNA, including the repository connectors, sequencers, graph
+ interfaces, and MIME type detectors.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-repository</emphasis>
- is the main module and provides the repository-oriented services, including the Repository Service, Sequencing Service, Observation Service, and Rules Service.
+ is the main module and provides the repository-oriented services, including the Repository Service, Sequencing
+ Service, Observation Service, and Rules Service.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-jcr</emphasis>
- provides the JBoss DNA implementation of the JCR API, which relies upon a repository connector, such as the Federation Connector
- (see <code>dna-connector-federation</code>).
+ provides the JBoss DNA implementation of the JCR API, which relies upon a repository connector, such as the
+ Federation Connector (see
+ <code>dna-connector-federation</code>
+ ).
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-integration-tests</emphasis>
- provides a home for all of the integration tests that involve more components that just unit tests. Integration tests
- are often more complicated, take longer, and involve testing the integration and functionality of many components
- (whereas unit tests focus on testing a single class or component and may use stubs or mock objects for other components).
- </para>
+ provides a home for all of the integration tests that involve more components that just unit tests. Integration
+ tests are often more complicated, take longer, and involve testing the integration and functionality of many
+ components (whereas unit tests focus on testing a single class or component and may use stubs or mock objects for
+ other components).
+ </para>
</listitem>
- </itemizedlist>
- The following modules are optional extensions that may be used selectively and as needed
- (and are located in the source under the <code>extensions</code> directory):
- <itemizedlist>
+ </itemizedlist>
+ The following modules are optional extensions that may be used selectively and as needed (and are located in the source
+ under the
+ <code>extensions</code>
+ directory):
+ <itemizedlist>
<listitem>
<para>
<emphasis role="strong">dna-maven-classloader</emphasis>
- is a small library that provides a <code>ClassLoaderFactory</code> implementation that can create <code>java.lang.ClassLoader</code> instances capable of loading
- classes given a Maven Repository and a list of Maven coordinates. The Maven Repository can be managed within a JCR repository.
+ is a small library that provides a
+ <code>ClassLoaderFactory</code>
+ implementation that can create
+ <code>java.lang.ClassLoader</code>
+ instances capable of loading classes given a Maven Repository and a list of Maven coordinates. The Maven Repository
+ can be managed within a JCR repository.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-connector-federation</emphasis>
- is a DNA repository connector that federates, integrates and caches information from multiple sources (via other repository connectors).
+ is a DNA repository connector that federates, integrates and caches information from multiple sources (via other
+ repository connectors).
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-connector-inmemory</emphasis>
- is a simple DNA repository connector that manages content within memory. This can be used as a simple cache or as a transient
- repository.
+ is a simple DNA repository connector that manages content within memory. This can be used as a simple cache or as a
+ transient repository.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-connector-jbosscache</emphasis>
- is a DNA repository connector that manages content within a <ulink url="http://www.jboss.org/jbosscache/">JBoss Cache</ulink> instance. JBoss Cache is a powerful cache implementation
- that can serve as a distributed cache and that can persist information. The cache instance can be found via JNDI or created and managed
- by the connector.
+ is a DNA repository connector that manages content within a
+ <ulink url="http://www.jboss.org/jbosscache/">JBoss Cache</ulink>
+ instance. JBoss Cache is a powerful cache implementation that can serve as a distributed cache and that can persist
+ information. The cache instance can be found via JNDI or created and managed by the connector.
</para>
</listitem>
<listitem>
@@ -248,7 +261,8 @@
<listitem>
<para>
<emphasis role="strong">dna-sequencer-images</emphasis>
- is a DNA sequencer that extracts the image metadata (e.g., size, date, etc.) from PNG, JPEG, GIF, BMP, PCS, IFF, RAS, PBM, PGM, and PPM image files.
+ is a DNA sequencer that extracts the image metadata (e.g., size, date, etc.) from PNG, JPEG, GIF, BMP, PCS, IFF,
+ RAS, PBM, PGM, and PPM image files.
</para>
</listitem>
<listitem>
@@ -260,15 +274,17 @@
<listitem>
<para>
<emphasis role="strong">dna-sequencer-java</emphasis>
- is a DNA sequencer that extracts the package, class/type, member, documentation, annotations, and other information from
- Java source files.
+ is a DNA sequencer that extracts the package, class/type, member, documentation, annotations, and other information
+ from Java source files.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">dna-sequencer-msoffice</emphasis>
- is a DNA sequencer that extracts metadata and summary information from <ulink url="http://office.microsoft.com/en-us/">Microsoft Office</ulink> documents. For example, the sequencer
- extracts from a PowerPoint presentation the outline as well as thumbnails of each slide. Microsoft Word and Excel files are also supported.
+ is a DNA sequencer that extracts metadata and summary information from
+ <ulink url="http://office.microsoft.com/en-us/">Microsoft Office</ulink>
+ documents. For example, the sequencer extracts from a PowerPoint presentation the outline as well as thumbnails of
+ each slide. Microsoft Word and Excel files are also supported.
</para>
</listitem>
<listitem>
@@ -280,18 +296,22 @@
<listitem>
<para>
<emphasis role="strong">dna-mimetype-detector-aperture</emphasis>
- is a DNA MIME type detector that uses the <ulink url="http://aperture.sourceforge.net/">Aperture</ulink> library to determine the best MIME type
- from the filename and file contents.
+ is a DNA MIME type detector that uses the
+ <ulink url="http://aperture.sourceforge.net/">Aperture</ulink>
+ library to determine the best MIME type from the filename and file contents.
</para>
</listitem>
- </itemizedlist>
- There are also documentation modules
- (located in the source under the <code>docs</code> directory):
- <itemizedlist>
+ </itemizedlist>
+ There are also documentation modules (located in the source under the
+ <code>docs</code>
+ directory):
+ <itemizedlist>
<listitem>
<para>
<emphasis role="strong">docs-getting-started</emphasis>
- is the project with the <ulink url="http://www.docbook.org/">DocBook</ulink> source for the JBoss DNA Getting Started document.
+ is the project with the
+ <ulink url="http://www.docbook.org/">DocBook</ulink>
+ source for the JBoss DNA Getting Started document.
</para>
</listitem>
<listitem>
@@ -303,52 +323,75 @@
<listitem>
<para>
<emphasis role="strong">docs-reference-guide</emphasis>
- is the project with the <ulink url="http://www.docbook.org/">DocBook</ulink> source for this document, the JBoss DNA Reference Guide document.
+ is the project with the
+ <ulink url="http://www.docbook.org/">DocBook</ulink>
+ source for this document, the JBoss DNA Reference Guide document.
</para>
</listitem>
- </itemizedlist>
- Finally, there is a module that represents the whole JBoss DNA project:
- <itemizedlist>
+ </itemizedlist>
+ Finally, there is a module that represents the whole JBoss DNA project:
+ <itemizedlist>
<listitem>
<para>
<emphasis role="strong">dna</emphasis>
- is the parent project that aggregates all of the other projects and that contains some asset files to create the necessary Maven artifacts during a build.
+ is the parent project that aggregates all of the other projects and that contains some asset files to create the
+ necessary Maven artifacts during a build.
</para>
</listitem>
- </itemizedlist>
- Each of these modules is a Maven project with a group ID of <code>org.jboss.dna</code>. All of these projects correspond to artifacts in the
- <ulink url="http://repository.jboss.com/maven2/">JBoss Maven 2 Repository</ulink>.</para>
- </sect1>
+ </itemizedlist>
+ Each of these modules is a Maven project with a group ID of
+ <code>org.jboss.dna</code>
+ . All of these projects correspond to artifacts in the
+ <ulink url="http://repository.jboss.com/maven2/">JBoss Maven 2 Repository</ulink>
+ .
+ </para>
+ </sect1>
</chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="classloaders">
- <title>Class loaders</title>
- <para></para>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="development-environment">
+ <title>Developer environment and tooling</title>
+ <para>
+ Discuss our use of Maven, Eclipse, coding styles/preferences, SVN, Hudson, etc.
+ </para>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="classloaders">
+ <title>Class loaders</title>
+ <para></para>
<sect1 id="dna-maven-classloader">
<title>Maven Repository class loader</title>
<para></para>
- </sect1>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="security">
- <title>Security</title>
- <para>JBoss DNA uses the <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
- for its security mechanism. This offers the greatest flexibility and power for integrating JBoss DNA into other applications.
- </para>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="security">
+ <title>Security</title>
+ <para>
+ JBoss DNA uses the
+ <ulink url="http://java.sun.com/javase/technologies/security/">Java Authentication and Authorization Service (JAAS)</ulink>
+ for its security mechanism. This offers the greatest flexibility and power for integrating JBoss DNA into other
+ applications.
+ </para>
<sect1 id="jboss-security">
<title>JBoss Security</title>
- <para>The <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> provides one of the best and most powerful
- implementations of the JAAS specification - plus it's open source. JBoss Security offers a number of login modules, including:
- <itemizedlist>
+ <para>
+ The
+ <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>
+ provides one of the best and most powerful implementations of the JAAS specification - plus it's open source. JBoss
+ Security offers a number of login modules, including:
+ <itemizedlist>
<listitem>
<para>
<emphasis role="strong">User-Roles Login Module</emphasis>
- is a simple <code>javax.security.auth.login.LoginContext</code> implementation that uses usernames and passwords stored
- in a properties file.
+ is a simple
+ <code>javax.security.auth.login.LoginContext</code>
+ implementation that uses usernames and passwords stored in a properties file.
</para>
</listitem>
<listitem>
@@ -366,13 +409,13 @@
<listitem>
<para>
<emphasis role="strong">LDAP Login Module</emphasis>
- uses an LDAP directory to authenticate principals. Two implementations are available.
+ uses an LDAP directory to authenticate principals. Two implementations are available.
</para>
</listitem>
<listitem>
<para>
<emphasis role="strong">Certificate Login Module</emphasis>
- authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
+ authenticates using X509 certificates, obtaining roles from either property files or a JDBC database.
</para>
</listitem>
<listitem>
@@ -381,173 +424,184 @@
authenticates using the operating system's mechanism.
</para>
</listitem>
- </itemizedlist>
- and many others.
- </para>
- <para>JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on.
- For more detail, see the <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink> project.
- </para>
- </sect1>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="repositories">
- <title>Repositories</title>
- <para></para>
+ </itemizedlist>
+ and many others.
+ </para>
+ <para>
+ JBoss Security also provides other capabilities, such as using XACML policies or using federated single sign-on. For more
+ detail, see the
+ <ulink url="http://www.jboss.org/jbosssecurity/">JBoss Security</ulink>
+ project.
+ </para>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="repositories">
+ <title>Repositories</title>
+ <para></para>
<sect1 id="repository-service">
<title>Repository Service</title>
<para></para>
- </sect1>
- <sect1 id="connectors">
- <title>Repository connectors and sources</title>
- <para></para>
- <sect2 id="dna-connector-inmemory">
- <title>In-memory connector</title>
- <para></para>
- </sect2>
- <sect2 id="dna-connector-jbosscache">
- <title>JBoss Cache connector</title>
- <para></para>
- </sect2>
- <sect2 id="dna-connector-federation">
- <title>Federating connector</title>
- <para></para>
- </sect2>
- </sect1>
+ </sect1>
+ <sect1 id="connectors">
+ <title>Repository connectors and sources</title>
+ <para></para>
+ <sect2 id="dna-connector-inmemory">
+ <title>In-memory connector</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-connector-jbosscache">
+ <title>JBoss Cache connector</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-connector-federation">
+ <title>Federating connector</title>
+ <para></para>
+ </sect2>
+ </sect1>
<sect1 id="custom-connectors">
<title>Writing custom connectors</title>
<para></para>
- </sect1>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="jcr">
- <title>Content Repositories for Java (JCR)</title>
- <para></para>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="jcr">
+ <title>Content Repositories for Java (JCR)</title>
+ <para></para>
<sect1 id="jcr-repositories">
<title>Obtaining JCR repositories</title>
- <para>Discuss how to obtain JCR repository instances (from the Repository Service).
- </para>
- </sect1>
+ <para>Discuss how to obtain JCR repository instances (from the Repository Service).</para>
+ </sect1>
<sect1 id="jcr-sessions">
<title>Creating JCR sessions</title>
- <para>Discuss how to obtain JCR sessions and how the credentials work.
- Also discuss that sessions should be created, used, and closed.
- </para>
- </sect1>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="sequencing">
- <title>Sequencing content</title>
- <para></para>
+ <para>Discuss how to obtain JCR sessions and how the credentials work. Also discuss that sessions should be created,
+ used, and closed.</para>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="sequencing">
+ <title>Sequencing content</title>
+ <para></para>
<sect1 id="sequencing-service">
<title>Sequencing Service</title>
<para></para>
- </sect1>
+ </sect1>
<sect1 id="sequencers">
<title>JBoss DNA Sequencers</title>
<para></para>
- <sect2 id="dna-sequencer-images">
- <title>Image sequencer</title>
- <para></para>
- </sect2>
- <sect2 id="dna-sequencer-msoffice">
- <title>Microsoft Office document sequencer</title>
- <para></para>
- </sect2>
- <sect2 id="dna-sequencer-zip">
- <title>ZIP archive sequencer</title>
- <para></para>
- </sect2>
- <sect2 id="dna-sequencer-java">
- <title>Java source sequencer</title>
- <para></para>
- </sect2>
- <sect2 id="dna-sequencer-mp3">
- <title>MP3 audio file sequencer</title>
- <para></para>
- </sect2>
- <sect2 id="dna-sequencer-cnd">
- <title>JCR Compact Node Definition (CND) file sequencer</title>
- <para></para>
- </sect2>
- </sect1>
+ <sect2 id="dna-sequencer-images">
+ <title>Image sequencer</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-sequencer-msoffice">
+ <title>Microsoft Office document sequencer</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-sequencer-zip">
+ <title>ZIP archive sequencer</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-sequencer-java">
+ <title>Java source sequencer</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-sequencer-mp3">
+ <title>MP3 audio file sequencer</title>
+ <para></para>
+ </sect2>
+ <sect2 id="dna-sequencer-cnd">
+ <title>JCR Compact Node Definition (CND) file sequencer</title>
+ <para></para>
+ </sect2>
+ </sect1>
<sect1 id="custom-sequencers">
<title>Writing custom sequencers</title>
<para></para>
- </sect1>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="mimetypes">
- <title>MIME types</title>
- <para></para>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="mimetypes">
+ <title>MIME types</title>
+ <para></para>
<sect1 id="detectors">
<title>JBoss DNA MIME type detectors</title>
<para></para>
- <sect2 id="dna-mimetype-detector-aperture">
- <title>Aperture MIME type detector</title>
- <para></para>
- </sect2>
- </sect1>
+ <sect2 id="dna-mimetype-detector-aperture">
+ <title>Aperture MIME type detector</title>
+ <para></para>
+ </sect2>
+ </sect1>
<sect1 id="custom-detectors">
<title>Writing custom detectors</title>
<para></para>
- </sect1>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="configuration">
- <title>Configuration</title>
- <para>Discuss how to configure JBoss DNA and how configuration repositories are used to bootstrap the
- various services and components. Describe how the next release will focus on making this easier
- and will detail configuration using the <ulink url="http://www.jboss.org/jbossmc/">JBoss Microcontainer</ulink>.</para>
- </chapter>
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="testing">
- <title>Testing</title>
- <para></para>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="configuration">
+ <title>Configuration</title>
+ <para>
+ Discuss how to configure JBoss DNA and how configuration repositories are used to bootstrap the various services and
+ components. Describe how the next release will focus on making this easier and will detail configuration using the
+ <ulink url="http://www.jboss.org/jbossmc/">JBoss Microcontainer</ulink>
+ .
+ </para>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="testing">
+ <title>Testing</title>
+ <para></para>
<sect1 id="unit-tests">
<title>Unit tests</title>
<para></para>
- </sect1>
+ </sect1>
<sect1 id="integration-tests">
<title>Integration tests</title>
<para></para>
- </sect1>
- </chapter>
-
-
- <!-- ====================================================================================================
- Chapter
- ==================================================================================================== -->
- <chapter id="future_directions">
- <title>Looking to the future</title>
- <para>What's next for JBoss DNA? Well, the sequencing system is just the beginning. With this release, the sequencing system
- is stable enough so that more <link linkend="sequencers">sequencers</link> can be developed and used within your own applications.
- If you're interested in getting involved with the JBoss DNA project, consider picking up one of the sequencers on our
- <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.sy...">roadmap</ulink>.
- Or, check out <ulink url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&mode...">JIRA</ulink>
- for the list of sequencers we've thought of. If you think of one that's not there, please add it to JIRA!
- </para>
- <para>
- The next release will focus on creating the <link linkend="federation">federation engine</link> and connectors
- for several popular and ubiquitous systems. The 0.2 release will likely only federate information in a read-only manner,
- but updates will soon follow. Also, during the early part of the next release, the JBoss DNA project will switch to use JDK 6.
- Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss projects and products continue to
- require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.</para>
- <para>
- Other components on our roadmap include a web user interface, a REST-ful server, and a view system that allows domain-specific
- views of information in the repository. These components are farther out on our roadmap, and at this time have not been
- targeted to a particular release. If any of these are of interest to you, please <link linkend="preface">get involved</link> in the community.
- </para>
- </chapter>
+ </sect1>
+ </chapter>
+ <!--
+ ====================================== Chapter ===============================================
+ -->
+ <chapter id="future_directions">
+ <title>Looking to the future</title>
+ <para>
+ What's next for JBoss DNA? Well, the sequencing system is just the beginning. With this release, the sequencing system is
+ stable enough so that more
+ <link linkend="sequencers">sequencers</link>
+ can be developed and used within your own applications. If you're interested in getting involved with the JBoss DNA project,
+ consider picking up one of the sequencers on our
+ <ulink url="http://jira.jboss.org/jira/browse/DNA?report=com.atlassian.jira.plugin.sy...">roadmap</ulink>
+ . Or, check out
+ <ulink
+ url="http://jira.jboss.org/jira/secure/IssueNavigator.jspa?reset=true&mode...">JIRA</ulink>
+ for the list of sequencers we've thought of. If you think of one that's not there, please add it to JIRA!
+ </para>
+ <para>
+ The next release will focus on creating the
+ <link linkend="federation">federation engine</link>
+ and connectors for several popular and ubiquitous systems. The 0.2 release will likely only federate information in a
+ read-only manner, but updates will soon follow. Also, during the early part of the next release, the JBoss DNA project will
+ switch to use JDK 6. Java 5 is being end-of-lifed, so we want to move to a supported JDK. However, a number of JBoss
+ projects and products continue to require Java 5, so our next release will most likely use JDK 6 with Java 5 compatibility.
+ </para>
+ <para>
+ Other components on our roadmap include a web user interface, a REST-ful server, and a view system that allows
+ domain-specific views of information in the repository. These components are farther out on our roadmap, and at this time
+ have not been targeted to a particular release. If any of these are of interest to you, please
+ <link linkend="preface">get involved</link>
+ in the community.
+ </para>
+ </chapter>
</book>
\ No newline at end of file
15 years, 10 months