Hello,

Today I tried to write a mixin which will be able to copy properties' values from existing entity to another entity prototype.

I want to do this:
       uow = assembler.module().unitOfWorkFactory().newUnitOfWork();
       Directory directory = filesystem.requestDirectory( "/etc/" );
EntityBuilder<Directory> entityBuilder = uow.newEntityBuilder( Directory.class );
       directory.copyPropertiesTo( entityBuilder.instance() );
       Directory newDir = entityBuilder.newInstance();
       Assert.assertEquals( "etc", newDir.name().get() );

Here is my copying mixin:

@Mixins(WithEntityCopying.WithEntityCopyingMixin.class)
public interface WithEntityCopying<T>
       extends WithCopying<T>
{

   class WithEntityCopyingMixin<T>
           implements WithEntityCopying<T>
   {

       @State
       private StateHolder stateHolder;

       public void copyPropertiesTo( final T prototype )
       {
final EntityInstance destination = (EntityInstance) Proxy.getInvocationHandler( prototype );

           this.stateHolder.visitProperties( new StateHolder.StateVisitor()
           {

               @Override
public void visitProperty( QualifiedName name, Object value )
               {
                   destination.state().getProperty( name ).set( value );

               }

           } );
       };
   }
}

Unfortunately this code crashes with NPE thrown from org.qi4j.runtime.property.PropertiesInstance 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.

Cheers,
Krzysztof

_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to