Index: modeshape-jcr/src/main/java/org/modeshape/jcr/AbstractJcrNode.java =================================================================== --- modeshape-jcr/src/main/java/org/modeshape/jcr/AbstractJcrNode.java (revision 2544) +++ modeshape-jcr/src/main/java/org/modeshape/jcr/AbstractJcrNode.java (working copy) @@ -213,7 +213,7 @@ abstract class AbstractJcrNode extends AbstractJcrItem implements javax.jcr.Node final JcrValue valueFrom( InputStream value ) { ValueFactories factories = cache.factories(); org.modeshape.graph.property.Binary binary = factories.getBinaryFactory().create(value); - return new JcrValue(factories, cache, PropertyType.DATE, binary); + return new JcrValue(factories, cache, PropertyType.BINARY, binary); } final JcrValue valueFrom( Binary value ) { Index: modeshape-jcr/src/main/java/org/modeshape/jcr/JcrQueryManager.java =================================================================== --- modeshape-jcr/src/main/java/org/modeshape/jcr/JcrQueryManager.java (revision 2544) +++ modeshape-jcr/src/main/java/org/modeshape/jcr/JcrQueryManager.java (working copy) @@ -30,7 +30,6 @@ import java.util.Set; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.NodeIterator; -import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Value; import javax.jcr.ValueFactory; @@ -1400,7 +1399,7 @@ class JcrQueryManager implements QueryManager { @Override public Value createValue( int propertyType, Object value ) { - return new JcrValue(factories, cache, PropertyType.PATH, value); + return new JcrValue(factories, cache, propertyType, value); } /** Index: modeshape-jcr/src/main/java/org/modeshape/jcr/JcrValue.java =================================================================== --- modeshape-jcr/src/main/java/org/modeshape/jcr/JcrValue.java (revision 2544) +++ modeshape-jcr/src/main/java/org/modeshape/jcr/JcrValue.java (working copy) @@ -82,7 +82,7 @@ final class JcrValue implements Value, org.modeshape.jcr.api.Value { this.valueFactories = valueFactories; this.sessionCache = sessionCache; this.type = type; - this.value = value instanceof JcrBinary ? ((JcrBinary)value).binary() : value; + this.value = convertToType(this.type, value instanceof JcrBinary ? ((JcrBinary)value).binary() : value); } JcrValue( ValueFactories valueFactories, @@ -539,6 +539,42 @@ final class JcrValue implements Value, org.modeshape.jcr.api.Value { } } + protected Object convertToType( int type, + Object value ) { + switch (type) { + case PropertyType.BOOLEAN: + return valueFactories.getBooleanFactory().create(value); + case PropertyType.DATE: + return valueFactories.getDateFactory().create(value); + case PropertyType.NAME: + return valueFactories.getNameFactory().create(value); + case PropertyType.PATH: + return valueFactories.getPathFactory().create(value); + case PropertyType.REFERENCE: + case PropertyType.WEAKREFERENCE: + return valueFactories.getReferenceFactory().create(value); + case PropertyType.DOUBLE: + return valueFactories.getDoubleFactory().create(value); + case PropertyType.LONG: + return valueFactories.getLongFactory().create(value); + case PropertyType.DECIMAL: + return valueFactories.getDecimalFactory().create(value); + case PropertyType.URI: + return valueFactories.getUriFactory().create(value); + case PropertyType.BINARY: + return valueFactories.getBinaryFactory().create(value); + case PropertyType.STRING: + return valueFactories.getStringFactory().create(value); + case PropertyType.UNDEFINED: + return value; + + default: + assert false : "Unexpected JCR property type " + type; + // This should still throw an exception even if assertions are turned off + throw new IllegalStateException("Invalid property type " + type); + } + } + @Override public String toString() { return (value == null ? "null" : value.toString()) + " (" + PropertyType.nameFromValue(type) + ")"; Index: modeshape-jcr/src/test/java/org/modeshape/jcr/JcrPropertyDefinitionTest.java =================================================================== --- modeshape-jcr/src/test/java/org/modeshape/jcr/JcrPropertyDefinitionTest.java (revision 2544) +++ modeshape-jcr/src/test/java/org/modeshape/jcr/JcrPropertyDefinitionTest.java (working copy) @@ -43,6 +43,7 @@ import org.junit.Before; import org.junit.Test; import org.modeshape.graph.property.Name; import org.modeshape.graph.property.NamespaceRegistry; +import org.modeshape.graph.property.ValueFormatException; /** * Indirectly tests the JcrConstaintCheckerFactory through {@link JcrPropertyDefinition#satisfiesConstraints(Value)}, which @@ -72,6 +73,8 @@ public class JcrPropertyDefinitionTest extends AbstractSessionTest { @Override protected void initializeContent() { + context.getNamespaceRegistry().register(TestLexicon.Namespace.PREFIX, TestLexicon.Namespace.URI); + graph.create("/jcr:system").and().create("/jcr:system/mode:namespaces"); graph.create("/a").and().create("/a/b").and().create("/a/b/c"); @@ -409,7 +412,7 @@ public class JcrPropertyDefinitionTest extends AbstractSessionTest { assertThat(satisfiesConstraints(prop, values), is(true)); } - @Test + @Test( expected = ValueFormatException.class ) public void shouldNotAllowInvalidNameValue() throws Exception { NodeType constrainedType = validateTypeDefinition(); JcrPropertyDefinition prop = propertyDefinitionFor(constrainedType, TestLexicon.CONSTRAINED_NAME);