Niclas Hedhman pisze:
2009/9/22 Krzysztof Białek <[email protected]>:

I looked at the core code and found that maybe EntityPropertyInstance should
override visitProperties method.
After overriding it as shown below it works fine.
  public void visitProperties( StateVisitor visitor )
  {
      for ( EntityPropertyModel propertyModel : this.model.properties() )
      {
          QualifiedName qualifiedName = propertyModel.qualifiedName();
          visitor.visitProperty( qualifiedName,
this.entityState.getProperty( qualifiedName ) );
      }
  }

I'm still learning Qi4j so it's highly probable I'm doing something wrong or
against the concept.

I think you are right, and your use-case has just not been seen before.

That said, I think Rickard is doing this kind of copying "allllll the
time" between entities and values, so perhaps he has some opinion on
what is the best way to do it. Meanwhile, I will fix the code per your
suggestion.


Cheers
I came across this same NPE problem with EntityState when visiting associations and many-associations. Thus I made an attempt to fix this by using model where possible. I changed several files, so I send you these changes for review in git diff format.

Cheers

diff --git a/runtime/src/main/java/org/qi4j/runtime/entity/EntityPropertiesInstance.java b/runtime/src/main/java/org/qi4j/runtime/entity/EntityPropertiesInstance.java
index 4b9b75e..a83fddc 100644
--- a/runtime/src/main/java/org/qi4j/runtime/entity/EntityPropertiesInstance.java
+++ b/runtime/src/main/java/org/qi4j/runtime/entity/EntityPropertiesInstance.java
@@ -15,7 +15,6 @@
 package org.qi4j.runtime.entity;
 
 import java.lang.reflect.Method;
-import java.util.HashMap;
 import org.qi4j.api.common.QualifiedName;
 import org.qi4j.api.property.Property;
 import org.qi4j.runtime.property.PropertiesInstance;
@@ -24,8 +23,8 @@ import org.qi4j.spi.entity.EntityState;
 /**
  * JAVADOC
  */
