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