{
ApplicationAssembly assembly = applicationFactory.newApplicationAssembly();
assembly.setName( "Forum" );
LayerAssembly configuration = assembly.layer( "Configuration" );
{
ModuleAssembly configModule = configuration.module( "Configuration" );
configModule.entities( NeoConfiguration.class ).visibleIn( Visibility.application );
configModule.services( MemoryEntityStoreService.class );
configModule.services( UuidIdentityGeneratorService.class );
new OrgJsonValueSerializationAssembler().assemble( configModule );
}
LayerAssembly infrastructure = assembly.layer( "Infrastructure" ).uses( configuration );
{
ModuleAssembly entityStore = infrastructure.module( "EntityStore" );
entityStore.services( FileConfigurationService.class );
entityStore.services( NeoEntityStoreService.class ).visibleIn( Visibility.application );
entityStore.services( UuidIdentityGeneratorService.class ).visibleIn( Visibility.application );
new OrgJsonValueSerializationAssembler().
visibleIn( Visibility.application ).
withValuesModuleFinder( new Function<Application, Module>()
{
@Override
public Module map( Application app )
{
return app.findModule( "REST", "Values" );
}
} ).
assemble( entityStore );
}
LayerAssembly data = assembly.layer( "Data" ).uses( infrastructure );
{
ModuleAssembly forum = data.module( "Forum" );
for( Class<?> dataClass : filter( hasModifier( Modifier.INTERFACE ), filter( isAssignableFrom( EntityComposite.class ), ClassScanner
.findClasses( User.class ) ) ) )
{
forum.entities( dataClass ).visibleIn( Visibility.application );
}
}
LayerAssembly context = assembly.layer( "Context" ).uses( data );
{
ModuleAssembly contexts = context.module( "Context" );
for( Class<?> contextClass : filter( not( hasModifier( Modifier.INTERFACE ) ), ClassScanner.findClasses( Context.class ) ) )
{
if( contextClass.getName().contains( "$" ) )
{
contexts.transients( contextClass ).visibleIn( Visibility.application );
}
else
{
contexts.objects( contextClass ).visibleIn( Visibility.application );
}
}
for( Class<?> valueClass : filter( isAssignableFrom( ValueComposite.class ), ClassScanner.findClasses( Context.class ) ) )
{
contexts.values( valueClass ).visibleIn( Visibility.application );
}
contexts.services( EventsService.class );
context.module( "Domain events" )
.values( DomainEventValue.class, ParameterValue.class )
.visibleIn( Visibility.application );
}
LayerAssembly services = assembly.layer( "Service" ).uses( data );
{
ModuleAssembly bootstrap = services.module( "Bootstrap" );
bootstrap.services( BootstrapData.class ).identifiedBy( "bootstrap" ).instantiateOnStartup();
}
LayerAssembly rest = assembly.layer( "REST" ).uses( context, data );
{
ModuleAssembly values = rest.module( "Values" );
{
new ValueAssembler().assemble( values );
}
ModuleAssembly transformation = rest.module( "Transformation" );
{
new RestServerAssembler().assemble( transformation );
transformation.objects( RequestReaderDelegator.class, ResponseWriterDelegator.class )
.visibleIn( Visibility.layer );
new OrgJsonValueSerializationAssembler().assemble( transformation );
}
ModuleAssembly resources = rest.module( "Resources" );
for( Class<?> resourceClass : ClassScanner.findClasses( RootResource.class ) )
{
resources.objects( resourceClass ).visibleIn( Visibility.layer );
}
ModuleAssembly restlet = rest.module( "Restlet" );
restlet.objects( ForumRestlet.class );
restlet.importedServices( CommandResult.class ).setMetaInfo( new DomainCommandResult() );
restlet.importedServices( MetadataService.class );
}