blob: adf610e594ea0a264d27beee8a56b84196e746ff [file] [log] [blame]
package org.qi4j.tools.shell.model;
import java.util.List;
import org.qi4j.api.association.Association;
import org.qi4j.api.association.ManyAssociation;
import org.qi4j.api.common.UseDefaults;
import org.qi4j.api.entity.Aggregated;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.This;
import org.qi4j.api.mixin.Mixins;
import org.qi4j.api.property.Property;
import org.qi4j.api.unitofwork.UnitOfWork;
import org.qi4j.api.unitofwork.UnitOfWorkFactory;
import org.qi4j.api.unitofwork.concern.UnitOfWorkPropagation;
import org.qi4j.tools.shell.StringUtils;
@Mixins( Layer.Mixin.class )
public interface Layer extends Nameable
{
// Commands
void usesLayer( String layer );
void createModule( String moduleName );
// Queries
Iterable<String> uses();
String packageName();
interface State
{
@UseDefaults
Property<String> packageName();
@UseDefaults
@Aggregated
ManyAssociation<Module> modules();
@UseDefaults
Property<List<String>> uses();
}
abstract class Mixin
implements Layer
{
@This
private Layer self;
@This
private State state;
@Structure
private UnitOfWorkFactory uowf;
@Override
public Iterable<String> uses()
{
return state.uses().get();
}
@Override
public String packageName()
{
return state.packageName().get();
}
@Override
@UnitOfWorkPropagation
public void createModule( String moduleName )
{
UnitOfWork uow = uowf.currentUnitOfWork();
Nameable.Support.create( uow, Module.class, self, moduleName );
Module module = Nameable.Support.get( uow, Module.class, self, moduleName );
state.modules().add( module );
}
@Override
public void usesLayer( String layer )
{
state.uses().get().add( layer );
}
}
}