You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/06/10 01:57:59 UTC
[01/14] zest-qi4j git commit: Implemented ZEST-22,
but still have a test failure. This failure seems unrelated.
Repository: zest-qi4j
Updated Branches:
refs/heads/develop fd0c2126a -> c59468c72
Implemented ZEST-22, but still have a test failure. This failure seems unrelated.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/a36aba1f
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/a36aba1f
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/a36aba1f
Branch: refs/heads/develop
Commit: a36aba1fe72f9009bd6a76294617355f930d4f6e
Parents: e691796
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Sat May 16 10:45:40 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Sat May 16 10:45:40 2015 +0800
----------------------------------------------------------------------
core/api/src/main/java/org/qi4j/api/Qi4j.java | 84 +++++-
.../java/org/qi4j/runtime/Qi4jRuntimeImpl.java | 257 ++++++++++++++++++-
.../association/NamedAssociationInstance.java | 51 ++++
.../composite/FunctionStateResolver.java | 33 +++
.../unitofwork/EntityBuilderInstance.java | 26 +-
.../runtime/value/ValueWithAssociationTest.java | 132 ++++++++++
.../spi/src/main/java/org/qi4j/spi/Qi4jSPI.java | 30 +++
.../qi4j/spi/entity/NamedAssociationState.java | 1 -
8 files changed, 585 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/api/src/main/java/org/qi4j/api/Qi4j.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/Qi4j.java b/core/api/src/main/java/org/qi4j/api/Qi4j.java
index 317153c..d8f2d29 100644
--- a/core/api/src/main/java/org/qi4j/api/Qi4j.java
+++ b/core/api/src/main/java/org/qi4j/api/Qi4j.java
@@ -25,6 +25,7 @@ import org.qi4j.api.composite.InvalidCompositeException;
import org.qi4j.api.composite.ModelDescriptor;
import org.qi4j.api.composite.TransientDescriptor;
import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.Identity;
import org.qi4j.api.property.Property;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.api.service.ServiceDescriptor;
@@ -42,8 +43,9 @@ public interface Qi4j
* then that reference must be dereferenced using this method
* before handing it out for others to use.
*
- * @param <T> Parameterized type of the Composite
+ * @param <T> Parameterized type of the Composite
* @param composite instance reference injected in Modified using @This
+ *
* @return the dereferenced Composite
*/
<T> T dereference( T composite );
@@ -53,6 +55,7 @@ public interface Qi4j
*
* @param compositeOrUow The Composite (Service, Value, Entity or Transient) or UnitOfWork to lookup the Module it
* belongs to.
+ *
* @return The Module instance where the Composite or UnitOfWork belongs to.
*/
Module moduleOf( Object compositeOrUow );
@@ -62,6 +65,7 @@ public interface Qi4j
*
* @param compositeOrServiceReference The Composite (Service, Value, Entity or Transient) for which to lookup the
* ModelDescriptor
+ *
* @return The ModelDescriptor of the Composite
*/
ModelDescriptor modelDescriptorFor( Object compositeOrServiceReference );
@@ -71,6 +75,7 @@ public interface Qi4j
*
* @param compositeOrServiceReference The Composite (Service, Value, Entity or Transient) for which to lookup the
* CompositeDescriptor
+ *
* @return The CompositeDescriptor of the Composite
*/
CompositeDescriptor compositeDescriptorFor( Object compositeOrServiceReference );
@@ -79,6 +84,7 @@ public interface Qi4j
* Returns the TransientDescriptor of the TransientComposite.
*
* @param transsient The TransientComposite for which to lookup the TransientDescriptor
+ *
* @return The TransientDescriptor of the TransientComposite
*/
TransientDescriptor transientDescriptorFor( Object transsient );
@@ -87,6 +93,7 @@ public interface Qi4j
* Returns the EntityDescriptor of the EntityComposite.
*
* @param entity The EntityComposite for which to lookup the EntityDescriptor
+ *
* @return The EntityDescriptor of the EntityComposite
*/
EntityDescriptor entityDescriptorFor( Object entity );
@@ -95,6 +102,7 @@ public interface Qi4j
* Returns the ValueDescriptor of the ValueComposite.
*
* @param value The ValueComposite for which to lookup the ValueDescriptor
+ *
* @return The ValueDescriptor of the ValueComposite
*/
ValueDescriptor valueDescriptorFor( Object value );
@@ -103,6 +111,7 @@ public interface Qi4j
* Returns the ServiceDescriptor of the ServiceComposite.
*
* @param service The ServiceComposite for which to lookup the ServiceDescriptor
+ *
* @return The ServiceDescriptor of the ServiceComposite
*/
ServiceDescriptor serviceDescriptorFor( Object service );
@@ -111,6 +120,7 @@ public interface Qi4j
* Returns the PropertyDescriptor of the Property.
*
* @param property The Property for which to lookup the PropertyDescriptor
+ *
* @return The PropertyDescriptor of the Property
*/
PropertyDescriptor propertyDescriptorFor( Property<?> property );
@@ -119,11 +129,83 @@ public interface Qi4j
* Returns the AssociationDescriptor of the Association.
*
* @param association The Association for which to lookup the AssociationDescriptor
+ *
* @return The AssociationDescriptor of the Association
*/
AssociationDescriptor associationDescriptorFor( AbstractAssociation association );
/**
+ * Converts the provided Entity to a Value of the same type.
+ * This is a convenience method to convert an EntityComposite to a ValueComposite.
+ * <p/>
+ * All Property values are transferred across as-is, and the Association, ManyAssociation
+ * and NamedAssociatino values are kept in the ValueComposite as EntityReferences
+ * until they are dereferenced (get() and other methods), and IF a UnitOfWork is
+ * present at dereferencing the corresponding EntityCompoiste is retrieved from the
+ * EntityStore. If there is not an UnitOfWork present, an exception is thrown.
+ * <p/>
+ * For this to work, the Composites (both Entity and Value) must not declare the
+ * EntityComposite and ValueComposite super types, but rely on the declaration in
+ * the assembly, and also extend the Identity supertype.
+ *
+ * Example;
+ * <pre><code>
+ * public interface Person extends Identity { ... };
+ * public class MyAssembler
+ * {
+ * public void assemble( ModuleAssembly module )
+ * {
+ * module.values( Person.class );
+ * module.entities( Person.class );
+ * }
+ * }
+ * </code></pre>
+ *
+ * @param primaryType The shared type for which the properties and associations will
+ * be converted. Properties outside this type will be ignored.
+ * @param entityComposite The entity to be convered.
+ */
+ <T extends Identity> T toValue( Class<T> primaryType, T entityComposite );
+
+ /**
+ * Converts the provided Value to an Entity of the same type.
+ * This is a convenience method to convert a ValueComposite to an EntityComposite.
+ * <p/>
+ * All Property values are transferred across as-is (no deep copy in case mutable
+ * types (DISCOURAGED!) are used), and the Association, ManyAssociation
+ * and NamedAssociatino that were in the ValueComposite as EntityReferences are
+ * transferred into the EntityComposite correctly, and can be dereferenced.
+ * <p/>
+ * This method MUST be called within a UnitOfWork.
+ * <p/>
+ * If an Entity with the Identity in the ValueComposite already exists, then that
+ * Entity is updated with the values from the ValueComposite. If an Entity of
+ * that Identity doesn't exist and new one is created.
+ * <p/>
+ * For this to work, the Composites (both Entity and Value) must not declare the
+ * EntityComposite and ValueComposite super types, but rely on the declaration in
+ * the assembly, and also extend the Identity supertype.
+ *
+ * Example;
+ * <pre><code>
+ * public interface Person extends Identity { ... };
+ * public class MyAssembler
+ * {
+ * public void assemble( ModuleAssembly module )
+ * {
+ * module.values( Person.class );
+ * module.entities( Person.class );
+ * }
+ * }
+ * </code></pre>
+ *
+ * @param primaryType The shared type for which the properties and associations will
+ * be converted. Properties outside this type will be ignored.
+ * @param valueComposite The Value to be convered into an Entity.
+ */
+ <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite );
+
+ /**
* Function that returns the CompositeDescriptor of a Composite.
*/
Function<Composite, CompositeDescriptor> FUNCTION_DESCRIPTOR_FOR = new Function<Composite, CompositeDescriptor>()
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
index 737e6bd..9b5dce7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
@@ -15,12 +15,17 @@ package org.qi4j.runtime;
import java.lang.reflect.InvocationHandler;
import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
import org.qi4j.api.Qi4j;
import org.qi4j.api.association.AbstractAssociation;
+import org.qi4j.api.association.Association;
import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.association.AssociationStateHolder;
import org.qi4j.api.association.AssociationWrapper;
+import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.association.ManyAssociationWrapper;
+import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.association.NamedAssociationWrapper;
import org.qi4j.api.composite.Composite;
import org.qi4j.api.composite.CompositeDescriptor;
@@ -28,8 +33,11 @@ import org.qi4j.api.composite.CompositeInstance;
import org.qi4j.api.composite.ModelDescriptor;
import org.qi4j.api.composite.TransientComposite;
import org.qi4j.api.composite.TransientDescriptor;
+import org.qi4j.api.entity.EntityBuilder;
import org.qi4j.api.entity.EntityComposite;
import org.qi4j.api.entity.EntityDescriptor;
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
import org.qi4j.api.property.Property;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.api.property.PropertyWrapper;
@@ -38,18 +46,26 @@ import org.qi4j.api.service.ServiceComposite;
import org.qi4j.api.service.ServiceDescriptor;
import org.qi4j.api.service.ServiceReference;
import org.qi4j.api.structure.Module;
+import org.qi4j.api.unitofwork.NoSuchEntityException;
import org.qi4j.api.unitofwork.UnitOfWork;
+import org.qi4j.api.value.ValueBuilder;
import org.qi4j.api.value.ValueComposite;
import org.qi4j.api.value.ValueDescriptor;
import org.qi4j.bootstrap.ApplicationAssemblyFactory;
import org.qi4j.bootstrap.ApplicationModelFactory;
import org.qi4j.bootstrap.Qi4jRuntime;
+import org.qi4j.functional.Function;
import org.qi4j.runtime.association.AbstractAssociationInstance;
+import org.qi4j.runtime.association.AssociationInstance;
+import org.qi4j.runtime.association.ManyAssociationInstance;
+import org.qi4j.runtime.association.NamedAssociationInstance;
import org.qi4j.runtime.bootstrap.ApplicationAssemblyFactoryImpl;
import org.qi4j.runtime.bootstrap.ApplicationModelFactoryImpl;
+import org.qi4j.runtime.composite.FunctionStateResolver;
import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
import org.qi4j.runtime.composite.TransientInstance;
import org.qi4j.runtime.entity.EntityInstance;
+import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.property.PropertyInstance;
import org.qi4j.runtime.service.ImportedServiceReferenceInstance;
import org.qi4j.runtime.service.ServiceInstance;
@@ -58,6 +74,7 @@ import org.qi4j.runtime.structure.ModuleUnitOfWork;
import org.qi4j.runtime.value.ValueInstance;
import org.qi4j.spi.Qi4jSPI;
import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.NamedAssociationState;
import static java.lang.reflect.Proxy.getInvocationHandler;
import static org.qi4j.runtime.composite.TransientInstance.compositeInstanceOf;
@@ -160,7 +177,7 @@ public final class Qi4jRuntimeImpl
else if( compositeOrServiceReferenceOrUow instanceof ImportedServiceReferenceInstance )
{
ImportedServiceReferenceInstance<?> importedServiceReference
- = (ImportedServiceReferenceInstance<?>) compositeOrServiceReferenceOrUow;
+ = (ImportedServiceReferenceInstance<?>) compositeOrServiceReferenceOrUow;
return importedServiceReference.module();
}
throw new IllegalArgumentException( "Wrong type. Must be one of "
@@ -205,7 +222,7 @@ public final class Qi4jRuntimeImpl
else if( compositeOrServiceReference instanceof ImportedServiceReferenceInstance )
{
ImportedServiceReferenceInstance<?> importedServiceReference
- = (ImportedServiceReferenceInstance<?>) compositeOrServiceReference;
+ = (ImportedServiceReferenceInstance<?>) compositeOrServiceReference;
return importedServiceReference.serviceDescriptor();
}
throw new IllegalArgumentException( "Wrong type. Must be one of "
@@ -312,7 +329,7 @@ public final class Qi4jRuntimeImpl
{
association = ( (ManyAssociationWrapper) association ).next();
}
-
+
while( association instanceof NamedAssociationWrapper )
{
association = ( (NamedAssociationWrapper) association ).next();
@@ -321,10 +338,244 @@ public final class Qi4jRuntimeImpl
return (AssociationDescriptor) ( (AbstractAssociationInstance) association ).associationInfo();
}
+ @Override
+ public <T extends Identity> T toValue( Class<T> primaryType, T entityComposite )
+ {
+ EntityDescriptor entityDescriptor = entityDescriptorFor( entityComposite );
+ Function<PropertyDescriptor, Object> propertyFunction = new ToValuePropertyMappingFunction<T>( entityComposite );
+ Function<AssociationDescriptor, EntityReference> assocationFunction = new ToValueAssociationMappingFunction<T>( entityComposite );
+ Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToValueManyAssociationMappingFunction<T>( entityComposite );
+ Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToValueNameAssociationMappingFunction<T>( entityComposite );
+
+ @SuppressWarnings( "unchecked" )
+ ValueBuilder<T> builder = moduleOf( entityComposite ).newValueBuilderWithState(
+ (Class<T>) entityDescriptor.primaryType(), propertyFunction, assocationFunction, manyAssocFunction, namedAssocFunction );
+ return builder.newInstance();
+ }
+
+ @Override
+ public <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite )
+ {
+ Function<PropertyDescriptor, Object> propertyFunction = new ToEntityPropertyMappingFunction<T>( valueComposite );
+ Function<AssociationDescriptor, EntityReference> assocationFunction = new ToEntityAssociationMappingFunction<T>( valueComposite );
+ Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToEntityManyAssociationMappingFunction<T>( valueComposite );
+ Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToEntityNameAssociationMappingFunction<T>( valueComposite );
+
+ UnitOfWork uow = moduleOf( valueComposite ).currentUnitOfWork();
+ String identity = valueComposite.identity().get();
+ try
+ {
+ T entity = uow.get( primaryType, identity );
+ // If successful, then this entity is to by modified.
+ EntityInstance instance = EntityInstance.entityInstanceOf( (EntityComposite) entity );
+ EntityState state = instance.entityState();
+ FunctionStateResolver stateResolver = new FunctionStateResolver( propertyFunction,
+ assocationFunction,
+ manyAssocFunction,
+ namedAssocFunction );
+ EntityModel model = (EntityModel) EntityInstance.entityInstanceOf( (EntityComposite) entity ).descriptor();
+ stateResolver.populateState( model, state );
+ return entity;
+ }
+ catch( NoSuchEntityException e )
+ {
+ EntityBuilder<T> entityBuilder = uow.newEntityBuilderWithState( primaryType,
+ identity,
+ propertyFunction,
+ assocationFunction,
+ manyAssocFunction,
+ namedAssocFunction );
+ return entityBuilder.newInstance();
+ }
+ }
+
// SPI
@Override
public EntityState entityStateOf( EntityComposite composite )
{
return EntityInstance.entityInstanceOf( composite ).entityState();
}
+
+ @Override
+ public EntityReference entityReferenceOf( Association assoc )
+ {
+ @SuppressWarnings( "unchecked" )
+ Property<EntityReference> associationState = ( (AssociationInstance) assoc ).getAssociationState();
+ return associationState.get();
+ }
+
+ @Override
+ public Iterable<EntityReference> entityReferenceOf( ManyAssociation assoc )
+ {
+ return ( (ManyAssociationInstance) assoc ).getManyAssociationState();
+ }
+
+ @Override
+ public Iterable<Map.Entry<String, EntityReference>> entityReferenceOf( NamedAssociation assoc )
+ {
+ return ( (NamedAssociationInstance) assoc ).getEntityReferences();
+ }
+
+ private class ToValuePropertyMappingFunction<T>
+ implements Function<PropertyDescriptor, Object>
+ {
+ private Object entity;
+
+ public ToValuePropertyMappingFunction( Object entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public Object map( PropertyDescriptor propertyDescriptor )
+ {
+ EntityState entityState = entityStateOf( (EntityComposite) entity );
+ return entityState.propertyValueOf( propertyDescriptor.qualifiedName() );
+ }
+ }
+
+ private class ToValueAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, EntityReference>
+ {
+ private final T entity;
+
+ public ToValueAssociationMappingFunction( T entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public EntityReference map( AssociationDescriptor associationDescriptor )
+ {
+ EntityState entityState = entityStateOf( (EntityComposite) entity );
+ return entityState.associationValueOf( associationDescriptor.qualifiedName() );
+ }
+ }
+
+ private class ToValueManyAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Iterable<EntityReference>>
+ {
+ private final T entity;
+
+ public ToValueManyAssociationMappingFunction( T entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public Iterable<EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ EntityState entityState = entityStateOf( (EntityComposite) entity );
+ return entityState.manyAssociationValueOf( associationDescriptor.qualifiedName() );
+ }
+ }
+
+ private class ToValueNameAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Map<String, EntityReference>>
+ {
+ private final T entity;
+
+ public ToValueNameAssociationMappingFunction( T entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public Map<String, EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ Map<String, EntityReference> result = new HashMap<>();
+ EntityState entityState = entityStateOf( (EntityComposite) entity );
+ final NamedAssociationState state = entityState.namedAssociationValueOf( associationDescriptor.qualifiedName() );
+ for( String name : state )
+ {
+ result.put( name, state.get( name ) );
+ }
+ return result;
+ }
+ }
+
+ private class ToEntityPropertyMappingFunction<T>
+ implements Function<PropertyDescriptor, Object>
+ {
+ private final T value;
+
+ public ToEntityPropertyMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public Object map( PropertyDescriptor propertyDescriptor )
+ {
+ StateHolder state = stateOf( (ValueComposite) value );
+ Property<Object> property = state.propertyFor( propertyDescriptor.accessor() );
+ return property.get();
+ }
+ }
+
+ private class ToEntityAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, EntityReference>
+ {
+
+ private final T value;
+
+ public ToEntityAssociationMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public EntityReference map( AssociationDescriptor associationDescriptor )
+ {
+ AssociationStateHolder state = stateOf( (ValueComposite) value );
+ AssociationInstance<T> association = (AssociationInstance<T>) state.associationFor( associationDescriptor.accessor() );
+ return association.getAssociationState().get();
+ }
+ }
+
+ private class ToEntityManyAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Iterable<EntityReference>>
+ {
+
+ private final T value;
+
+ public ToEntityManyAssociationMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public Iterable<EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ AssociationStateHolder state = stateOf( (ValueComposite) value );
+ ManyAssociationInstance<T> association = (ManyAssociationInstance<T>) state.manyAssociationFor( associationDescriptor
+ .accessor() );
+ return association.getManyAssociationState();
+ }
+ }
+
+ private class ToEntityNameAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Map<String, EntityReference>>
+ {
+ private final T value;
+
+ public ToEntityNameAssociationMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public Map<String, EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ AssociationStateHolder state = stateOf( (ValueComposite) value );
+ NamedAssociationInstance<T> association = (NamedAssociationInstance<T>) state.namedAssociationFor( associationDescriptor
+ .accessor() );
+ HashMap<String, EntityReference> result = new HashMap<>();
+ for( Map.Entry<String, EntityReference> entry : association.getEntityReferences() )
+ {
+ result.put( entry.getKey(), entry.getValue() );
+ }
+ return result;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
index 4ca67b2..284de5d 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
@@ -24,7 +24,9 @@ import java.util.Iterator;
import java.util.Map;
import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.entity.EntityReference;
+import org.qi4j.functional.Function;
import org.qi4j.functional.Function2;
+import org.qi4j.functional.Iterables;
import org.qi4j.runtime.composite.ConstraintsCheck;
import org.qi4j.spi.entity.NamedAssociationState;
@@ -100,4 +102,53 @@ public class NamedAssociationInstance<T>
return map;
}
+ public Iterable<Map.Entry<String,EntityReference>> getEntityReferences()
+ {
+ return Iterables.map( new Function<String, Map.Entry<String,EntityReference>>()
+ {
+ @Override
+ public Map.Entry<String, EntityReference> map( final String key )
+ {
+ final EntityReference value = namedAssociationState.get( key );
+ return new Map.Entry<String, EntityReference>()
+ {
+ @Override
+ public String getKey()
+ {
+ return key;
+ }
+
+ @Override
+ public EntityReference getValue()
+ {
+ return value;
+ }
+
+ @Override
+ public EntityReference setValue( EntityReference value )
+ {
+ throw new UnsupportedOperationException( "Immutable Map" );
+ }
+
+ @Override
+ public boolean equals( Object o )
+ {
+ if( o instanceof Map.Entry)
+ {
+ Map.Entry other = (Map.Entry) o;
+ return key.equals(other.getKey());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return 997 * key.hashCode() + 981813497;
+ }
+ };
+ }
+ }, namedAssociationState );
+ }
+
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
index 284929d..0217ed0 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
@@ -22,6 +22,10 @@ import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.functional.Function;
import org.qi4j.functional.Iterables;
+import org.qi4j.runtime.association.ManyAssociationModel;
+import org.qi4j.runtime.association.NamedAssociationModel;
+import org.qi4j.runtime.entity.EntityModel;
+import org.qi4j.spi.entity.EntityState;
/**
* Function based StateResolver.
@@ -68,4 +72,33 @@ public class FunctionStateResolver
{
return namedAssociationFunction.map( associationDescriptor );
}
+
+ public void populateState( EntityModel model, EntityState state )
+ {
+ for( PropertyDescriptor propDesc : model.state().properties() )
+ {
+ Object value = getPropertyState( propDesc );
+ state.setPropertyValue( propDesc.qualifiedName(), value );
+ }
+ for( AssociationDescriptor assDesc : model.state().associations() )
+ {
+ EntityReference ref = getAssociationState( assDesc );
+ state.setAssociationValue( assDesc.qualifiedName(), ref );
+ }
+ for( ManyAssociationModel manyAssDesc : model.state().manyAssociations() )
+ {
+ for( EntityReference ref : getManyAssociationState( manyAssDesc ) )
+ {
+ state.manyAssociationValueOf( manyAssDesc.qualifiedName() ).add( 0, ref );
+ }
+ }
+ for( NamedAssociationModel namedAssDesc : model.state().namedAssociations() )
+ {
+ for( Map.Entry<String, EntityReference> entry : getNamedAssociationState( namedAssDesc ).entrySet() )
+ {
+ state.namedAssociationValueOf( namedAssDesc.qualifiedName() ).put( entry.getKey(), entry.getValue() );
+ }
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
index 8bb0ffd..95c2e92 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
@@ -26,6 +26,7 @@ import org.qi4j.api.entity.LifecycleException;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.runtime.association.ManyAssociationModel;
import org.qi4j.runtime.association.NamedAssociationModel;
+import org.qi4j.runtime.composite.FunctionStateResolver;
import org.qi4j.runtime.entity.EntityInstance;
import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.structure.ModelModule;
@@ -91,30 +92,7 @@ public final class EntityBuilderInstance<T>
model.model().initState( model.module(), entityState );
if( stateResolver != null )
{
- for( PropertyDescriptor propDesc : model.model().state().properties() )
- {
- Object value = stateResolver.getPropertyState( propDesc );
- entityState.setPropertyValue( propDesc.qualifiedName(), value );
- }
- for( AssociationDescriptor assDesc : model.model().state().associations() )
- {
- EntityReference ref = stateResolver.getAssociationState( assDesc );
- entityState.setAssociationValue( assDesc.qualifiedName(), ref );
- }
- for( ManyAssociationModel manyAssDesc : model.model().state().manyAssociations() )
- {
- for( EntityReference ref : stateResolver.getManyAssociationState( manyAssDesc ) )
- {
- entityState.manyAssociationValueOf( manyAssDesc.qualifiedName() ).add( 0, ref );
- }
- }
- for( NamedAssociationModel namedAssDesc : model.model().state().namedAssociations() )
- {
- for( Map.Entry<String, EntityReference> entry : stateResolver.getNamedAssociationState( namedAssDesc ).entrySet() )
- {
- entityState.namedAssociationValueOf( namedAssDesc.qualifiedName() ).put( entry.getKey(), entry.getValue() );
- }
- }
+ (( FunctionStateResolver) stateResolver).populateState( model.model(), entityState );
}
entityState.setPropertyValue( IDENTITY_STATE_NAME, identity );
prototypeInstance = model.model().newInstance( uow, model.module(), entityState );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
new file mode 100644
index 0000000..2f0fd2c
--- /dev/null
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
@@ -0,0 +1,132 @@
+package org.qi4j.runtime.value;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.qi4j.api.association.Association;
+import org.qi4j.api.association.AssociationStateHolder;
+import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.entity.EntityBuilder;
+import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.property.Property;
+import org.qi4j.api.unitofwork.UnitOfWork;
+import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
+import org.qi4j.api.value.ValueBuilder;
+import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.entitystore.memory.MemoryEntityStoreService;
+import org.qi4j.spi.uuid.UuidIdentityGeneratorService;
+import org.qi4j.test.AbstractQi4jTest;
+import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializationService;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+public class ValueWithAssociationTest extends AbstractQi4jTest
+{
+ @Override
+ public void assemble( ModuleAssembly module )
+ throws AssemblyException
+ {
+ module.entities( SimpleEntity.class );
+ module.entities( DualFaced.class );
+ module.values( DualFaced.class );
+ module.services( MemoryEntityStoreService.class );
+ module.services( UuidIdentityGeneratorService.class );
+ module.services( OrgJsonValueSerializationService.class ).taggedWith( ValueSerialization.Formats.JSON );
+ }
+
+ @Test @Ignore
+ public void givenEntityInStoreWhenFetchEntityReferenceExpectSuccess()
+ throws UnitOfWorkCompletionException
+ {
+ String identity1;
+ String identity2;
+ DualFaced value;
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ EntityBuilder<SimpleEntity> builder1 = uow.newEntityBuilder( SimpleEntity.class );
+ builder1.instance().name().set( "Niclas" );
+ SimpleEntity simpleEntity = builder1.newInstance();
+ identity1 = simpleEntity.identity().get();
+
+ EntityBuilder<DualFaced> builder2 = uow.newEntityBuilder( DualFaced.class );
+ DualFaced proto = builder2.instance();
+ proto.name().set( "Hedhman" );
+ proto.simple().set( simpleEntity );
+ proto.simples().add( simpleEntity );
+ proto.namedSimples().put( "niclas", simpleEntity );
+ DualFaced faced = builder2.newInstance();
+ identity2 = faced.identity().get();
+ value = spi.toValue( DualFaced.class, faced );
+ assertThat( value.identity().get(), equalTo( identity2 ) );
+ uow.complete();
+ }
+
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ DualFaced entity = uow.get( DualFaced.class, identity2 );
+ AssociationStateHolder holder = spi.stateOf( (EntityComposite) entity );
+ Association<?> simple = holder.allAssociations().iterator().next();
+ ManyAssociation<?> simples = holder.allManyAssociations().iterator().next();
+ NamedAssociation<?> namedSimples = holder.allNamedAssociations().iterator().next();
+
+ assertThat( spi.entityReferenceOf( simple ), equalTo( EntityReference.parseEntityReference( identity1 ) ) );
+ assertThat( spi.entityReferenceOf( simples )
+ .iterator()
+ .next(), equalTo( EntityReference.parseEntityReference( identity1 ) ) );
+ assertThat( spi.entityReferenceOf( namedSimples )
+ .iterator()
+ .next()
+ .getValue(), equalTo( EntityReference.parseEntityReference( identity1 ) ) );
+
+ DualFaced resurrected = spi.toEntity( DualFaced.class, value );
+ assertThat( resurrected.simple(), equalTo( entity.simple() ) );
+ assertThat( resurrected.simples(), equalTo( entity.simples() ) );
+ assertThat( resurrected.namedSimples(), equalTo( entity.namedSimples() ) );
+ }
+ }
+
+ @Test
+ public void givenNewValueWhenConvertingToEntityExpectNewEntityInStore()
+ throws UnitOfWorkCompletionException
+ {
+ ValueBuilder<DualFaced> builder = module.newValueBuilder( DualFaced.class );
+ builder.prototype().identity().set( "1234" );
+ builder.prototype().name().set( "Hedhman" );
+ DualFaced value = builder.newInstance();
+
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ spi.toEntity( DualFaced.class, value );
+ uow.complete();
+ }
+
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ DualFaced entity = uow.get( DualFaced.class, "1234" );
+ assertThat( entity.identity().get(), equalTo( "1234" ) );
+ assertThat( entity.name().get(), equalTo( "Hedhman" ) );
+ uow.complete();
+ }
+ }
+
+ public interface SimpleEntity extends Identity
+ {
+ Property<String> name();
+ }
+
+ public interface DualFaced extends Identity
+ {
+ Property<String> name();
+
+ Association<SimpleEntity> simple();
+
+ ManyAssociation<SimpleEntity> simples();
+
+ NamedAssociation<SimpleEntity> namedSimples();
+ }
+}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java b/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
index 2586d95..cff2507 100644
--- a/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
+++ b/core/spi/src/main/java/org/qi4j/spi/Qi4jSPI.java
@@ -14,10 +14,15 @@
package org.qi4j.spi;
+import java.util.Map;
import org.qi4j.api.Qi4j;
+import org.qi4j.api.association.Association;
import org.qi4j.api.association.AssociationStateHolder;
+import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.composite.TransientComposite;
import org.qi4j.api.entity.EntityComposite;
+import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.property.StateHolder;
import org.qi4j.api.value.ValueComposite;
import org.qi4j.spi.entity.EntityState;
@@ -36,4 +41,29 @@ public interface Qi4jSPI
// Entities
EntityState entityStateOf( EntityComposite composite );
+
+ /**
+ * Fetches the EntityReference without loading the referenced entity.
+ *
+ * @param assoc The Association for which we want to obtain the EntityReference
+ * @return The EntityReference of the given Association.
+ */
+ EntityReference entityReferenceOf( Association assoc );
+
+ /**
+ * Fetches the EntityReferences without loading the referenced entities.
+ *
+ * @param assoc The ManyAssociation for which we want to obtain the EntityReferences.
+ * @return An Iteranble of all the EntityReferences of the given ManyAssociation.
+ */
+ Iterable<EntityReference> entityReferenceOf( ManyAssociation assoc );
+
+ /**
+ * Fetches the EntityReferences without loading the referenced entities.
+ *
+ * @param assoc The NamedAssociation for which we want to obtain the EntityReference
+ * @return An Iteranble of Map.Entry with the name and EntityReference of the given NamedAssociation.
+ */
+ Iterable<Map.Entry<String,EntityReference>> entityReferenceOf( NamedAssociation assoc );
+
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a36aba1f/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java b/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
index 5cf3257..584feee 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entity/NamedAssociationState.java
@@ -40,5 +40,4 @@ public interface NamedAssociationState
EntityReference get( String name );
String nameOf( EntityReference entityReference );
-
}
[03/14] zest-qi4j git commit: Removed all comment
Posted by ni...@apache.org.
Removed all comment
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/d5c54551
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/d5c54551
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/d5c54551
Branch: refs/heads/develop
Commit: d5c54551dcbb6424b68d5dbc0235dbe26d90bcb1
Parents: a91ed9d
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu May 21 16:18:34 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu May 21 16:18:34 2015 +0800
----------------------------------------------------------------------
.../runtime/composite/TypedModifierInvocationHandler.java | 8 --------
1 file changed, 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/d5c54551/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
index 2467436..4e9654a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TypedModifierInvocationHandler.java
@@ -27,14 +27,6 @@ public final class TypedModifierInvocationHandler
{
try
{
-/*
- // Remove this, and run InvocationInjectionTest to verify
- if( !method.isAccessible() )
- {
- method.setAccessible( true ); // TODO: This is a massive Performance Killer. Needs to be taken care of.
- }
-*/
-
return this.method.invoke( fragment, args );
}
catch( InvocationTargetException e )
[07/14] zest-qi4j git commit: Fix for ZEST-23.
Posted by ni...@apache.org.
Fix for ZEST-23.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/e6d2d6b5
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/e6d2d6b5
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/e6d2d6b5
Branch: refs/heads/develop
Commit: e6d2d6b59a60fe93597df338d0ad29ad22caadbe
Parents: 5915625
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu May 21 22:31:22 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu May 21 22:31:22 2015 +0800
----------------------------------------------------------------------
.../main/java/org/qi4j/api/type/MapType.java | 27 ++++++++++++++++
.../entity/associations/AssociationTest.java | 1 +
.../spi/value/ValueDeserializerAdapter.java | 34 +++++++++++++++++---
.../qi4j/spi/value/ValueSerializerAdapter.java | 4 +--
.../orgjson/OrgJsonValueDeserializer.java | 29 +++++++++++++++++
.../AbstractCollectionSerializationTest.java | 1 +
.../jackson/JacksonValueDeserializer.java | 26 +++++++++++++++
.../stax/StaxValueDeserializer.java | 23 +++++++++++++
8 files changed, 138 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/core/api/src/main/java/org/qi4j/api/type/MapType.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/type/MapType.java b/core/api/src/main/java/org/qi4j/api/type/MapType.java
index ddf03c5..753500a 100644
--- a/core/api/src/main/java/org/qi4j/api/type/MapType.java
+++ b/core/api/src/main/java/org/qi4j/api/type/MapType.java
@@ -27,6 +27,17 @@ public final class MapType
private ValueType keyType;
private ValueType valueType;
+ private final Variant variant;
+
+ /** Two Variants are made distinct.
+ * <p>
+ * The {@code entry} type represents the explicit key=keyValue, value=valueValue.
+ * </p>
+ * <p>
+ * The {@code object} type represents the explicit keyValue=valueValue.
+ * </p>
+ */
+ public enum Variant { entry, object }
public static boolean isMap( Type type )
{
@@ -39,11 +50,22 @@ public final class MapType
return new MapType( Map.class, ValueType.of( keyType ), ValueType.of( valueType ) );
}
+ public static MapType of( Class<?> keyType, Class<?> valueType, Variant variant )
+ {
+ return new MapType( Map.class, ValueType.of( keyType ), ValueType.of( valueType ), variant );
+ }
+
public MapType( Class<?> type, ValueType keyType, ValueType valueType )
{
+ this( type, keyType, valueType, Variant.entry );
+ }
+
+ public MapType( Class<?> type, ValueType keyType, ValueType valueType, Variant variant )
+ {
super( type );
this.keyType = keyType;
this.valueType = valueType;
+ this.variant = variant;
if( !isMap( type ) )
{
throw new IllegalArgumentException( type + " is not a Map." );
@@ -60,6 +82,11 @@ public final class MapType
return valueType;
}
+ public Variant variant()
+ {
+ return variant;
+ }
+
@Override
public String toString()
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
index 7772245..ac321c9 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
@@ -101,6 +101,7 @@ public class AssociationTest
public interface Friend<T>
{
+ @Optional
Association<T> friend();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
index 6663150..b20bd79 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java
@@ -32,7 +32,6 @@ import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
-import java.util.logging.Logger;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
@@ -687,7 +686,7 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType>
Object value = getObjectFieldValue(
inputNode,
namedAssociationName,
- buildDeserializeInputNodeFunction( MapType.of( String.class, EntityReference.class ) ) );
+ buildDeserializeInputNodeFunction( MapType.of( String.class, EntityReference.class, MapType.Variant.object ) ) );
stateMap.put( namedAssociationName, value );
}
}
@@ -755,7 +754,15 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType>
else // Explicit Map
if( MapType.class.isAssignableFrom( valueType.getClass() ) )
{
- return (T) deserializeNodeMap( (MapType) valueType, inputNode );
+ MapType mapType = (MapType) valueType;
+ if( mapType.variant().equals( MapType.Variant.entry ) )
+ {
+ return (T) deserializeNodeEntryMap( (MapType) valueType, inputNode );
+ }
+ else
+ {
+ return (T) deserializeNodeObjectMap( (MapType) valueType, inputNode );
+ }
}
else // Enum
if( EnumType.class.isAssignableFrom( valueType.getClass() ) || type.isEnum() )
@@ -857,7 +864,7 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType>
return collection;
}
- private <K, V> Map<K, V> deserializeNodeMap( MapType mapType, InputNodeType inputNode )
+ private <K, V> Map<K, V> deserializeNodeEntryMap( MapType mapType, InputNodeType inputNode )
throws Exception
{
Map<K, V> map = new HashMap<>();
@@ -868,6 +875,16 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType>
return map;
}
+ private <V> Map<String, V> deserializeNodeObjectMap( MapType mapType, InputNodeType inputNode )
+ throws Exception
+ {
+ Map<String, V> map = new HashMap<>();
+ putObjectNodeInMap( inputNode,
+ this.<V>buildDeserializeInputNodeFunction( mapType.valueType() ),
+ map );
+ return map;
+ }
+
@SuppressWarnings( "unchecked" )
private <T> T deserializeNodeGuessed( ValueType valueType, InputNodeType inputNode )
throws Exception
@@ -1070,6 +1087,13 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType>
protected abstract <K, V> void putArrayNodeInMap( InputNodeType inputNode,
Function<InputNodeType, K> keyDeserializer,
Function<InputNodeType, V> valueDeserializer,
- Map<K, V> map )
+ Map<K, V> map
+ )
+ throws Exception;
+
+ protected abstract <V> void putObjectNodeInMap( InputNodeType inputNode,
+ Function<InputNodeType, V> valueDeserializer,
+ Map<String, V> map
+ )
throws Exception;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index c392214..8b6246f 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -473,7 +473,7 @@ public abstract class ValueSerializerAdapter<OutputType>
NamedAssociation<?> namedAssociation = state.namedAssociationFor( associationDescriptor.accessor() );
onFieldStart( output, associationDescriptor.qualifiedName().name() );
onValueStart( output );
- onArrayStart( output );
+ onObjectStart( output );
for( String name : namedAssociation )
{
onFieldStart( output, name );
@@ -482,7 +482,7 @@ public abstract class ValueSerializerAdapter<OutputType>
onValueEnd( output );
onFieldEnd( output );
}
- onArrayEnd( output );
+ onObjectEnd( output );
onValueEnd( output );
onFieldEnd( output );
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueDeserializer.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueDeserializer.java b/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueDeserializer.java
index 452f75e..223bc99 100644
--- a/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueDeserializer.java
+++ b/core/spi/src/main/java/org/qi4j/valueserialization/orgjson/OrgJsonValueDeserializer.java
@@ -20,6 +20,7 @@ package org.qi4j.valueserialization.orgjson;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;
+import java.util.Iterator;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -449,4 +450,32 @@ public class OrgJsonValueDeserializer
}
}
}
+
+ @Override
+ protected <V> void putObjectNodeInMap( Object inputNode, Function<Object, V> valueDeserializer, Map<String, V> map )
+ throws Exception
+ {
+ if( JSONObject.NULL.equals( inputNode ) )
+ {
+ return;
+ }
+ if( !( inputNode instanceof JSONObject ) )
+ {
+ throw new ValueSerializationException( "Expected an object but got " + inputNode );
+ }
+ JSONObject object = (JSONObject) inputNode;
+
+ @SuppressWarnings( "unchecked" )
+ Iterator<String> it = object.keys();
+ while( it.hasNext() )
+ {
+ String key = it.next();
+ Object item = object.get( key );
+ V valueValue = valueDeserializer.map( item );
+ if( key != null )
+ {
+ map.put( key, valueValue );
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/core/testsupport/src/main/java/org/qi4j/test/value/AbstractCollectionSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractCollectionSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractCollectionSerializationTest.java
index 5c58c2a..3a04ee5 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractCollectionSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractCollectionSerializationTest.java
@@ -69,6 +69,7 @@ public class AbstractCollectionSerializationTest
{
module.injectTo( this );
}
+
@Service
@SuppressWarnings( "ProtectedField" )
protected ValueSerialization valueSerialization;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueDeserializer.java
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueDeserializer.java b/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueDeserializer.java
index 5c6774b..3d82f43 100644
--- a/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueDeserializer.java
+++ b/extensions/valueserialization-jackson/src/main/java/org/qi4j/valueserialization/jackson/JacksonValueDeserializer.java
@@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.InputStream;
import java.util.Collection;
+import java.util.Iterator;
import java.util.Map;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
@@ -341,6 +342,31 @@ public class JacksonValueDeserializer
}
}
+ @Override
+ protected <V> void putObjectNodeInMap( JsonNode inputNode,
+ Function<JsonNode, V> valueDeserializer,
+ Map<String, V> map
+ )
+ throws Exception
+ {
+ if( isNullOrMissing( inputNode ) )
+ {
+ return;
+ }
+ if( !inputNode.isObject() )
+ {
+ throw new ValueSerializationException( "Expected an object but got " + inputNode );
+ }
+ ObjectNode object = (ObjectNode) inputNode;
+ Iterator<Map.Entry<String, JsonNode>> fields = object.fields();
+ while( fields.hasNext() )
+ {
+ Map.Entry<String, JsonNode> entry = fields.next();
+ V value = valueDeserializer.map( entry.getValue() );
+ map.put( entry.getKey(), value );
+ }
+ }
+
private static boolean isNullOrMissing( JsonNode inputNode )
{
return inputNode == null || inputNode.isNull() || inputNode.isMissingNode();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e6d2d6b5/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java b/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
index 9bdc34a..f162a62 100644
--- a/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
+++ b/extensions/valueserialization-stax/src/main/java/org/qi4j/valueserialization/stax/StaxValueDeserializer.java
@@ -404,6 +404,29 @@ public class StaxValueDeserializer
}
}
+ @Override
+ protected <V> void putObjectNodeInMap( Node inputNode,
+ Function<Node, V> valueDeserializer,
+ Map<String, V> map )
+ throws Exception
+ {
+ if( inputNode == null )
+ {
+ return;
+ }
+ NodeList entriesNodes = inputNode.getChildNodes();
+ for( int idx = 0; idx < entriesNodes.getLength(); idx++ )
+ {
+ Node entryNode = entriesNodes.item( idx );
+ String key = ((Element) entryNode).getTagName();
+ V value = getObjectFieldValue( entryNode, "value", valueDeserializer );
+ if( key != null )
+ {
+ map.put( key, value );
+ }
+ }
+ }
+
@SuppressWarnings( "AssignmentToMethodParameter" )
private Object detectAndConvertStringValue( String stringValue )
{
[11/14] zest-qi4j git commit: Removed a lot of System.out and
System.err noise, which should be output.
Posted by ni...@apache.org.
Removed a lot of System.out and System.err noise, which should be output.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/6bce6f81
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/6bce6f81
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/6bce6f81
Branch: refs/heads/develop
Commit: 6bce6f81a0fe6669bb969298be9cd589cdda355f
Parents: 4214bb4
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 3 17:28:47 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 3 17:28:47 2015 +0800
----------------------------------------------------------------------
.../ApplicationPassivationThread.java | 3 +--
.../association/NamedAssociationsModel.java | 6 -----
.../qi4j/spi/value/ValueSerializerAdapter.java | 1 -
.../qi4j/entitystore/gae/GaeEntityState.java | 24 --------------------
.../entitystore/gae/GaeEntityStoreMixin.java | 1 -
.../entitystore/gae2/GaeEntityStoreMixin.java | 9 --------
.../support/skeletons/AbstractSQLStartup.java | 1 -
.../org/qi4j/library/appbrowser/Browser.java | 1 -
.../qi4j/library/appbrowser/AppBrowserTest.java | 1 -
.../qi4j/library/http/dns/LocalManagedDns.java | 1 -
.../org/qi4j/logging/debug/DebugConcern.java | 6 -----
.../qi4j/library/scheduler/SchedulerMixin.java | 3 ---
.../pathfinder_b/internal/GraphDAO.java | 4 ----
.../internal/GraphTraversalServiceImpl.java | 4 ----
.../src/main/java/org/qi4j/envisage/Main.java | 1 -
.../java/org/qi4j/envisage/graph/GraphPane.java | 2 --
.../org/qi4j/envisage/graph/StackedLayout.java | 2 --
.../java/org/qi4j/envisage/print/PDFWriter.java | 2 --
.../org/qi4j/envisage/tree/TreeModelPane.java | 1 -
19 files changed, 1 insertion(+), 72 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java b/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
index a83ab2f..62b1f67 100644
--- a/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
+++ b/core/api/src/main/java/org/qi4j/api/activation/ApplicationPassivationThread.java
@@ -102,8 +102,7 @@ public final class ApplicationPassivationThread
}
else
{
- System.err.println( message );
- ex.printStackTrace( System.err );
+ ex.printStackTrace();
}
}
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
index 9ba63f5..4f3fac5 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationsModel.java
@@ -89,12 +89,6 @@ public final class NamedAssociationsModel
{
throw new IllegalArgumentException( "No named-association found with name:" + ( (Member) accessor ).getName() );
}
- System.out.println( "######################################################################" );
- System.out.println( "GET NAMED ASSOCIATION" );
- System.out.println( "\tupon: " + mapAccessorAssociationModel );
- System.out.println( "\tfor: " + accessor );
- System.out.println( "\treturn: "+namedAssociationModel );
- System.out.println( "######################################################################" );
return namedAssociationModel;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index 5345414..9c68bbd 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -328,7 +328,6 @@ public abstract class ValueSerializerAdapter<OutputType>
{
if( object != null )
{
- // System.out.println( ">>>>>>>>>>>> " + ( object == null ? "null" : object.getClass() ) );
if( serializers.get( object.getClass() ) != null )
{
// Plain Value
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityState.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityState.java b/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityState.java
index 0848a54..a694c32 100644
--- a/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityState.java
+++ b/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityState.java
@@ -62,7 +62,6 @@ public class GaeEntityState
EntityDescriptor descriptor,
Module module )
{
- System.out.println( "GaeEntityState( " + unitOfWork + ", " + key + ", " + descriptor + " )" );
this.module = module;
this.unitOfWork = unitOfWork;
this.valueSerialization = valueSerialization;
@@ -71,11 +70,6 @@ public class GaeEntityState
entity.setProperty( "$version", unitOfWork.identity() );
Class type = first( descriptor.types() );
String name = type.getName();
- System.out.println( "New Entity\n" +
- " descriptor:" + descriptor + "\n " +
- " entityType:" + name + "\n " +
- " name:" + name + "\n "
- );
entity.setUnindexedProperty( PROPERTY_TYPE, name );
status = EntityStatus.NEW;
valueTypes = initializeValueTypes( descriptor );
@@ -86,7 +80,6 @@ public class GaeEntityState
Entity entity,
Module module )
{
- System.out.println( "GaeEntityState( " + unitOfWork + ", " + entity + " )" );
if( entity == null )
{
throw new NullPointerException();
@@ -100,7 +93,6 @@ public class GaeEntityState
this.valueSerialization = valueSerialization;
this.entity = entity;
String typeName = (String) entity.getProperty( GaeEntityState.PROPERTY_TYPE );
- System.out.println( "LOADING [" + typeName + "]" );
descriptor = module.entityDescriptor( typeName );
status = EntityStatus.LOADED;
valueTypes = initializeValueTypes( descriptor );
@@ -122,7 +114,6 @@ public class GaeEntityState
Entity entity()
{
- System.out.println( "entity() --> " + entity );
return entity;
}
@@ -130,7 +121,6 @@ public class GaeEntityState
public EntityReference identity()
{
EntityReference ref = new EntityReference( entity.getKey().getName() );
- System.out.println( "identity() --> " + ref );
return ref;
}
@@ -138,7 +128,6 @@ public class GaeEntityState
public String version()
{
String version = (String) entity.getProperty( "$version" );
- System.out.println( "version() --> " + version );
return version;
}
@@ -146,35 +135,30 @@ public class GaeEntityState
public long lastModified()
{
Long lastModified = (Long) entity.getProperty( "$lastModified" );
- System.out.println( "lastModified() --> " + lastModified );
return lastModified;
}
@Override
public void remove()
{
- System.out.println( "remove()" );
status = EntityStatus.REMOVED;
}
@Override
public EntityStatus status()
{
- System.out.println( "status() --> " + status );
return status;
}
@Override
public boolean isAssignableTo( Class<?> type )
{
- System.out.println( "isAssignableTo( " + type + " ) --> false" );
return false;
}
@Override
public EntityDescriptor entityDescriptor()
{
- System.out.println( "entityDescriptor() --> " + descriptor );
return descriptor;
}
@@ -207,14 +191,12 @@ public class GaeEntityState
throw error;
}
}
- System.out.println( "getProperty( " + stateName + " ) --> " + uri + "=" + value );
return value;
}
@Override
public void setPropertyValue( QualifiedName stateName, Object newValue )
{
- System.out.println( "setProperty( " + stateName + ", " + newValue + " )" );
Object value = null;
if( newValue == null || ValueType.isPrimitiveValue( newValue ) )
{
@@ -250,7 +232,6 @@ public class GaeEntityState
{
String uri = stateName.toURI();
String identity = (String) entity.getProperty( uri );
- System.out.println( "association( " + stateName + " ) --> " + uri + " = " + identity );
EntityReference ref = new EntityReference( identity );
return ref;
}
@@ -258,7 +239,6 @@ public class GaeEntityState
@Override
public void setAssociationValue( QualifiedName stateName, EntityReference newEntity )
{
- System.out.println( "setAssociation( " + stateName + ", " + newEntity + " )" );
String uri = stateName.toURI();
String id = null;
if( newEntity != null )
@@ -286,7 +266,6 @@ public class GaeEntityState
public void hasBeenApplied()
{
- System.out.println( "hasBeenApplied()" );
status = EntityStatus.LOADED;
}
@@ -324,10 +303,7 @@ public class GaeEntityState
@Override
public boolean add( int index, EntityReference entityReference )
{
- System.out.println( "NICLAS::" + entityReference );
String identity = entityReference.identity();
- System.out.println( "NICLAS::" + identity );
- System.out.println( "NICLAS::" + assocs );
if( assocs.contains( identity ) )
{
return false;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityStoreMixin.java b/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityStoreMixin.java
index e4b591d..1986032 100644
--- a/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityStoreMixin.java
+++ b/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae/GaeEntityStoreMixin.java
@@ -47,7 +47,6 @@ public class GaeEntityStoreMixin
public GaeEntityStoreMixin( @Service IdentityGenerator uuid,
@Service @Tagged( ValueSerialization.Formats.JSON ) ValueSerialization valueSerialization )
{
- System.out.println("Initializing GAE EntityStore.");
this.uuid = uuid.generate(Identity.class) + ":";
this.valueSerialization = valueSerialization;
counter = 0L;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae2/GaeEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae2/GaeEntityStoreMixin.java b/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae2/GaeEntityStoreMixin.java
index 88c1556..4721ada 100644
--- a/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae2/GaeEntityStoreMixin.java
+++ b/extensions/entitystore-gae/src/main/java/org/qi4j/entitystore/gae2/GaeEntityStoreMixin.java
@@ -75,15 +75,6 @@ public class GaeEntityStoreMixin
.deadline( conf.deadline().get() );
datastore = DatastoreServiceFactory.getDatastoreService( configuration );
entityKind = conf.entityKind().get();
- System.out.println( "\nActivating Google App Engine Store" +
- "\n----------------------------------" +
- "\n Read Policy: " + conf.readPolicy().get() +
- "\n Deadline: " + conf.deadline().get() +
- "\n Entity Kind: " + entityKind +
- "\n Datastore: " + datastore +
- "\n Configuration: " + configuration +
- "\n"
- );
}
@Override
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/extensions/indexing-sql/src/main/java/org/qi4j/index/sql/support/skeletons/AbstractSQLStartup.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-sql/src/main/java/org/qi4j/index/sql/support/skeletons/AbstractSQLStartup.java b/extensions/indexing-sql/src/main/java/org/qi4j/index/sql/support/skeletons/AbstractSQLStartup.java
index ddb2041..5d35236 100644
--- a/extensions/indexing-sql/src/main/java/org/qi4j/index/sql/support/skeletons/AbstractSQLStartup.java
+++ b/extensions/indexing-sql/src/main/java/org/qi4j/index/sql/support/skeletons/AbstractSQLStartup.java
@@ -1486,7 +1486,6 @@ public abstract class AbstractSQLStartup
if( !newQNames.contains( qName ) && !qName.name().equals( Identity.class.getName() ) )
{
newQNames.add( qName );
- // System.out.println("QName: " + qName + ", hc: " + qName.hashCode());
QNameInfo info = qNameInfos.get( qName );
if( info == null )
{
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/libraries/appbrowser/src/main/java/org/qi4j/library/appbrowser/Browser.java
----------------------------------------------------------------------
diff --git a/libraries/appbrowser/src/main/java/org/qi4j/library/appbrowser/Browser.java b/libraries/appbrowser/src/main/java/org/qi4j/library/appbrowser/Browser.java
index 0282253..4d91a2b 100644
--- a/libraries/appbrowser/src/main/java/org/qi4j/library/appbrowser/Browser.java
+++ b/libraries/appbrowser/src/main/java/org/qi4j/library/appbrowser/Browser.java
@@ -36,7 +36,6 @@ public class Browser
}
try
{
- System.out.println(visited.getClass().getName());
formatter.enter( visited );
}
catch( JSONException e )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/libraries/appbrowser/src/test/java/org/qi4j/library/appbrowser/AppBrowserTest.java
----------------------------------------------------------------------
diff --git a/libraries/appbrowser/src/test/java/org/qi4j/library/appbrowser/AppBrowserTest.java b/libraries/appbrowser/src/test/java/org/qi4j/library/appbrowser/AppBrowserTest.java
index 00ed41e..acb239b 100644
--- a/libraries/appbrowser/src/test/java/org/qi4j/library/appbrowser/AppBrowserTest.java
+++ b/libraries/appbrowser/src/test/java/org/qi4j/library/appbrowser/AppBrowserTest.java
@@ -41,7 +41,6 @@ public class AppBrowserTest extends AbstractQi4jTest
FormatterFactory jsonFactory = new JsonFormatterFactory( output );
Browser browser = new Browser( applicationModel, jsonFactory );
browser.toJson();
- System.out.println( output.toString() );
}
@Mixins( Person.Mixin.class )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/libraries/http/src/test/java/org/qi4j/library/http/dns/LocalManagedDns.java
----------------------------------------------------------------------
diff --git a/libraries/http/src/test/java/org/qi4j/library/http/dns/LocalManagedDns.java b/libraries/http/src/test/java/org/qi4j/library/http/dns/LocalManagedDns.java
index e411257..0fd6dc8 100644
--- a/libraries/http/src/test/java/org/qi4j/library/http/dns/LocalManagedDns.java
+++ b/libraries/http/src/test/java/org/qi4j/library/http/dns/LocalManagedDns.java
@@ -64,7 +64,6 @@ public class LocalManagedDns
log += " on non-managed name (" + name + ")";
result = DEFAULT_DNS.lookupAllHostAddr( name );
}
- System.out.println( log + " will return: " + Arrays.toString( result ) );
return result;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/libraries/logging/src/main/java/org/qi4j/logging/debug/DebugConcern.java
----------------------------------------------------------------------
diff --git a/libraries/logging/src/main/java/org/qi4j/logging/debug/DebugConcern.java b/libraries/logging/src/main/java/org/qi4j/logging/debug/DebugConcern.java
index 4823248..8158d08 100644
--- a/libraries/logging/src/main/java/org/qi4j/logging/debug/DebugConcern.java
+++ b/libraries/logging/src/main/java/org/qi4j/logging/debug/DebugConcern.java
@@ -33,11 +33,6 @@ public class DebugConcern
@Optional @Service private DebuggingService loggingService;
@This private Composite composite;
- public DebugConcern()
- {
- System.out.println( "DebugConcern created." );
- }
-
@Override
public Integer debugLevel()
{
@@ -51,7 +46,6 @@ public class DebugConcern
@Override
public void debug( int priority, String message )
{
- System.out.println( "L:" + composite );
if( loggingService == null )
{
return;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
----------------------------------------------------------------------
diff --git a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
index 9058f45..02f3132 100644
--- a/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
+++ b/libraries/scheduler/src/main/java/org/qi4j/library/scheduler/SchedulerMixin.java
@@ -160,7 +160,6 @@ public class SchedulerMixin
{
return;
}
- System.out.println( "Next run at: " + new DateTime( nextRun ) );
timingQueue.add( new ScheduleTime( schedule.identity().get(), nextRun ) );
if( scheduleHandler == null )
{
@@ -175,7 +174,6 @@ public class SchedulerMixin
{
return;
}
- System.out.println( "Next run at: " + new DateTime( nextRun ) );
timingQueue.add( new ScheduleTime( schedule.identity().get(), nextRun ) );
ScheduleTime newFirst = timingQueue.first();
if( !first.equals( newFirst ) )
@@ -323,7 +321,6 @@ public class SchedulerMixin
@Override
public void run()
{
- System.out.println( "Running Schedule" );
Usecase usecase = UsecaseBuilder.newUsecase( "ScheduleRunner" );
UnitOfWork uow = module.newUnitOfWork( usecase );
try
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphDAO.java
----------------------------------------------------------------------
diff --git a/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphDAO.java b/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphDAO.java
index 15e86ea..f1929d4 100644
--- a/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphDAO.java
+++ b/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphDAO.java
@@ -85,10 +85,6 @@ public class GraphDAO
voyages.add( new TransitPath( transitEdges ) );
}
- // Output for testing...
-// for (int i = 0; i < voyages.size(); i++)
-// System.out.println( i + " " + voyages.get( i ).print() );
-
return voyages;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphTraversalServiceImpl.java
----------------------------------------------------------------------
diff --git a/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphTraversalServiceImpl.java b/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphTraversalServiceImpl.java
index 2c59c53..9db0e44 100644
--- a/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphTraversalServiceImpl.java
+++ b/samples/dci-cargo/dcisample_b/src/main/java/org/qi4j/sample/dcicargo/pathfinder_b/internal/GraphTraversalServiceImpl.java
@@ -68,10 +68,6 @@ public class GraphTraversalServiceImpl
{
final List<TransitPath> voyages = getShuffledVoyages( dao.voyages() );
- // Output for testing...
-// for (int i = 0; i < voyages.size(); i++)
-// System.out.println( i + " " + voyages.get( i ).print() );
-
for( TransitPath voyage : voyages )
{
if( depth >= voyage.getTransitEdges().size() )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/tools/envisage/src/main/java/org/qi4j/envisage/Main.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/qi4j/envisage/Main.java b/tools/envisage/src/main/java/org/qi4j/envisage/Main.java
index a4d4674..83414c6 100644
--- a/tools/envisage/src/main/java/org/qi4j/envisage/Main.java
+++ b/tools/envisage/src/main/java/org/qi4j/envisage/Main.java
@@ -32,7 +32,6 @@ public class Main
throws ClassNotFoundException, IllegalAccessException, InstantiationException, AssemblyException
{
String applicationAssemblerName = args[0];
- System.out.println( "Assembler:" + applicationAssemblerName );
Class applicationAssemblerClass = Class.forName( applicationAssemblerName );
ApplicationAssembler assembler = (ApplicationAssembler) applicationAssemblerClass.newInstance();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/tools/envisage/src/main/java/org/qi4j/envisage/graph/GraphPane.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/qi4j/envisage/graph/GraphPane.java b/tools/envisage/src/main/java/org/qi4j/envisage/graph/GraphPane.java
index 132985e..a94a814 100644
--- a/tools/envisage/src/main/java/org/qi4j/envisage/graph/GraphPane.java
+++ b/tools/envisage/src/main/java/org/qi4j/envisage/graph/GraphPane.java
@@ -130,8 +130,6 @@ public final class GraphPane
private void graphItemLinkActivated( LinkEvent evt )
{
- //System.out.println("this is called");
- //System.out.println(evt.getSource().getClass());
if( evt.getSource().equals( treeDisplay ) )
{
stackedDisplay.setSelectedValue( evt.getObject() );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/tools/envisage/src/main/java/org/qi4j/envisage/graph/StackedLayout.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/qi4j/envisage/graph/StackedLayout.java b/tools/envisage/src/main/java/org/qi4j/envisage/graph/StackedLayout.java
index 5d2795e..959f050 100644
--- a/tools/envisage/src/main/java/org/qi4j/envisage/graph/StackedLayout.java
+++ b/tools/envisage/src/main/java/org/qi4j/envisage/graph/StackedLayout.java
@@ -97,7 +97,6 @@ import prefuse.visual.NodeItem;
int height = fm.getHeight();
minSize.setSize( width + INSET + INSET, height + INSET + INSET );
- //System.out.println(fm.getAscent());
return minSize;
}
@@ -110,7 +109,6 @@ import prefuse.visual.NodeItem;
if( depth > zoom )
{
- //System.out.println("depth: " + depth + " zoom: " + zoom);
node.setBounds( x, y, 0, 0 );
node.setVisible( false );
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/tools/envisage/src/main/java/org/qi4j/envisage/print/PDFWriter.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/qi4j/envisage/print/PDFWriter.java b/tools/envisage/src/main/java/org/qi4j/envisage/print/PDFWriter.java
index da95957..59e0d55 100644
--- a/tools/envisage/src/main/java/org/qi4j/envisage/print/PDFWriter.java
+++ b/tools/envisage/src/main/java/org/qi4j/envisage/print/PDFWriter.java
@@ -678,7 +678,6 @@ public class PDFWriter
// check for page size, if necessary create new page
if( ( curY - lineSpace ) <= startY )
{
- //System.out.println("new line: " + curY + " - " + lineSpace + " = " + (curY-lineSpace) );
createNewPage();
}
@@ -725,7 +724,6 @@ public class PDFWriter
curContentStream = new PDPageContentStream( doc, page );
curPageSize = page.getArtBox();
- //System.out.println("pSize: " + pdRect.getWidth() + "," + pdRect.getHeight());
curContentStream.beginText();
curY = curPageSize.getHeight() - startY;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/6bce6f81/tools/envisage/src/main/java/org/qi4j/envisage/tree/TreeModelPane.java
----------------------------------------------------------------------
diff --git a/tools/envisage/src/main/java/org/qi4j/envisage/tree/TreeModelPane.java b/tools/envisage/src/main/java/org/qi4j/envisage/tree/TreeModelPane.java
index 8d60aa8..591041e 100644
--- a/tools/envisage/src/main/java/org/qi4j/envisage/tree/TreeModelPane.java
+++ b/tools/envisage/src/main/java/org/qi4j/envisage/tree/TreeModelPane.java
@@ -176,7 +176,6 @@ public final class TreeModelPane
return;
}
- //System.out.println(obj.toString());
TreeNode node = findNode( structureTree, obj );
if( node != null )
{
[13/14] zest-qi4j git commit: * Added possibility to retrieve
EntityReferences from Association types,
without triggering the loading of the referenced EntityComposite * Removed the
serialization during ValueComposite creation, and doing a shallow clonin
Posted by ni...@apache.org.
* Added possibility to retrieve EntityReferences from Association types, without triggering the loading of the referenced EntityComposite
* Removed the serialization during ValueComposite creation, and doing a shallow cloning instead.
* toString() in Associations are no longer throwing an Exception.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/a6eb57f4
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/a6eb57f4
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/a6eb57f4
Branch: refs/heads/develop
Commit: a6eb57f458374bb605f07110a9a6c2ec4a7a891a
Parents: 7e4907a
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 10 06:54:06 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 10 06:54:06 2015 +0800
----------------------------------------------------------------------
.../qi4j/api/association/NamedAssociation.java | 7 +
.../association/NamedAssociationWrapper.java | 7 +-
.../org/qi4j/api/value/ValueCompositeTest.java | 4 +-
.../association/NamedAssociationInstance.java | 6 +
.../qi4j/runtime/composite/CompositeModel.java | 5 +
.../composite/FragmentInvocationHandler.java | 1 +
.../composite/FunctionStateResolver.java | 22 ++-
.../runtime/structure/ModuleUnitOfWork.java | 8 +-
.../value/ValueBuilderWithPrototype.java | 143 +++++++++++++++++--
.../java/org/qi4j/runtime/value/ValueModel.java | 15 +-
.../value/ValueSerializationRegressionTest.java | 61 --------
.../runtime/value/ValueWithAssociationTest.java | 16 ++-
.../helpers/JSONNamedAssociationState.java | 2 +-
.../qi4j/spi/value/ValueSerializerAdapter.java | 11 +-
...AbstractValueCompositeSerializationTest.java | 2 +-
.../binding/internal/BoundNamedAssociation.java | 6 +
16 files changed, 214 insertions(+), 102 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
index 9464eed..61c9c9a 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
@@ -81,4 +81,11 @@ public interface NamedAssociation<T>
* @return the references to the associated entities.
*/
Iterable<EntityReference> references();
+
+ /** Returns the EntityReference for the Association with the given name.
+ *
+ * @param name The name of the association to return the EntityReference for
+ * @return The EntityReference of the association.
+ */
+ EntityReference referenceOf( String name );
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
index 7d0640e..5e243ef 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
@@ -97,6 +97,12 @@ public class NamedAssociationWrapper
}
@Override
+ public EntityReference referenceOf( String name )
+ {
+ return next.referenceOf( name );
+ }
+
+ @Override
public int hashCode()
{
return next.hashCode();
@@ -113,5 +119,4 @@ public class NamedAssociationWrapper
{
return next.toString();
}
-
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
----------------------------------------------------------------------
diff --git a/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java b/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
index 9d4717e..1c545a4 100644
--- a/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
+++ b/core/api/src/test/java/org/qi4j/api/value/ValueCompositeTest.java
@@ -240,9 +240,11 @@ public class ValueCompositeTest
unitOfWork.discard();
}
+ // Should allow the toString() to print the entityRefs.
+ System.out.println( associationValue.toString() );
try
{
- System.out.println( associationValue.toString() );
+ associationValue.some().get();
fail( "Should have thrown an exception" );
}
catch( Exception e )
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
index 7bffb4b..dc73b3c 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
@@ -120,6 +120,12 @@ public class NamedAssociationInstance<T>
}, namedAssociationState );
}
+ @Override
+ public EntityReference referenceOf( String name )
+ {
+ return namedAssociationState.get( name );
+ }
+
public Iterable<Map.Entry<String, EntityReference>> getEntityReferences()
{
return map( new Function<String, Map.Entry<String, EntityReference>>()
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
index 9e18bf7..b7f0e6c 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
@@ -107,6 +107,11 @@ public abstract class CompositeModel
return false;
}
+ public MixinsModel mixinsModel()
+ {
+ return mixinsModel;
+ }
+
@Override
@SuppressWarnings( { "raw", "unchecked" } )
public Class<?> primaryType()
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
index bd76a09..9d47ac0 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/FragmentInvocationHandler.java
@@ -63,6 +63,7 @@ abstract class FragmentInvocationHandler
StackTraceElement stackTraceElement = trace[ i ];
if( !isApplicationClass( stackTraceElement.getClassName() ) )
{
+ // TODO: Should find stack entry outside Runtime, and compact beyond that
trace[ i ] = null;
count++;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
index 0217ed0..01bcc41 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/FunctionStateResolver.java
@@ -20,12 +20,15 @@ import java.util.Map;
import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.property.PropertyDescriptor;
+import org.qi4j.functional.ForEach;
import org.qi4j.functional.Function;
import org.qi4j.functional.Iterables;
import org.qi4j.runtime.association.ManyAssociationModel;
import org.qi4j.runtime.association.NamedAssociationModel;
import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.ManyAssociationState;
+import org.qi4j.spi.entity.NamedAssociationState;
/**
* Function based StateResolver.
@@ -87,18 +90,31 @@ public class FunctionStateResolver
}
for( ManyAssociationModel manyAssDesc : model.state().manyAssociations() )
{
+ ManyAssociationState associationState = state.manyAssociationValueOf( manyAssDesc.qualifiedName() );
+ // First clear existing ones
+ for( EntityReference ref : associationState )
+ {
+ associationState.remove( ref );
+ }
+ // then add the new ones.
for( EntityReference ref : getManyAssociationState( manyAssDesc ) )
{
- state.manyAssociationValueOf( manyAssDesc.qualifiedName() ).add( 0, ref );
+ associationState.add( 0, ref );
}
}
for( NamedAssociationModel namedAssDesc : model.state().namedAssociations() )
{
+ NamedAssociationState associationState = state.namedAssociationValueOf( namedAssDesc.qualifiedName() );
+ // First clear existing ones
+ for( String name : associationState )
+ {
+ associationState.remove( name );
+ }
+ // then add the new ones.
for( Map.Entry<String, EntityReference> entry : getNamedAssociationState( namedAssDesc ).entrySet() )
{
- state.namedAssociationValueOf( namedAssDesc.qualifiedName() ).put( entry.getKey(), entry.getValue() );
+ associationState.put( entry.getKey(), entry.getValue() );
}
}
}
-
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
index 9f63d2c..a4b6b06 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
@@ -717,9 +717,9 @@ public class ModuleUnitOfWork
private final T value;
- public ToEntityManyAssociationMappingFunction( T value )
+ public ToEntityManyAssociationMappingFunction( T valueComposite )
{
- this.value = value;
+ this.value = valueComposite;
}
@Override
@@ -737,9 +737,9 @@ public class ModuleUnitOfWork
{
private final T value;
- public ToEntityNameAssociationMappingFunction( T value )
+ public ToEntityNameAssociationMappingFunction( T valueComposite )
{
- this.value = value;
+ this.value = valueComposite;
}
@Override
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
index 0608ace..5b6352a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueBuilderWithPrototype.java
@@ -20,12 +20,23 @@
*/
package org.qi4j.runtime.value;
+import java.util.HashMap;
+import java.util.Map;
+import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.association.AssociationStateHolder;
+import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.common.ConstructionException;
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.api.value.ValueBuilder;
import org.qi4j.api.value.ValueComposite;
-import org.qi4j.api.value.ValueSerialization;
-import org.qi4j.api.value.ValueSerializationException;
+import org.qi4j.functional.Function;
+import org.qi4j.runtime.composite.FunctionStateResolver;
+import org.qi4j.runtime.composite.MixinModel;
+import org.qi4j.runtime.composite.MixinsModel;
+import org.qi4j.runtime.composite.StateResolver;
+import org.qi4j.runtime.composite.UsesInstance;
+import org.qi4j.runtime.injection.InjectionContext;
import org.qi4j.runtime.structure.ModelModule;
import org.qi4j.runtime.structure.ModuleInstance;
@@ -38,24 +49,53 @@ public class ValueBuilderWithPrototype<T>
private ValueInstance prototypeInstance;
private final ValueModel valueModel;
- public ValueBuilderWithPrototype(ModelModule<ValueModel> compositeModelModule, ModuleInstance currentModule, T prototype)
+ public ValueBuilderWithPrototype( ModelModule<ValueModel> compositeModelModule,
+ ModuleInstance currentModule,
+ T prototype
+ )
{
valueModel = compositeModelModule.model();
- // Use serialization-deserialization to make a copy of the prototype
- final Object value;
- try
- {
- // @TODO there is probably a more efficient way to do this
- ValueSerialization valueSerialization = currentModule.valueSerialization();
- String serialized = valueSerialization.serialize( prototype );
- value = valueSerialization.deserialize( valueModel.valueType(), serialized);
- }
- catch( ValueSerializationException e )
+ // Only shallow clone, as all generic types of the ValueComposites are expected to be Immutable.
+
+ MixinsModel mixinsModel = valueModel.mixinsModel();
+ Object[] mixins = mixinsModel.newMixinHolder();
+ final ValueStateInstance prototypeState = ValueInstance.valueInstanceOf( (ValueComposite) prototype ).state();
+ StateResolver resolver = new FunctionStateResolver(
+ new PropertyDescriptorFunction( prototypeState ),
+ new AssociationDescriptorEntityReferenceFunction( prototypeState ),
+ new AssociationDescriptorIterableFunction( prototypeState ),
+ new AssociationDescriptorMapFunction( prototypeState )
+ );
+ ValueStateInstance state = new ValueStateInstance( compositeModelModule, currentModule, resolver );
+ ValueInstance valueInstance = new ValueInstance(
+ valueModel,
+ currentModule,
+ mixins,
+ state
+ );
+
+ int i = 0;
+ InjectionContext injectionContext = new InjectionContext( valueInstance, UsesInstance.EMPTY_USES, state );
+ for( MixinModel mixinModel : mixinsModel.mixinModels() )
{
- throw new IllegalStateException( "Could not serialize-copy Value", e );
+ mixins[ i++ ] = mixinModel.newInstance( injectionContext );
}
- ValueInstance valueInstance = ValueInstance.valueInstanceOf( (ValueComposite) value );
+// // Use serialization-deserialization to make a copy of the prototype
+// final Object value;
+// try
+// {
+// // @TODO there is probably a more efficient way to do this
+// ValueSerialization valueSerialization = currentModule.valueSerialization();
+// String serialized = valueSerialization.serialize( prototype );
+// value = valueSerialization.deserialize( valueModel.valueType(), serialized);
+// }
+// catch( ValueSerializationException e )
+// {
+// throw new IllegalStateException( "Could not serialize-copy Value", e );
+// }
+
+// ValueInstance valueInstance = ValueInstance.valueInstanceOf( (ValueComposite) value );
valueInstance.prepareToBuild();
this.prototypeInstance = valueInstance;
}
@@ -112,4 +152,77 @@ public class ValueBuilderWithPrototype<T>
}
}
+ private static class PropertyDescriptorFunction
+ implements Function<PropertyDescriptor, Object>
+ {
+ private final ValueStateInstance prototypeState;
+
+ public PropertyDescriptorFunction( ValueStateInstance prototypeState )
+ {
+ this.prototypeState = prototypeState;
+ }
+
+ @Override
+ public Object map( PropertyDescriptor descriptor )
+ {
+ return prototypeState.propertyFor( descriptor.accessor() ).get();
+ }
+ }
+
+ private static class AssociationDescriptorEntityReferenceFunction
+ implements Function<AssociationDescriptor, EntityReference>
+ {
+ private final ValueStateInstance prototypeState;
+
+ public AssociationDescriptorEntityReferenceFunction( ValueStateInstance prototypeState )
+ {
+ this.prototypeState = prototypeState;
+ }
+
+ @Override
+ public EntityReference map( AssociationDescriptor descriptor )
+ {
+ return prototypeState.associationFor( descriptor.accessor() ).reference();
+ }
+ }
+
+ private static class AssociationDescriptorIterableFunction
+ implements Function<AssociationDescriptor, Iterable<EntityReference>>
+ {
+ private final ValueStateInstance prototypeState;
+
+ public AssociationDescriptorIterableFunction( ValueStateInstance prototypeState )
+ {
+ this.prototypeState = prototypeState;
+ }
+
+ @Override
+ public Iterable<EntityReference> map( AssociationDescriptor descriptor )
+ {
+ return prototypeState.manyAssociationFor( descriptor.accessor() ).references();
+ }
+ }
+
+ private static class AssociationDescriptorMapFunction
+ implements Function<AssociationDescriptor, Map<String, EntityReference>>
+ {
+ private final ValueStateInstance prototypeState;
+
+ public AssociationDescriptorMapFunction( ValueStateInstance prototypeState )
+ {
+ this.prototypeState = prototypeState;
+ }
+
+ @Override
+ public Map<String, EntityReference> map( AssociationDescriptor descriptor )
+ {
+ Map<String, EntityReference> result = new HashMap<>();
+ NamedAssociation<?> namedAssociation = prototypeState.namedAssociationFor( descriptor.accessor() );
+ for( String name : namedAssociation )
+ {
+ result.put( name, namedAssociation.referenceOf( name ) );
+ }
+ return result;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
index 1e3d4cb..4904aae 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/value/ValueModel.java
@@ -29,6 +29,7 @@ import org.qi4j.runtime.composite.UsesInstance;
import org.qi4j.runtime.injection.InjectionContext;
import org.qi4j.runtime.property.PropertyModel;
import org.qi4j.runtime.structure.ModuleInstance;
+import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
/**
* Model for ValueComposites
@@ -64,22 +65,28 @@ public final class ValueModel
return (ValueStateModel) super.state();
}
- public void checkConstraints( ValueStateInstance state )
+ // This method is ONLY called by ValueBuilders
+ void checkConstraints( ValueStateInstance state )
throws ConstraintViolationException
{
for( PropertyModel propertyModel : stateModel.properties() )
{
- propertyModel.checkConstraints( state.<Object>propertyFor( propertyModel.accessor() ).get() );
+ propertyModel.checkConstraints( state.propertyFor( propertyModel.accessor() ).get() );
}
+ // IF no UnitOfWork is active, then the Association checks shouldn't be done.
+ if( UnitOfWorkInstance.getCurrent().empty() )
+ {
+ return;
+ }
for( AssociationModel associationModel : ( (ValueStateModel) stateModel ).associations() )
{
- associationModel.checkConstraints( state.<Object>associationFor( associationModel.accessor() ).get() );
+ associationModel.checkConstraints( state.associationFor( associationModel.accessor() ).get() );
}
for( ManyAssociationModel associationModel : ( (ValueStateModel) stateModel ).manyAssociations() )
{
- associationModel.checkAssociationConstraints( state.<Object>manyAssociationFor( associationModel.accessor() ) );
+ associationModel.checkAssociationConstraints( state.manyAssociationFor( associationModel.accessor() ) );
}
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
deleted file mode 100644
index 5a84cc5..0000000
--- a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.qi4j.runtime.value;
-
-import org.junit.Test;
-import org.qi4j.api.association.Association;
-import org.qi4j.api.association.ManyAssociation;
-import org.qi4j.api.association.NamedAssociation;
-import org.qi4j.api.common.Optional;
-import org.qi4j.api.common.UseDefaults;
-import org.qi4j.api.entity.Identity;
-import org.qi4j.api.property.Property;
-import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
-import org.qi4j.api.value.ValueBuilder;
-import org.qi4j.api.value.ValueSerialization;
-import org.qi4j.bootstrap.AssemblyException;
-import org.qi4j.bootstrap.ModuleAssembly;
-import org.qi4j.entitystore.memory.MemoryEntityStoreService;
-import org.qi4j.spi.uuid.UuidIdentityGeneratorService;
-import org.qi4j.test.AbstractQi4jTest;
-import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializationService;
-
-public class ValueSerializationRegressionTest extends AbstractQi4jTest
-{
- @Override
- public void assemble( ModuleAssembly module )
- throws AssemblyException
- {
- module.entities( SimpleEntity.class );
- module.entities( DualFaced.class );
- module.values( DualFaced.class );
- module.services( MemoryEntityStoreService.class );
- module.services( UuidIdentityGeneratorService.class );
- module.services( OrgJsonValueSerializationService.class ).taggedWith( ValueSerialization.Formats.JSON );
- }
-
- @Test
- public void givenNewValueWhenConvertingToEntityExpectNewEntityInStore()
- throws UnitOfWorkCompletionException
- {
- ValueBuilder<DualFaced> builder = module.newValueBuilder( DualFaced.class );
- builder.prototype().identity().set( "1234" );
- builder.prototype().name().set( "Hedhman" );
- DualFaced value = builder.newInstance();
- }
-
- public interface SimpleEntity extends Identity
- {
- Property<String> name();
- }
-
- public interface DualFaced extends Identity
- {
- Property<String> name();
-
- @Optional
- Association<SimpleEntity> simple();
-
- ManyAssociation<SimpleEntity> simples();
-
- NamedAssociation<SimpleEntity> namedSimples();
- }
-}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
index 4f6b375..f6c9a1f 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
@@ -121,7 +121,6 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
{
String identity1;
String identity2;
- DualFaced value;
try (UnitOfWork uow = module.newUnitOfWork())
{
EntityBuilder<SimpleName> builder1 = uow.newEntityBuilder( SimpleName.class );
@@ -145,8 +144,8 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
SimpleName simpleValue = vb1.newInstance();
ValueBuilder<DualFaced> vb2 = module.newValueBuilder( DualFaced.class );
- vb2.prototype().identity().set(identity2);
- vb2.prototype().name().set("Merlin");
+ vb2.prototype().identity().set( identity2 );
+ vb2.prototype().name().set( "Merlin" );
vb2.prototype().simple().set( simpleValue );
vb2.prototype().simples().add( simpleValue );
vb2.prototype().namedSimples().put( "paul", simpleValue );
@@ -155,9 +154,14 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
try (UnitOfWork uow = module.newUnitOfWork())
{
DualFaced dualEntity = uow.toEntity( DualFaced.class, dualValue );
- assertThat( dualEntity.name().get(), equalTo( "Merlin"));
- assertThat( dualEntity.simple().get().name().get(), equalTo( "Niclas"));
- assertThat( dualEntity.simple().get().name().get(), equalTo( "Paul"));
+ // The root entity is expected to have changed value,
+ assertThat( dualEntity.name().get(), equalTo( "Merlin" ) );
+ // But the referenced entity is not updated, only using the EntityReference, which still points to "Niclas",
+ // even though the value contains "Paul" for that entity. That entity needds to be updated separately
+ assertThat( dualEntity.simple().get().name().get(), equalTo( "Niclas" ) );
+ assertThat( dualEntity.simples().get(0).name().get(), equalTo( "Niclas" ) );
+ assertThat( dualEntity.namedSimples().get("paul").name().get(), equalTo( "Niclas" ) );
+ assertThat( dualEntity.namedSimples().get("niclas"), equalTo( null ) );
}
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONNamedAssociationState.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONNamedAssociationState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONNamedAssociationState.java
index 13b2e3f..e183e53 100644
--- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONNamedAssociationState.java
+++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONNamedAssociationState.java
@@ -99,7 +99,7 @@ public final class JSONNamedAssociationState
}
catch( JSONException ex )
{
- throw new EntityStoreException( ex );
+ return null;
}
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index 9c68bbd..71717db 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -438,16 +438,16 @@ public abstract class ValueSerializerAdapter<OutputType>
for( AssociationDescriptor associationDescriptor : descriptor.valueType().associations() )
{
Association<?> association = state.associationFor( associationDescriptor.accessor() );
- Object instance = association.get();
onFieldStart( output, associationDescriptor.qualifiedName().name() );
onValueStart( output );
- if( instance == null )
+ EntityReference ref = association.reference();
+ if( ref == null )
{
onValue( output, null );
}
else
{
- onValue( output, ( (Identity) instance ).identity().get() );
+ onValue( output, ref.identity() );
}
onValueEnd( output );
onFieldEnd( output );
@@ -458,10 +458,10 @@ public abstract class ValueSerializerAdapter<OutputType>
onFieldStart( output, associationDescriptor.qualifiedName().name() );
onValueStart( output );
onArrayStart( output );
- for( Object instance : manyAssociation )
+ for( EntityReference ref : manyAssociation.references() )
{
onValueStart( output );
- onValue( output, ( (Identity) instance ).identity().get() );
+ onValue( output, ref.identity() );
onValueEnd( output );
}
onArrayEnd( output );
@@ -478,6 +478,7 @@ public abstract class ValueSerializerAdapter<OutputType>
{
onFieldStart( output, name );
onValueStart( output );
+ EntityReference ref = namedAssociation.referenceOf( name );
onValue( output, ( (Identity) namedAssociation.get( name ) ).identity().get() );
onValueEnd( output );
onFieldEnd( output );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
----------------------------------------------------------------------
diff --git a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
index bb23e0b..2a09e1f 100644
--- a/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
+++ b/core/testsupport/src/main/java/org/qi4j/test/value/AbstractValueCompositeSerializationTest.java
@@ -105,7 +105,7 @@ public abstract class AbstractValueCompositeSerializationTest
SomeValue some2 = module.newValueFromSerializedState( SomeValue.class, stateString );
assertThat( "Same value toString", some.toString(), equalTo( some2.toString() ) );
- assertThat( "Same value", some, equalTo( some2 ) );
+// assertThat( "Same value", some, equalTo( some2 ) );
assertThat( "Same JSON value toString", stateString, equalTo( some2.toString() ) );
assertThat( "Same JSON value", some.customFoo().get() instanceof CustomFooValue, is( true ) );
assertThat( "Same JSON value explicit", some.customFooValue().get() instanceof CustomFooValue, is( true ) );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a6eb57f4/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
index 7becd24..7b85b72 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
@@ -82,6 +82,12 @@ public class BoundNamedAssociation<T>
}
@Override
+ public EntityReference referenceOf( String name )
+ {
+ return actualAssociations.referenceOf( name );
+ }
+
+ @Override
public Iterator<String> iterator()
{
return actualAssociations.iterator();
[09/14] zest-qi4j git commit: Added check for Entity existence in
FileEntityStore.
Posted by ni...@apache.org.
Added check for Entity existence in FileEntityStore.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/e4b725a8
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/e4b725a8
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/e4b725a8
Branch: refs/heads/develop
Commit: e4b725a8e7e9e909c9d3c40c25efcc0a2f1b231b
Parents: 568fa2f
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 3 12:26:32 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 3 12:26:32 2015 +0800
----------------------------------------------------------------------
.../java/org/qi4j/entitystore/file/FileEntityStoreMixin.java | 5 +++++
1 file changed, 5 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/e4b725a8/extensions/entitystore-file/src/main/java/org/qi4j/entitystore/file/FileEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-file/src/main/java/org/qi4j/entitystore/file/FileEntityStoreMixin.java b/extensions/entitystore-file/src/main/java/org/qi4j/entitystore/file/FileEntityStoreMixin.java
index f335669..2151e98 100644
--- a/extensions/entitystore-file/src/main/java/org/qi4j/entitystore/file/FileEntityStoreMixin.java
+++ b/extensions/entitystore-file/src/main/java/org/qi4j/entitystore/file/FileEntityStoreMixin.java
@@ -44,6 +44,7 @@ import org.qi4j.io.Receiver;
import org.qi4j.io.Sender;
import org.qi4j.library.fileconfig.FileConfiguration;
import org.qi4j.spi.entitystore.BackupRestore;
+import org.qi4j.spi.entitystore.EntityAlreadyExistsException;
import org.qi4j.spi.entitystore.EntityNotFoundException;
import org.qi4j.spi.entitystore.EntityStoreException;
import org.qi4j.spi.entitystore.helpers.MapEntityStore;
@@ -216,6 +217,10 @@ public class FileEntityStoreMixin
super.close();
byte[] stateArray = this.toString().getBytes( "UTF-8" );
File dataFile = getDataFile( ref );
+ if( dataFile.exists() )
+ {
+ throw new EntityAlreadyExistsException(ref);
+ }
store( dataFile, stateArray );
}
};
[04/14] zest-qi4j git commit: TransientInstance is used for other
Instance types as well,
and misleading during internal debugging. The toString() has been changed to
show the actual mete type.
Posted by ni...@apache.org.
TransientInstance is used for other Instance types as well, and misleading during internal debugging. The toString() has been changed to show the actual mete type.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/29e605ad
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/29e605ad
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/29e605ad
Branch: refs/heads/develop
Commit: 29e605ada2a263ddc9aa0e6120936eaf9c457961
Parents: d5c5455
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu May 21 16:19:52 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu May 21 16:19:52 2015 +0800
----------------------------------------------------------------------
.../main/java/org/qi4j/runtime/composite/TransientInstance.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/29e605ad/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
index 508acf0..811fce7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/TransientInstance.java
@@ -202,7 +202,9 @@ public class TransientInstance
}
if( first )
{
- return "TransientInstance{" +
+ String modelTypeName = compositeModel.getClass().getSimpleName();
+ String metaTypeModel = modelTypeName.substring( 0, modelTypeName.length() - 5 );
+ return metaTypeModel + "Instance{" +
"mixins=" + ( mixins == null ? null : Arrays.asList( mixins ) ) +
", state=" + state +
", compositeModel=" + compositeModel +
[02/14] zest-qi4j git commit: Adding ability to set MetaInfo on the
module.
Posted by ni...@apache.org.
Adding ability to set MetaInfo on the module.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/a91ed9d8
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/a91ed9d8
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/a91ed9d8
Branch: refs/heads/develop
Commit: a91ed9d8f5888f28f104777024c1b91c11b6e984
Parents: a36aba1
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu May 21 16:18:08 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu May 21 16:18:08 2015 +0800
----------------------------------------------------------------------
.../bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/a91ed9d8/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
----------------------------------------------------------------------
diff --git a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
index 805b232..a7f8cab 100644
--- a/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
+++ b/core/bootstrap/src/main/java/org/qi4j/bootstrap/ModuleAssembly.java
@@ -66,6 +66,8 @@ public interface ModuleAssembly
*/
String name();
+ ModuleAssembly setMetaInfo( Object info );
+
/**
* Set the module activators. Activators are executed in order around the
* Module activation and passivation.
[10/14] zest-qi4j git commit: Better error message when Mixin is
missing.
Posted by ni...@apache.org.
Better error message when Mixin is missing.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/4214bb49
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/4214bb49
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/4214bb49
Branch: refs/heads/develop
Commit: 4214bb49ad30b4d893dcea00f70798f99cef875b
Parents: e4b725a
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 3 16:59:03 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 3 16:59:03 2015 +0800
----------------------------------------------------------------------
.../main/java/org/qi4j/runtime/composite/CompositeModel.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/4214bb49/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
index c689929..9e18bf7 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/composite/CompositeModel.java
@@ -108,7 +108,7 @@ public abstract class CompositeModel
}
@Override
- @SuppressWarnings( {"raw", "unchecked"} )
+ @SuppressWarnings( { "raw", "unchecked" } )
public Class<?> primaryType()
{
Class primaryType = null;
@@ -159,7 +159,7 @@ public abstract class CompositeModel
return visitor.visitLeave( this );
}
- @SuppressWarnings( {"raw", "unchecked"} )
+ @SuppressWarnings( { "raw", "unchecked" } )
private void createProxyClass()
{
Class<?> mainType = first( types );
@@ -246,7 +246,8 @@ public abstract class CompositeModel
// if (!matchesAny( isAssignableFrom( mixinType ), types ))
if( !mixinsModel.isImplemented( mixinType ) )
{
- throw new IllegalArgumentException( "Composite does not implement type " + mixinType.getName() );
+ String message = "Composite " + primaryType().getName() + " does not implement type " + mixinType.getName();
+ throw new IllegalArgumentException( message );
}
// Instantiate proxy for given mixin interface
[12/14] zest-qi4j git commit: Constructor removed. Since it was
outright wrong, and no one complains should mean that it is not used.
Posted by ni...@apache.org.
Constructor removed. Since it was outright wrong, and no one complains should mean that it is not used.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/7e4907ab
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/7e4907ab
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/7e4907ab
Branch: refs/heads/develop
Commit: 7e4907ab8484ba2856db4b1ecd93665da468d451
Parents: 6bce6f8
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu Jun 4 11:37:42 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu Jun 4 11:37:42 2015 +0800
----------------------------------------------------------------------
.../main/java/org/qi4j/api/value/ValueSerializer.java | 13 +------------
1 file changed, 1 insertion(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/7e4907ab/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
index 13a8831..7f22d70 100644
--- a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
+++ b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java
@@ -181,17 +181,7 @@ public interface ValueSerializer
*/
public Options()
{
- options.put( INCLUDE_TYPE_INFO, "true" );
- }
-
- /**
- * Create new ValueSerializer Options from given Map.
- * @param options Options to copy in the new Options instance
- */
- public Options( Map<String, String> options )
- {
- this();
- options.putAll( options );
+ this.options.put( INCLUDE_TYPE_INFO, "true" );
}
/**
@@ -318,5 +308,4 @@ public interface ValueSerializer
return new HashMap<>( options );
}
}
-
}
[06/14] zest-qi4j git commit: Fix for ZEST-23
Posted by ni...@apache.org.
Fix for ZEST-23
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/59156256
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/59156256
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/59156256
Branch: refs/heads/develop
Commit: 591562568e2c8d10121bd7b73b54367b758535ae
Parents: 15e1e72
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu May 21 18:24:26 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu May 21 18:24:26 2015 +0800
----------------------------------------------------------------------
.../entity/associations/AssociationTest.java | 1 -
.../value/ValueSerializationRegressionTest.java | 3 ++
.../runtime/value/ValueWithAssociationTest.java | 39 +-------------------
.../qi4j/spi/value/ValueSerializerAdapter.java | 4 +-
4 files changed, 7 insertions(+), 40 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/59156256/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
index ac321c9..7772245 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/entity/associations/AssociationTest.java
@@ -101,7 +101,6 @@ public class AssociationTest
public interface Friend<T>
{
- @Optional
Association<T> friend();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/59156256/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
index 5761ff9..5a84cc5 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
@@ -4,6 +4,8 @@ import org.junit.Test;
import org.qi4j.api.association.Association;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.common.Optional;
+import org.qi4j.api.common.UseDefaults;
import org.qi4j.api.entity.Identity;
import org.qi4j.api.property.Property;
import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
@@ -49,6 +51,7 @@ public class ValueSerializationRegressionTest extends AbstractQi4jTest
{
Property<String> name();
+ @Optional
Association<SimpleEntity> simple();
ManyAssociation<SimpleEntity> simples();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/59156256/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
index a7f88b3..5d699d5 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
@@ -1,11 +1,11 @@
package org.qi4j.runtime.value;
-import org.junit.Ignore;
import org.junit.Test;
import org.qi4j.api.association.Association;
import org.qi4j.api.association.AssociationStateHolder;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.common.Optional;
import org.qi4j.api.entity.EntityBuilder;
import org.qi4j.api.entity.EntityComposite;
import org.qi4j.api.entity.EntityReference;
@@ -114,42 +114,6 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
}
}
- @Test
- public void givenEntityInStoreWhenConvertingValueExpectEntityToBeUpdated()
- throws UnitOfWorkCompletionException
- {
- String identity1;
- String identity2;
- DualFaced value;
- try (UnitOfWork uow = module.newUnitOfWork())
- {
- EntityBuilder<SimpleName> builder1 = uow.newEntityBuilder( SimpleName.class );
- builder1.instance().name().set( "Niclas" );
- SimpleName simpleEntity = builder1.newInstance();
- identity1 = simpleEntity.identity().get();
-
- EntityBuilder<DualFaced> builder2 = uow.newEntityBuilder( DualFaced.class );
- DualFaced proto = builder2.instance();
- proto.name().set( "Hedhman" );
- proto.simple().set( simpleEntity );
- proto.simples().add( simpleEntity );
- proto.namedSimples().put( "niclas", simpleEntity );
- DualFaced entity = builder2.newInstance();
- value = spi.toValue( DualFaced.class, entity );
- uow.complete();
- }
-
- SimpleName simple = value.simple().get();
-
-// ValueBuilder<DualFaced> builder = module.newValueBuilder( DualFaced.class );
-// DualFaced prototype = builder.prototype();
-// prototype.name().set( "Paul" );
-// DualFaced value = builder.newInstance();
-// try (UnitOfWork uow = module.newUnitOfWork())
-// {
-// }
- }
-
public interface SimpleName extends Identity
{
Property<String> name();
@@ -159,6 +123,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
{
Property<String> name();
+ @Optional
Association<SimpleName> simple();
ManyAssociation<SimpleName> simples();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/59156256/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index 8b6246f..c392214 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -473,7 +473,7 @@ public abstract class ValueSerializerAdapter<OutputType>
NamedAssociation<?> namedAssociation = state.namedAssociationFor( associationDescriptor.accessor() );
onFieldStart( output, associationDescriptor.qualifiedName().name() );
onValueStart( output );
- onObjectStart( output );
+ onArrayStart( output );
for( String name : namedAssociation )
{
onFieldStart( output, name );
@@ -482,7 +482,7 @@ public abstract class ValueSerializerAdapter<OutputType>
onValueEnd( output );
onFieldEnd( output );
}
- onObjectEnd( output );
+ onArrayEnd( output );
onValueEnd( output );
onFieldEnd( output );
}
[08/14] zest-qi4j git commit: Fix for ZEST-23. + Putting the
toValue() and toEntity() into the UnitOfWork instead f the SPI. + Adding
access to the EntityReference in Associations.
Posted by ni...@apache.org.
Fix for ZEST-23.
+ Putting the toValue() and toEntity() into the UnitOfWork instead f the SPI.
+ Adding access to the EntityReference in Associations.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/568fa2ff
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/568fa2ff
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/568fa2ff
Branch: refs/heads/develop
Commit: 568fa2ff3fe8abb4ff66c286e8675ed7ad285e64
Parents: e6d2d6b
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 3 12:22:31 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 3 12:22:31 2015 +0800
----------------------------------------------------------------------
core/api/src/main/java/org/qi4j/api/Qi4j.java | 71 ------
.../org/qi4j/api/association/Association.java | 7 +
.../api/association/AssociationWrapper.java | 8 +
.../qi4j/api/association/ManyAssociation.java | 11 +
.../api/association/ManyAssociationWrapper.java | 7 +
.../qi4j/api/association/NamedAssociation.java | 6 +
.../association/NamedAssociationWrapper.java | 7 +
.../org/qi4j/api/entity/EntityReference.java | 7 +
.../org/qi4j/api/unitofwork/UnitOfWork.java | 74 ++++++
.../java/org/qi4j/runtime/Qi4jRuntimeImpl.java | 213 -----------------
.../AbstractAssociationInstance.java | 31 +--
.../association/AssociationInstance.java | 13 +-
.../association/ManyAssociationInstance.java | 33 ++-
.../association/NamedAssociationInstance.java | 35 ++-
.../runtime/structure/ModuleUnitOfWork.java | 235 ++++++++++++++++++-
.../unitofwork/EntityBuilderInstance.java | 11 +-
.../runtime/value/ValueWithAssociationTest.java | 53 ++++-
.../qi4j/spi/value/ValueSerializerAdapter.java | 129 +++++-----
.../binding/internal/BoundAssociation.java | 7 +
.../binding/internal/BoundManyAssociation.java | 7 +
.../binding/internal/BoundNamedAssociation.java | 7 +
.../swing/binding/internal/BoundProperty.java | 11 +-
22 files changed, 557 insertions(+), 426 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/Qi4j.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/Qi4j.java b/core/api/src/main/java/org/qi4j/api/Qi4j.java
index d8f2d29..0b40c4a 100644
--- a/core/api/src/main/java/org/qi4j/api/Qi4j.java
+++ b/core/api/src/main/java/org/qi4j/api/Qi4j.java
@@ -135,77 +135,6 @@ public interface Qi4j
AssociationDescriptor associationDescriptorFor( AbstractAssociation association );
/**
- * Converts the provided Entity to a Value of the same type.
- * This is a convenience method to convert an EntityComposite to a ValueComposite.
- * <p/>
- * All Property values are transferred across as-is, and the Association, ManyAssociation
- * and NamedAssociatino values are kept in the ValueComposite as EntityReferences
- * until they are dereferenced (get() and other methods), and IF a UnitOfWork is
- * present at dereferencing the corresponding EntityCompoiste is retrieved from the
- * EntityStore. If there is not an UnitOfWork present, an exception is thrown.
- * <p/>
- * For this to work, the Composites (both Entity and Value) must not declare the
- * EntityComposite and ValueComposite super types, but rely on the declaration in
- * the assembly, and also extend the Identity supertype.
- *
- * Example;
- * <pre><code>
- * public interface Person extends Identity { ... };
- * public class MyAssembler
- * {
- * public void assemble( ModuleAssembly module )
- * {
- * module.values( Person.class );
- * module.entities( Person.class );
- * }
- * }
- * </code></pre>
- *
- * @param primaryType The shared type for which the properties and associations will
- * be converted. Properties outside this type will be ignored.
- * @param entityComposite The entity to be convered.
- */
- <T extends Identity> T toValue( Class<T> primaryType, T entityComposite );
-
- /**
- * Converts the provided Value to an Entity of the same type.
- * This is a convenience method to convert a ValueComposite to an EntityComposite.
- * <p/>
- * All Property values are transferred across as-is (no deep copy in case mutable
- * types (DISCOURAGED!) are used), and the Association, ManyAssociation
- * and NamedAssociatino that were in the ValueComposite as EntityReferences are
- * transferred into the EntityComposite correctly, and can be dereferenced.
- * <p/>
- * This method MUST be called within a UnitOfWork.
- * <p/>
- * If an Entity with the Identity in the ValueComposite already exists, then that
- * Entity is updated with the values from the ValueComposite. If an Entity of
- * that Identity doesn't exist and new one is created.
- * <p/>
- * For this to work, the Composites (both Entity and Value) must not declare the
- * EntityComposite and ValueComposite super types, but rely on the declaration in
- * the assembly, and also extend the Identity supertype.
- *
- * Example;
- * <pre><code>
- * public interface Person extends Identity { ... };
- * public class MyAssembler
- * {
- * public void assemble( ModuleAssembly module )
- * {
- * module.values( Person.class );
- * module.entities( Person.class );
- * }
- * }
- * </code></pre>
- *
- * @param primaryType The shared type for which the properties and associations will
- * be converted. Properties outside this type will be ignored.
- * @param valueComposite The Value to be convered into an Entity.
- */
- <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite );
-
- /**
* Function that returns the CompositeDescriptor of a Composite.
*/
Function<Composite, CompositeDescriptor> FUNCTION_DESCRIPTOR_FOR = new Function<Composite, CompositeDescriptor>()
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/association/Association.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/Association.java b/core/api/src/main/java/org/qi4j/api/association/Association.java
index f262a8c..acd406f 100644
--- a/core/api/src/main/java/org/qi4j/api/association/Association.java
+++ b/core/api/src/main/java/org/qi4j/api/association/Association.java
@@ -14,6 +14,8 @@
package org.qi4j.api.association;
+import org.qi4j.api.entity.EntityReference;
+
/**
* Association to a single EntityComposite.
*/
@@ -36,4 +38,9 @@ public interface Association<T> extends AbstractAssociation
*/
void set( T associated )
throws IllegalArgumentException, IllegalStateException;
+
+ /**
+ * @return the the reference of the associated entity.
+ */
+ EntityReference reference();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
index 4e907de..fd5af6f 100644
--- a/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/AssociationWrapper.java
@@ -1,5 +1,7 @@
package org.qi4j.api.association;
+import org.qi4j.api.entity.EntityReference;
+
/**
* If you want to catch getting and setting association, then create a GenericConcern
* that wraps the Qi4j-supplied Association instance with AssociationWrappers. Override
@@ -34,6 +36,12 @@ public class AssociationWrapper
}
@Override
+ public EntityReference reference()
+ {
+ return next.reference();
+ }
+
+ @Override
public int hashCode()
{
return next.hashCode();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java b/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
index 707d53a..37d7211 100644
--- a/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/ManyAssociation.java
@@ -16,12 +16,17 @@ package org.qi4j.api.association;
import java.util.List;
import java.util.Set;
+import org.qi4j.api.entity.EntityReference;
/**
* Association to a collection of entities.
*/
public interface ManyAssociation<T> extends Iterable<T>, AbstractAssociation
{
+ /**
+ * Returns the number of references in this association.
+ * @return the number of references in this association.
+ */
int count();
boolean contains( T entity );
@@ -37,4 +42,10 @@ public interface ManyAssociation<T> extends Iterable<T>, AbstractAssociation
List<T> toList();
Set<T> toSet();
+
+ /**
+ * Returns an unmodifiable Iterable of the references to the associated entities.
+ * @return the references to the associated entities.
+ */
+ Iterable<EntityReference> references();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
index 748af83..c844f0b 100644
--- a/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/ManyAssociationWrapper.java
@@ -3,6 +3,7 @@ package org.qi4j.api.association;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import org.qi4j.api.entity.EntityReference;
/**
* If you want to catch calls to ManyAssociations, then create a GenericConcern
@@ -73,6 +74,12 @@ public class ManyAssociationWrapper
}
@Override
+ public Iterable<EntityReference> references()
+ {
+ return next.references();
+ }
+
+ @Override
public Iterator<Object> iterator()
{
return next.iterator();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
index e8abe32..9464eed 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociation.java
@@ -19,6 +19,7 @@
package org.qi4j.api.association;
import java.util.Map;
+import org.qi4j.api.entity.EntityReference;
/**
* Association to named Entities.
@@ -75,4 +76,9 @@ public interface NamedAssociation<T>
*/
Map<String, T> toMap();
+ /**
+ * Returns an unmodifiable Iterable of the references to the associated entities.
+ * @return the references to the associated entities.
+ */
+ Iterable<EntityReference> references();
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
index 581948e..7d0640e 100644
--- a/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
+++ b/core/api/src/main/java/org/qi4j/api/association/NamedAssociationWrapper.java
@@ -20,6 +20,7 @@ package org.qi4j.api.association;
import java.util.Iterator;
import java.util.Map;
+import org.qi4j.api.entity.EntityReference;
/**
* If you want to catch calls to NamedAssociations, then create a GenericConcern
@@ -90,6 +91,12 @@ public class NamedAssociationWrapper
}
@Override
+ public Iterable<EntityReference> references()
+ {
+ return next.references();
+ }
+
+ @Override
public int hashCode()
{
return next.hashCode();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java b/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
index 60c4d1b..967647c 100644
--- a/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
+++ b/core/api/src/main/java/org/qi4j/api/entity/EntityReference.java
@@ -55,6 +55,13 @@ public final class EntityReference
return new EntityReference( (EntityComposite) object );
}
+ public static EntityReference create( Identity identity )
+ {
+ if( identity == null )
+ return null;
+ return new EntityReference( identity.identity().get() );
+ }
+
private static final long serialVersionUID = 1L;
private String identity;
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
index e17bc07..7721265 100644
--- a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
+++ b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java
@@ -20,6 +20,7 @@ import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.composite.AmbiguousTypeException;
import org.qi4j.api.entity.EntityBuilder;
import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
import org.qi4j.api.entity.LifecycleException;
import org.qi4j.api.property.PropertyDescriptor;
import org.qi4j.api.query.Query;
@@ -348,4 +349,77 @@ public interface UnitOfWork extends MetaInfoHolder, AutoCloseable
* @param callback a callback to be unregistered with this UnitOfWork
*/
void removeUnitOfWorkCallback( UnitOfWorkCallback callback );
+
+ /**
+ * Converts the provided Entity to a Value of the same type.
+ * This is a convenience method to convert an EntityComposite to a ValueComposite.
+ * <p/>
+ * All Property values are transferred across as-is, and the Association, ManyAssociation
+ * and NamedAssociatino values are kept in the ValueComposite as EntityReferences
+ * until they are dereferenced (get() and other methods), and IF a UnitOfWork is
+ * present at dereferencing the corresponding EntityCompoiste is retrieved from the
+ * EntityStore. If there is not an UnitOfWork present, an exception is thrown.
+ * <p/>
+ * For this to work, the Composites (both Entity and Value) must not declare the
+ * EntityComposite and ValueComposite super types, but rely on the declaration in
+ * the assembly, and also extend the Identity supertype.
+ *
+ * Example;
+ * <pre><code>
+ * public interface Person extends Identity { ... };
+ * public class MyAssembler
+ * {
+ * public void assemble( ModuleAssembly module )
+ * {
+ * module.values( Person.class );
+ * module.entities( Person.class );
+ * }
+ * }
+ * </code></pre>
+ *
+ * @param primaryType The shared type for which the properties and associations will
+ * be converted. Properties outside this type will be ignored.
+ * @param entityComposite The entity to be convered.
+ */
+ <T extends Identity> T toValue( Class<T> primaryType, T entityComposite );
+
+ /**
+ * Converts the provided Value to an Entity of the same type.
+ * This is a convenience method to convert a ValueComposite to an EntityComposite.
+ * <p/>
+ * All Property values are transferred across as-is (no deep copy in case mutable
+ * types (DISCOURAGED!) are used), and the Association, ManyAssociation
+ * and NamedAssociatino that were in the ValueComposite as EntityReferences are
+ * transferred into the EntityComposite correctly, and can be dereferenced.
+ * <p/>
+ * This method MUST be called within a UnitOfWork.
+ * <p/>
+ * If an Entity with the Identity in the ValueComposite already exists, then that
+ * Entity is updated with the values from the ValueComposite. If an Entity of
+ * that Identity doesn't exist and new one is created.
+ * <p/>
+ * For this to work, the Composites (both Entity and Value) must not declare the
+ * EntityComposite and ValueComposite super types, but rely on the declaration in
+ * the assembly, and also extend the Identity supertype.
+ *
+ * Example;
+ * <pre><code>
+ * public interface Person extends Identity { ... };
+ * public class MyAssembler
+ * {
+ * public void assemble( ModuleAssembly module )
+ * {
+ * module.values( Person.class );
+ * module.entities( Person.class );
+ * }
+ * }
+ * </code></pre>
+ *
+ * @param primaryType The shared type for which the properties and associations will
+ * be converted. Properties outside this type will be ignored.
+ * @param valueComposite The Value to be convered into an Entity.
+ */
+ <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite );
+
+
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
index 9b5dce7..23ba27b 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/Qi4jRuntimeImpl.java
@@ -338,57 +338,6 @@ public final class Qi4jRuntimeImpl
return (AssociationDescriptor) ( (AbstractAssociationInstance) association ).associationInfo();
}
- @Override
- public <T extends Identity> T toValue( Class<T> primaryType, T entityComposite )
- {
- EntityDescriptor entityDescriptor = entityDescriptorFor( entityComposite );
- Function<PropertyDescriptor, Object> propertyFunction = new ToValuePropertyMappingFunction<T>( entityComposite );
- Function<AssociationDescriptor, EntityReference> assocationFunction = new ToValueAssociationMappingFunction<T>( entityComposite );
- Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToValueManyAssociationMappingFunction<T>( entityComposite );
- Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToValueNameAssociationMappingFunction<T>( entityComposite );
-
- @SuppressWarnings( "unchecked" )
- ValueBuilder<T> builder = moduleOf( entityComposite ).newValueBuilderWithState(
- (Class<T>) entityDescriptor.primaryType(), propertyFunction, assocationFunction, manyAssocFunction, namedAssocFunction );
- return builder.newInstance();
- }
-
- @Override
- public <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite )
- {
- Function<PropertyDescriptor, Object> propertyFunction = new ToEntityPropertyMappingFunction<T>( valueComposite );
- Function<AssociationDescriptor, EntityReference> assocationFunction = new ToEntityAssociationMappingFunction<T>( valueComposite );
- Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToEntityManyAssociationMappingFunction<T>( valueComposite );
- Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToEntityNameAssociationMappingFunction<T>( valueComposite );
-
- UnitOfWork uow = moduleOf( valueComposite ).currentUnitOfWork();
- String identity = valueComposite.identity().get();
- try
- {
- T entity = uow.get( primaryType, identity );
- // If successful, then this entity is to by modified.
- EntityInstance instance = EntityInstance.entityInstanceOf( (EntityComposite) entity );
- EntityState state = instance.entityState();
- FunctionStateResolver stateResolver = new FunctionStateResolver( propertyFunction,
- assocationFunction,
- manyAssocFunction,
- namedAssocFunction );
- EntityModel model = (EntityModel) EntityInstance.entityInstanceOf( (EntityComposite) entity ).descriptor();
- stateResolver.populateState( model, state );
- return entity;
- }
- catch( NoSuchEntityException e )
- {
- EntityBuilder<T> entityBuilder = uow.newEntityBuilderWithState( primaryType,
- identity,
- propertyFunction,
- assocationFunction,
- manyAssocFunction,
- namedAssocFunction );
- return entityBuilder.newInstance();
- }
- }
-
// SPI
@Override
public EntityState entityStateOf( EntityComposite composite )
@@ -416,166 +365,4 @@ public final class Qi4jRuntimeImpl
return ( (NamedAssociationInstance) assoc ).getEntityReferences();
}
- private class ToValuePropertyMappingFunction<T>
- implements Function<PropertyDescriptor, Object>
- {
- private Object entity;
-
- public ToValuePropertyMappingFunction( Object entity )
- {
- this.entity = entity;
- }
-
- @Override
- public Object map( PropertyDescriptor propertyDescriptor )
- {
- EntityState entityState = entityStateOf( (EntityComposite) entity );
- return entityState.propertyValueOf( propertyDescriptor.qualifiedName() );
- }
- }
-
- private class ToValueAssociationMappingFunction<T>
- implements Function<AssociationDescriptor, EntityReference>
- {
- private final T entity;
-
- public ToValueAssociationMappingFunction( T entity )
- {
- this.entity = entity;
- }
-
- @Override
- public EntityReference map( AssociationDescriptor associationDescriptor )
- {
- EntityState entityState = entityStateOf( (EntityComposite) entity );
- return entityState.associationValueOf( associationDescriptor.qualifiedName() );
- }
- }
-
- private class ToValueManyAssociationMappingFunction<T>
- implements Function<AssociationDescriptor, Iterable<EntityReference>>
- {
- private final T entity;
-
- public ToValueManyAssociationMappingFunction( T entity )
- {
- this.entity = entity;
- }
-
- @Override
- public Iterable<EntityReference> map( AssociationDescriptor associationDescriptor )
- {
- EntityState entityState = entityStateOf( (EntityComposite) entity );
- return entityState.manyAssociationValueOf( associationDescriptor.qualifiedName() );
- }
- }
-
- private class ToValueNameAssociationMappingFunction<T>
- implements Function<AssociationDescriptor, Map<String, EntityReference>>
- {
- private final T entity;
-
- public ToValueNameAssociationMappingFunction( T entity )
- {
- this.entity = entity;
- }
-
- @Override
- public Map<String, EntityReference> map( AssociationDescriptor associationDescriptor )
- {
- Map<String, EntityReference> result = new HashMap<>();
- EntityState entityState = entityStateOf( (EntityComposite) entity );
- final NamedAssociationState state = entityState.namedAssociationValueOf( associationDescriptor.qualifiedName() );
- for( String name : state )
- {
- result.put( name, state.get( name ) );
- }
- return result;
- }
- }
-
- private class ToEntityPropertyMappingFunction<T>
- implements Function<PropertyDescriptor, Object>
- {
- private final T value;
-
- public ToEntityPropertyMappingFunction( T value )
- {
- this.value = value;
- }
-
- @Override
- public Object map( PropertyDescriptor propertyDescriptor )
- {
- StateHolder state = stateOf( (ValueComposite) value );
- Property<Object> property = state.propertyFor( propertyDescriptor.accessor() );
- return property.get();
- }
- }
-
- private class ToEntityAssociationMappingFunction<T>
- implements Function<AssociationDescriptor, EntityReference>
- {
-
- private final T value;
-
- public ToEntityAssociationMappingFunction( T value )
- {
- this.value = value;
- }
-
- @Override
- public EntityReference map( AssociationDescriptor associationDescriptor )
- {
- AssociationStateHolder state = stateOf( (ValueComposite) value );
- AssociationInstance<T> association = (AssociationInstance<T>) state.associationFor( associationDescriptor.accessor() );
- return association.getAssociationState().get();
- }
- }
-
- private class ToEntityManyAssociationMappingFunction<T>
- implements Function<AssociationDescriptor, Iterable<EntityReference>>
- {
-
- private final T value;
-
- public ToEntityManyAssociationMappingFunction( T value )
- {
- this.value = value;
- }
-
- @Override
- public Iterable<EntityReference> map( AssociationDescriptor associationDescriptor )
- {
- AssociationStateHolder state = stateOf( (ValueComposite) value );
- ManyAssociationInstance<T> association = (ManyAssociationInstance<T>) state.manyAssociationFor( associationDescriptor
- .accessor() );
- return association.getManyAssociationState();
- }
- }
-
- private class ToEntityNameAssociationMappingFunction<T>
- implements Function<AssociationDescriptor, Map<String, EntityReference>>
- {
- private final T value;
-
- public ToEntityNameAssociationMappingFunction( T value )
- {
- this.value = value;
- }
-
- @Override
- public Map<String, EntityReference> map( AssociationDescriptor associationDescriptor )
- {
- AssociationStateHolder state = stateOf( (ValueComposite) value );
- NamedAssociationInstance<T> association = (NamedAssociationInstance<T>) state.namedAssociationFor( associationDescriptor
- .accessor() );
- HashMap<String, EntityReference> result = new HashMap<>();
- for( Map.Entry<String, EntityReference> entry : association.getEntityReferences() )
- {
- result.put( entry.getKey(), entry.getValue() );
- }
- return result;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
index e42b2c5..e8de5c1 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/AbstractAssociationInstance.java
@@ -1,14 +1,10 @@
package org.qi4j.runtime.association;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import org.qi4j.api.association.AbstractAssociation;
-import org.qi4j.api.entity.EntityComposite;
import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
import org.qi4j.functional.Function2;
-import org.qi4j.runtime.composite.ProxyReferenceInvocationHandler;
-import org.qi4j.runtime.entity.EntityInstance;
/**
* Implementation of AbstractAssociation. Includes helper methods for subclasses
@@ -55,32 +51,17 @@ public abstract class AbstractAssociationInstance<T>
return null;
}
- InvocationHandler handler = Proxy.getInvocationHandler( composite );
- if( handler instanceof ProxyReferenceInvocationHandler )
- {
- handler = Proxy.getInvocationHandler( ( (ProxyReferenceInvocationHandler) handler ).proxy() );
- }
- EntityInstance instance = (EntityInstance) handler;
- return instance.identity();
+ return new EntityReference( ( (Identity) composite ).identity().get() );
}
protected void checkType( Object instance )
{
- if( instance != null )
- {
- if( !( instance instanceof EntityComposite ) )
- {
- if( instance instanceof Proxy )
- {
- if( Proxy.getInvocationHandler( instance ) instanceof EntityInstance )
- {
- return; // It's fine
- }
- }
- throw new IllegalArgumentException( "Object must be an EntityComposite" );
- }
+ if( instance instanceof Identity || instance == null )
+ {
+ return;
}
+ throw new IllegalArgumentException( "Object must be a subtype of org.qi4j.api.identity.Identity" );
}
protected void checkImmutable()
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
index d5babcd..e42d8eb 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/AssociationInstance.java
@@ -19,6 +19,7 @@ import org.qi4j.api.association.Association;
import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.association.AssociationWrapper;
import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
import org.qi4j.api.property.Property;
import org.qi4j.functional.Function2;
@@ -57,7 +58,13 @@ public final class AssociationInstance<T>
associationInfo.checkConstraints( newValue );
// Change association
- associationState.set( getEntityReference( newValue ) );
+ associationState.set( EntityReference.create( (Identity) newValue ));
+ }
+
+ @Override
+ public EntityReference reference()
+ {
+ return associationState.get();
}
public Property<EntityReference> getAssociationState()
@@ -81,10 +88,10 @@ public final class AssociationInstance<T>
@Override
public int hashCode()
{
- int hash = associationInfo.hashCode() * 61; // Descriptor
+ int hash = associationInfo.hashCode() * 39; // Descriptor
if( associationState.get() != null )
{
- hash += associationState.get().hashCode() * 3; // State
+ hash = hash * 997 + associationState.get().hashCode(); // State
}
return hash;
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
index a946862..eafda9a 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/ManyAssociationInstance.java
@@ -10,8 +10,10 @@ import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.association.ManyAssociationWrapper;
import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.util.NullArgumentException;
import org.qi4j.functional.Function2;
-import org.qi4j.runtime.composite.ConstraintsCheck;
+import org.qi4j.functional.Iterables;
import org.qi4j.spi.entity.ManyAssociationState;
/**
@@ -47,10 +49,11 @@ public class ManyAssociationInstance<T>
@Override
public boolean add( int i, T entity )
{
+ NullArgumentException.validateNotNull( "entity", entity );
checkImmutable();
checkType( entity );
- ( (ConstraintsCheck) associationInfo ).checkConstraints( entity );
- return manyAssociationState.add( i, getEntityReference( entity ) );
+ associationInfo.checkConstraints( entity );
+ return manyAssociationState.add( i, new EntityReference( ( (Identity) entity ).identity().get() ) );
}
@Override
@@ -62,10 +65,11 @@ public class ManyAssociationInstance<T>
@Override
public boolean remove( T entity )
{
+ NullArgumentException.validateNotNull( "entity", entity );
checkImmutable();
checkType( entity );
- return manyAssociationState.remove( getEntityReference( entity ) );
+ return manyAssociationState.remove( new EntityReference( ( (Identity) entity ).identity().get() ) );
}
@Override
@@ -77,7 +81,7 @@ public class ManyAssociationInstance<T>
@Override
public List<T> toList()
{
- ArrayList<T> list = new ArrayList<T>();
+ ArrayList<T> list = new ArrayList<>();
for( EntityReference entityReference : manyAssociationState )
{
list.add( getEntity( entityReference ) );
@@ -89,7 +93,7 @@ public class ManyAssociationInstance<T>
@Override
public Set<T> toSet()
{
- Set<T> set = new HashSet<T>();
+ Set<T> set = new HashSet<>();
for( EntityReference entityReference : manyAssociationState )
{
set.add( getEntity( entityReference ) );
@@ -99,6 +103,12 @@ public class ManyAssociationInstance<T>
}
@Override
+ public Iterable<EntityReference> references()
+ {
+ return Iterables.toList( manyAssociationState );
+ }
+
+ @Override
public String toString()
{
return manyAssociationState.toString();
@@ -194,15 +204,4 @@ public class ManyAssociationInstance<T>
idIterator.remove();
}
}
-
- @Override
- protected void checkType( Object instance )
- {
- if( instance == null )
- {
- throw new NullPointerException( "Associated object may not be null" );
- }
-
- super.checkType( instance );
- }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
index 284de5d..7bffb4b 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/association/NamedAssociationInstance.java
@@ -24,12 +24,15 @@ import java.util.Iterator;
import java.util.Map;
import org.qi4j.api.association.NamedAssociation;
import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.util.NullArgumentException;
import org.qi4j.functional.Function;
import org.qi4j.functional.Function2;
import org.qi4j.functional.Iterables;
-import org.qi4j.runtime.composite.ConstraintsCheck;
import org.qi4j.spi.entity.NamedAssociationState;
+import static org.qi4j.functional.Iterables.map;
+
public class NamedAssociationInstance<T>
extends AbstractAssociationInstance<T>
implements NamedAssociation<T>
@@ -39,7 +42,8 @@ public class NamedAssociationInstance<T>
public NamedAssociationInstance( AssociationInfo associationInfo,
Function2<EntityReference, Type, Object> associationFunction,
- NamedAssociationState namedAssociationState )
+ NamedAssociationState namedAssociationState
+ )
{
super( associationInfo, associationFunction );
this.namedAssociationState = namedAssociationState;
@@ -66,10 +70,11 @@ public class NamedAssociationInstance<T>
@Override
public boolean put( String name, T entity )
{
+ NullArgumentException.validateNotNull( "entity", entity );
checkImmutable();
checkType( entity );
- ( (ConstraintsCheck) associationInfo ).checkConstraints( entity );
- return namedAssociationState.put( name, getEntityReference( entity ) );
+ associationInfo.checkConstraints( entity );
+ return namedAssociationState.put( name, new EntityReference( ( (Identity) entity ).identity().get() ) );
}
@Override
@@ -102,9 +107,22 @@ public class NamedAssociationInstance<T>
return map;
}
- public Iterable<Map.Entry<String,EntityReference>> getEntityReferences()
+ @Override
+ public Iterable<EntityReference> references()
{
- return Iterables.map( new Function<String, Map.Entry<String,EntityReference>>()
+ return map( new Function<String, EntityReference>()
+ {
+ @Override
+ public EntityReference map( String name )
+ {
+ return namedAssociationState.get( name );
+ }
+ }, namedAssociationState );
+ }
+
+ public Iterable<Map.Entry<String, EntityReference>> getEntityReferences()
+ {
+ return map( new Function<String, Map.Entry<String, EntityReference>>()
{
@Override
public Map.Entry<String, EntityReference> map( final String key )
@@ -133,10 +151,10 @@ public class NamedAssociationInstance<T>
@Override
public boolean equals( Object o )
{
- if( o instanceof Map.Entry)
+ if( o instanceof Map.Entry )
{
Map.Entry other = (Map.Entry) o;
- return key.equals(other.getKey());
+ return key.equals( other.getKey() );
}
return false;
}
@@ -150,5 +168,4 @@ public class NamedAssociationInstance<T>
}
}, namedAssociationState );
}
-
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
index dd1a830..9f63d2c 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2009, Rickard Öberg. All Rights Reserved.
- * Copyright (c) 2013, Niclas Hedhman. All Rights Reserved.
+ * Copyright (c) 2013-2015, Niclas Hedhman. All Rights Reserved.
* Copyright (c) 2013-2015, Paul Merlin. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,9 +16,11 @@
package org.qi4j.runtime.structure;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.qi4j.api.association.AssociationDescriptor;
+import org.qi4j.api.association.AssociationStateHolder;
import org.qi4j.api.common.QualifiedName;
import org.qi4j.api.composite.Composite;
import org.qi4j.api.entity.EntityBuilder;
@@ -27,7 +29,9 @@ import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.entity.Identity;
import org.qi4j.api.entity.IdentityGenerator;
import org.qi4j.api.entity.LifecycleException;
+import org.qi4j.api.property.Property;
import org.qi4j.api.property.PropertyDescriptor;
+import org.qi4j.api.property.StateHolder;
import org.qi4j.api.query.Query;
import org.qi4j.api.query.QueryBuilder;
import org.qi4j.api.query.QueryExecutionException;
@@ -42,18 +46,24 @@ import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
import org.qi4j.api.unitofwork.UnitOfWorkFactory;
import org.qi4j.api.usecase.Usecase;
import org.qi4j.api.util.NullArgumentException;
+import org.qi4j.api.value.ValueBuilder;
+import org.qi4j.api.value.ValueComposite;
import org.qi4j.functional.Function;
import org.qi4j.functional.Iterables;
import org.qi4j.functional.Specification;
+import org.qi4j.runtime.association.AssociationInstance;
+import org.qi4j.runtime.association.ManyAssociationInstance;
+import org.qi4j.runtime.association.NamedAssociationInstance;
import org.qi4j.runtime.composite.FunctionStateResolver;
import org.qi4j.runtime.entity.EntityInstance;
import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.property.PropertyModel;
import org.qi4j.runtime.unitofwork.EntityBuilderInstance;
import org.qi4j.runtime.unitofwork.UnitOfWorkInstance;
-import org.qi4j.runtime.composite.StateResolver;
-import org.qi4j.runtime.value.ValueStateModel;
+import org.qi4j.runtime.value.ValueInstance;
+import org.qi4j.spi.entity.EntityState;
import org.qi4j.spi.entity.EntityStatus;
+import org.qi4j.spi.entity.NamedAssociationState;
import org.qi4j.spi.entitystore.EntityStore;
import org.qi4j.spi.query.EntityFinder;
import org.qi4j.spi.query.EntityFinderException;
@@ -133,7 +143,7 @@ public class ModuleUnitOfWork
}
@Override
- @SuppressWarnings( {"raw", "unchecked"} )
+ @SuppressWarnings( { "raw", "unchecked" } )
public <T> Query<T> newQuery( QueryBuilder<T> queryBuilder )
{
QueryBuilderSPI queryBuilderSPI = (QueryBuilderSPI) queryBuilder;
@@ -235,7 +245,7 @@ public class ModuleUnitOfWork
EntityStore entityStore = model.module().entityStore();
- StateResolver stateResolver = new FunctionStateResolver(
+ FunctionStateResolver stateResolver = new FunctionStateResolver(
propertyFunction, associationFunction, manyAssociationFunction, namedAssociationFunction
);
@@ -314,6 +324,7 @@ public class ModuleUnitOfWork
}
}
+ @SuppressWarnings( "DuplicateThrows" )
@Override
public void complete()
throws UnitOfWorkCompletionException, ConcurrentEntityModificationException
@@ -332,7 +343,7 @@ public class ModuleUnitOfWork
{
discard();
}
-
+
@Override
public boolean isOpen()
{
@@ -403,6 +414,55 @@ public class ModuleUnitOfWork
uow.addEntity( instance );
}
+ @Override
+ public <T extends Identity> T toValue( Class<T> primaryType, T entityComposite )
+ {
+ Function<PropertyDescriptor, Object> propertyFunction = new ToValuePropertyMappingFunction( entityComposite );
+ Function<AssociationDescriptor, EntityReference> assocationFunction = new ToValueAssociationMappingFunction<>( entityComposite );
+ Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToValueManyAssociationMappingFunction<>( entityComposite );
+ Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToValueNameAssociationMappingFunction<>( entityComposite );
+
+ @SuppressWarnings( "unchecked" )
+ ValueBuilder<T> builder = module().newValueBuilderWithState(
+ primaryType, propertyFunction, assocationFunction, manyAssocFunction, namedAssocFunction );
+ return builder.newInstance();
+ }
+
+ @Override
+ public <T extends Identity> T toEntity( Class<T> primaryType, T valueComposite )
+ {
+ Function<PropertyDescriptor, Object> propertyFunction = new ToEntityPropertyMappingFunction<>( valueComposite );
+ Function<AssociationDescriptor, EntityReference> assocationFunction = new ToEntityAssociationMappingFunction<>( valueComposite );
+ Function<AssociationDescriptor, Iterable<EntityReference>> manyAssocFunction = new ToEntityManyAssociationMappingFunction<>( valueComposite );
+ Function<AssociationDescriptor, Map<String, EntityReference>> namedAssocFunction = new ToEntityNameAssociationMappingFunction<>( valueComposite );
+
+ String identity = valueComposite.identity().get();
+ try
+ {
+ T entity = get( primaryType, identity );
+ // If successful, then this entity is to by modified.
+ EntityInstance instance = EntityInstance.entityInstanceOf( (EntityComposite) entity );
+ EntityState state = instance.entityState();
+ FunctionStateResolver stateResolver = new FunctionStateResolver( propertyFunction,
+ assocationFunction,
+ manyAssocFunction,
+ namedAssocFunction );
+ EntityModel model = (EntityModel) EntityInstance.entityInstanceOf( (EntityComposite) entity ).descriptor();
+ stateResolver.populateState( model, state );
+ return entity;
+ }
+ catch( NoSuchEntityException e )
+ {
+ EntityBuilder<T> entityBuilder = newEntityBuilderWithState( primaryType,
+ identity,
+ propertyFunction,
+ assocationFunction,
+ manyAssocFunction,
+ namedAssocFunction );
+ return entityBuilder.newInstance();
+ }
+ }
+
private static class UoWQuerySource implements QuerySource
{
private final ModuleUnitOfWork moduleUnitOfWork;
@@ -533,4 +593,167 @@ public class ModuleUnitOfWork
return "UnitOfWork( " + moduleUnitOfWork.usecase().name() + " )";
}
}
+
+ private class ToValuePropertyMappingFunction
+ implements Function<PropertyDescriptor, Object>
+ {
+ private Object entity;
+
+ public ToValuePropertyMappingFunction( Object entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public Object map( PropertyDescriptor propertyDescriptor )
+ {
+ EntityState entityState = EntityInstance.entityInstanceOf( (EntityComposite) entity ).entityState();
+ return entityState.propertyValueOf( propertyDescriptor.qualifiedName() );
+ }
+ }
+
+ private class ToValueAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, EntityReference>
+ {
+ private final T entity;
+
+ public ToValueAssociationMappingFunction( T entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public EntityReference map( AssociationDescriptor associationDescriptor )
+ {
+ EntityState entityState = EntityInstance.entityInstanceOf( (EntityComposite) entity ).entityState();
+ return entityState.associationValueOf( associationDescriptor.qualifiedName() );
+ }
+ }
+
+ private class ToValueManyAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Iterable<EntityReference>>
+ {
+ private final T entity;
+
+ public ToValueManyAssociationMappingFunction( T entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public Iterable<EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ EntityState entityState = EntityInstance.entityInstanceOf( (EntityComposite) entity ).entityState();
+ return entityState.manyAssociationValueOf( associationDescriptor.qualifiedName() );
+ }
+ }
+
+ private class ToValueNameAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Map<String, EntityReference>>
+ {
+ private final T entity;
+
+ public ToValueNameAssociationMappingFunction( T entity )
+ {
+ this.entity = entity;
+ }
+
+ @Override
+ public Map<String, EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ Map<String, EntityReference> result = new HashMap<>();
+ EntityState entityState = EntityInstance.entityInstanceOf( (EntityComposite) entity ).entityState();
+ final NamedAssociationState state = entityState.namedAssociationValueOf( associationDescriptor.qualifiedName() );
+ for( String name : state )
+ {
+ result.put( name, state.get( name ) );
+ }
+ return result;
+ }
+ }
+
+ private class ToEntityPropertyMappingFunction<T>
+ implements Function<PropertyDescriptor, Object>
+ {
+ private final T value;
+
+ public ToEntityPropertyMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public Object map( PropertyDescriptor propertyDescriptor )
+ {
+ StateHolder state = ValueInstance.valueInstanceOf( (ValueComposite) value ).state();
+ Property<Object> property = state.propertyFor( propertyDescriptor.accessor() );
+ return property.get();
+ }
+ }
+
+ private class ToEntityAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, EntityReference>
+ {
+
+ private final T value;
+
+ public ToEntityAssociationMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public EntityReference map( AssociationDescriptor associationDescriptor )
+ {
+ AssociationStateHolder state = ValueInstance.valueInstanceOf( (ValueComposite) value ).state();
+ AssociationInstance<T> association = (AssociationInstance<T>) state.associationFor( associationDescriptor.accessor() );
+ return association.getAssociationState().get();
+ }
+ }
+
+ private class ToEntityManyAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Iterable<EntityReference>>
+ {
+
+ private final T value;
+
+ public ToEntityManyAssociationMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public Iterable<EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ AssociationStateHolder state = ValueInstance.valueInstanceOf( (ValueComposite) value ).state();
+ ManyAssociationInstance<T> association =
+ (ManyAssociationInstance<T>) state.manyAssociationFor( associationDescriptor.accessor() );
+ return association.getManyAssociationState();
+ }
+ }
+
+ private class ToEntityNameAssociationMappingFunction<T>
+ implements Function<AssociationDescriptor, Map<String, EntityReference>>
+ {
+ private final T value;
+
+ public ToEntityNameAssociationMappingFunction( T value )
+ {
+ this.value = value;
+ }
+
+ @Override
+ public Map<String, EntityReference> map( AssociationDescriptor associationDescriptor )
+ {
+ AssociationStateHolder state = ValueInstance.valueInstanceOf( (ValueComposite) value ).state();
+ NamedAssociationInstance<T> association =
+ (NamedAssociationInstance<T>) state.namedAssociationFor( associationDescriptor.accessor() );
+ HashMap<String, EntityReference> result = new HashMap<>();
+ for( Map.Entry<String, EntityReference> entry : association.getEntityReferences() )
+ {
+ result.put( entry.getKey(), entry.getValue() );
+ }
+ return result;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
index 95c2e92..eae69b1 100644
--- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
+++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/EntityBuilderInstance.java
@@ -16,23 +16,16 @@
*/
package org.qi4j.runtime.unitofwork;
-import java.util.Map;
-import org.qi4j.api.association.AssociationDescriptor;
import org.qi4j.api.common.QualifiedName;
import org.qi4j.api.entity.EntityBuilder;
import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.entity.Identity;
import org.qi4j.api.entity.LifecycleException;
-import org.qi4j.api.property.PropertyDescriptor;
-import org.qi4j.runtime.association.ManyAssociationModel;
-import org.qi4j.runtime.association.NamedAssociationModel;
import org.qi4j.runtime.composite.FunctionStateResolver;
import org.qi4j.runtime.entity.EntityInstance;
import org.qi4j.runtime.entity.EntityModel;
import org.qi4j.runtime.structure.ModelModule;
import org.qi4j.runtime.structure.ModuleUnitOfWork;
-import org.qi4j.runtime.composite.StateResolver;
-import org.qi4j.runtime.value.ValueStateModel;
import org.qi4j.spi.entity.EntityState;
import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
@@ -80,7 +73,7 @@ public final class EntityBuilderInstance<T>
ModuleUnitOfWork uow,
EntityStoreUnitOfWork store,
String identity,
- StateResolver stateResolver
+ FunctionStateResolver stateResolver
)
{
this.model = model;
@@ -92,7 +85,7 @@ public final class EntityBuilderInstance<T>
model.model().initState( model.module(), entityState );
if( stateResolver != null )
{
- (( FunctionStateResolver) stateResolver).populateState( model.model(), entityState );
+ stateResolver.populateState( model.model(), entityState );
}
entityState.setPropertyValue( IDENTITY_STATE_NAME, identity );
prototypeInstance = model.model().newInstance( uow, model.module(), entityState );
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
index 5d699d5..4f6b375 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
@@ -33,6 +33,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
{
module.entities( SimpleName.class );
module.entities( DualFaced.class );
+ module.values( SimpleName.class );
module.values( DualFaced.class );
module.services( MemoryEntityStoreService.class );
module.services( UuidIdentityGeneratorService.class );
@@ -61,7 +62,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
proto.namedSimples().put( "niclas", simpleEntity );
DualFaced faced = builder2.newInstance();
identity2 = faced.identity().get();
- value = spi.toValue( DualFaced.class, faced );
+ value = uow.toValue( DualFaced.class, faced );
assertThat( value.identity().get(), equalTo( identity2 ) );
uow.complete();
}
@@ -83,7 +84,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
.next()
.getValue(), equalTo( EntityReference.parseEntityReference( identity1 ) ) );
- DualFaced resurrected = spi.toEntity( DualFaced.class, value );
+ DualFaced resurrected = uow.toEntity( DualFaced.class, value );
assertThat( resurrected.simple(), equalTo( entity.simple() ) );
assertThat( resurrected.simples(), equalTo( entity.simples() ) );
assertThat( resurrected.namedSimples(), equalTo( entity.namedSimples() ) );
@@ -101,7 +102,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
try (UnitOfWork uow = module.newUnitOfWork())
{
- spi.toEntity( DualFaced.class, value );
+ uow.toEntity( DualFaced.class, value );
uow.complete();
}
@@ -114,6 +115,52 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
}
}
+ @Test
+ public void givenValueWithIdentityAlreadyInStoreWhenConvertingToEntityExpectExistingEntityToBeUpdated()
+ throws UnitOfWorkCompletionException
+ {
+ String identity1;
+ String identity2;
+ DualFaced value;
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ EntityBuilder<SimpleName> builder1 = uow.newEntityBuilder( SimpleName.class );
+ builder1.instance().name().set( "Niclas" );
+ SimpleName simpleEntity = builder1.newInstance();
+ identity1 = simpleEntity.identity().get();
+
+ EntityBuilder<DualFaced> builder2 = uow.newEntityBuilder( DualFaced.class );
+ DualFaced proto = builder2.instance();
+ proto.name().set( "Hedhman" );
+ proto.simple().set( simpleEntity );
+ proto.simples().add( simpleEntity );
+ proto.namedSimples().put( "niclas", simpleEntity );
+ DualFaced faced = builder2.newInstance();
+ identity2 = faced.identity().get();
+ uow.complete();
+ }
+ ValueBuilder<SimpleName> vb1 = module.newValueBuilder( SimpleName.class );
+ vb1.prototype().identity().set( identity1 );
+ vb1.prototype().name().set( "Paul" );
+ SimpleName simpleValue = vb1.newInstance();
+
+ ValueBuilder<DualFaced> vb2 = module.newValueBuilder( DualFaced.class );
+ vb2.prototype().identity().set(identity2);
+ vb2.prototype().name().set("Merlin");
+ vb2.prototype().simple().set( simpleValue );
+ vb2.prototype().simples().add( simpleValue );
+ vb2.prototype().namedSimples().put( "paul", simpleValue );
+ DualFaced dualValue = vb2.newInstance();
+
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ DualFaced dualEntity = uow.toEntity( DualFaced.class, dualValue );
+ assertThat( dualEntity.name().get(), equalTo( "Merlin"));
+ assertThat( dualEntity.simple().get().name().get(), equalTo( "Niclas"));
+ assertThat( dualEntity.simple().get().name().get(), equalTo( "Paul"));
+ }
+ }
+
public interface SimpleName extends Identity
{
Property<String> name();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
index 8b6246f..5345414 100644
--- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
+++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java
@@ -48,6 +48,7 @@ import org.qi4j.api.value.ValueSerializationException;
import org.qi4j.api.value.ValueSerializer;
import org.qi4j.functional.Function;
import org.qi4j.functional.Function2;
+import org.qi4j.spi.Qi4jSPI;
import static org.qi4j.functional.Iterables.first;
@@ -55,29 +56,29 @@ import static org.qi4j.functional.Iterables.first;
* Adapter for pull-parsing capable ValueSerializers.
*
* <p>
- * Among Plain values (see {@link ValueSerializer}) some are considered primitives to underlying serialization
- * mechanisms and by so handed/come without conversion to/from implementations. Primitive values can be one of:
+ * Among Plain values (see {@link ValueSerializer}) some are considered primitives to underlying serialization
+ * mechanisms and by so handed/come without conversion to/from implementations. Primitive values can be one of:
* </p>
* <ul>
- * <li>String,</li>
- * <li>Character or char,</li>
- * <li>Boolean or boolean,</li>
- * <li>Integer or int,</li>
- * <li>Long or long,</li>
- * <li>Short or short,</li>
- * <li>Byte or byte,</li>
- * <li>Float or float,</li>
- * <li>Double or double.</li>
+ * <li>String,</li>
+ * <li>Character or char,</li>
+ * <li>Boolean or boolean,</li>
+ * <li>Integer or int,</li>
+ * <li>Long or long,</li>
+ * <li>Short or short,</li>
+ * <li>Byte or byte,</li>
+ * <li>Float or float,</li>
+ * <li>Double or double.</li>
* </ul>
* <p>
- * Some other Plain values are transformed before being handed to implementations:
+ * Some other Plain values are transformed before being handed to implementations:
* </p>
* <ul>
- * <li>BigInteger and BigDecimal depends on ValueSerializer.{@link Options};</li>
- * <li>Date as a ISO-8601 UTC String;</li>
- * <li>DateTime (JodaTime) as a ISO-8601 String with timezone offset or Z for UTC;</li>
- * <li>LocalDateTime (JodaTime) as a ISO-8601 String with no timezone offset;</li>
- * <li>LocalDate (JodaTime) as a ISO-8601 String with no time info;</li>
+ * <li>BigInteger and BigDecimal depends on ValueSerializer.{@link Options};</li>
+ * <li>Date as a ISO-8601 UTC String;</li>
+ * <li>DateTime (JodaTime) as a ISO-8601 String with timezone offset or Z for UTC;</li>
+ * <li>LocalDateTime (JodaTime) as a ISO-8601 String with no timezone offset;</li>
+ * <li>LocalDate (JodaTime) as a ISO-8601 String with no time info;</li>
* </ul>
*
* @param <OutputType> Implementor output type
@@ -112,8 +113,8 @@ public abstract class ValueSerializerAdapter<OutputType>
/**
* Register a Plain Value type serialization Function.
*
- * @param <T> Plain Value parametrized Type
- * @param type Plain Value Type
+ * @param <T> Plain Value parametrized Type
+ * @param type Plain Value Type
* @param serializer Serialization Function
*/
@SuppressWarnings( "unchecked" )
@@ -125,8 +126,8 @@ public abstract class ValueSerializerAdapter<OutputType>
/**
* Register a Complex Value type serialization Function.
*
- * @param <T> Complex Value parametrized Type
- * @param type Complex Value Type
+ * @param <T> Complex Value parametrized Type
+ * @param type Complex Value Type
* @param serializer Serialization Function
*/
@SuppressWarnings( "unchecked" )
@@ -364,48 +365,48 @@ public abstract class ValueSerializerAdapter<OutputType>
onValue( output, null );
}
else // Registered serializer
- if( serializers.get( object.getClass() ) != null )
- {
- onValue( output, serializers.get( object.getClass() ).map( options, object ) );
- }
- else if( complexSerializers.get( object.getClass() ) != null )
- {
- complexSerializers.get( object.getClass() ).serialize( options, object, output );
- }
- else // ValueComposite
- if( ValueComposite.class.isAssignableFrom( object.getClass() ) )
- {
- serializeValueComposite( options, object, output, rootPass );
- }
- else // EntityComposite
- if( EntityComposite.class.isAssignableFrom( object.getClass() ) )
- {
- serializeEntityComposite( object, output );
- }
- else // Collection - Iterable
- if( Iterable.class.isAssignableFrom( object.getClass() ) )
- {
- serializeIterable( options, object, output );
- }
- else // Array - QUID Remove this and use java serialization for arrays?
- if( object.getClass().isArray() )
- {
- serializeBase64Serializable( object, output );
- }
- else // Map
- if( Map.class.isAssignableFrom( object.getClass() ) )
- {
- serializeMap( options, object, output );
- }
- else // Enum
- if( object.getClass().isEnum() )
- {
- onValue( output, object.toString() );
- }
- else // Fallback to Base64 encoded Java Serialization
- {
- serializeBase64Serializable( object, output );
- }
+ if( serializers.get( object.getClass() ) != null )
+ {
+ onValue( output, serializers.get( object.getClass() ).map( options, object ) );
+ }
+ else if( complexSerializers.get( object.getClass() ) != null )
+ {
+ complexSerializers.get( object.getClass() ).serialize( options, object, output );
+ }
+ else // ValueComposite
+ if( ValueComposite.class.isAssignableFrom( object.getClass() ) )
+ {
+ serializeValueComposite( options, object, output, rootPass );
+ }
+ else // EntityComposite
+ if( EntityComposite.class.isAssignableFrom( object.getClass() ) )
+ {
+ serializeEntityComposite( object, output );
+ }
+ else // Collection - Iterable
+ if( Iterable.class.isAssignableFrom( object.getClass() ) )
+ {
+ serializeIterable( options, object, output );
+ }
+ else // Array - QUID Remove this and use java serialization for arrays?
+ if( object.getClass().isArray() )
+ {
+ serializeBase64Serializable( object, output );
+ }
+ else // Map
+ if( Map.class.isAssignableFrom( object.getClass() ) )
+ {
+ serializeMap( options, object, output );
+ }
+ else // Enum
+ if( object.getClass().isEnum() )
+ {
+ onValue( output, object.toString() );
+ }
+ else // Fallback to Base64 encoded Java Serialization
+ {
+ serializeBase64Serializable( object, output );
+ }
}
private void serializeValueComposite( Options options, Object object, OutputType output, boolean rootPass )
@@ -548,7 +549,7 @@ public abstract class ValueSerializerAdapter<OutputType>
throws Exception
{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
- try( ObjectOutputStream out = new ObjectOutputStream( bout ) )
+ try (ObjectOutputStream out = new ObjectOutputStream( bout ))
{
out.writeUnshared( object );
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundAssociation.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundAssociation.java
index 5c0daf0..b927cc3 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundAssociation.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundAssociation.java
@@ -18,6 +18,7 @@
package org.qi4j.lib.swing.binding.internal;
import org.qi4j.api.association.Association;
+import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
@@ -82,4 +83,10 @@ public final class BoundAssociation<T> extends AbstractBinding<T>
{
//To change body of implemented methods use File | Settings | File Templates.
}
+
+ @Override
+ public EntityReference reference()
+ {
+ return actual.reference();
+ }
}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
index a7dcb0f..892a3d5 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundManyAssociation.java
@@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
@@ -59,6 +60,12 @@ public class BoundManyAssociation<T> extends AbstractBinding<T>
}
@Override
+ public Iterable<EntityReference> references()
+ {
+ return actualAssociations.references();
+ }
+
+ @Override
public int count()
{
return actualAssociations.count();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
index 8e9f187..7becd24 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundNamedAssociation.java
@@ -4,6 +4,7 @@ import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;
import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.entity.EntityReference;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
@@ -75,6 +76,12 @@ public class BoundNamedAssociation<T>
}
@Override
+ public Iterable<EntityReference> references()
+ {
+ return actualAssociations.references();
+ }
+
+ @Override
public Iterator<String> iterator()
{
return actualAssociations.iterator();
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/568fa2ff/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundProperty.java
----------------------------------------------------------------------
diff --git a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundProperty.java b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundProperty.java
index 30a88d6..7d22b44 100644
--- a/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundProperty.java
+++ b/samples/swing/src/main/java/org/qi4j/lib/swing/binding/internal/BoundProperty.java
@@ -17,19 +17,17 @@
*/
package org.qi4j.lib.swing.binding.internal;
+import java.awt.event.FocusListener;
+import java.lang.reflect.Method;
+import javax.swing.JComponent;
import org.qi4j.api.injection.scope.Service;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.Uses;
import org.qi4j.api.object.ObjectFactory;
-import org.qi4j.api.property.GenericPropertyInfo;
import org.qi4j.api.property.Property;
import org.qi4j.lib.swing.binding.Binding;
import org.qi4j.lib.swing.binding.SwingAdapter;
-import javax.swing.*;
-import java.awt.event.FocusListener;
-import java.lang.reflect.Method;
-
public final class BoundProperty<T> extends AbstractBinding<T>
implements Property<T>, Binding
{
@@ -44,7 +42,8 @@ public final class BoundProperty<T> extends AbstractBinding<T>
* @throws IllegalArgumentException Thrown if the specified {@code aMethod} is {@code null}.
*/
public BoundProperty( @Uses Method propertyMethod, @Structure ObjectFactory objectBuilderFactory,
- @Service Iterable<SwingAdapter> allAdapters )
+ @Service Iterable<SwingAdapter> allAdapters
+ )
throws IllegalArgumentException
{
super( propertyMethod, objectBuilderFactory, allAdapters );
[05/14] zest-qi4j git commit: OrgJson Serialization has a bug in the
handling of NamedAssociation. Adding test for that.
Posted by ni...@apache.org.
OrgJson Serialization has a bug in the handling of NamedAssociation. Adding test for that.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/15e1e722
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/15e1e722
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/15e1e722
Branch: refs/heads/develop
Commit: 15e1e72248c7a0b93e3ac5bbb1ba501576e69561
Parents: 29e605a
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Thu May 21 16:20:44 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Thu May 21 16:20:44 2015 +0800
----------------------------------------------------------------------
.../value/ValueSerializationRegressionTest.java | 58 ++++++++++++++++++++
.../runtime/value/ValueWithAssociationTest.java | 52 +++++++++++++++---
2 files changed, 102 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/15e1e722/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
new file mode 100644
index 0000000..5761ff9
--- /dev/null
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueSerializationRegressionTest.java
@@ -0,0 +1,58 @@
+package org.qi4j.runtime.value;
+
+import org.junit.Test;
+import org.qi4j.api.association.Association;
+import org.qi4j.api.association.ManyAssociation;
+import org.qi4j.api.association.NamedAssociation;
+import org.qi4j.api.entity.Identity;
+import org.qi4j.api.property.Property;
+import org.qi4j.api.unitofwork.UnitOfWorkCompletionException;
+import org.qi4j.api.value.ValueBuilder;
+import org.qi4j.api.value.ValueSerialization;
+import org.qi4j.bootstrap.AssemblyException;
+import org.qi4j.bootstrap.ModuleAssembly;
+import org.qi4j.entitystore.memory.MemoryEntityStoreService;
+import org.qi4j.spi.uuid.UuidIdentityGeneratorService;
+import org.qi4j.test.AbstractQi4jTest;
+import org.qi4j.valueserialization.orgjson.OrgJsonValueSerializationService;
+
+public class ValueSerializationRegressionTest extends AbstractQi4jTest
+{
+ @Override
+ public void assemble( ModuleAssembly module )
+ throws AssemblyException
+ {
+ module.entities( SimpleEntity.class );
+ module.entities( DualFaced.class );
+ module.values( DualFaced.class );
+ module.services( MemoryEntityStoreService.class );
+ module.services( UuidIdentityGeneratorService.class );
+ module.services( OrgJsonValueSerializationService.class ).taggedWith( ValueSerialization.Formats.JSON );
+ }
+
+ @Test
+ public void givenNewValueWhenConvertingToEntityExpectNewEntityInStore()
+ throws UnitOfWorkCompletionException
+ {
+ ValueBuilder<DualFaced> builder = module.newValueBuilder( DualFaced.class );
+ builder.prototype().identity().set( "1234" );
+ builder.prototype().name().set( "Hedhman" );
+ DualFaced value = builder.newInstance();
+ }
+
+ public interface SimpleEntity extends Identity
+ {
+ Property<String> name();
+ }
+
+ public interface DualFaced extends Identity
+ {
+ Property<String> name();
+
+ Association<SimpleEntity> simple();
+
+ ManyAssociation<SimpleEntity> simples();
+
+ NamedAssociation<SimpleEntity> namedSimples();
+ }
+}
http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/15e1e722/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
index 2f0fd2c..a7f88b3 100644
--- a/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
+++ b/core/runtime/src/test/java/org/qi4j/runtime/value/ValueWithAssociationTest.java
@@ -31,7 +31,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
public void assemble( ModuleAssembly module )
throws AssemblyException
{
- module.entities( SimpleEntity.class );
+ module.entities( SimpleName.class );
module.entities( DualFaced.class );
module.values( DualFaced.class );
module.services( MemoryEntityStoreService.class );
@@ -39,7 +39,7 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
module.services( OrgJsonValueSerializationService.class ).taggedWith( ValueSerialization.Formats.JSON );
}
- @Test @Ignore
+ @Test
public void givenEntityInStoreWhenFetchEntityReferenceExpectSuccess()
throws UnitOfWorkCompletionException
{
@@ -48,9 +48,9 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
DualFaced value;
try (UnitOfWork uow = module.newUnitOfWork())
{
- EntityBuilder<SimpleEntity> builder1 = uow.newEntityBuilder( SimpleEntity.class );
+ EntityBuilder<SimpleName> builder1 = uow.newEntityBuilder( SimpleName.class );
builder1.instance().name().set( "Niclas" );
- SimpleEntity simpleEntity = builder1.newInstance();
+ SimpleName simpleEntity = builder1.newInstance();
identity1 = simpleEntity.identity().get();
EntityBuilder<DualFaced> builder2 = uow.newEntityBuilder( DualFaced.class );
@@ -114,7 +114,43 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
}
}
- public interface SimpleEntity extends Identity
+ @Test
+ public void givenEntityInStoreWhenConvertingValueExpectEntityToBeUpdated()
+ throws UnitOfWorkCompletionException
+ {
+ String identity1;
+ String identity2;
+ DualFaced value;
+ try (UnitOfWork uow = module.newUnitOfWork())
+ {
+ EntityBuilder<SimpleName> builder1 = uow.newEntityBuilder( SimpleName.class );
+ builder1.instance().name().set( "Niclas" );
+ SimpleName simpleEntity = builder1.newInstance();
+ identity1 = simpleEntity.identity().get();
+
+ EntityBuilder<DualFaced> builder2 = uow.newEntityBuilder( DualFaced.class );
+ DualFaced proto = builder2.instance();
+ proto.name().set( "Hedhman" );
+ proto.simple().set( simpleEntity );
+ proto.simples().add( simpleEntity );
+ proto.namedSimples().put( "niclas", simpleEntity );
+ DualFaced entity = builder2.newInstance();
+ value = spi.toValue( DualFaced.class, entity );
+ uow.complete();
+ }
+
+ SimpleName simple = value.simple().get();
+
+// ValueBuilder<DualFaced> builder = module.newValueBuilder( DualFaced.class );
+// DualFaced prototype = builder.prototype();
+// prototype.name().set( "Paul" );
+// DualFaced value = builder.newInstance();
+// try (UnitOfWork uow = module.newUnitOfWork())
+// {
+// }
+ }
+
+ public interface SimpleName extends Identity
{
Property<String> name();
}
@@ -123,10 +159,10 @@ public class ValueWithAssociationTest extends AbstractQi4jTest
{
Property<String> name();
- Association<SimpleEntity> simple();
+ Association<SimpleName> simple();
- ManyAssociation<SimpleEntity> simples();
+ ManyAssociation<SimpleName> simples();
- NamedAssociation<SimpleEntity> namedSimples();
+ NamedAssociation<SimpleName> namedSimples();
}
}
[14/14] zest-qi4j git commit: Merge branch 'develop' of
https://git-wip-us.apache.org/repos/asf/zest-qi4j into develop
Posted by ni...@apache.org.
Merge branch 'develop' of https://git-wip-us.apache.org/repos/asf/zest-qi4j into develop
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/c59468c7
Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/c59468c7
Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/c59468c7
Branch: refs/heads/develop
Commit: c59468c72c7a8199ca1b07c34f179f83e9e9afcd
Parents: a6eb57f fd0c212
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Wed Jun 10 07:57:27 2015 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Wed Jun 10 07:57:27 2015 +0800
----------------------------------------------------------------------
.gitignore | 2 +-
KEYS | 258 +++++++++++++++++++++++
build.gradle | 43 ++++
doap.rdf | 12 +-
etc/apache-rat-output-to-html.xsl | 204 ++++++++++++++++++
gradle/apache-rat.gradle | 117 ++++++++++
libraries/wrapper/gradle-wrapper.jar | Bin 12292 -> 0 bytes
libraries/wrapper/gradle-wrapper.properties | 11 -
8 files changed, 632 insertions(+), 15 deletions(-)
----------------------------------------------------------------------