Class Dispatcher
- java.lang.Object
-
- javacard.framework.service.Dispatcher
-
public class Dispatcher extends Object
ADispatcheris used to build an application by aggregating several services.The dispatcher maintains a registry of
Serviceobjects. AServiceis categorized by the type of processing it performs:- A pre-processing service pre-processes input data for the command being processed.
It is associated with the
PROCESS_INPUT_DATAphase. - A command processing service processes the input data and generates output
data. It is associated with the
PROCESS_COMMANDphase. - A post-processing service post-processes the generated output data.
It is associated with the
PROCESS_OUTPUT_DATAphase.
APDUobject containing the command being processed to the registered services. - A pre-processing service pre-processes input data for the command being processed.
It is associated with the
-
-
Field Summary
Fields Modifier and Type Field Description static bytePROCESS_COMMANDIdentifies the main command processing phase.static bytePROCESS_INPUT_DATAIdentifies the input data processing phase.static bytePROCESS_NONEIdentifies the null processing phase.static bytePROCESS_OUTPUT_DATAIdentifies the output data processing phase.
-
Constructor Summary
Constructors Constructor Description Dispatcher(short maxServices)Creates aDispatcherwith a designated maximum number of services.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddService(Service service, byte phase)Atomically adds the specified service to the dispatcher registry for the specified processing phase.Exceptiondispatch(APDU command, byte phase)Manages the processing of the command in theAPDUobject.voidprocess(APDU command)Manages the entire processing of the command in the APDU object input parameter.voidremoveService(Service service, byte phase)Atomically removes the specified service for the specified processing phase from the dispatcher registry.
-
-
-
Field Detail
-
PROCESS_NONE
public static final byte PROCESS_NONE
Identifies the null processing phase.- See Also:
- Constant Field Values
-
PROCESS_INPUT_DATA
public static final byte PROCESS_INPUT_DATA
Identifies the input data processing phase.- See Also:
- Constant Field Values
-
PROCESS_COMMAND
public static final byte PROCESS_COMMAND
Identifies the main command processing phase.- See Also:
- Constant Field Values
-
PROCESS_OUTPUT_DATA
public static final byte PROCESS_OUTPUT_DATA
Identifies the output data processing phase.- See Also:
- Constant Field Values
-
-
Constructor Detail
-
Dispatcher
public Dispatcher(short maxServices) throws ServiceExceptionCreates aDispatcherwith a designated maximum number of services.- Parameters:
maxServices- the maximum number of services that can be registered to this dispatcher- Throws:
ServiceException- with the following reason code:ServiceException.ILLEGAL_PARAMif the maxServices parameter is negative.
-
-
Method Detail
-
addService
public void addService(Service service, byte phase) throws ServiceException
Atomically adds the specified service to the dispatcher registry for the specified processing phase. Services are invoked in the order in which they are added to the registry during the processing of that phase. If the requested service is already registered for the specified processing phase, this method does nothing.- Parameters:
service- the Service to be added to the dispatcherphase- the processing phase associated with this service- Throws:
ServiceException- with the following reason code:ServiceException.DISPATCH_TABLE_FULLif the maximum number of registered services is exceeded.ServiceException.ILLEGAL_PARAMif the phase parameter is undefined or if the service parameter is null.
-
removeService
public void removeService(Service service, byte phase) throws ServiceException
Atomically removes the specified service for the specified processing phase from the dispatcher registry. Upon removal, the slot used by the specified service in the dispatcher registry is available for re-use. If the specified service is not registered for the specified processing phase, this method does nothing.- Parameters:
service- theServiceto be deleted from the dispatcherphase- the processing phase associated with this service- Throws:
ServiceException- with the following reason code:ServiceException.ILLEGAL_PARAMif the phase parameter is unknown or if the service parameter is null.
-
dispatch
public Exception dispatch(APDU command, byte phase) throws ServiceException
Manages the processing of the command in theAPDUobject. This method is called when only partial processing using the registered services is required or when the APDU response following an error during the processing needs to be controlled.It sequences through the registered services by calling the appropriate processing methods. Processing starts with the phase indicated in the input parameter. Services registered for that processing phase are called in the sequence in which they were registered until all the services for the processing phase have been called or a service indicates that processing for that phase is complete by returning
truefrom its processing method. The dispatcher then processes the next phases in a similar manner until all the phases have been processed. ThePROCESS_OUTPUT_DATAprocessing phase is performed only if the command processing has completed normally (APDUobject state isAPDU.STATE_OUTGOING).The processing sequence is
PROCESS_INPUT_DATAphase, followed by thePROCESS_COMMANDphase and lastly thePROCESS_OUTPUT_DATA. The processing is performed as follows:PROCESS_INPUT_DATAphase invokes theService.processDataIn(APDU)methodPROCESS_COMMANDphase invokes theService.processCommand(APDU)methodPROCESS_OUTPUT_DATAphase invokes theService.processDataOut(APDU)method
BasicService, is sent usingAPDU.sendBytesand the response status is generated by throwing anISOExceptionexception. If the command could not be processed,nullis returned. If any exception is thrown by a Service during the processing, that exception is returned.- Parameters:
command- the APDU object containing the command to be processedphase- the processing phase to perform first- Returns:
- an exception that occurred during the processing of the command,
or
nullif the command could not be processed - Throws:
ServiceException- with the following reason code:ServiceException.ILLEGAL_PARAMif the phase parameter is PROCESS_NONE or an undefined value.
- See Also:
BasicService
-
process
public void process(APDU command) throws ISOException
Manages the entire processing of the command in the APDU object input parameter. This method is called to delegate the complete processing of the incoming APDU command to the configured services.This method uses the
dispatch(APDU,byte)method withPROCESS_INPUT_DATAas the input phase parameter to sequence through the services registered for all three phases :PROCESS_INPUT_DATAfollowed byPROCESS_COMMANDand lastlyPROCESS_OUTPUT_DATA.If the command processing completes normally, the output data is sent using
APDU.sendBytesand the response status is generated by throwing anISOExceptionexception or by simply returning (for status = 0x9000). If an exception is thrown by any Service during the processing,ISO7816.SW_UNKNOWNresponse status code is generated by throwing anISOException. If the command could not be processedISO7816.SW_INS_NOT_SUPPORTEDresponse status is generated by throwing anISOException.Note:
- If additional command processing is required following a call to this method, the caller should catch and process exceptions thrown by this method.
- Parameters:
command- the APDU object containing command to be processed- Throws:
ISOException- with the response bytes per ISO 7816-4
-
-