diff options
| author | Benjamin Culkin <scorpress@gmail.com> | 2024-05-20 17:58:16 -0400 |
|---|---|---|
| committer | Benjamin Culkin <scorpress@gmail.com> | 2024-05-20 17:58:16 -0400 |
| commit | 40a9d99496e098562f090fb7ffce9e749011b131 (patch) | |
| tree | 437df24d65470582e943e494a52db8ed65a881ae /projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java | |
| parent | ff072dfe782f6f22123cd4ba050828d35c0d0fbd (diff) | |
Formatting pass
Diffstat (limited to 'projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java')
| -rw-r--r-- | projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java | 929 |
1 files changed, 418 insertions, 511 deletions
diff --git a/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java index 4f774e6..40c5f5c 100644 --- a/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java +++ b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/WOContext.java @@ -25,548 +25,455 @@ import java.util.List; import java.util.Map; /** -* A pure java implementation of WOContext. -* -* @author michael@mpowers.net -* @author $Author: cgruber $ -* @version $Revision: 905 $ -*/ -public class WOContext -{ + * A pure java implementation of WOContext. + * + * @author michael@mpowers.net + * @author $Author: cgruber $ + * @version $Revision: 905 $ + */ +public class WOContext { private WOSession session; private WORequest request; private WOResponse response; - private List elementStack; + private List elementStack; private boolean isInForm; private boolean isDistributionEnabled; - private static final String EMPTY = ""; - private static final String SEP = "."; - private static final String ZERO = "0"; - private static final String HTTP = "http://"; - private static final String HTTPS = "https://"; + private static final String EMPTY = ""; + private static final String SEP = "."; + private static final String ZERO = "0"; + private static final String HTTP = "http://"; + private static final String HTTPS = "https://"; // package access WOComponent page; WOComponent component; StringBuffer elementID; - - private static volatile int contextCounter = 0; - private String contextID; - - /** - * Default constructor performs necessary initialization. - * Subclassers should override the static factory method below. - */ - public WOContext () - { - contextID = null; - elementID = new StringBuffer(); - elementStack = new LinkedList(); - } - - /** - * Preferred constructor performs necessary initialization. - * Subclassers should override this method. - */ - public WOContext (WORequest aRequest) - { - this(); - request = aRequest; - response = new WOResponse(); - } - - /** - * Simply calls the preferred constructor. - * Included for compatibility. - */ - public static WOContext contextWithRequest (WORequest aRequest) - { - String id = Integer.toString( contextCounter++ ); - WOContext result = new WOContext( aRequest ); - result.contextID = id; - return result; - } - - /** - * Returns the context id. - */ - public String contextID () - { - return contextID; - } - - /** - * Returns the sender id, or null if it doesn't exist. - */ - public String senderID () - { - return request.senderID(); - } - - /** - * Returns the element id, or null if it doesn't exist. - */ - public String elementID () - { - return elementID.toString(); - } - - /** - * Returns this context's application, or null if it doesn't exist. - */ - public WOApplication application () - { - return request.application(); - } - - /** - * Returns whether a session has been created for the associated request. - */ - public boolean hasSession () - { - return ( session != null ); - } - - /** - * Returns this context's session, creating one if it doesn't exist. - */ - public WOSession session () - { - if ( session == null ) - { - // so far we can't figure out how the direct action handler can avoid creating a session - throw new RuntimeException( "WOContext.session: Lazy instantiation not yet implemented." ); -/* - session = application().restoreSessionWithID( - request.sessionID(), this ); - if ( session == null ) - { - session = application().createSessionForRequest( request ); - session.setContext( this ); - } -*/ - } - return session; - } - - /** - * Package access only. - */ - void setSession( WOSession aSession ) - { - session = aSession; - } - - /** - * Returns this context's request. - */ - public WORequest request () - { - return request; - } - - /** - * Returns this context's response. - */ - public WOResponse response () - { - return response; - } - - /** - * Returns the current page. - */ - public WOComponent page () - { - return (WOComponent) elementStack.get( elementStack.size()-1 ); - } - - /** - * Returns the current component. - */ - public WOComponent component () - { - Object o; - Iterator i = elementStack.iterator(); - while ( i.hasNext() ) - { - o = i.next(); - if ( o instanceof WOComponent ) return (WOComponent) o; - } - return null; - } - - /** - * Returns the current component's parent. - */ - WOComponent parent () - { - Object o; - Iterator i = elementStack.iterator(); - if ( i.hasNext() ) - { - // skip current component - o = i.next(); - } - while ( i.hasNext() ) - { - o = i.next(); - if ( o instanceof WOComponent ) - { - return (WOComponent) o; - } - } - return null; - } - - /** - * Pushes an element onto the stack. - * Package access only. - */ - void pushElement( WOElement aComponent ) - { - elementStack.add( 0, aComponent ); - } - - /** - * Pops an element off the stack. - * Package access only. - */ - WOElement popElement() - { - return (WOElement) elementStack.remove(0); - } - - /** - * Returns whether the current context is in a form. - */ - public boolean isInForm () - { - return isInForm; - } - - /** - * Sets whether the current context is in a WOForm. - */ - public void setInForm (boolean inForm) - { - isInForm = inForm; - } - - /** - * Appends the specified string to the end of the element id. - * For example, if the element id is "0.1", sending "Test" - * changes the element id to "0.1.Test". - */ - public void appendElementIDComponent (String aString) - { - if ( elementID.length() > 0 ) - { - elementID.append( SEP ); - } - elementID.append( aString ); - } - - /** - * Appends a zero to the element id to represent the first - * new child component. For example, if the element id is "0.1", - * calling this changes the element id to "0.1.0". - */ - public void appendZeroElementIDComponent () - { - if ( elementID.length() > 0 ) - { - elementID.append( SEP ); - } - elementID.append( ZERO ); - } - - /** - * Increments the last component of the element id. - * For example, if the element id is "0.1", calling this - * changes the element id to "0.2". - */ - public void incrementLastElementIDComponent () - { - String last; - String id = elementID.toString(); - int index = id.lastIndexOf( SEP ); - if ( index == -1 ) - { - last = id; - } - else - { - last = id.substring( index + 1 ); - } - - deleteLastElementIDComponent(); - - try - { - appendElementIDComponent( - Integer.toString( Integer.parseInt( last ) + 1 ) ); - } - catch ( Exception exc ) - { - System.err.println( "Error parsing id: " + last ); - appendZeroElementIDComponent(); - } - //System.out.println( "WOContext: " + elementID ); - } - - /** - * Deletes the last component of the element id. - * For example, if the element id is "0.1", callling this - * changes the element id to "0". - */ - public void deleteLastElementIDComponent () - { - int index = elementID.toString().lastIndexOf( SEP ); - if ( index == -1 ) - { - elementID.setLength( 0 ); - } - else - { - elementID.setLength( index ); - } - } - - /** - * Deletes all components of the element id. - * This makes the element id an empty string. - */ - public void deleteAllElementIDComponents () - { - elementID.setLength( 0 ); - } - - /** - * Returns a URL for the named action with query parameters - * as specified by the dictionary. - */ - public String directActionURLForActionNamed ( - String anActionName, Map aQueryDict) - { - StringBuffer query = new StringBuffer(); - - try - { - String key; - Iterator i = aQueryDict.keySet().iterator(); - while ( i.hasNext() ) - { - key = i.next().toString(); - query.append( URI.encode( key, - URI.allowed_within_query ) ); - query.append( '=' ); - query.append( URI.encode( aQueryDict.get( key ).toString(), - URI.allowed_within_query ) ); - if ( i.hasNext() ) - { - query.append( '&' ); - } - } - } - catch ( IOException exc ) - { - // report error - System.err.println( - "directActionURLForActionNamed: " + anActionName + " : " + aQueryDict ); - System.err.println( exc ); - - // delete query string - query = new StringBuffer(); - } - - return urlWithRequestHandlerKey( - WOApplication.directActionRequestHandlerKey(), - anActionName, query.toString() ); - } - - /** - * Returns the complete URL for the current component action. - */ - public String componentActionURL () - { - StringBuffer buffer = new StringBuffer(); - buffer.append( request().applicationName() ); - buffer.append( '/' ); - buffer.append( WOApplication.application().componentRequestHandlerKey() ); - buffer.append( '/' ); - buffer.append( page().name() ); - buffer.append( '/' ); - buffer.append( contextID ); - buffer.append( '/' ); - buffer.append( elementID ); - return buffer.toString(); - } - - /** - * Returns a URL relative to the servlet for the specified - * request handler, action, and query string. - */ - public String urlWithRequestHandlerKey ( - String aRequestHandlerKey, String aPath, String aQueryString) - { - StringBuffer buffer = new StringBuffer(); - buffer.append( request().applicationName() ); - buffer.append( '/' ); - buffer.append( aRequestHandlerKey ); - buffer.append( '/' ); - buffer.append( aPath ); - if ( aQueryString != null && aQueryString.trim().length() > 0 ) - { - buffer.append( '?' ); - buffer.append( aQueryString ); - } - return buffer.toString(); - } - - /** - * Returns the complete URL for the specified request handler, - * path, and query string. isSecure determines the protocol: - * http or https. port is appended to the protocol, if zero, - * the port is omitted from the URL. - */ - public String completeURLWithRequestHandlerKey ( - String aRequestHandlerKey, String aPath, String aQueryString, - boolean isSecure, int port) - { - StringBuffer buffer = new StringBuffer(); - - if ( isSecure ) - { - buffer.append( HTTPS ); - } - else - { - buffer.append( HTTP ); - } - - buffer.append( request.applicationHost() ); - - if ( port != 0 && port != 80 ) - { - buffer.append( ':' ); - buffer.append( Integer.toString( port ) ); - } - - buffer.append( urlWithRequestHandlerKey( - aRequestHandlerKey, aPath, aQueryString ) ); - - return buffer.toString(); - } - - /** - * Sets whether distribution is enabled. - */ - public void setDistributionEnabled (boolean distributionEnabled) - { - isDistributionEnabled = distributionEnabled; - } - - /** - * Returns whether distribution is enabled. - */ - public boolean isDistributionEnabled () - { - return isDistributionEnabled; - } - - /** - * This method is not included in the WOContext specification. - * This implementation returns "" since only cookie ids are - * currently supported. - */ - String urlSessionPrefix () - { - return EMPTY; // "/" + sessionid; - } - - /** - * Returns the relative URL for the current page. - */ - String url () - { - throw new RuntimeException( "Not implemented yet." ); - } - - public String toString() - { - return "[WOContext@"+Integer.toHexString(System.identityHashCode(this)) - +":id=" + contextID +":page=" + page + ":component=" + component + ":element=" + elementID + "]"; - } + + private static volatile int contextCounter = 0; + private String contextID; + + /** + * Default constructor performs necessary initialization. Subclassers should + * override the static factory method below. + */ + public WOContext() { + contextID = null; + elementID = new StringBuffer(); + elementStack = new LinkedList(); + } + + /** + * Preferred constructor performs necessary initialization. Subclassers should + * override this method. + */ + public WOContext(WORequest aRequest) { + this(); + request = aRequest; + response = new WOResponse(); + } + + /** + * Simply calls the preferred constructor. Included for compatibility. + */ + public static WOContext contextWithRequest(WORequest aRequest) { + String id = Integer.toString(contextCounter++); + WOContext result = new WOContext(aRequest); + result.contextID = id; + return result; + } + + /** + * Returns the context id. + */ + public String contextID() { + return contextID; + } + + /** + * Returns the sender id, or null if it doesn't exist. + */ + public String senderID() { + return request.senderID(); + } + + /** + * Returns the element id, or null if it doesn't exist. + */ + public String elementID() { + return elementID.toString(); + } + + /** + * Returns this context's application, or null if it doesn't exist. + */ + public WOApplication application() { + return request.application(); + } + + /** + * Returns whether a session has been created for the associated request. + */ + public boolean hasSession() { + return (session != null); + } + + /** + * Returns this context's session, creating one if it doesn't exist. + */ + public WOSession session() { + if (session == null) { + // so far we can't figure out how the direct action handler can avoid creating a + // session + throw new RuntimeException("WOContext.session: Lazy instantiation not yet implemented."); + /* + * session = application().restoreSessionWithID( request.sessionID(), this ); if + * ( session == null ) { session = application().createSessionForRequest( + * request ); session.setContext( this ); } + */ + } + return session; + } + + /** + * Package access only. + */ + void setSession(WOSession aSession) { + session = aSession; + } + + /** + * Returns this context's request. + */ + public WORequest request() { + return request; + } + + /** + * Returns this context's response. + */ + public WOResponse response() { + return response; + } + + /** + * Returns the current page. + */ + public WOComponent page() { + return (WOComponent) elementStack.get(elementStack.size() - 1); + } + + /** + * Returns the current component. + */ + public WOComponent component() { + Object o; + Iterator i = elementStack.iterator(); + while (i.hasNext()) { + o = i.next(); + if (o instanceof WOComponent) + return (WOComponent) o; + } + return null; + } + + /** + * Returns the current component's parent. + */ + WOComponent parent() { + Object o; + Iterator i = elementStack.iterator(); + if (i.hasNext()) { + // skip current component + o = i.next(); + } + while (i.hasNext()) { + o = i.next(); + if (o instanceof WOComponent) { + return (WOComponent) o; + } + } + return null; + } + + /** + * Pushes an element onto the stack. Package access only. + */ + void pushElement(WOElement aComponent) { + elementStack.add(0, aComponent); + } + + /** + * Pops an element off the stack. Package access only. + */ + WOElement popElement() { + return (WOElement) elementStack.remove(0); + } + + /** + * Returns whether the current context is in a form. + */ + public boolean isInForm() { + return isInForm; + } + + /** + * Sets whether the current context is in a WOForm. + */ + public void setInForm(boolean inForm) { + isInForm = inForm; + } + + /** + * Appends the specified string to the end of the element id. For example, if + * the element id is "0.1", sending "Test" changes the element id to "0.1.Test". + */ + public void appendElementIDComponent(String aString) { + if (elementID.length() > 0) { + elementID.append(SEP); + } + elementID.append(aString); + } + + /** + * Appends a zero to the element id to represent the first new child component. + * For example, if the element id is "0.1", calling this changes the element id + * to "0.1.0". + */ + public void appendZeroElementIDComponent() { + if (elementID.length() > 0) { + elementID.append(SEP); + } + elementID.append(ZERO); + } + + /** + * Increments the last component of the element id. For example, if the element + * id is "0.1", calling this changes the element id to "0.2". + */ + public void incrementLastElementIDComponent() { + String last; + String id = elementID.toString(); + int index = id.lastIndexOf(SEP); + if (index == -1) { + last = id; + } else { + last = id.substring(index + 1); + } + + deleteLastElementIDComponent(); + + try { + appendElementIDComponent(Integer.toString(Integer.parseInt(last) + 1)); + } catch (Exception exc) { + System.err.println("Error parsing id: " + last); + appendZeroElementIDComponent(); + } + // System.out.println( "WOContext: " + elementID ); + } + + /** + * Deletes the last component of the element id. For example, if the element id + * is "0.1", callling this changes the element id to "0". + */ + public void deleteLastElementIDComponent() { + int index = elementID.toString().lastIndexOf(SEP); + if (index == -1) { + elementID.setLength(0); + } else { + elementID.setLength(index); + } + } + + /** + * Deletes all components of the element id. This makes the element id an empty + * string. + */ + public void deleteAllElementIDComponents() { + elementID.setLength(0); + } + + /** + * Returns a URL for the named action with query parameters as specified by the + * dictionary. + */ + public String directActionURLForActionNamed(String anActionName, Map aQueryDict) { + StringBuffer query = new StringBuffer(); + + try { + String key; + Iterator i = aQueryDict.keySet().iterator(); + while (i.hasNext()) { + key = i.next().toString(); + query.append(URI.encode(key, URI.allowed_within_query)); + query.append('='); + query.append(URI.encode(aQueryDict.get(key).toString(), URI.allowed_within_query)); + if (i.hasNext()) { + query.append('&'); + } + } + } catch (IOException exc) { + // report error + System.err.println("directActionURLForActionNamed: " + anActionName + " : " + aQueryDict); + System.err.println(exc); + + // delete query string + query = new StringBuffer(); + } + + return urlWithRequestHandlerKey(WOApplication.directActionRequestHandlerKey(), anActionName, query.toString()); + } + + /** + * Returns the complete URL for the current component action. + */ + public String componentActionURL() { + StringBuffer buffer = new StringBuffer(); + buffer.append(request().applicationName()); + buffer.append('/'); + buffer.append(WOApplication.application().componentRequestHandlerKey()); + buffer.append('/'); + buffer.append(page().name()); + buffer.append('/'); + buffer.append(contextID); + buffer.append('/'); + buffer.append(elementID); + return buffer.toString(); + } + + /** + * Returns a URL relative to the servlet for the specified request handler, + * action, and query string. + */ + public String urlWithRequestHandlerKey(String aRequestHandlerKey, String aPath, String aQueryString) { + StringBuffer buffer = new StringBuffer(); + buffer.append(request().applicationName()); + buffer.append('/'); + buffer.append(aRequestHandlerKey); + buffer.append('/'); + buffer.append(aPath); + if (aQueryString != null && aQueryString.trim().length() > 0) { + buffer.append('?'); + buffer.append(aQueryString); + } + return buffer.toString(); + } + + /** + * Returns the complete URL for the specified request handler, path, and query + * string. isSecure determines the protocol: http or https. port is appended to + * the protocol, if zero, the port is omitted from the URL. + */ + public String completeURLWithRequestHandlerKey(String aRequestHandlerKey, String aPath, String aQueryString, + boolean isSecure, int port) { + StringBuffer buffer = new StringBuffer(); + + if (isSecure) { + buffer.append(HTTPS); + } else { + buffer.append(HTTP); + } + + buffer.append(request.applicationHost()); + + if (port != 0 && port != 80) { + buffer.append(':'); + buffer.append(Integer.toString(port)); + } + + buffer.append(urlWithRequestHandlerKey(aRequestHandlerKey, aPath, aQueryString)); + + return buffer.toString(); + } + + /** + * Sets whether distribution is enabled. + */ + public void setDistributionEnabled(boolean distributionEnabled) { + isDistributionEnabled = distributionEnabled; + } + + /** + * Returns whether distribution is enabled. + */ + public boolean isDistributionEnabled() { + return isDistributionEnabled; + } + + /** + * This method is not included in the WOContext specification. This + * implementation returns "" since only cookie ids are currently supported. + */ + String urlSessionPrefix() { + return EMPTY; // "/" + sessionid; + } + + /** + * Returns the relative URL for the current page. + */ + String url() { + throw new RuntimeException("Not implemented yet."); + } + + public String toString() { + return "[WOContext@" + Integer.toHexString(System.identityHashCode(this)) + ":id=" + contextID + ":page=" + page + + ":component=" + component + ":element=" + elementID + "]"; + } } /* - * $Log$ - * Revision 1.2 2006/02/19 01:44:02 cgruber - * Add xmlrpc files - * Remove jclark and replace with dom4j and javax.xml.sax stuff - * Re-work dependencies and imports so it all compiles. + * $Log$ Revision 1.2 2006/02/19 01:44:02 cgruber Add xmlrpc files Remove jclark + * and replace with dom4j and javax.xml.sax stuff Re-work dependencies and + * imports so it all compiles. * - * Revision 1.1 2006/02/16 13:22:22 cgruber - * Check in all sources in eclipse-friendly maven-enabled packages. + * Revision 1.1 2006/02/16 13:22:22 cgruber Check in all sources in + * eclipse-friendly maven-enabled packages. * - * Revision 1.19 2003/08/07 00:15:15 chochos - * general cleanup (mostly removing unused imports) + * Revision 1.19 2003/08/07 00:15:15 chochos general cleanup (mostly removing + * unused imports) * - * Revision 1.18 2003/02/21 16:40:23 mpowers - * Now reading port and smtp host from system properties. - * Implemented WOApplication.main. + * Revision 1.18 2003/02/21 16:40:23 mpowers Now reading port and smtp host from + * system properties. Implemented WOApplication.main. * - * Revision 1.17 2003/01/24 20:12:54 mpowers - * Better parent determination. + * Revision 1.17 2003/01/24 20:12:54 mpowers Better parent determination. * - * Revision 1.16 2003/01/21 22:27:02 mpowers - * Corrected context id usage. + * Revision 1.16 2003/01/21 22:27:02 mpowers Corrected context id usage. * Implemented backtracking. * - * Revision 1.15 2003/01/17 20:58:19 mpowers - * Fixed up WOHyperlink. + * Revision 1.15 2003/01/17 20:58:19 mpowers Fixed up WOHyperlink. * - * Revision 1.14 2003/01/17 20:34:57 mpowers - * Better handling for components and parents in the context's element stack. + * Revision 1.14 2003/01/17 20:34:57 mpowers Better handling for components and + * parents in the context's element stack. * - * Revision 1.13 2003/01/14 19:48:36 mpowers - * - fixes to property synchronization - * - forms now pass takeValuesFromRequest to children - * - fixes to action invocation - * - now supporting multipleSubmit in forms + * Revision 1.13 2003/01/14 19:48:36 mpowers - fixes to property synchronization + * - forms now pass takeValuesFromRequest to children - fixes to action + * invocation - now supporting multipleSubmit in forms * - * Revision 1.12 2003/01/13 22:24:44 mpowers - * Request-response cycle is working with session and page persistence. + * Revision 1.12 2003/01/13 22:24:44 mpowers Request-response cycle is working + * with session and page persistence. * - * Revision 1.11 2003/01/10 20:17:41 mpowers - * Component action urls are now working. + * Revision 1.11 2003/01/10 20:17:41 mpowers Component action urls are now + * working. * - * Revision 1.8 2003/01/09 21:16:48 mpowers - * Bringing request-response cycle more into conformance. + * Revision 1.8 2003/01/09 21:16:48 mpowers Bringing request-response cycle more + * into conformance. * - * Revision 1.7 2003/01/09 16:13:59 mpowers - * Implemented WOComponentRequestHandler: - * Bringing the request-response cycle more into conformance. + * Revision 1.7 2003/01/09 16:13:59 mpowers Implemented + * WOComponentRequestHandler: Bringing the request-response cycle more into + * conformance. * - * Revision 1.4 2002/12/20 22:56:33 mpowers - * Reimplemented the template parsing again. - * Nested components are now correctly parsed. - * ElementID numbering is now working. + * Revision 1.4 2002/12/20 22:56:33 mpowers Reimplemented the template parsing + * again. Nested components are now correctly parsed. ElementID numbering is now + * working. * - * Revision 1.3 2002/12/18 14:12:38 mpowers - * Support for differentiated request handlers. - * Support url generation for WOContext and WORequest. + * Revision 1.3 2002/12/18 14:12:38 mpowers Support for differentiated request + * handlers. Support url generation for WOContext and WORequest. * - * Revision 1.2 2002/12/17 14:57:42 mpowers - * Minor corrections to WORequests's parsing, and updated javadocs. + * Revision 1.2 2002/12/17 14:57:42 mpowers Minor corrections to WORequests's + * parsing, and updated javadocs. * - * Revision 1.1.1.1 2000/12/21 15:53:04 mpowers - * Contributing wotonomy. + * Revision 1.1.1.1 2000/12/21 15:53:04 mpowers Contributing wotonomy. * - * Revision 1.3 2000/12/20 16:25:49 michael - * Added log to all files. + * Revision 1.3 2000/12/20 16:25:49 michael Added log to all files. * * */ - |
