com.ail.core.command
Class JaninoAccessor

java.lang.Object
  extended by com.ail.core.Type
      extended by com.ail.core.command.AbstractCommand
          extended by com.ail.core.command.Accessor
              extended by com.ail.core.command.JaninoAccessor
All Implemented Interfaces:
ConfigurationOwner, CoreUser, java.io.Serializable, java.lang.Cloneable

public class JaninoAccessor
extends Accessor
implements ConfigurationOwner

This accessor provides access to services implented using Janino. Services that use this accessor either define a script inline (using a Script parameter in the configuration), of they point at a script via a URL (using the Url parameter). Either way, the script is compiled to java byte code by Janino at runtime and the resulting code is invoked by the accssor.

Compilation is only carried on when the service is initially loaded - on the first attemt to execute the service. Once compiled, the resulting class is cached by the accessor for faster access later on.

As used by this accessor, Janino scripts adopt a simple contract: they must define an invoke method which accepts only one argument of a type which is suitable for the command being serviced.

In the following example the command called 'TestCommand' had been bound to the Janino based 'TestService'. The convension within the core is to have a the command class (TestCommand) paired with an argument implementation (TestArgImp); therefore, the invoke method accepts an argument of that type.

 <service name="TestService" builder="CachingClassBuilder" key="com.ail.core.command.JaninoAccessor" >
   <parameter name="Script"><![CDATA[
     import com.ail.coretest.service.TestArgImp;

     public static void invoke(TestArgImp args) {
       if (args.getX()>1000) {
         args.setR(args.getX()-(2*args.getY()));
       }
     }
   ]]></parameter>
 </service>
 
 <command name="TestCommand" builder="ClassBuilder" key="com.ail.coretest.service.TestCommand">
    <parameter name="Service">TestService</parameter>
 </command>
 
The JaninoAccessor supports the concept of inheritance (or extension) between services based on it. The concept of one service 'Extend'ing another is common to all Core accessors, but in the case of the JaninoAccessor the approach adopted is better thought of as a chain. In effect the service which form part of the chain are each invoked in turn by the accessor.

Building on the sample code above, an 'extending' service could be added as follows:

 <service name="TestExtendingService" builder="CachingClassBuilder" key="com.ail.core.command.JaninoAccessor" >
   <parameter name="Extends">TestService</parameter>
   <parameter name="Script"><![CDATA[
     import com.ail.coretest.service.TestArgImp;

     public static void invoke(TestArgImp args) {
       if (args.getX()<1000) {
         args.setR(args.getX()-(4*args.getY()));
       }
     }
   ]]></parameter>
 </service>
 
 <command name="TestExtendingCommand" builder="ClassBuilder" key="com.ail.coretest.service.TestCommand">
    <parameter name="Service">TestExtendingService</parameter>
 </command>
 
The 'Extends' parameter in 'TestExtendingService' tells the accessor to execute the named service before this one - a chain with two links. So in this case invoking the 'TestExtendingCommand' will lead to a 'TestService' being invoked first, and then 'TestExtendingService' being invoked.

Note that the invoke() methods in all the services in a chain must accept an argument of the same type.

Version:
$Revision$
Author:
$Author$
See Also:
Serialized Form

Field Summary
 
Fields inherited from class com.ail.core.Type
jXPathContext, NOT_PERSISTED
 
Constructor Summary
JaninoAccessor()
           
 
Method Summary
 void activate(Core core, Type typeSpec)
           
 CommandArg getArgs()
          Get the argument set associated with this command.
 Configuration getConfiguration()
          Fetch the configuration of the entry point associated with this command.
 java.lang.String getConfigurationNamespace()
          Return the caller's configuration namespace.
 Core getCore()
           
 java.lang.String getExtend()
           
 java.lang.String getScript()
           
 java.security.Principal getSecurityPrincipal()
          Get the callers security principal.
 java.lang.String getUrl()
           
 Version getVersion()
          Fetch the version of the command (entry point) associated with this command.
 VersionEffectiveDate getVersionEffectiveDate()
          The Core uses this callback to determin which versions of artefacts it should use on the CoreUser's behalf.
 void invoke()
          Invoke the command associated with this command object.
 void resetConfiguration()
          Factory reset.
 void setArgs(CommandArg args)
          Update this Command object's arguments with those taken from the command arg passed in.
 void setConfiguration(Configuration properties)
          Update the configuration of the entry point associated with this command.
 void setExtend(java.lang.String extend)
           
 void setScript(java.lang.String script)
           
 void setUrl(java.lang.String url)
           
 
Methods inherited from class com.ail.core.command.Accessor
getLoggingIndicator, getLoggingIndicatorAsString, setLoggingIndicator, setLoggingIndicatorAsString
 
Methods inherited from class com.ail.core.Type
addAttribute, clone, deleteLock, deleteSerialVersion, fetchJXPathContext, getAttribute, getAttribute, getAttributeCount, getForeignSystemId, getLock, getSerialVersion, getSystemId, hasLock, hasSerialVersion, hasSystemId, isPersisted, markAsNotPersisted, mergeWithDataFrom, removeAttribute, removeAttribute, setAttribute, setForeignSystemId, setLock, setSerialVersion, setSystemId, xpathGet, xpathGet, xpathIterate, xpathSet
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

JaninoAccessor

public JaninoAccessor()
Method Detail

setArgs

public void setArgs(CommandArg args)
Description copied from class: AbstractCommand
Update this Command object's arguments with those taken from the command arg passed in. This is in effect a bulk setter. This interface will be implemented by beans that have many more getters/setters to support their properties. The implementations of this method take 'that', and pull all the relevant properties into this.

Specified by:
setArgs in class AbstractCommand
Parameters:
args - Source for arguments

getArgs

public CommandArg getArgs()
Description copied from class: AbstractCommand
Get the argument set associated with this command.

Specified by:
getArgs in class AbstractCommand
Returns:
This objects arguments.

activate

public void activate(Core core,
                     Type typeSpec)

invoke

public void invoke()
            throws BaseException
Description copied from class: AbstractCommand
Invoke the command associated with this command object. Before invoke is called, the command object must be populated with all the information (parameters) needed to invoke the service via the command object's setters. Once invoke has been called, the object's getters are used to retrieve the results.

Specified by:
invoke in class AbstractCommand
Throws:
BaseException

getVersion

public Version getVersion()
Description copied from class: AbstractCommand
Fetch the version of the command (entry point) associated with this command. This is similar to the 'invoke' entry point in that control is passed to the entry point object. In this case to the getVersion() method.

Note: This method does not return the version of the command.

Specified by:
getVersion in class AbstractCommand
Returns:
The version of the entry point.

getConfiguration

public Configuration getConfiguration()
Description copied from class: AbstractCommand
Fetch the configuration of the entry point associated with this command. This is similar to invoke in that control is passed to the entry point object, in this case to the getConfiguration method. Note: This method does not return the configuration of the command object.

Specified by:
getConfiguration in interface ConfigurationOwner
Specified by:
getConfiguration in class AbstractCommand
Returns:
The entry point's configuration.

setConfiguration

public void setConfiguration(Configuration properties)
Description copied from class: AbstractCommand
Update the configuration of the entry point associated with this command. This is similar to the invoke method in that control is pass to the entry point object, in this case to its setConfiguration method. Note: This method does not set the configuration of the command object.

Specified by:
setConfiguration in interface ConfigurationOwner
Specified by:
setConfiguration in class AbstractCommand
Parameters:
properties - Properties to replace the current configuration.

setScript

public void setScript(java.lang.String script)

getScript

public java.lang.String getScript()

setUrl

public void setUrl(java.lang.String url)

getUrl

public java.lang.String getUrl()

getVersionEffectiveDate

public VersionEffectiveDate getVersionEffectiveDate()
Description copied from interface: CoreUser
The Core uses this callback to determin which versions of artefacts it should use on the CoreUser's behalf.

Specified by:
getVersionEffectiveDate in interface CoreUser
Returns:
The version date that the CoreUser is working at.

getSecurityPrincipal

public java.security.Principal getSecurityPrincipal()
Description copied from interface: CoreUser
Get the callers security principal.

Specified by:
getSecurityPrincipal in interface CoreUser
Returns:
The callers security principal

getConfigurationNamespace

public java.lang.String getConfigurationNamespace()
Return the caller's configuration namespace.

Specified by:
getConfigurationNamespace in interface CoreUser
Returns:
Caller's namespace

resetConfiguration

public void resetConfiguration()
Description copied from interface: ConfigurationOwner
Factory reset. Reset the configuration to the factory defaults.

Specified by:
resetConfiguration in interface ConfigurationOwner

getCore

public Core getCore()

getExtend

public java.lang.String getExtend()

setExtend

public void setExtend(java.lang.String extend)