blob: 504f52dccceb038fe5ea11b6b0743fd112416198 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.zest.bootstrap;
import org.apache.zest.api.activation.ActivationException;
import org.apache.zest.api.common.Visibility;
import org.apache.zest.api.property.Property;
import org.apache.zest.api.service.importer.InstanceImporter;
import org.apache.zest.api.service.importer.NewObjectImporter;
import org.apache.zest.api.structure.Application;
import org.apache.zest.api.structure.ApplicationDescriptor;
import org.apache.zest.api.structure.Module;
import org.apache.zest.functional.Iterables;
import org.apache.zest.functional.Specification;
public class DocumentationSupport
{
public static Specification<ObjectAssembly> hasMyTypeSpecification = new Specification<ObjectAssembly>()
{
public boolean satisfiedBy( ObjectAssembly item )
{
return Iterables.toList( item.types() ).contains( String.class );
}
};
public static class objects
implements Assembler
{
public static class MyObject {}
// START SNIPPET: objects
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.objects( MyObject.class ).visibleIn( Visibility.layer );
}
// END SNIPPET: objects
}
public static class transients
implements Assembler
{
public static interface MyTransient {}
// START SNIPPET: transients
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.transients( MyTransient.class ).visibleIn( Visibility.layer );
}
// END SNIPPET: transients
}
public static class values
implements Assembler
{
public static interface MyValue {}
// START SNIPPET: values
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.values( MyValue.class ).visibleIn( Visibility.layer );
}
// END SNIPPET: values
}
public static class entities
implements Assembler
{
public static interface MyEntity {}
// START SNIPPET: entities
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.entities( MyEntity.class ).visibleIn( Visibility.layer );
}
// END SNIPPET: entities
}
public static class services
implements Assembler
{
public static interface MyService {}
// START SNIPPET: services
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.services( MyService.class ).visibleIn( Visibility.layer );
}
// END SNIPPET: services
}
public static class taggedServices
implements Assembler
{
public static interface MyService {}
// START SNIPPET: tagged-services
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.services( MyService.class ).taggedWith( "foo", "bar" );
}
// END SNIPPET: tagged-services
}
public static class importedServices
implements Assembler
{
public static class MyService {}
// START SNIPPET: imported-services
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.importedServices( MyService.class ).
importedBy( InstanceImporter.class ).
setMetaInfo( new MyService() );
// OR
module.objects( MyService.class );
module.importedServices( MyService.class ).
importedBy( NewObjectImporter.class );
}
// END SNIPPET: imported-services
}
public static class defaultPropertyValues
implements Assembler
{
public interface MyValue { Property<String> foo(); }
public interface MyEntity { Property<String> cathedral(); }
// START SNIPPET: properties-defaults
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.values( MyValue.class );
MyValue myValueDefaults = module.forMixin( MyValue.class ).declareDefaults();
myValueDefaults.foo().set( "bar" );
module.entities( MyEntity.class );
MyEntity myEntityDefaults = module.forMixin( MyEntity.class ).declareDefaults();
myEntityDefaults.cathedral().set( "bazar" );
}
// END SNIPPET: properties-defaults
}
public static class singleton
{
public interface MyService { }
public interface Stuff { }
void singleton()
throws ActivationException, AssemblyException
{
// START SNIPPET: singleton
SingletonAssembler assembler = new SingletonAssembler()
{
@Override
public void assemble( ModuleAssembly module )
throws AssemblyException
{
module.services( MyService.class ).identifiedBy( "Foo" );
module.services( MyService.class ).identifiedBy( "Bar" );
module.objects( Stuff.class );
}
};
Module module = assembler.module();
Stuff stuff = module.newObject( Stuff.class );
// END SNIPPET: singleton
}
}
public static class pancake
{
public static class LoginAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class MenuAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class PerspectivesAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class ViewsAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class ReportingAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class PdfAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class BookkeepingAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class CashFlowAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class BalanceSheetAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class PricingAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class ProductAssembler implements Assembler { public void assemble( ModuleAssembly module ) throws AssemblyException { } }
private static Energy4Java qi4j;
// START SNIPPET: pancake
public static void main( String[] args )
throws Exception
{
qi4j = new Energy4Java();
Assembler[][][] assemblers = new Assembler[][][]{
{ // View Layer
{ // Login Module
new LoginAssembler()
// :
},
{ // Main Workbench Module
new MenuAssembler(),
new PerspectivesAssembler(),
new ViewsAssembler()
// :
},
{ // Printing Module
new ReportingAssembler(),
new PdfAssembler()
// :
}
},
{ // Application Layer
{ // Accounting Module
new BookkeepingAssembler(),
new CashFlowAssembler(),
new BalanceSheetAssembler()
// :
},
{ // Inventory Module
new PricingAssembler(),
new ProductAssembler()
// :
}
},
{ // Domain Layer
// :
},
{ // Infrastructure Layer
// :
}
};
ApplicationDescriptor model = newApplication( assemblers );
Application runtime = model.newInstance( qi4j.spi() );
runtime.activate();
}
private static ApplicationDescriptor newApplication( final Assembler[][][] assemblers )
throws AssemblyException
{
return qi4j.newApplicationModel( new ApplicationAssembler()
{
@Override
public ApplicationAssembly assemble( ApplicationAssemblyFactory appFactory )
throws AssemblyException
{
return appFactory.newApplicationAssembly( assemblers );
}
} );
}
// END SNIPPET: pancake
}
public static class full
{
public static class CustomerViewComposite{}
public static class CustomerEditComposite{}
public static class CustomerListViewComposite{}
public static class CustomerSearchComposite{}
public static class CustomerEntity{}
public static class CountryEntity{}
public static class AddressValue{}
public static class LdapAuthenticationAssembler implements Assembler{ public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class ThrinkAuthorizationAssembler implements Assembler{ public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class UserTrackingAuditAssembler implements Assembler{ public void assemble( ModuleAssembly module ) throws AssemblyException { } }
public static class NeoAssembler implements Assembler{ NeoAssembler( String path ) {} public void assemble( ModuleAssembly module ) throws AssemblyException { } }
// START SNIPPET: full
private static Energy4Java qi4j;
private static Application application;
public static void main( String[] args )
throws Exception
{
// Create a Zest Runtime
qi4j = new Energy4Java();
application = qi4j.newApplication( new ApplicationAssembler()
{
@Override
public ApplicationAssembly assemble( ApplicationAssemblyFactory appFactory )
throws AssemblyException
{
ApplicationAssembly assembly = appFactory.newApplicationAssembly();
buildAssembly( assembly );
return assembly;
}
} );
// activate the application
application.activate();
}
static void buildAssembly( ApplicationAssembly app ) throws AssemblyException
{
LayerAssembly webLayer = createWebLayer( app );
LayerAssembly domainLayer = createDomainLayer( app );
LayerAssembly persistenceLayer = createInfrastructureLayer( app );
LayerAssembly authLayer = createAuth2Layer( app );
LayerAssembly messagingLayer = createMessagingLayer( app );
webLayer.uses( domainLayer );
domainLayer.uses( authLayer );
domainLayer.uses( persistenceLayer );
domainLayer.uses( messagingLayer );
}
static LayerAssembly createWebLayer( ApplicationAssembly app ) throws AssemblyException
{
LayerAssembly layer = app.layer( "web-layer" );
createCustomerWebModule( layer );
return layer;
}
static LayerAssembly createDomainLayer( ApplicationAssembly app ) throws AssemblyException
{
LayerAssembly layer = app.layer( "domain-layer" );
createCustomerDomainModule( layer );
// :
// :
return layer;
}
static LayerAssembly createInfrastructureLayer( ApplicationAssembly app ) throws AssemblyException
{
LayerAssembly layer = app.layer( "infrastructure-layer" );
createPersistenceModule( layer );
return layer;
}
static LayerAssembly createMessagingLayer( ApplicationAssembly app ) throws AssemblyException
{
LayerAssembly layer = app.layer( "messaging-layer" );
createWebServiceModule( layer );
createMessagingPersistenceModule( layer );
return layer;
}
static LayerAssembly createAuth2Layer( ApplicationAssembly application ) throws AssemblyException
{
LayerAssembly layer = application.layer( "auth2-layer" );
createAuthModule( layer );
return layer;
}
static void createCustomerWebModule( LayerAssembly layer ) throws AssemblyException
{
ModuleAssembly assembly = layer.module( "customer-web-module" );
assembly.transients( CustomerViewComposite.class, CustomerEditComposite.class,
CustomerListViewComposite.class, CustomerSearchComposite.class );
}
static void createCustomerDomainModule( LayerAssembly layer ) throws AssemblyException
{
ModuleAssembly assembly = layer.module( "customer-domain-module" );
assembly.entities( CustomerEntity.class, CountryEntity.class );
assembly.values( AddressValue.class );
}
static void createAuthModule( LayerAssembly layer ) throws AssemblyException
{
ModuleAssembly assembly = layer.module( "auth-module" );
new LdapAuthenticationAssembler().assemble( assembly );
new ThrinkAuthorizationAssembler().assemble( assembly );
new UserTrackingAuditAssembler().assemble( assembly );
}
static void createPersistenceModule( LayerAssembly layer ) throws AssemblyException
{
ModuleAssembly assembly = layer.module( "persistence-module" );
// Someone has created an assembler for the Neo EntityStore
new NeoAssembler( "./neostore" ).assemble( assembly );
}
// END SNIPPET: full
private static void createWebServiceModule( LayerAssembly layer ) throws AssemblyException
{
}
private static void createMessagingPersistenceModule( LayerAssembly layer ) throws AssemblyException
{
}
}
}