This section describe a proposal, how can you use Crispy in a AspectJ envionment
It are two problems to solve:
First, you can see the abstract aspect AbstractServiceBuilder:
public abstract aspect AbstractServiceBuilder {
protected IServiceManager serviceManager = null;
/**
* Create a configuration for a ServiceManager-Instance (first problem).
*/
public abstract Properties createProperties();
/**
* Find all service interfaces for the ServiceManager to
* create the Service-Proxy-Instance (second problem).
*/
public abstract pointcut findServices();
/**
* The Advice.
*/
Object around() : findServices() {
serviceManager = new ServiceManager(createProperties());
FieldSignature fieldSignature = (FieldSignature) thisJoinPoint.getSignature();
Class serviceClass = fieldSignature.getFieldType();
Object serviceProxy = serviceManager.createService(serviceClass);
return serviceProxy;
}
}
Second, you can see the concrete implementation from the AbstractServiceBuilder, the ServiceBuilder:
public aspect ServiceBuilder extends AbstractServiceBuilder {
/**
* Capture all read access to fields in the
* net.sf.crispy.extension.aspectj.AspectJExample class, where
* fields from the package test.crispy.example.service.
*/
public pointcut findServices() :
get (test.crispy.example.service.* net.sf.crispy.extension.aspectj.AspectJExample.*);
/**
* Load Properties from a file, where the class is.
*/
public Properties createProperties() {
String propFileName = "aspect-test.properties";
Class propClass = this.getClass();
PropertiesLoader propertiesLoader = new ClassPropertiesLoader(propClass, propFileName);
Properties properties = propertiesLoader.load();
return properties;
}
}
A example class, where the aspects be effective (this example starts your own MiniServer):
public class AspectJExample {
private Echo echo = null;
public Calculator calculator = null;
public String echo (String echoString) {
return echo.echo(echoString);
}
public static void main(String[] args) {
MiniServer miniServer = new MiniRmiServer(1099);
miniServer.addService("test.crispy.example.service.Echo", "test.crispy.example.service.EchoImpl");
miniServer.addService("test.crispy.example.service.Calculator", "test.crispy.example.service.CalculatorImpl");
miniServer.start();
try {
AspectJExample aspectJExample = new AspectJExample();
System.out.println("Echo: " + aspectJExample.echo("Hello Crispy-AspectJ-Echo ..."));
System.out.println("Calculator-add (2+3): " + aspectJExample.calculator.add(2, 3));
} catch (Exception e) {
e.printStackTrace();
}
finally {
miniServer.stop();
}
}
}
The properties:
crispy.prop.server.url=rmi://localhost:1099 crispy.prop.executor.class=net.sf.crispy.impl.RmiExecutor