-public class EntityPropertiesInstance
-    extends PropertiesInstance
+public final class EntityPropertiesInstance
+        extends PropertiesInstance
 {
     private EntityPropertiesModel model;
     private EntityState entityState;
@@ -39,12 +38,7 @@ public class EntityPropertiesInstance
 
     public <T> Property<T> getProperty( Method accessor )
     {
-        if( properties == null )
-        {
-            properties = new HashMap<Method, Property<?>>();
-        }
-
-        Property<T> property = (Property<T>) properties.get( accessor );
+        Property<T> property = super.getProperty( accessor );
 
         if( property == null )
         {
@@ -58,37 +52,24 @@ public class EntityPropertiesInstance
     @Override
     public <T> Property<T> getProperty( QualifiedName name )
     {
-        if( properties == null )
-        {
-            properties = new HashMap<Method, Property<?>>();
-        }
-
         Property<T> property = super.getProperty( name );
 
         if( property == null )
         {
-            for( EntityPropertyModel propertyType : model.properties() )
-            {
-                if( propertyType.qualifiedName().equals( name ) )
-                {
-                    property = getProperty( propertyType.accessor() );
-                }
-            }
+            Method accessor = model.getPropertyByQualifiedName( name ).accessor();
+            property = getProperty( accessor );
         }
 
         return property;
     }
 
-
     @Override
     public void visitProperties( StateVisitor visitor )
     {
         for( EntityPropertyModel propertyModel : model.properties() )
         {
             QualifiedName qualifiedName = propertyModel.qualifiedName();
-
-            // Should this.getProperty( qualifiedName ) be called instead??
-            Object value = entityState.getProperty( qualifiedName );
+            Object value = this.getProperty( qualifiedName ).get();
             visitor.visitProperty( qualifiedName, value );
         }
     }
diff --git a/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityAssociationsInstance.java b/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityAssociationsInstance.java
index 2270273..33047d8 100644
--- a/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityAssociationsInstance.java
+++ b/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityAssociationsInstance.java
@@ -17,10 +17,12 @@ package org.qi4j.runtime.entity.association;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
+import org.qi4j.api.common.QualifiedName;
 import org.qi4j.api.entity.association.Association;
 import org.qi4j.api.entity.association.EntityStateHolder;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.association.AssociationDescriptor;
 
 /**
  * Collection of Property instances.
@@ -64,9 +66,11 @@ public final class EntityAssociationsInstance
 
     public void visitAssociations( EntityStateHolder.EntityStateVisitor visitor )
     {
-        for( Association<?> association : associations.values() )
+        for( AssociationDescriptor associationDescriptor : model.associations() )
         {
-            visitor.visitAssociation( association.qualifiedName(), association );
+            QualifiedName qualifiedName = associationDescriptor.qualifiedName();
+            Method accessor = associationDescriptor.accessor();
+            visitor.visitAssociation( qualifiedName, this.associationFor( accessor ) );
         }
     }
 }
\ No newline at end of file
diff --git a/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityManyAssociationsInstance.java b/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityManyAssociationsInstance.java
index f3d9399..3d514c3 100644
--- a/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityManyAssociationsInstance.java
+++ b/runtime/src/main/java/org/qi4j/runtime/entity/association/EntityManyAssociationsInstance.java
@@ -17,10 +17,12 @@ package org.qi4j.runtime.entity.association;
 import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
+import org.qi4j.api.common.QualifiedName;
 import org.qi4j.api.entity.association.EntityStateHolder;
 import org.qi4j.api.entity.association.ManyAssociation;
 import org.qi4j.runtime.structure.ModuleUnitOfWork;
 import org.qi4j.spi.entity.EntityState;
+import org.qi4j.spi.entity.association.ManyAssociationDescriptor;
 
 /**
  * Collection of Property instances.
@@ -64,9 +66,11 @@ public final class EntityManyAssociationsInstance
 
     public void visitManyAssociations( EntityStateHolder.EntityStateVisitor visitor )
     {
-        for( ManyAssociation<?> manyAssociation : manyAssociations.values() )
+        for( ManyAssociationDescriptor associationDescriptor : model.manyAssociations() )
         {
-            visitor.visitManyAssociation( manyAssociation.qualifiedName(), manyAssociation );
+            QualifiedName qualifiedName = associationDescriptor.qualifiedName();
+            Method accessor = associationDescriptor.accessor();
+            visitor.visitAssociation( qualifiedName, this.manyAssociationFor( accessor ) );
         }
     }
 }
\ No newline at end of file
diff --git a/runtime/src/main/java/org/qi4j/runtime/property/PropertiesInstance.java b/runtime/src/main/java/org/qi4j/runtime/property/PropertiesInstance.java
index 60df128..5747c8a 100644
--- a/runtime/src/main/java/org/qi4j/runtime/property/PropertiesInstance.java
+++ b/runtime/src/main/java/org/qi4j/runtime/property/PropertiesInstance.java
@@ -15,6 +15,7 @@
 package org.qi4j.runtime.property;
 
 import java.lang.reflect.Method;
+import java.util.HashMap;
 import java.util.Map;
 import org.qi4j.api.common.QualifiedName;
 import org.qi4j.api.property.Property;
@@ -24,7 +25,7 @@ import org.qi4j.api.property.StateHolder;
  * Collection of Property instances.
  */
 public class PropertiesInstance
-    implements StateHolder
+        implements StateHolder
 {
     protected Map<Method, Property<?>> properties;
 
@@ -35,11 +36,21 @@ public class PropertiesInstance
 
     public <T> Property<T> getProperty( Method propertyMethod )
     {
+        if( properties == null )
+        {
+            properties = new HashMap<Method, Property<?>>();
+        }
+
         return (Property<T>) properties.get( propertyMethod );
     }
 
     public <T> Property<T> getProperty( QualifiedName name )
     {
+        if( properties == null )
+        {
+            properties = new HashMap<Method, Property<?>>();
+        }
+
         for( Property property : properties.values() )
         {
             if( property.qualifiedName().equals( name ) )
_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to