php.java.bridge.http
Class ContextFactory

java.lang.Object
  extended by php.java.bridge.JavaBridgeFactory
      extended by php.java.bridge.SessionFactory
          extended by php.java.bridge.http.ContextFactory
All Implemented Interfaces:
IContextFactory, IJavaBridgeFactory

public final class ContextFactory
extends SessionFactory
implements IContextFactory

Create session, jsr223 contexts.

The ContextFactory may keep a promise (a "proxy") which one may evaluate to a session reference (for PHP/JSP session sharing), and/or it may reference a "half-executed" bridge for local channel re-directs (for "high speed" communication links).

A unique context instance should be created for each request and destroyed when the request is done.

Clients of the PHP clients may attach additional data and run with a customized ContextFactory by using the visitor pattern, see accept(IContextFactoryVisitor).

The string ID of the instance should be passed to the client, which may pass it back together with the getSession request or the "local channel re-direct". If the former happens, we invoke the promise and return the session object to the client. Different promises can evaluate to the same session object. For local channel re-directs the ContextFactory is given to a ContextRunner which handles the local channel communication.

When a php client is not interested in a context for 5 seconds (checked every 10 minutes), the context is destroyed: a) switching from the HTTP tunnel to the local channel of the ContextRunner or b) switching from the fresh context created by the client of the PHP client to the recycled, persistent context, costs only one round-trip. The time for such a context switch is usually much less than 10ms unless either the php client or the client that waits for the php client is traced. If 5 seconds is not enough during debugging, change the ORPHANED_TIMEOUT.

In a shared environment with k web contexts there can be up to n*k active JavaBridge/ContextFactory instances (where n is the number of active php clients). All ContextFactories are kept in a shared, per-loader map. But the map can only be accessed via get(String, ICredentials), which checks if the ContextFactory belongs to the same ContextServer.

See Also:
ServletContextFactory, ContextServer, SessionFactory.TIMER_DURATION

Nested Class Summary
static interface ContextFactory.ICredentials
          The credentials provided by the web context, usually this ContextFactory.
 
Field Summary
static java.lang.String EMPTY_CONTEXT_NAME
          This context name can be used when a ContextFactory is used outside of a servlet environment
static ContextFactory.ICredentials NO_CREDENTIALS
          Use this if you don't care about security.
 
Fields inherited from class php.java.bridge.SessionFactory
TIMER_DURATION
 
Constructor Summary
ContextFactory(java.lang.String webContext)
          Create a new ContextFactory.
 
Method Summary
 void accept(IContextFactoryVisitor visitor)
          Use this method to attach a visitor to the ContextFactory.
static IContextFactory addNew()
          Create a new simple ContextFactory (a factory which creates an emulated JSR223 context) and add it to the list of context factories kept by this classloader.
 void destroy()
          Destroy the factory
static void destroyAll()
          Remove all context factories from the classloader.
static IContextFactory get(java.lang.String id, ContextFactory.ICredentials server)
          Only for internal use.
 java.lang.ClassLoader getClassLoader()
          Return the context loader
 IContext getContext()
          Returns the context.
 java.lang.String getId()
          Return the serializable ID of the context factory
 SimpleJavaBridgeClassLoader getJavaBridgeClassLoader()
          Return an instance of the JavaBridgeClassLoader
 ISession getSession(boolean clientIsNew, int timeout)
          Return a session, not shared with JSP
 ISession getSession(java.lang.String name, boolean clientIsNew, int timeout)
          Return a standard session, shared with JSP
 ISession getSimpleSession(boolean clientIsNew, int timeout)
          Return a simple session which cannot be shared with JSP
 ISession getSimpleSession(java.lang.String name, boolean clientIsNew, int timeout)
          Return a simple session which cannot be shared with JSP
 void initialize()
          Called when the context runner starts
 void invalidate()
          Called at the end of the visitor's life cycle
static IContextFactory peek(java.lang.String id)
          Only for internal use.
 void recycle()
          Recycle the factory for new reqests.
 void recycle(java.lang.String id)
           Update the context factory with the new JavaBridge obtained from the servlet
 void release()
          Releases the context factory.
 void releaseManaged()
          Wait until this context is finished and release/destroy it.
 void setClassLoader(java.lang.ClassLoader loader)
          Set the class loader obtained from the current servlet into the context.
 void setContext(IContext context)
          Set the Context into this factory.
 java.lang.String toString()
          
 void waitFor(long timeout)
          Wait until this context is finished.
 
Methods inherited from class php.java.bridge.SessionFactory
destroyTimer
 
Methods inherited from class php.java.bridge.JavaBridgeFactory
getBridge, isNew
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface php.java.bridge.IJavaBridgeFactory
getBridge, isNew
 

Field Detail

EMPTY_CONTEXT_NAME

public static final java.lang.String EMPTY_CONTEXT_NAME
This context name can be used when a ContextFactory is used outside of a servlet environment

See Also:
Constant Field Values

NO_CREDENTIALS

public static final ContextFactory.ICredentials NO_CREDENTIALS
Use this if you don't care about security. This is used by the SocketContextServer

Constructor Detail

ContextFactory

public ContextFactory(java.lang.String webContext)
Create a new ContextFactory.

Parameters:
webContext - The current web context or "@"
Method Detail

addNew

public static IContextFactory addNew()
Create a new simple ContextFactory (a factory which creates an emulated JSR223 context) and add it to the list of context factories kept by this classloader.

Returns:
The created ContextFactory.
See Also:
get(String, ICredentials)

get

public static IContextFactory get(java.lang.String id,
                                  ContextFactory.ICredentials server)
Only for internal use. Returns the context factory associated with the given id

Parameters:
id - The ID
server - Your context server.
Returns:
The ContextFactory or null.
Throws:
java.lang.SecurityException - if id belongs to a different ContextServer.
See Also:
addNew()

peek

public static IContextFactory peek(java.lang.String id)
Only for internal use. The same as get(String, php.java.bridge.http.ContextFactory.ICredentials) with the second argument set to null. The servlet may use this procedure to check for a new context factory.

Parameters:
id - The existing id.
Returns:
The factory or null
Throws:
java.lang.SecurityException - if the context contains information.

recycle

public void recycle(java.lang.String id)

Update the context factory with the new JavaBridge obtained from the servlet

Specified by:
recycle in interface IContextFactory
Parameters:
id - The fresh id
See Also:
recycle(), Request.setBridge(php.java.bridge.JavaBridge), Request.recycle()

recycle

public void recycle()
Recycle the factory for new reqests.

Specified by:
recycle in interface IJavaBridgeFactory
Overrides:
recycle in class JavaBridgeFactory

destroy

public void destroy()
Destroy the factory

Specified by:
destroy in interface IContextFactory
Specified by:
destroy in interface IJavaBridgeFactory
Overrides:
destroy in class JavaBridgeFactory

destroyAll

public static void destroyAll()
Remove all context factories from the classloader. May only be called by the ContextServer.

See Also:
ContextServer

releaseManaged

public void releaseManaged()
                    throws java.lang.InterruptedException
Wait until this context is finished and release/destroy it. This method returns immediately if this context is not in use yet or it is no longer in use. Call this method only if Java has initiated the communication and Java have full control over the connection, for example via a ScriptEngine's URLReader or CGIRunner. For Apache/PHP initiated requests use a combination of #waitFor(long) and #release() instead.

Specified by:
releaseManaged in interface IContextFactory
Throws:
java.lang.InterruptedException
See Also:
ContextRunner

waitFor

public void waitFor(long timeout)
             throws java.lang.InterruptedException
Wait until this context is finished.

Specified by:
waitFor in interface IContextFactory
Parameters:
timeout - The timeout
Throws:
java.lang.InterruptedException
See Also:
ContextRunner

getId

public java.lang.String getId()
Return the serializable ID of the context factory

Specified by:
getId in interface IContextFactory
Returns:
The ID

toString

public java.lang.String toString()

Overrides:
toString in class java.lang.Object

getContext

public IContext getContext()
Returns the context.

Specified by:
getContext in interface IContextFactory
Specified by:
getContext in interface IJavaBridgeFactory
Overrides:
getContext in class SessionFactory
Returns:
The context or null.
See Also:
getContext()

setContext

public void setContext(IContext context)
Set the Context into this factory. Should be called by Context.addNew() only.

Specified by:
setContext in interface IContextFactory
Parameters:
context - The context.
See Also:
addNew()

accept

public void accept(IContextFactoryVisitor visitor)
Use this method to attach a visitor to the ContextFactory.

Parameters:
visitor - The custom ContextFactory

getSimpleSession

public ISession getSimpleSession(java.lang.String name,
                                 boolean clientIsNew,
                                 int timeout)
Return a simple session which cannot be shared with JSP

Parameters:
name - The session name
clientIsNew - true, if the client wants a new session
timeout - expires in n seconds
Returns:
The session

getSimpleSession

public ISession getSimpleSession(boolean clientIsNew,
                                 int timeout)
Return a simple session which cannot be shared with JSP

Parameters:
clientIsNew - true, if the client wants a new session
timeout - expires in n seconds
Returns:
The session

getSession

public ISession getSession(java.lang.String name,
                           boolean clientIsNew,
                           int timeout)
Return a standard session, shared with JSP

Specified by:
getSession in interface IContextFactory
Specified by:
getSession in interface IJavaBridgeFactory
Overrides:
getSession in class SessionFactory
Parameters:
name - The session name
clientIsNew - true, if the client wants a new session
timeout - expires in n seconds
Returns:
The session
See Also:
ISession

getSession

public ISession getSession(boolean clientIsNew,
                           int timeout)
Return a session, not shared with JSP

Specified by:
getSession in interface IJavaBridgeFactory
Overrides:
getSession in class SessionFactory
Parameters:
clientIsNew - true, if the client wants a new session
timeout - expires in n seconds
Returns:
The sessioin

release

public void release()
Releases the context factory. This method should be called when the factory is not needed anymore. Implementations could then remove any unused context factory from the classloader's list of context factories.

Specified by:
release in interface IContextFactory

setClassLoader

public void setClassLoader(java.lang.ClassLoader loader)
Set the class loader obtained from the current servlet into the context.

Specified by:
setClassLoader in interface IContextFactory
Parameters:
loader - The currentThreadContextClassLoader

getJavaBridgeClassLoader

public SimpleJavaBridgeClassLoader getJavaBridgeClassLoader()
Return an instance of the JavaBridgeClassLoader

Specified by:
getJavaBridgeClassLoader in interface IJavaBridgeFactory
Overrides:
getJavaBridgeClassLoader in class SessionFactory
Returns:
The JavaBridgeClassLoader
See Also:
Util.getContextClassLoader()

getClassLoader

public java.lang.ClassLoader getClassLoader()
Return the context loader

Specified by:
getClassLoader in interface IContextFactory
Overrides:
getClassLoader in class SessionFactory
Returns:
The context class loader

initialize

public void initialize()
Called when the context runner starts

Specified by:
initialize in interface IContextFactory
See Also:
IContextFactory.releaseManaged()

invalidate

public void invalidate()
Called at the end of the visitor's life cycle

Specified by:
invalidate in interface IContextFactory