use of org.qi4j.samples.forum.domainevent.DomainCommandResult in project qi4j-sdk by Qi4j.
the class ForumAssembler method assemble.
@Override
public ApplicationAssembly assemble(ApplicationAssemblyFactory applicationFactory) throws AssemblyException {
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);
}
return assembly;
}
Aggregations