|
Java™ 2 Platform, Micro Edition Content Handler API (Final Release, June 3, 2005) | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object javax.microedition.content.Registry
The Registry provides method to invoke,
register,
unregister, and query information about content handlers.
An application registers, for each content handler,
zero or more content types, suffixes, and actions.
Access to the registry is via the getRegistry
method. The Registry class is thread safe.
Applications are responsible for the thread safety of
Invocation objects passed as arguments to Registry methods.
Multiple content handlers can be registered for each type, suffix, and action. The types, suffixes, and actions registered for a handler can be used to select a handler. The content handler ID is set during registration and is used to uniquely identify the content handler and to enforce access controls.
A content handler is any application that is registered to
handle some content. It responds to requests and displays
or acts on the content.
Registration can occur dynamically or statically.
Static registration occurs during the installation of the
application package, while dynamic registration occurs via this API.
A content handler may be a Java or a non-Java application.
For example, MIDlet suites and Personal Basis Profile applications
using the Xlet application model can be content handlers.
Refer to the ContentHandler
class for information on registering Java platform content handlers.
When a content handler is processing an invocation, it may be necessary to invoke another content handler before it is able to satisfy the first request. The invocation and chaining of content handlers is managed to maintain the context and sequence across application executions.
The term application is used more generally than the term content handler. The term application is used to refer to the common handling for making requests, handling responses, and querying the content handler registrations. The term content handler is used for an application that registers for types, suffixes, actions, etc. and processes the requests queued to it.
A content handler can register a set of types that it can handle. Content types are simple opaque strings that are NOT case sensitive. Type strings are not case sensitive, types that differ only by case are treated as a single type.
A content handler can register a set of suffixes that identify from the syntax of a URL the content it can handle. Suffixes are NOT case sensitive.
Each content handler may register a set of actions
it supports.
The set of actions is extensible but applications should
choose from the actions defined in the ContentHandler
class when they are appropriate.
The predefined actions are:
open
,
edit
,
new
,
send
,
save
,
execute
,
select
,
install
,
print
, and
stop
.
The content handler ID is a string chosen by the application vendor to identify the content handler. The ID registered by a content handler MUST be unique and MUST NOT match the prefix of any other registered content handler. IDs are case sensitive and are treated as opaque strings. They are compared for equality or as prefixes of IDs when used to locate an appropriate content handler.
Content handler IDs should follow the form of fully qualified Java class names or any naming syntax that provides a natural way to disambiguate between vendors. For example, IDs may be URLs including scheme, authority (server), and path information.
For example, if registered in the order below, the following content handler IDs would be valid or invalid as indicated because there is an ambiguity due to prefix comparisons.
com.sun.applications.calc
- validcom.sun.applications.trig
- validcom.sun.application
- invalid,
this is the prefix of the calc
IDcom.sun.applications.calc.decimal
-
invalid, the calc
ID is prefix of decimal
The content handler to be launched is identified by the
application class. The class MUST contain entry point(s)
and be packaged according to the Java runtime environment.
For MIDP, the application class MUST extend
javax.microedition.midlet.MIDlet
.
The application class uniquely identifies a content handler
within the application package, which is usually a JAR file.
Each application class can only be registered to a single content
handler. Registering a content handler for a class will replace any
content handler previously registered to that class.
ContentHandler.getAuthority
method will return the authority used in the authentication.
While processing an invocation request the content handler can use the
Invocation.getInvokingAuthority
method to verify the authenticity of the invoking application.
java.lang.string.startsWith
method was used.
The access controls are only visible to the content handler
itself using the method
ContentHandlerServer.getAccessAllowed
.
By default,
access is allowed to all applications and content handlers.
Access restrictions are established when the content handler is
registered with the register
method.
Dynamic registration is performed by
initializing the classname, types, suffixes,
actions, action names, ID, and access restrictions, and passing
them to the register
method.
The unregister
method removes
a registered content handler.
The current registrations can be examined by using various methods to
get the types
,
IDs
,
suffixes
,
actions
,
or to find a content handler
by content handler classname
, or
to get all of the matching content handlers
by ID
,
by content type
,
by suffix
, or
by action
.
Only content handlers that are accessible and visible to the
application will be returned.
To invoke a content handler, an application initializes an
Invocation instance with the information needed to identify the
content and/or the content handler. Typically this could include the
URL, type, action, and content handler ID.
The application may also supply arguments and data, and set
whether a response is required.
The application may request information about the content
and the content handler that will process it before invocation.
Calling the Registry.invoke
method
starts the request.
When invoked, the ID, type, URL, and action are used to identify a
target content handler. If multiple content handlers are registered
for the ID, type, suffixes or action, the implementation can decide
which to use to satisfy the request. If the application needs to
select which handler to use, the
findHandler
method will
return the set of matching ContentHandlers. The application can
choose from the content handlers returned and use
Invocation.setID
to select a specific handler.
In a runtime environment in which only a single application can
run at a time, the invoking application must exit before the
content handler can be started to handle the request.
Invocation requests are queued so that the invoking
application and the content handler can be run sequentially in
resource-constrained environments.
The return value of invoke
is true
to indicate that the application must exit.
This allows the invoking application to save the users context
and leave the user interface, if any, with some visual that the
user will see until the content handler is ready.
Invocation processing involves the invoking application, the invoked content handler, and the application management software (AMS). The implementation of the API and the AMS MUST implement the queuing of invocations to the appropriate content handler and the necessary interactions with the lifecycle to start and restart applications and content handlers.
The invoke
methods initiate the request.
The URL, type, action, and ID, as described above, are used to
dispatch the request to an appropriate content handler.
If the content handler is not running, it MUST be started to process
the request. If the content handler is already running,
then the new request MUST be queued to the content handler.
Only a single instance of each content handler application can be
active at a time.
The ContentHandlerServer
class is used to dequeue and process
requests.
Method Summary | |
void |
cancelGetResponse()
Cancels a pending getResponse . |
ContentHandler[] |
findHandler(Invocation invocation)
Gets the registered content handlers that could be used for this Invocation. |
ContentHandler[] |
forAction(java.lang.String action)
Gets the registered content handlers that support the action. |
ContentHandler |
forID(java.lang.String ID,
boolean exact)
Gets the registered content handler for the ID. |
ContentHandler[] |
forSuffix(java.lang.String suffix)
Gets the content handlers for the suffix. |
ContentHandler[] |
forType(java.lang.String type)
Gets the registered content handlers for the content type. |
java.lang.String[] |
getActions()
Gets the unique actions of the registered content handlers. |
java.lang.String |
getID()
Gets the content handler ID for the current application. |
java.lang.String[] |
getIDs()
Gets the IDs of the registered content handlers. |
static Registry |
getRegistry(java.lang.String classname)
Gets the Registry for the application or content handler that will be calling registry methods. |
Invocation |
getResponse(boolean wait)
Gets the next Invocation response pending for this application. |
static ContentHandlerServer |
getServer(java.lang.String classname)
Gets the content handler server registered for the content handler. |
java.lang.String[] |
getSuffixes()
Gets the unique suffixes of the registered content handlers. |
java.lang.String[] |
getTypes()
Gets all of the unique content types for which there are registered handlers. |
boolean |
invoke(Invocation invocation)
Checks the Invocation and uses the ID, type, URL, and action, if present, to find a matching ContentHandler and queues this request to it. |
boolean |
invoke(Invocation invocation,
Invocation previous)
Checks the Invocation and uses the ID, type, URL, and action, if present, to find a matching ContentHandler and queues this request to it. |
ContentHandlerServer |
register(java.lang.String classname,
java.lang.String[] types,
java.lang.String[] suffixes,
java.lang.String[] actions,
ActionNameMap[] actionnames,
java.lang.String ID,
java.lang.String[] accessAllowed)
Registers the application class using content type(s), suffix(es), and action(s), action name(s), access restrictions and content handler ID. |
boolean |
reinvoke(Invocation invocation)
Reinvokes the Invocation and uses the ID, type, URL, and action to find a matching ContentHandler and re-queues this request to it. |
void |
setListener(ResponseListener listener)
Sets the listener to be notified when a new response is available for the application context. |
boolean |
unregister(java.lang.String classname)
Removes the content handler registration for the application class and any bindings made during registration to the content ID, type(s), suffix(es), and action(s), etc. |
Methods inherited from class java.lang.Object |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Method Detail |
public static Registry getRegistry(java.lang.String classname)
For a MIDP implementation,
application classes must be registered with the
MIDlet-<n>
attribute; content handlers are
registered with the MicroEdition-Handler-<n>
attribute or the register
method.
classname
- the application class
null
java.lang.IllegalArgumentException
- is thrown if the classname
is not a registered application or content handler
java.lang.NullPointerException
- if classname
is
null
public static ContentHandlerServer getServer(java.lang.String classname) throws ContentHandlerException
classname
MUST be registered as
a content handler in the current application package using
either the register
method or
the static registration attributes.
classname
- the name of an application class or
content handler registered by this application package
classname
registered by this application package;
MUST NOT be null
java.lang.NullPointerException
- if classname
is
null
ContentHandlerException
- is thrown with a reason of
NO_REGISTERED_HANDLER
if there is no
content handler registered for the classname in the current
application packagepublic ContentHandlerServer register(java.lang.String classname, java.lang.String[] types, java.lang.String[] suffixes, java.lang.String[] actions, ActionNameMap[] actionnames, java.lang.String ID, java.lang.String[] accessAllowed) throws java.lang.SecurityException, java.lang.IllegalArgumentException, java.lang.ClassNotFoundException, ContentHandlerException
This method will replace any content handler registration in the application package that has the same classname. The update occurs atomically: the update to the registry either occurs or it does not.
The content handler may register the following items:
If no exceptions are thrown, then the type(s), suffix(s), action(s), action names, access restrictions, and ID will be registered for the application class.
If an exception is thrown, then the previous registration, if any, will not be removed or modified.
classname
- the name of an application class or
content handler in this application package;
the value MUST NOT be null
;
and the handler MUST implement the lifecycle of the Java runtime
environmenttypes
- an array of types to register;
if null
it is treated the same as an empty arraysuffixes
- an array of suffixes to register;
if null
it is treated the same as an empty arrayactions
- an array of actions to register;
if null
it is treated the same as an empty arrayactionnames
- an array of ActionNameMaps to register;
if null
it is treated the same as an empty arrayID
- the content handler ID; if null
a default non-null value MUST be provided by the implementationaccessAllowed
- the IDs of applications and content
handlers that are
allowed visibility and access to this content handler;
if null
or an empty array then all applications and
content handlers are allowed access;
otherwise ONLY applications and content handlers with matching IDs
are allowed access.
null
java.lang.NullPointerException
- if any of the following items is
null
:
classname
types
, suffixes
,
actions
, actionnames
, and
accessAllowed
java.lang.IllegalArgumentException
- is thrown:
types
, suffix
,
actions
, or accessAllowed
strings have a length of zero, or classname
does not implement the valid
lifecycle for the Java runtime environment,actions
,
or java.lang.ClassNotFoundException
- if the classname
is not present
ContentHandlerException
- with an error code of
ContentHandlerException.AMBIGUOUS
if ID
(or if ID is null, the default ID)
is a prefix of any registered handler or if any registered
handler ID is a prefix of this ID,
except where the registration is replacing or updating
an existing registration with the same classname
java.lang.SecurityException
- if registration
is not permittedpublic boolean unregister(java.lang.String classname)
classname
- the name of the content handler class
true
if the content handler registered
by this application was found and removed;
false
otherwise
java.lang.NullPointerException
- if classname
is
null
public java.lang.String[] getTypes()
Only content handlers that this application is allowed to access will be included.
null
public java.lang.String[] getIDs()
Only content handlers that this application is allowed to access will be included.
null
public java.lang.String[] getActions()
Only content handlers that this application is allowed to access will be included.
null
public java.lang.String[] getSuffixes()
Only content handlers that this application is allowed to access will be included.
null
public ContentHandler[] forType(java.lang.String type)
Only content handlers that are visible and accessible to this application are returned.
type
- the type of the requested content handlers
ContentHandler
s registered
for the type; MUST NOT be null
.
An empty array is returned if there are no
ContentHandler
s accessible to
this application with the type equal to the request type.
java.lang.NullPointerException
- if type
is
null
public ContentHandler[] forAction(java.lang.String action)
Only content handlers that are visible and accessible to this application are returned.
action
- content handlers for which the action is supported
ContentHandler
s registered
for the action; MUST NOT be null
;
an empty array is returned if no ContentHandler
s
are accessible to this application
java.lang.NullPointerException
- if action
is
null
public ContentHandler[] forSuffix(java.lang.String suffix)
Only content handlers that are visible and accessible to this application are returned.
suffix
- the suffix to be used to get the associated
content handlers
ContentHandler
s registered
for the suffix; MUST NOT be null
.
An empty array is returned if there are none accessible to
this application
java.lang.NullPointerException
- if suffix
is
null
public ContentHandler forID(java.lang.String ID, boolean exact)
Only a content handler which is visible to and accessible to this application will be returned.
The forID
method may be useful for applications
with multiple components or subsystems
to define a base ID for the application.
A request to a particular component can be made by appending an
additional string to the base ID. The additional string can be
used by the handler itself to dispatch to
the component or subsystem. The forID
method can be used to
query for the registered content handler.
ID
- the content handler application ID of the content
handler requestedexact
- true
to require an exact match;
false
to allow a registered content handler ID
to match a prefix of the requested ID
null
java.lang.NullPointerException
- if ID
is
null
public ContentHandler[] findHandler(Invocation invocation) throws java.io.IOException, ContentHandlerException, java.lang.SecurityException
forID
method with the parameter exact set to false.
The type and URL are ignored. If there is no handler that matches
the requested ID then a ContentHandlerException
is thrown.null
and
the URL is non-null
and
if the protocol supports typing of content, then
the type is determined
as described in Invocation.findType()
.
If the type cannot be determined from the content,
the type is set to null
.forType
method.
If there are no handlers that match the requested type
then a ContentHandlerException is thrown. null
and
the URL is non-null
and
if the protocol does not support typing of content
or the type was not available from the content,
then the set of candidate handlers
includes any handler with a suffix that matches the
end of the path component of the URL.
If there are no handlers that match a registered
suffix then a ContentHandlerException is thrown.The calling thread blocks while the ID and type are being determined. If a network access is needed there may be an associated delay.
invocation
- the ID, type, action, and URL that
are needed to identify one or more content handlers;
must not be null
ContentHandler
(s)
that could be used for this Invocation; MUST NOT be null
;
java.io.IOException
- is thrown if access to the content fails
ContentHandlerException
- is thrown with a reason of
NO_REGISTERED_HANDLER
if
there is no registered content handler that
matches the requested ID, type, URL, and action
java.lang.IllegalArgumentException
- is thrown if ID, type, URL,
and action are all null
or
if the content is accessed via the URL and the URL is invalid
java.lang.NullPointerException
- is thrown if the
invocation
is null
java.lang.SecurityException
- is thrown if access to the content
is not permittedpublic boolean invoke(Invocation invocation, Invocation previous) throws java.lang.IllegalArgumentException, java.io.IOException, ContentHandlerException, java.lang.SecurityException
If the previous
Invocation is null
, then
a new transaction is created; otherwise, this
Invocation will use the same transaction as the
previous
Invocation.
The status of this Invocation MUST be INIT
.
If there is a previous Invocation, that Invocation MUST
have a status of ACTIVE
and this Invocation MUST
require a response.
Candidate content handlers are found as described in
findHandler
. If any handlers are
found, one is selected for this Invocation.
The choice of content handler is implementation dependent.
A copy of the Invocation is made, the status is set to
ACTIVE
and then queued to the
target content handler.
If the invoked content handler is not running, it MUST be started
as described in Invoking a Content Handler.
The status of this Invocation is set to WAITING
.
If there is a non-null previous
Invocation,
its status is set to HOLD
.
The previous
Invocation is saved in the waiting
Invocation.
It can be retrieved by the getPrevious
method.
The calling thread blocks while the content handler is being determined. If a network access is needed, there may be an associated delay.
invocation
- the Invocation containing the target ID, type, URL,
actions, arguments, and responseRequired parameters;
MUST NOT be null
previous
- a previous Invocation for this Invocation;
may be null
true
if the application MUST
voluntarily exit to allow the target content handler to be started;
false
otherwise
java.lang.IllegalArgumentException
- is thrown if:
null
,null
references, or invocation.getResponseRequired
method returns false
and
previous
is non-nulljava.io.IOException
- is thrown if access to the content fails
ContentHandlerException
- is thrown with a reason of
NO_REGISTERED_HANDLER
if
there is no registered content handler that
matches the requested ID, type, URL, and action
java.lang.IllegalStateException
- is thrown if the status of this
Invocation is not INIT
or if the status of the previous
Invocation, if any, is not ACTIVE
java.lang.NullPointerException
- is thrown if the
invocation
is null
java.lang.SecurityException
- if access to the content is not permittedpublic boolean invoke(Invocation invocation) throws java.lang.IllegalArgumentException, java.io.IOException, ContentHandlerException, java.lang.SecurityException
invoke(invocation, null)
.
invocation
- the Invocation containing the target ID, type,
URL, action, arguments, and responseRequired parameters;
MUST NOT be null
true
if the application MUST
voluntarily exit to allow the target content handler to be started;
false
otherwise
java.lang.IllegalArgumentException
- is thrown if:
null
, or null
referencesjava.io.IOException
- is thrown if access to the content fails
ContentHandlerException
- is thrown with a reason of
NO_REGISTERED_HANDLER
if
there is no registered content handler that
matches the requested ID, type, URL, and action
java.lang.IllegalStateException
- is thrown if the status of this
Invocation is not INIT
java.lang.NullPointerException
- is thrown if the
invocation
is null
java.lang.SecurityException
- if access to the content is not permittedpublic boolean reinvoke(Invocation invocation) throws java.lang.IllegalArgumentException, java.io.IOException, ContentHandlerException, java.lang.SecurityException
OK
. Responses to the
reinvocation will be queued to the original invoking
application, if a response is required.
The status of this Invocation MUST be ACTIVE
.
Candidate content handlers are found as described in
findHandler
. If any handlers are
found, one is selected for this Invocation.
The choice of content handler is implementation dependent.
The status of this Invocation is set to OK
.
A copy of the Invocation is made, the status is set to
ACTIVE
, and then queued to the
target content handler.
If the invoked content handler application is not running,
it MUST be started
as described in Invocation Processing.
The calling thread blocks while the content handler is being determined. If a network access is needed there may be an associated delay.
invocation
- an Invocation containing the target ID, type,
action, arguments, and responseRequired parameters;
MUST NOT be null
true
if the application MUST
voluntarily exit to allow the target content handler to be started;
false
otherwise
java.lang.IllegalArgumentException
- is thrown if:
null
, or null
referencesjava.io.IOException
- is thrown if access to the content fails
ContentHandlerException
- is thrown with a reason of:
NO_REGISTERED_HANDLER
if
there is no registered content handler that
matches the requested ID, type, URL, and action
java.lang.IllegalStateException
- is thrown if the status of this
Invocation is not ACTIVE
java.lang.NullPointerException
- is thrown if the
invocation
is null
java.lang.SecurityException
- if access to the content is not permittedpublic Invocation getResponse(boolean wait)
cancelGetResponse
.
The application can process the Invocation based on
its status. The status is one of
OK
, CANCELLED
, ERROR
,
or INITIATED
.
If the Invocation was invoked with
invoke(Invocation invocation, Invocation previous)
,
the getPrevious
method MUST return the
previous Invocation.
If the status of the previous Invocation is HOLD
then its status is restored to ACTIVE
.
If the original Invocation instance is reachable, then it
MUST be updated with the values from the response
and be returned to the application. If it is not
reachable, then a new instance is returned from
getResponse
with the response values.
wait
- true
if the method
MUST wait for an Invocation if one is not available;
otherwise false
if the method MUST NOT wait
null
if the wait
is false and no Invocation is available or
if cancelled with cancelGetResponse()
invoke(javax.microedition.content.Invocation, javax.microedition.content.Invocation)
,
cancelGetResponse()
public void cancelGetResponse()
getResponse
.
This method will force a thread blocked in a call to the
getResponse
method for this Registry instance
to return early.
If no thread is blocked; this call has no effect.
public void setListener(ResponseListener listener)
getResponse
.
If the listener is non-null
and a response is
available, the listener MUST be notified.
listener
- the listener to register;
null
to remove the listenerpublic java.lang.String getID()
getServer
then the ID MUST be
the content handler ID returned from
ContentHandlerServer.getID
.
Otherwise, the ID will be generated for the profile.
The package documentation
for "Content Handlers and the Mobile Information Device Profile"
defines the value for MIDP.
null
|
Java™ 2 Platform, Micro Edition Content Handler API (Final Release, June 3, 2005) | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |