Author: rhauch
Date: 2008-08-05 20:45:08 -0400 (Tue, 05 Aug 2008)
New Revision: 380
Added:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/DnaLexicon.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/UuidFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidValueFactory.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/UuidValueFactoryTest.java
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/ProjectedGetChildrenCommand.java
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/StandardMergeStrategy.java
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java
trunk/connectors/dna-connector-inmemory/src/test/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryTest.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/dna-spi/src/main/java/org/jboss/dna/spi/graph/PropertyType.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueComparators.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactories.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/GetChildrenCommand.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetChildrenCommand.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetNodeCommand.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactories.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/BooleanValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DecimalValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DelegatingValueFactories.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DoubleValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/InMemoryBinaryValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/JodaDateTimeValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/LongValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/NameValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/ObjectValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/PathValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StandardValueFactories.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StringValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UriValueFactory.java
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidReferenceValueFactory.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepository.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepositorySource.java
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/AbstractValueFactoryTest.java
Log:
DNA-188 - Complete the federating command executor
http://jira.jboss.com/jira/browse/DNA-188
Needed to add the ability to get the identification properties (e.g., a UUID property) for
each child. These properties are required when getting nodes from the original sources so
that the merge logic can determine whether child nodes (from different sources) represent
the same node or different nodes. These properties are also required in the Federation
Connector to obtain the UUID property for each node in the integrated repository cache.
The GetChildrenCommand was modified to remove most of the "setChildren(...)"
methods and to instead have "addChild(Segment, Property)" methods. The existing
connectors were modified to use this new capability.
To support storing UUIDs as properties, a UUID property type was added and a new
UuidFactory (which extends ValueFactory<UUID>) interface was defined. Each existing
factory interface (and implementation) was then modified to add a "create(UUID
value)" method. All ValueFactories implementations were modified as well.
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-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/FederatingCommandExecutor.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -39,6 +39,7 @@
import org.jboss.dna.connector.federation.merge.MergeStrategy;
import org.jboss.dna.connector.federation.merge.OneContributionMergeStrategy;
import org.jboss.dna.connector.federation.merge.StandardMergeStrategy;
+import org.jboss.dna.spi.DnaLexicon;
import org.jboss.dna.spi.ExecutionContext;
import org.jboss.dna.spi.cache.CachePolicy;
import org.jboss.dna.spi.graph.DateTime;
@@ -58,7 +59,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.commands.impl.BasicGetPropertiesCommand;
import org.jboss.dna.spi.graph.connection.RepositoryConnection;
import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactories;
import org.jboss.dna.spi.graph.connection.RepositoryConnectionFactory;
@@ -134,8 +134,8 @@
this.sourceProjections = sourceProjections;
this.connectionFactories = connectionFactories;
this.connectionsBySourceName = new HashMap<String,
RepositoryConnection>();
- this.uuidPropertyName =
context.getValueFactories().getNameFactory().create("dna:uuid");
- this.mergePlanPropertyName =
context.getValueFactories().getNameFactory().create("dna:mergePlan");
+ this.uuidPropertyName =
context.getValueFactories().getNameFactory().create(DnaLexicon.PropertyNames.UUID);
+ this.mergePlanPropertyName =
context.getValueFactories().getNameFactory().create(DnaLexicon.PropertyNames.MERGE_PLAN);
this.sourceNames = new HashSet<String>();
for (Projection projection : this.sourceProjections) {
this.sourceNames.add(projection.getSourceName());
@@ -143,7 +143,7 @@
if (this.sourceProjections.size() == 1 &&
this.sourceProjections.get(0).isSimple()) {
this.mergingStrategy = new OneContributionMergeStrategy();
} else {
- this.mergingStrategy = new StandardMergeStrategy();
+ this.mergingStrategy = new
StandardMergeStrategy(DnaLexicon.PropertyNames.UUID);
}
}
@@ -206,7 +206,9 @@
for (Property property : nodeInfo.getProperties().values()) {
command.setProperty(property);
}
- command.setChildren(nodeInfo.getChildren());
+ for (Segment child : nodeInfo.getChildren()) {
+ command.addChild(child, nodeInfo.getChildIdentityProperties(child));
+ }
}
/**
@@ -230,7 +232,9 @@
@Override
public void execute( GetChildrenCommand command ) throws RepositorySourceException,
InterruptedException {
BasicGetNodeCommand nodeInfo = getNode(command.getPath());
- command.setChildren(nodeInfo.getChildren());
+ for (Segment child : nodeInfo.getChildren()) {
+ command.addChild(child, nodeInfo.getChildIdentityProperties(child));
+ }
}
/**
@@ -397,7 +401,7 @@
return mergedNode;
}
- protected MergePlan getMergePlan( BasicGetPropertiesCommand command ) {
+ protected MergePlan getMergePlan( BasicGetNodeCommand command ) {
Property mergePlanProperty = command.getProperties().get(mergePlanPropertyName);
if (mergePlanProperty == null || mergePlanProperty.isEmpty()) {
return null;
Modified:
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/ProjectedGetChildrenCommand.java
===================================================================
---
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/ProjectedGetChildrenCommand.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/executor/ProjectedGetChildrenCommand.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -21,11 +21,10 @@
*/
package org.jboss.dna.connector.federation.executor;
-import java.util.Iterator;
import org.jboss.dna.spi.cache.CachePolicy;
import org.jboss.dna.spi.graph.DateTime;
-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.Path.Segment;
import org.jboss.dna.spi.graph.commands.GetChildrenCommand;
@@ -46,60 +45,17 @@
/**
* {@inheritDoc}
*
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#setChild(org.jboss.dna.spi.graph.Name)
+ * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChild(org.jboss.dna.spi.graph.Path.Segment,
+ * org.jboss.dna.spi.graph.Property[])
*/
- public void setChild( Name nameOfChild ) {
- getOriginalCommand().setChild(nameOfChild);
+ public void addChild( Segment nameOfChild,
+ Property... identityProperties ) {
+ getOriginalCommand().addChild(nameOfChild, identityProperties);
}
/**
* {@inheritDoc}
*
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#setChildren(java.util.Iterator)
- */
- public void setChildren( Iterator<Segment> namesOfChildren ) {
- getOriginalCommand().setChildren(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#setChildren(java.lang.Iterable)
- */
- public void setChildren( Iterable<Segment> namesOfChildren ) {
- getOriginalCommand().setChildren(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#setChildren(org.jboss.dna.spi.graph.Path.Segment[])
- */
- public void setChildren( Segment... namesOfChildren ) {
- getOriginalCommand().setChildren(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChild(org.jboss.dna.spi.graph.Path.Segment)
- */
- public void addChild( Segment nameOfChild ) {
- getOriginalCommand().addChild(nameOfChild);
- }
-
- /**
- * {@inheritDoc}
- *
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChildren(org.jboss.dna.spi.graph.Path.Segment[])
- */
- public void addChildren( Segment... namesOfChildren ) {
- getOriginalCommand().addChildren(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- *
* @see org.jboss.dna.spi.graph.commands.GetChildrenCommand#setNoChildren()
*/
public void setNoChildren() {
Modified:
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/StandardMergeStrategy.java
===================================================================
---
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/StandardMergeStrategy.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-federation/src/main/java/org/jboss/dna/connector/federation/merge/StandardMergeStrategy.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -24,12 +24,21 @@
import java.util.List;
import org.jboss.dna.connector.federation.contribution.Contribution;
import org.jboss.dna.spi.ExecutionContext;
+import org.jboss.dna.spi.graph.Name;
/**
* @author Randall Hauch
*/
public class StandardMergeStrategy implements MergeStrategy {
+ private final String identityPropertyNameString;
+
+ public StandardMergeStrategy( String identityPropertyName ) {
+ assert identityPropertyName != null;
+ assert identityPropertyName.trim().length() != 0;
+ this.identityPropertyNameString = identityPropertyName;
+ }
+
/**
* {@inheritDoc}
*
@@ -39,5 +48,9 @@
public void merge( FederatedNode federatedNode,
List<Contribution> contributions,
ExecutionContext context ) {
+
+ // Children whose identity properties are the same will be considered to be the
same node ...
+ Name identityPropertyName =
context.getValueFactories().getNameFactory().create(this.identityPropertyNameString);
+ assert identityPropertyName != null;
}
}
Modified:
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java
===================================================================
---
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-inmemory/src/main/java/org/jboss/dna/connector/inmemory/InMemoryRepository.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -21,7 +21,6 @@
*/
package org.jboss.dna.connector.inmemory;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
@@ -31,6 +30,7 @@
import java.util.concurrent.locks.ReentrantReadWriteLock;
import net.jcip.annotations.NotThreadSafe;
import org.jboss.dna.common.util.ArgCheck;
+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.Path;
@@ -206,7 +206,7 @@
Path parentPath = path.getAncestor();
Node parentNode = getNode(parentPath);
Name name = path.getLastSegment().getName();
- return createNode(context, parentNode, name);
+ return createNode(context, parentNode, name, null);
}
/**
@@ -215,15 +215,18 @@
* @param context the execution context
* @param parentNode the parent node; may not be null
* @param name the name; may not be null
+ * @param uuid the UUID of the node, or null if the UUID is to be generated
* @return the new node
*/
public Node createNode( ExecutionContext context,
Node parentNode,
- Name name ) {
+ Name name,
+ UUID uuid ) {
assert context != null;
assert name != null;
if (parentNode == null) parentNode = getRoot();
- Node node = new Node(generateUuid());
+ if (uuid == null) uuid = generateUuid();
+ Node node = new Node(uuid);
nodesByUuid.put(node.getUuid(), node);
node.setParent(parentNode);
Path.Segment newName =
context.getValueFactories().getPathFactory().createSegment(name);
@@ -297,7 +300,7 @@
assert original != null;
assert newParent != null;
// Get or create the new node ...
- Node copy = createNode(context, newParent, original.getName().getName());
+ Node copy = createNode(context, newParent, original.getName().getName(), null);
// Copy the properties ...
copy.getProperties().clear();
@@ -326,11 +329,18 @@
protected class Executor extends AbstractCommandExecutor {
+ private final Name uuidPropertyName;
+
protected Executor( ExecutionContext context,
String sourceName ) {
super(context, sourceName);
+ this.uuidPropertyName =
context.getValueFactories().getNameFactory().create(DnaLexicon.PropertyNames.UUID);
}
+ protected Property getUuidProperty( Node node ) {
+ return getExecutionContext().getPropertyFactory().create(uuidPropertyName,
node.getUuid());
+ }
+
@Override
public void execute( CreateNodeCommand command ) {
Path path = command.getPath();
@@ -341,7 +351,14 @@
Path lowestExisting = getLowestExistingPath(parent);
throw new PathNotFoundException(path, lowestExisting,
InMemoryConnectorI18n.nodeDoesNotExist.text(parent));
}
- Node node = createNode(getExecutionContext(), parentNode,
path.getLastSegment().getName());
+ UUID uuid = null;
+ for (Property property : command.getPropertyIterator()) {
+ if (property.getName().equals(uuidPropertyName)) {
+ uuid =
getExecutionContext().getValueFactories().getUuidFactory().create(property.getValues().next());
+ break;
+ }
+ }
+ Node node = createNode(getExecutionContext(), parentNode,
path.getLastSegment().getName(), uuid);
// Now add the properties to the supplied node ...
for (Property property : command.getPropertyIterator()) {
Name propName = property.getName();
@@ -349,7 +366,9 @@
node.getProperties().remove(propName);
continue;
}
- node.getProperties().put(propName, property);
+ if (!propName.equals(uuidPropertyName)) {
+ node.getProperties().put(propName, property);
+ }
}
assert node != null;
}
@@ -359,11 +378,10 @@
Node node = getTargetNode(command);
// Get the names of the children ...
List<Node> children = node.getChildren();
- List<Segment> childSegments = new
ArrayList<Segment>(children.size());
for (Node child : children) {
- childSegments.add(child.getName());
+ Segment childName = child.getName();
+ command.addChild(childName, getUuidProperty(child));
}
- command.setChildren(childSegments);
}
@Override
@@ -372,6 +390,7 @@
for (Property property : node.getProperties().values()) {
command.setProperty(property);
}
+ command.setProperty(getUuidProperty(node));
}
@Override
@@ -384,7 +403,9 @@
node.getProperties().remove(propName);
continue;
}
- node.getProperties().put(propName, property);
+ if (!propName.equals(uuidPropertyName)) {
+ node.getProperties().put(propName, property);
+ }
}
}
Modified:
trunk/connectors/dna-connector-inmemory/src/test/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryTest.java
===================================================================
---
trunk/connectors/dna-connector-inmemory/src/test/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryTest.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-inmemory/src/test/java/org/jboss/dna/connector/inmemory/InMemoryRepositoryTest.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -153,21 +153,21 @@
@Test
public void shouldCreateNodesByPath() {
Name name_a = nameFactory.create("a");
- Node node_a = repository.createNode(context, repository.getRoot(), name_a);
+ Node node_a = repository.createNode(context, repository.getRoot(), name_a,
null);
assertThat(node_a, is(notNullValue()));
assertThat(node_a.getParent(), is(repository.getRoot()));
assertThat(node_a.getName().getName(), is(name_a));
assertThat(node_a.getName().hasIndex(), is(false));
Name name_b = nameFactory.create("b");
- Node node_b = repository.createNode(context, node_a, name_b);
+ Node node_b = repository.createNode(context, node_a, name_b, null);
assertThat(node_b, is(notNullValue()));
assertThat(node_b.getParent(), is(node_a));
assertThat(node_b.getName().getName(), is(name_b));
assertThat(node_b.getName().hasIndex(), is(false));
Name name_c = nameFactory.create("c");
- Node node_c = repository.createNode(context, node_b, name_c);
+ Node node_c = repository.createNode(context, node_b, name_c, null);
assertThat(node_c, is(notNullValue()));
assertThat(node_c.getParent(), is(node_b));
assertThat(node_c.getName().getName(), is(name_c));
@@ -182,9 +182,9 @@
@Test
public void shouldNotFindNodesThatDoNotExist() {
- Node node_a = repository.createNode(context, repository.getRoot(),
nameFactory.create("a"));
- Node node_b = repository.createNode(context, node_a,
nameFactory.create("b"));
- /*Node node_c =*/repository.createNode(context, node_b,
nameFactory.create("c"));
+ Node node_a = repository.createNode(context, repository.getRoot(),
nameFactory.create("a"), null);
+ Node node_b = repository.createNode(context, node_a,
nameFactory.create("b"), null);
+ /*Node node_c =*/repository.createNode(context, node_b,
nameFactory.create("c"), null);
assertThat(repository.getNodesByUuid().size(), is(4));
assertThat(repository.getNode(pathFactory.create("/a[1]")),
is(nullValue()));
@@ -194,14 +194,14 @@
@Test
public void shouldCorrectlyManageIndexesOfSiblingsWithSameNames() {
Name name_a1 = nameFactory.create("a");
- Node node_a1 = repository.createNode(context, repository.getRoot(), name_a1);
+ Node node_a1 = repository.createNode(context, repository.getRoot(), name_a1,
null);
assertThat(node_a1, is(notNullValue()));
assertThat(node_a1.getParent(), is(repository.getRoot()));
assertThat(node_a1.getName().getName(), is(name_a1));
assertThat(node_a1.getName().hasIndex(), is(false));
Name name_a2 = nameFactory.create("a");
- Node node_a2 = repository.createNode(context, repository.getRoot(), name_a2);
+ Node node_a2 = repository.createNode(context, repository.getRoot(), name_a2,
null);
assertThat(node_a2, is(notNullValue()));
assertThat(node_a2.getParent(), is(repository.getRoot()));
assertThat(node_a2.getName().getName(), is(name_a2));
@@ -213,7 +213,7 @@
// Add another node without the same name ...
Name name_b = nameFactory.create("b");
- Node node_b = repository.createNode(context, repository.getRoot(), name_b);
+ Node node_b = repository.createNode(context, repository.getRoot(), name_b,
null);
assertThat(node_b, is(notNullValue()));
assertThat(node_b.getParent(), is(repository.getRoot()));
assertThat(node_b.getName().getName(), is(name_b));
@@ -221,7 +221,7 @@
// Add a third node with the same name ...
Name name_a3 = nameFactory.create("a");
- Node node_a3 = repository.createNode(context, repository.getRoot(), name_a3);
+ Node node_a3 = repository.createNode(context, repository.getRoot(), name_a3,
null);
assertThat(node_a3, is(notNullValue()));
assertThat(node_a3.getParent(), is(repository.getRoot()));
assertThat(node_a3.getName().getName(), is(name_a3));
@@ -257,12 +257,12 @@
@Test
public void shouldMoveNodes() {
Node root = repository.getRoot();
- Node node_a = repository.createNode(context, root,
nameFactory.create("a"));
- Node node_b = repository.createNode(context, node_a,
nameFactory.create("b"));
- Node node_c = repository.createNode(context, node_b,
nameFactory.create("c"));
- Node node_d = repository.createNode(context, root,
nameFactory.create("d"));
- Node node_e = repository.createNode(context, node_d,
nameFactory.create("e"));
- Node node_b2 = repository.createNode(context, node_d,
nameFactory.create("b"));
+ Node node_a = repository.createNode(context, root,
nameFactory.create("a"), null);
+ Node node_b = repository.createNode(context, node_a,
nameFactory.create("b"), null);
+ Node node_c = repository.createNode(context, node_b,
nameFactory.create("c"), null);
+ Node node_d = repository.createNode(context, root,
nameFactory.create("d"), null);
+ Node node_e = repository.createNode(context, node_d,
nameFactory.create("e"), null);
+ Node node_b2 = repository.createNode(context, node_d,
nameFactory.create("b"), null);
assertThat(repository.getNodesByUuid().size(), is(7));
assertThat(repository.getNode(pathFactory.create("/")),
is(sameInstance(repository.getRoot())));
@@ -297,12 +297,12 @@
@Test
public void shouldCopyNodes() {
Node root = repository.getRoot();
- Node node_a = repository.createNode(context, root,
nameFactory.create("a"));
- Node node_b = repository.createNode(context, node_a,
nameFactory.create("b"));
- Node node_c = repository.createNode(context, node_b,
nameFactory.create("c"));
- Node node_d = repository.createNode(context, root,
nameFactory.create("d"));
- Node node_e = repository.createNode(context, node_d,
nameFactory.create("e"));
- Node node_b2 = repository.createNode(context, node_d,
nameFactory.create("b"));
+ Node node_a = repository.createNode(context, root,
nameFactory.create("a"), null);
+ Node node_b = repository.createNode(context, node_a,
nameFactory.create("b"), null);
+ Node node_c = repository.createNode(context, node_b,
nameFactory.create("c"), null);
+ Node node_d = repository.createNode(context, root,
nameFactory.create("d"), null);
+ Node node_e = repository.createNode(context, node_d,
nameFactory.create("e"), null);
+ Node node_b2 = repository.createNode(context, node_d,
nameFactory.create("b"), null);
ValueFactory<String> stringFactory = valueFactories.getStringFactory();
Name propertyName = nameFactory.create("something");
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-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheConnection.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -21,7 +21,6 @@
*/
package org.jboss.dna.connector.jbosscache;
-import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -39,6 +38,7 @@
import org.jboss.dna.spi.graph.PathNotFoundException;
import org.jboss.dna.spi.graph.Property;
import org.jboss.dna.spi.graph.PropertyFactory;
+import org.jboss.dna.spi.graph.ValueFactory;
import org.jboss.dna.spi.graph.Path.Segment;
import org.jboss.dna.spi.graph.commands.CopyBranchCommand;
import org.jboss.dna.spi.graph.commands.CopyNodeCommand;
@@ -248,11 +248,13 @@
protected class Executor extends AbstractCommandExecutor {
private final PropertyFactory propertyFactory;
+ private final ValueFactory<UUID> uuidFactory;
protected Executor( ExecutionContext context,
String sourceName ) {
super(context, sourceName);
this.propertyFactory = context.getPropertyFactory();
+ this.uuidFactory = context.getValueFactories().getUuidFactory();
}
@Override
@@ -285,12 +287,20 @@
@Override
public void execute( GetChildrenCommand command ) {
Node<Name, Object> node = getNode(command.getPath());
+ Name uuidPropertyName = getUuidPropertyName();
// Get the names of the children ...
- List<Segment> childSegments = new ArrayList<Segment>();
for (Node<Name, Object> child : node.getChildren()) {
- childSegments.add((Segment)child.getFqn().getLastElement());
+ Segment segment = (Segment)child.getFqn().getLastElement();
+ Object uuid = node.getData().get(uuidPropertyName);
+ if (uuid == null) {
+ uuid = generateUuid();
+ node.getData().put(uuidPropertyName, uuid);
+ } else {
+ uuid = uuidFactory.create(uuid);
+ }
+ Property uuidProperty = propertyFactory.create(uuidPropertyName, uuid);
+ command.addChild(segment, uuidProperty);
}
- command.setChildren(childSegments);
}
@Override
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-05
21:05:45 UTC (rev 379)
+++
trunk/connectors/dna-connector-jbosscache/src/main/java/org/jboss/dna/connector/jbosscache/JBossCacheSource.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -43,6 +43,7 @@
import org.jboss.cache.CacheFactory;
import org.jboss.cache.DefaultCacheFactory;
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.graph.Name;
import org.jboss.dna.spi.graph.NameFactory;
@@ -55,11 +56,8 @@
@ThreadSafe
public class JBossCacheSource extends AbstractRepositorySource implements ObjectFactory
{
- /**
- */
- private static final long serialVersionUID = 1530716494560375111L;
- public static final String DEFAULT_UUID_PROPERTY_NAMESPACE =
"http://www.jboss.org/dna/connector/jbosscache";
- public static final String DEFAULT_UUID_PROPERTY_NAME = "uuid";
+ private static final long serialVersionUID = 1L;
+ public static final String DEFAULT_UUID_PROPERTY_NAME =
DnaLexicon.PropertyNames.UUID;
private static final ConcurrentMap<String, JBossCacheSource> sources = new
ConcurrentHashMap<String, JBossCacheSource>();
private static final ReadWriteLock sourcesLock = new ReentrantReadWriteLock();
@@ -103,7 +101,6 @@
private CachePolicy defaultCachePolicy;
private String cacheConfigurationName;
private String uuidPropertyName = DEFAULT_UUID_PROPERTY_NAME;
- private String uuidPropertyNamespaceUri = DEFAULT_UUID_PROPERTY_NAMESPACE;
private transient Cache<Name, Object> cache;
/**
@@ -157,20 +154,6 @@
}
/**
- * @return uuidPropertyNamespaceUri
- */
- public String getUuidPropertyNamespaceUri() {
- return this.uuidPropertyNamespaceUri;
- }
-
- /**
- * @param uuidPropertyNamespaceUri Sets uuidPropertyNamespaceUri to the specified
value.
- */
- public synchronized void setUuidPropertyNamespaceUri( String uuidPropertyNamespaceUri
) {
- this.uuidPropertyNamespaceUri = uuidPropertyNamespaceUri != null ?
uuidPropertyNamespaceUri.trim() : DEFAULT_UUID_PROPERTY_NAMESPACE;
- }
-
- /**
* If you use this to set a JNDI name, this source will be bound to that name using
the default {@link InitialContext}. You
* can also do this manually if you have additional requirements.
*
@@ -276,8 +259,8 @@
* @return the property name, or null if UUIDs are not to be maintained
*/
/* package */synchronized Name getUuidPropertyName( NameFactory factory ) {
- if (this.uuidPropertyName.length() == 0 &&
this.uuidPropertyNamespaceUri.length() == 0) return null;
- return factory.create(this.uuidPropertyNamespaceUri, this.uuidPropertyName);
+ if (this.uuidPropertyName.length() == 0) return null;
+ return factory.create(this.uuidPropertyName);
}
/**
Added: trunk/dna-spi/src/main/java/org/jboss/dna/spi/DnaLexicon.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/DnaLexicon.java
(rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/DnaLexicon.java 2008-08-06 00:45:08 UTC
(rev 380)
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * @author Randall Hauch
+ */
+public class DnaLexicon {
+
+ public static final String NAMESPACE_URI = "http://www.jboss.org/dna";
+ public static final String NAMESPACE_PREFIX = "dna";
+
+ public static class PropertyNames {
+ public static final String UUID = "dna:uuid";
+ public static final String MERGE_PLAN = "dna:mergePlan";
+ }
+}
Property changes on: trunk/dna-spi/src/main/java/org/jboss/dna/spi/DnaLexicon.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/PropertyType.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/PropertyType.java 2008-08-05
21:05:45 UTC (rev 379)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/PropertyType.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -28,6 +28,7 @@
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.spi.SpiI18n;
@@ -47,6 +48,7 @@
BOOLEAN("Boolean", ValueComparators.BOOLEAN_COMPARATOR, Boolean.class),
NAME("Name", ValueComparators.NAME_COMPARATOR, Name.class),
PATH("Path", ValueComparators.PATH_COMPARATOR, Path.class),
+ UUID("UUID", ValueComparators.UUID_COMPARATOR, UUID.class),
REFERENCE("Reference", ValueComparators.REFERENCE_COMPARATOR,
Reference.class),
URI("URI", ValueComparators.URI_COMPARATOR, URI.class),
OBJECT("Object", ValueComparators.OBJECT_COMPARATOR, Object.class);
Added: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/UuidFactory.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/UuidFactory.java
(rev 0)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/UuidFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -0,0 +1,41 @@
+/*
+ * 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;
+
+import java.util.UUID;
+
+/**
+ * A factory for creating {@link UUID UUID instances}. This interface extends the {@link
ValueFactory} generic interface and adds
+ * specific methods for creating UUIDs.
+ *
+ * @author Randall Hauch
+ */
+public interface UuidFactory extends ValueFactory<UUID> {
+
+ /**
+ * Create a new random UUID.
+ *
+ * @return the new randomly generated UUID
+ */
+ UUID create();
+
+}
Property changes on: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/UuidFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueComparators.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueComparators.java 2008-08-05
21:05:45 UTC (rev 379)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueComparators.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -28,6 +28,7 @@
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
+import java.util.UUID;
import org.jboss.dna.spi.SpiI18n;
import org.jboss.dna.spi.graph.impl.StringValueFactory;
@@ -247,6 +248,19 @@
}
};
/**
+ * A comparator of UUID values.
+ */
+ public static final Comparator<UUID> UUID_COMPARATOR = new
Comparator<UUID>() {
+
+ public int compare( UUID o1,
+ UUID o2 ) {
+ if (o1 == o2) return 0;
+ if (o1 == null) return -1;
+ if (o2 == null) return 1;
+ return o1.compareTo(o2);
+ }
+ };
+ /**
* A comparator of reference values.
*/
public static final Comparator<Reference> REFERENCE_COMPARATOR = new
Comparator<Reference>() {
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactories.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactories.java 2008-08-05
21:05:45 UTC (rev 379)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactories.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -26,12 +26,14 @@
/**
* The set of standard {@link ValueFactory} instances.
+ *
* @author Randall Hauch
*/
public interface ValueFactories extends Iterable<ValueFactory<?>> {
/**
* Get the value factory that creates values of the supplied {@link PropertyType
type}.
+ *
* @param type the type for the values
* @return the factory; never null
* @throws IllegalArgumentException if the property type is null
@@ -40,6 +42,7 @@
/**
* Get the value factory that is best able to create values with the most natural
type given by the supplied value.
+ *
* @param prototype the value that should be used to determine the best value
factory
* @return the factory; never null
* @throws IllegalArgumentException if the prototype value is null
@@ -48,72 +51,91 @@
/**
* Get the value factory for {@link PropertyType#STRING string} properties.
+ *
* @return the factory; never null
*/
ValueFactory<String> getStringFactory();
/**
* Get the value factory for {@link PropertyType#BINARY binary} properties.
+ *
* @return the factory; never null
*/
ValueFactory<Binary> getBinaryFactory();
/**
* Get the value factory for {@link PropertyType#LONG long} properties.
+ *
* @return the factory; never null
*/
ValueFactory<Long> getLongFactory();
/**
* Get the value factory for {@link PropertyType#DOUBLE double} properties.
+ *
* @return the factory; never null
*/
ValueFactory<Double> getDoubleFactory();
/**
* Get the value factory for {@link PropertyType#DECIMAL decimal} properties.
+ *
* @return the factory; never null
*/
ValueFactory<BigDecimal> getDecimalFactory();
/**
* Get the value factory for {@link PropertyType#DATE date} properties.
+ *
* @return the factory; never null
*/
DateTimeFactory getDateFactory();
/**
* Get the value factory for {@link PropertyType#BOOLEAN boolean} properties.
+ *
* @return the factory; never null
*/
ValueFactory<Boolean> getBooleanFactory();
/**
* Get the value factory for {@link PropertyType#NAME name} properties.
+ *
* @return the factory; never null
*/
NameFactory getNameFactory();
/**
* Get the value factory for {@link PropertyType#REFERENCE reference} properties.
+ *
* @return the factory; never null
*/
ValueFactory<Reference> getReferenceFactory();
/**
* Get the value factory for {@link PropertyType#PATH path} properties.
+ *
* @return the factory; never null
*/
PathFactory getPathFactory();
/**
* Get the value factory for {@link PropertyType#URI URI} properties.
+ *
* @return the factory; never null
*/
ValueFactory<URI> getUriFactory();
/**
+ * Get the value factory for {@link PropertyType#UUID UUID} properties.
+ *
+ * @return the factory; never null
+ */
+ UuidFactory getUuidFactory();
+
+ /**
* Get the value factory for {@link PropertyType#OBJECT object} properties.
+ *
* @return the factory; never null
*/
ValueFactory<Object> getObjectFactory();
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactory.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++ trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/ValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -28,6 +28,7 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.text.TextEncoder;
@@ -187,6 +188,15 @@
T create( URI value ) throws IoException;
/**
+ * Create a value from a UUID.
+ *
+ * @param value the UUID from which the value is to be created
+ * @return the value, or null if the supplied URI is null
+ * @throws IoException If an unexpected problem occurs during the conversion.
+ */
+ T create( UUID value ) throws IoException;
+
+ /**
* Create a value from the binary content given by the supplied array.
*
* @param value the content to be used to create the value
@@ -218,9 +228,9 @@
int approximateLength ) throws IoException;
/**
- * Create a value from the specified information by determining which other
<code>create</code> method applies and
- * delegating to that method. Note that this method only will call
<code>create</code> methods that take a single parameter;
- * so this excludes {@link #create(InputStream, int)}, {@link #create(Reader, int)}
and {@link #create(String, TextDecoder)}.
+ * Create a value from the specified information by determining which other
<code>create</code> method applies and delegating
+ * to that method. Note that this method only will call
<code>create</code> methods that take a single parameter; so this
+ * excludes {@link #create(InputStream, int)}, {@link #create(Reader, int)} and
{@link #create(String, TextDecoder)}.
*
* @param value the value
* @return the new value, or null if the supplied parameter is null
@@ -359,6 +369,15 @@
T[] create( URI[] values ) throws IoException;
/**
+ * Create an array of values from an array of UUIDs.
+ *
+ * @param values the UUIDs from which the values are to be created
+ * @return the values, or null if the supplied array is null
+ * @throws IoException If an unexpected problem occurs during the conversion.
+ */
+ T[] create( UUID[] values ) throws IoException;
+
+ /**
* Create an array of values from the array of binary content.
*
* @param values the array of content to be used to create the values
@@ -368,9 +387,9 @@
T[] create( byte[][] values ) throws IoException;
/**
- * Create an array of values from the specified information by determining which
other <code>create</code> method applies
- * for each object and then delegating to that method. Note that this method will not
consider
- * {@link #create(InputStream, int)}, {@link #create(Reader, int)} and {@link
#create(String, TextDecoder)}.
+ * Create an array of values from the specified information by determining which
other <code>create</code> method applies for
+ * each object and then delegating to that method. Note that this method will not
consider {@link #create(InputStream, int)},
+ * {@link #create(Reader, int)} and {@link #create(String, TextDecoder)}.
*
* @param values the values
* @return the new value, or null if the supplied parameter is null
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/GetChildrenCommand.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/GetChildrenCommand.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/GetChildrenCommand.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -21,10 +21,9 @@
*/
package org.jboss.dna.spi.graph.commands;
-import java.util.Iterator;
import org.jboss.dna.spi.cache.Cacheable;
-import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
+import org.jboss.dna.spi.graph.Property;
/**
* A command to get the children of a single node given its path.
@@ -34,74 +33,17 @@
public interface GetChildrenCommand extends GraphCommand, ActsOnPath, Cacheable {
/**
- * Set the children of this node using an iterator of names. Any existing child
references already set on this command will be
- * replaced by those supplied to this method.
- * <p>
- * The indexes of the same-name siblings will be determined by the order in which
they appear in the iterator.
- * </p>
- * <p>
- * The caller may supply a custom iterator implementation, which will be called on
this same connection within the same
- * transaction when the node data is processed and consumed. This is useful, for
example, if the iterator to transparently
- * page through the information without requiring all children to be pulled into
memory.
- * </p>
- *
- * @param namesOfChildren the iterator over the names of children; may be null if
there are no children
- */
- void setChildren( Iterator<Path.Segment> namesOfChildren );
-
- /**
- * Set the children of this node using an iterator of names. Any existing child
references already set on this command will be
- * replaced by those supplied to this method.
- * <p>
- * The indexes of the same-name siblings will be determined by the order in which
they appear in the iterator.
- * </p>
- * <p>
- * The caller may supply a custom {@link Iterable} implementation, which will be
called on this same connection within the
- * same transaction when the node data is processed and consumed. This is useful, for
example, if the iterator to
- * transparently page through the information without requiring all children to be
pulled into memory.
- * </p>
- *
- * @param namesOfChildren the iterable names of children; may be null if there are no
children
- */
- void setChildren( Iterable<Path.Segment> namesOfChildren );
-
- /**
- * Set the children of this node using the array of names. Any existing child
references already set on this command will be
- * replaced by those supplied to this method.
- * <p>
- * The indexes of the same-name siblings will be determined by the order in which
they appear in the iterator.
- * </p>
- *
- * @param namesOfChildren the names of children; may be null if there are no
children
- */
- void setChildren( Path.Segment... namesOfChildren );
-
- /**
- * Set the child of this node using the supplied name. Any existing child references
already set on this command will be
- * replaced by those supplied to this method. Note that a {@link Path.Segment
segment} is not required in this case because
- * there is only one child and (by definition) no index.
- *
- * @param nameOfChild the name of the only child
- */
- void setChild( Name nameOfChild );
-
- /**
* Add the child to this node. This method does not affect existing children, so
callers of this method should not add a child
* with the same segment as an existing child (this is not checked by this method).
*
* @param nameOfChild the name of the child; should not be the same as an existing
child (not checked)
+ * @param identityProperties the property/properties that are considered identity
properties (other than the name) for the
+ * child
*/
- void addChild( Path.Segment nameOfChild );
+ void addChild( Path.Segment nameOfChild,
+ Property... identityProperties );
/**
- * Adds the children to this node. This method does not affect existing children, so
callers of this method should not add
- * children with the same segment as existing children (this is not checked by this
method).
- *
- * @param namesOfChildren the names of the new children; these should not be the same
as any other children
- */
- void addChildren( Path.Segment... namesOfChildren );
-
- /**
* Set that this node has no children. Any existing child references already set on
this command will be removed.
*/
void setNoChildren();
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetChildrenCommand.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetChildrenCommand.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetChildrenCommand.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -21,15 +21,16 @@
*/
package org.jboss.dna.spi.graph.commands.impl;
-import java.util.Collections;
-import java.util.Iterator;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Map;
import net.jcip.annotations.NotThreadSafe;
import org.jboss.dna.common.util.StringUtil;
import org.jboss.dna.spi.cache.CachePolicy;
import org.jboss.dna.spi.graph.DateTime;
-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.Path.Segment;
import org.jboss.dna.spi.graph.commands.GetChildrenCommand;
@@ -42,7 +43,8 @@
/**
*/
private static final long serialVersionUID = -8515194602506918337L;
- private List<Segment> children;
+ private final Map<Segment, Property[]> childProperties = new
HashMap<Segment, Property[]>();
+ private final List<Segment> children = new LinkedList<Segment>();
private final Path path;
private CachePolicy cachePolicy;
private DateTime timeLoaded;
@@ -59,56 +61,34 @@
/**
* {@inheritDoc}
*/
- public void setChild( Name nameOfChild ) {
- children = createChildrenList(nameOfChild);
- }
-
- /**
- * {@inheritDoc}
- */
- public void setChildren( Iterator<Segment> namesOfChildren ) {
- children = createChildrenList(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- */
- public void setChildren( Iterable<Segment> namesOfChildren ) {
- children = createChildrenList(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- */
- public void setChildren( Segment... namesOfChildren ) {
- children = createChildrenList(namesOfChildren);
- }
-
- /**
- * {@inheritDoc}
- */
public void setNoChildren() {
- children = Collections.emptyList();
+ this.children.clear();
}
/**
* {@inheritDoc}
*
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChild(org.jboss.dna.spi.graph.Path.Segment)
+ * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChild(org.jboss.dna.spi.graph.Path.Segment,
+ * org.jboss.dna.spi.graph.Property[])
*/
- public void addChild( Segment nameOfChild ) {
- if (nameOfChild != null) this.children.add(nameOfChild);
+ public void addChild( Segment nameOfChild,
+ Property... identityProperties ) {
+ if (nameOfChild == null) return;
+ this.children.add(nameOfChild);
+ if (identityProperties != null) {
+ if (identityProperties.length == 0) identityProperties = null;
+ this.childProperties.put(nameOfChild, identityProperties);
+ }
}
/**
- * {@inheritDoc}
+ * Get the identity properties for the supplied child.
*
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChildren(org.jboss.dna.spi.graph.Path.Segment[])
+ * @param child the name of the child
+ * @return the array of identity properties for the child, or null if there are none
*/
- public void addChildren( Segment... namesOfChildren ) {
- for (Segment nameOfChild : namesOfChildren) {
- if (nameOfChild != null) this.children.add(nameOfChild);
- }
+ public Property[] getChildIdentityProperties( Segment child ) {
+ return this.childProperties.get(child);
}
/**
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetNodeCommand.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetNodeCommand.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/commands/impl/BasicGetNodeCommand.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -21,29 +21,24 @@
*/
package org.jboss.dna.spi.graph.commands.impl;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import net.jcip.annotations.NotThreadSafe;
import org.jboss.dna.common.util.StringUtil;
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.Path.Segment;
import org.jboss.dna.spi.graph.commands.GetNodeCommand;
-import org.jboss.dna.spi.graph.impl.BasicPathSegment;
/**
* @author Randall Hauch
*/
@NotThreadSafe
-public class BasicGetNodeCommand extends BasicGetPropertiesCommand implements
GetNodeCommand {
+public class BasicGetNodeCommand extends BasicGetChildrenCommand implements
GetNodeCommand {
- /**
- */
private static final long serialVersionUID = 5355669032301356873L;
- private List<Segment> children;
+ private final Map<Name, Property> properties = new HashMap<Name,
Property>();
/**
* @param path
@@ -54,95 +49,34 @@
}
/**
- * @return children
- */
- public List<Segment> getChildren() {
- return children;
- }
-
- /**
* {@inheritDoc}
*/
- public void setChild( Name nameOfChild ) {
- if (nameOfChild == null) {
- children = Collections.emptyList();
- } else {
- children = Collections.singletonList((Segment)new
BasicPathSegment(nameOfChild));
+ public void setProperty( Property property ) {
+ if (property != null) {
+ properties.put(property.getName(), property);
}
}
- /**
- * {@inheritDoc}
- */
- public void setChildren( Iterator<Segment> namesOfChildren ) {
- if (namesOfChildren == null) {
- children = Collections.emptyList();
- } else {
- children = new ArrayList<Segment>();
- while (namesOfChildren.hasNext()) {
- Segment childSegment = namesOfChildren.next();
- if (childSegment != null) children.add(childSegment);
- }
- }
+ public void setProperties( Map<Name, Property> properties ) {
+ this.properties.clear();
+ if (properties != null) this.properties.putAll(properties);
}
/**
- * {@inheritDoc}
- */
- public void setChildren( Iterable<Segment> namesOfChildren ) {
- if (namesOfChildren == null) {
- children = Collections.emptyList();
- } else {
- children = new ArrayList<Segment>();
- for (Segment childSegment : namesOfChildren) {
- if (childSegment != null) children.add(childSegment);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void setChildren( Segment... namesOfChildren ) {
- if (namesOfChildren == null || namesOfChildren.length == 0) {
- children = Collections.emptyList();
- } else {
- children = new ArrayList<Segment>();
- for (Segment childSegment : namesOfChildren) {
- if (childSegment != null) children.add(childSegment);
- }
- }
- }
-
- /**
- * {@inheritDoc}
+ * Get the property values that were added to the command
*
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChild(org.jboss.dna.spi.graph.Path.Segment)
+ * @return the map of property name to values
*/
- public void addChild( Segment nameOfChild ) {
- if (nameOfChild != null) this.children.add(nameOfChild);
+ public Iterable<Property> getPropertyIterator() {
+ return this.properties.values();
}
- /**
- * {@inheritDoc}
- *
- * @see
org.jboss.dna.spi.graph.commands.GetChildrenCommand#addChildren(org.jboss.dna.spi.graph.Path.Segment[])
- */
- public void addChildren( Segment... namesOfChildren ) {
- for (Segment nameOfChild : namesOfChildren) {
- if (nameOfChild != null) this.children.add(nameOfChild);
- }
+ public Map<Name, Property> getProperties() {
+ return this.properties;
}
/**
* {@inheritDoc}
- */
- public void setNoChildren() {
- children = Collections.emptyList();
- }
-
- /**
- * {@inheritDoc}
*
* @see java.lang.Object#toString()
*/
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactories.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactories.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactories.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -78,6 +78,8 @@
return getStringFactory();
case URI:
return getUriFactory();
+ case UUID:
+ return getUuidFactory();
}
return getObjectFactory();
}
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/AbstractValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,9 +27,11 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.util.ArgCheck;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -327,4 +329,19 @@
return result;
}
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID[])
+ */
+ public T[] create( UUID[] values ) throws IoException {
+ if (values == null) return null;
+ final int length = values.length;
+ T[] result = createEmptyArray(length);
+ for (int i = 0; i != length; ++i) {
+ result[i] = create(values[i]);
+ }
+ return result;
+ }
+
}
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/BooleanValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/BooleanValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/BooleanValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,9 +27,11 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -175,7 +177,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Boolean create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Boolean create( byte[] value ) {
// First create a string and then create the boolean from the string value ...
return create(getStringValueFactory().create(value));
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DecimalValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DecimalValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DecimalValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,9 +27,11 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -171,7 +173,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public BigDecimal create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public BigDecimal create( byte[] value ) {
// First attempt to create a string from the value, then a long from the string
...
return create(getStringValueFactory().create(value));
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DelegatingValueFactories.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DelegatingValueFactories.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DelegatingValueFactories.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -28,6 +28,7 @@
import org.jboss.dna.spi.graph.NameFactory;
import org.jboss.dna.spi.graph.PathFactory;
import org.jboss.dna.spi.graph.Reference;
+import org.jboss.dna.spi.graph.UuidFactory;
import org.jboss.dna.spi.graph.ValueFactories;
import org.jboss.dna.spi.graph.ValueFactory;
@@ -91,4 +92,8 @@
return delegate.getUriFactory();
}
+ public UuidFactory getUuidFactory() {
+ return delegate.getUuidFactory();
+ }
+
}
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DoubleValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DoubleValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/DoubleValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,9 +27,11 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -178,7 +180,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Double create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Double create( byte[] value ) {
// First attempt to create a string from the value, then a long from the string
...
return create(getStringValueFactory().create(value));
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/InMemoryBinaryValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/InMemoryBinaryValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/InMemoryBinaryValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -29,17 +29,18 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.util.IoUtil;
import org.jboss.dna.spi.SpiI18n;
import org.jboss.dna.spi.graph.Binary;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
import org.jboss.dna.spi.graph.Reference;
import org.jboss.dna.spi.graph.ValueFactory;
-import org.jboss.dna.spi.graph.IoException;
/**
* Teh standard {@link ValueFactory} for {@link PropertyType#BINARY} values.
@@ -178,7 +179,17 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Binary create( UUID value ) throws IoException {
+ // Convert the value to a string, then to a binary ...
+ return create(this.getStringValueFactory().create(value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Binary create( byte[] value ) {
return new InMemoryBinary(value);
}
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/JodaDateTimeValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/JodaDateTimeValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/JodaDateTimeValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,11 +27,13 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.SpiI18n;
import org.jboss.dna.spi.graph.DateTime;
import org.jboss.dna.spi.graph.DateTimeFactory;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -175,7 +177,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public DateTime create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public DateTime create( byte[] value ) {
// First attempt to create a string from the value, then a long from the string
...
return create(getStringValueFactory().create(value));
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/LongValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/LongValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/LongValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,9 +27,11 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -172,7 +174,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Long create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Long create( byte[] value ) {
// First attempt to create a string from the value, then a long from the string
...
return create(getStringValueFactory().create(value));
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/NameValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/NameValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/NameValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,12 +27,14 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.NameFactory;
import org.jboss.dna.spi.graph.NamespaceException;
@@ -263,7 +265,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Name create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Name create( byte[] value ) {
// First attempt to create a string from the value, then a long from the string
...
return create(getStringValueFactory().create(value));
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/ObjectValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/ObjectValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/ObjectValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -27,6 +27,7 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.util.ArgCheck;
@@ -164,7 +165,16 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Object create( UUID value ) {
+ return value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Object create( byte[] value ) {
return getBinaryValueFactory().create(value);
}
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/PathValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/PathValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/PathValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -29,11 +29,13 @@
import java.util.Calendar;
import java.util.Date;
import java.util.List;
+import java.util.UUID;
import java.util.regex.Pattern;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PathFactory;
@@ -504,7 +506,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Path create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Path create( byte[] value ) {
// First attempt to create a string from the value, then a long from the string
...
return create(getStringValueFactory().create(value));
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StandardValueFactories.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StandardValueFactories.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StandardValueFactories.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -36,6 +36,7 @@
import org.jboss.dna.spi.graph.PathFactory;
import org.jboss.dna.spi.graph.PropertyType;
import org.jboss.dna.spi.graph.Reference;
+import org.jboss.dna.spi.graph.UuidFactory;
import org.jboss.dna.spi.graph.ValueFactory;
/**
@@ -58,6 +59,7 @@
private final PathFactory pathFactory;
private final ValueFactory<Reference> referenceFactory;
private final ValueFactory<URI> uriFactory;
+ private final UuidFactory uuidFactory;
private final ValueFactory<Object> objectFactory;
private final NamespaceRegistry namespaceRegistry;
@@ -113,6 +115,7 @@
this.pathFactory = (PathFactory)getFactory(factories, new
PathValueFactory(this.decoder, this.stringFactory,
this.nameFactory));
this.referenceFactory = getFactory(factories, new
UuidReferenceValueFactory(this.decoder, this.stringFactory));
+ this.uuidFactory = (UuidFactory)getFactory(factories, new
UuidValueFactory(this.decoder, this.stringFactory));
this.uriFactory = getFactory(factories, new
UriValueFactory(this.namespaceRegistry, this.decoder, this.stringFactory));
this.objectFactory = getFactory(factories, new ObjectValueFactory(this.decoder,
this.stringFactory, this.binaryFactory));
}
@@ -222,7 +225,16 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactories#getUuidFactory()
*/
+ public UuidFactory getUuidFactory() {
+ return this.uuidFactory;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public ValueFactory<Object> getObjectFactory() {
return this.objectFactory;
}
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StringValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StringValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/StringValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -29,18 +29,19 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.text.TextEncoder;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.common.util.IoUtil;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
import org.jboss.dna.spi.graph.Reference;
import org.jboss.dna.spi.graph.ValueFactory;
-import org.jboss.dna.spi.graph.IoException;
/**
* The standard {@link ValueFactory} for {@link PropertyType#STRING} values.
@@ -185,7 +186,17 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public String create( UUID value ) throws IoException {
+ if (value == null) return null;
+ return value.toString();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public String create( byte[] value ) {
if (value == null) return null;
try {
Modified: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UriValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UriValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UriValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -28,10 +28,12 @@
import java.net.URISyntaxException;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.common.util.ArgCheck;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.NamespaceRegistry;
import org.jboss.dna.spi.graph.Path;
@@ -183,7 +185,18 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public URI create( UUID value ) throws IoException {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
UUID.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public URI create( URI value ) {
return value;
}
Modified:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidReferenceValueFactory.java
===================================================================
---
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidReferenceValueFactory.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidReferenceValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -31,6 +31,7 @@
import net.jcip.annotations.Immutable;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
import org.jboss.dna.spi.graph.Name;
import org.jboss.dna.spi.graph.Path;
import org.jboss.dna.spi.graph.PropertyType;
@@ -174,7 +175,16 @@
/**
* {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
*/
+ public Reference create( UUID value ) throws IoException {
+ return new UuidReference(value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Reference create( URI value ) {
throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
Date.class.getSimpleName(),
Added: trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidValueFactory.java
===================================================================
--- trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidValueFactory.java
(rev 0)
+++
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidValueFactory.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -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.graph.impl;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.net.URI;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.UUID;
+import net.jcip.annotations.Immutable;
+import org.jboss.dna.common.text.TextDecoder;
+import org.jboss.dna.spi.SpiI18n;
+import org.jboss.dna.spi.graph.IoException;
+import org.jboss.dna.spi.graph.Name;
+import org.jboss.dna.spi.graph.Path;
+import org.jboss.dna.spi.graph.PropertyType;
+import org.jboss.dna.spi.graph.Reference;
+import org.jboss.dna.spi.graph.UuidFactory;
+import org.jboss.dna.spi.graph.ValueFactory;
+
+/**
+ * The standard {@link ValueFactory} for {@link PropertyType#URI} values.
+ *
+ * @author Randall Hauch
+ * @author John Verhaeg
+ */
+@Immutable
+public class UuidValueFactory extends AbstractValueFactory<UUID> implements
UuidFactory {
+
+ public UuidValueFactory( TextDecoder decoder,
+ ValueFactory<String> stringValueFactory ) {
+ super(PropertyType.UUID, decoder, stringValueFactory);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.UuidFactory#create()
+ */
+ public UUID create() {
+ return UUID.randomUUID();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( String value ) {
+ if (value == null) return null;
+ value = value.trim();
+ try {
+ return UUID.fromString(value);
+ } catch (IllegalArgumentException err) {
+ throw new
IllegalArgumentException(SpiI18n.errorConvertingType.text(String.class.getSimpleName(),
+
URI.class.getSimpleName(),
+ value),
err);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( String value,
+ TextDecoder decoder ) {
+ // this probably doesn't really need to call the decoder, but by doing so
then we don't care at all what the decoder does
+ return create(getDecoder(decoder).decode(value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( int value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( long value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( boolean value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( float value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( double value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( BigDecimal value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( Calendar value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( Date value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Date.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( Name value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Reference.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( Path value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Reference.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( Reference value ) {
+ if (value instanceof UuidReference) {
+ UuidReference ref = (UuidReference)value;
+ return ref.getUuid();
+ }
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Reference.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( URI value ) {
+ throw new
UnsupportedOperationException(SpiI18n.unableToCreateValue.text(getPropertyType().getName(),
+
Reference.class.getSimpleName(),
+
value));
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @see org.jboss.dna.spi.graph.ValueFactory#create(java.util.UUID)
+ */
+ public UUID create( UUID value ) throws IoException {
+ return value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( byte[] value ) {
+ // First attempt to create a string from the value, then a long from the string
...
+ return create(getStringValueFactory().create(value));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( InputStream stream,
+ int approximateLength ) {
+ // First attempt to create a string from the value, then a double from the string
...
+ return create(getStringValueFactory().create(stream, approximateLength));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public UUID create( Reader reader,
+ int approximateLength ) {
+ // First attempt to create a string from the value, then a double from the string
...
+ return create(getStringValueFactory().create(reader, approximateLength));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected UUID[] createEmptyArray( int length ) {
+ return new UUID[length];
+ }
+
+}
Property changes on:
trunk/dna-spi/src/main/java/org/jboss/dna/spi/graph/impl/UuidValueFactory.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepository.java
===================================================================
---
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepository.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepository.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -25,9 +25,11 @@
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;
@@ -50,6 +52,8 @@
@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 ) {
@@ -64,6 +68,7 @@
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 ) {
@@ -81,6 +86,21 @@
}
/**
+ * @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
@@ -133,6 +153,10 @@
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;
}
Modified:
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepositorySource.java
===================================================================
---
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepositorySource.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/connection/SimpleRepositorySource.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -35,10 +35,11 @@
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.CompositeCommand;
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}.
@@ -163,61 +164,19 @@
* org.jboss.dna.spi.graph.commands.GraphCommand[])
*/
public void execute( ExecutionContext context,
- GraphCommand... commands ) throws RepositorySourceException
{
+ 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) {
- executeCommand(context, command);
+ executor.execute(command);
}
}
- protected void executeCommand( ExecutionContext context,
- GraphCommand command ) {
- if (command == null) return;
- if (command instanceof CompositeCommand) {
- CompositeCommand composite = (CompositeCommand)command;
- for (GraphCommand nestedCommand : composite) {
- executeCommand(context, nestedCommand);
- }
- }
- Map<Path, Map<Name, Property>> data = repository.getData();
- // Only commands we recognize are the following; everything else is ignored
...
- if (command instanceof GetPropertiesCommand) { // super of GetNodeCommand
- GetPropertiesCommand getProperties = (GetPropertiesCommand)command;
- Path targetPath = getProperties.getPath();
- Map<Name, Property> properties = data.get(targetPath);
- if (properties == null) {
- getProperties.setError(new InvalidPathException("Non-existant
node: " + targetPath));
- return;
- }
- for (Property property : properties.values()) {
- getProperties.setProperty(property);
- }
- }
- if (command instanceof GetChildrenCommand) { // super of GetNodeCommand
- GetChildrenCommand getChildren = (GetChildrenCommand)command;
- Path targetPath = getChildren.getPath();
- if (data.get(targetPath) == null) {
- getChildren.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);
- getChildren.setChildren(childSegments);
- }
-
- }
-
/**
* {@inheritDoc}
*
@@ -273,4 +232,66 @@
}
+ 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);
+ }
+ }
+ }
+ }
+
}
Modified:
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/AbstractValueFactoryTest.java
===================================================================
---
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/AbstractValueFactoryTest.java 2008-08-05
21:05:45 UTC (rev 379)
+++
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/AbstractValueFactoryTest.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -32,6 +32,7 @@
import java.net.URI;
import java.util.Calendar;
import java.util.Date;
+import java.util.UUID;
import org.jboss.dna.common.text.NoOpEncoder;
import org.jboss.dna.common.text.TextDecoder;
import org.jboss.dna.spi.graph.Name;
@@ -113,6 +114,10 @@
return null;
}
+ public String create( UUID value ) {
+ return null;
+ }
+
public String create( byte[] value ) {
return null;
}
Added: trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/UuidValueFactoryTest.java
===================================================================
--- trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/UuidValueFactoryTest.java
(rev 0)
+++
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/UuidValueFactoryTest.java 2008-08-06
00:45:08 UTC (rev 380)
@@ -0,0 +1,164 @@
+/*
+ * 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.impl;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.hamcrest.core.IsSame.sameInstance;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import java.io.ByteArrayInputStream;
+import java.io.StringReader;
+import java.net.URI;
+import java.util.Calendar;
+import java.util.UUID;
+import org.jboss.dna.spi.graph.Name;
+import org.jboss.dna.spi.graph.Path;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Randall Hauch
+ * @author John Verhaeg
+ */
+public class UuidValueFactoryTest {
+
+ private UuidValueFactory factory;
+ private StringValueFactory stringFactory;
+ private UUID uuid;
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUp() throws Exception {
+ stringFactory = new StringValueFactory(Path.URL_DECODER, Path.URL_ENCODER);
+ factory = new UuidValueFactory(Path.URL_DECODER, stringFactory);
+ uuid = UUID.randomUUID();
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateDoubleFromBooleanValue() {
+ factory.create(true);
+ }
+
+ @Test
+ public void shouldReturnUuidWhenCreatingFromUuid() {
+ assertThat(factory.create(uuid), is(sameInstance(uuid)));
+ }
+
+ @Test
+ public void shouldCreateUuidWithNoArguments() {
+ assertThat(factory.create(), is(instanceOf(UUID.class)));
+ }
+
+ @Test
+ public void shouldCreateUuidFromString() {
+ assertThat(factory.create(uuid.toString()), is(uuid));
+ }
+
+ @Test
+ public void shouldCreateUuidFromStringRegardlessOfLeadingAndTrailingWhitespace() {
+ assertThat(factory.create(" " + uuid.toString() + " "),
is(uuid));
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromIntegerValue() {
+ factory.create(1);
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromLongValue() {
+ factory.create(1L);
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromDoubleValue() {
+ factory.create(1.0d);
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromFloatValue() {
+ factory.create(1.0f);
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromBooleanValue() {
+ factory.create(true);
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromCalendarValue() {
+ factory.create(Calendar.getInstance());
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromName() {
+ factory.create(mock(Name.class));
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromPath() {
+ factory.create(mock(Path.class));
+ }
+
+ @Test
+ public void shouldCreateUuidFromReference() {
+ UuidReference ref = new UuidReference(uuid);
+ assertThat(factory.create(ref), is(uuid));
+ }
+
+ @Test( expected = UnsupportedOperationException.class )
+ public void shouldNotCreateUuidFromUri() throws Exception {
+ factory.create(new URI("http://www.jboss.org"));
+ }
+
+ @Test
+ public void shouldCreateUuidFromByteArrayContainingUtf8EncodingOfStringWithUuid()
throws Exception {
+ assertThat(factory.create(uuid.toString().getBytes("UTF-8")),
is(uuid));
+ }
+
+ @Test
+ public void shouldCreateUuidFromInputStreamContainingUtf8EncodingOfStringWithUuid()
throws Exception {
+ assertThat(factory.create(new
ByteArrayInputStream(uuid.toString().getBytes("UTF-8"))), is(uuid));
+ }
+
+ @Test
+ public void shouldCreateUuidFromReaderContainingStringWithUuid() {
+ assertThat(factory.create(new StringReader(uuid.toString())), is(uuid));
+ }
+
+ @Test( expected = IllegalArgumentException.class )
+ public void
shouldNotCreateUuidFromByteArrayContainingUtf8EncodingOfStringWithContentsOtherThanUuid()
throws Exception {
+ factory.create("something".getBytes("UTF-8"));
+ }
+
+ @Test( expected = IllegalArgumentException.class )
+ public void
shouldNotCreateUuuidFromInputStreamContainingUtf8EncodingOfStringWithContentsOtherThanUuuid()
throws Exception {
+ factory.create(new
ByteArrayInputStream("something".getBytes("UTF-8")));
+ }
+
+ @Test( expected = IllegalArgumentException.class )
+ public void
shouldNotCreateUuuidFromReaderContainingStringWithContentsOtherThanUuuid() throws
Exception {
+ factory.create(new
ByteArrayInputStream("something".getBytes("UTF-8")));
+ }
+}
Property changes on:
trunk/dna-spi/src/test/java/org/jboss/dna/spi/graph/impl/UuidValueFactoryTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain