From 722a74ce2f8e6c4e59bb2ced81e312e06c37b1b2 Mon Sep 17 00:00:00 2001
From: quasi The top-level container for all Bebop components and containers.
- * A typical A typical
+ *
- *
- * Page may be created as follows:
- *
+ * Page may be created as follows: null
- *
* Page p = new Page("Hello World");
* p.add(new Label("Hello World");
* p.lock();
- *
Container that renders this Page.
+ * Container that renders this
+ * Page.
*/
protected Container m_panel;
private List m_actionListeners;
private List m_requestListeners;
/**
- * The title of the page to be added in the head of HTML output. The
- * title is wrapped in a Label to allow developers to add
- * PrintListeners to dynamically change the value of the title.
+ * The title of the page to be added in the head of HTML output. The title
+ * is wrapped in a Label to allow developers to add PrintListeners to
+ * dynamically change the value of the title.
*/
private Label m_title;
/**
@@ -147,16 +145,16 @@ public class Page extends BlockStylable implements Container {
*/
private RequestLocal m_currentTitle;
/**
- * A list of all the client-side stylesheets. The elements of the list
- * are of type Page.Stylesheet, defined at the end of this file.
+ * A list of all the client-side stylesheets. The elements of the list are
+ * of type Page.Stylesheet, defined at the end of this file.
*/
private List m_clientStylesheets;
private StringParameter m_selected;
private StringParameter m_controlEvent;
private StringParameter m_controlValue;
/**
- * The default (initial) visibility of components. The encoding is
- * identical to that for PageState.m_invisible.
+ * The default (initial) visibility of components. The encoding is identical
+ * to that for PageState.m_invisible.
*
* This variable is package-friendly since it needs to be accessed by
* PageState.
@@ -172,51 +170,53 @@ public class Page extends BlockStylable implements Container {
*/
private boolean m_finished = false;
/**
- * indicates whether pageState.stateAsURL() should export the
- * entire state for this page, or whether it should only export
- * the control event as a URL and use the HttpSession for the
- * rest of the page state.
+ * indicates whether pageState.stateAsURL() should export the entire state
+ * for this page, or whether it should only export the control event as a
+ * URL and use the HttpSession for the rest of the page state.
*/
private boolean m_useHttpSession = false;
+ /**
+ * HasMap for page generator information.
+ */
+ private HashMaptrue if this page should export state through
- * the HttpSession instead of the URL query string.
- * If this returns true, then PageState.stateAsURL()
- * will only export the control event as
- * a URL query string. If this returns false,
- * then stateAsURL() will export the entire page state.
-
+ * Returns
+ * true if this page should export state through the
+ * HttpSession instead of the URL query string.
If this returns
+ * true, then PageState.stateAsURL() will only export the
+ * control event as a URL query string. If this returns
+ * false, then stateAsURL() will export the entire page state.
+ *
*
* @see PageState#stateAsURL
*
- * @return true if this page should export state through
- * the HttpSession; false if it should export using
- * the URL query string.
+ * @return true if this page should export state through the
+ * HttpSession; false if it should export using the URL query
+ * string.
*/
public boolean isUsingHttpSession() {
return m_useHttpSession;
}
/**
- * Indicates to this page whether it should export its entire state
- * to subsequent requests through the URL query string, or if it should
- * use the HttpSession instead and only use the URL query string for
- * the control event.
+ * Indicates to this page whether it should export its entire state to
+ * subsequent requests through the URL query string, or if it should use the
+ * HttpSession instead and only use the URL query string for the control
+ * event.
*
* @see PageState#stateAsURL
*
- * @param b true if PageState.stateAsURL()
- * will export only the control event as a URL query string.
- * false if stateAsURL() will export the entire page state.
+ * @param b true if PageState.stateAsURL() will export only the
+ * control event as a URL query string. false if stateAsURL()
+ * will export the entire page state.
*/
public void setUsingHttpSession(boolean b) {
m_useHttpSession = b;
}
/**
- * Creates an empty page with the specified title and
- * panel.
+ * Creates an empty page with the specified title and panel.
*
* @param title title for this page
*
@@ -227,8 +227,7 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Creates an empty page with the specified title and
- * panel.
+ * Creates an empty page with the specified title and panel.
*
* @param title title for this page
*
@@ -248,7 +247,6 @@ public class Page extends BlockStylable implements Container {
// Initialize the RequestLocal where the title for the current
// request will be kept
m_currentTitle = new RequestLocal() {
-
@Override
protected Object initialValue(PageState state) {
return m_title.firePrintEvent(state);
@@ -270,21 +268,20 @@ public class Page extends BlockStylable implements Container {
// Set up the visibility tracking parameters
m_invisible = new BitSet(32);
BitSetParameter p = new BitSetParameter(INVISIBLE,
- BitSetParameter.ENCODE_DGAP);
+ BitSetParameter.ENCODE_DGAP);
m_stateModel.addFormParam(p);
}
/**
- * Creates an empty page with default title and implicit BoxPanel
- * container.
+ * Creates an empty page with default title and implicit BoxPanel container.
*/
public Page() {
this("");
}
/**
- * Creates an empty page with the specified title and implicit
- * BoxPanel container.
+ * Creates an empty page with the specified title and implicit BoxPanel
+ * container.
*
* @param title title for this page
*/
@@ -295,8 +292,8 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Creates an empty page with the specified title and implicit
- * BoxPanel container.
+ * Creates an empty page with the specified title and implicit BoxPanel
+ * container.
*
* @param title title for this page
*/
@@ -315,31 +312,31 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Adds a component with the specified layout constraints to this
- * container. Layout constraints are defined in each layout container as
- * static ints. To specify multiple constraints, use bitwise OR.
+ * Adds a component with the specified layout constraints to this container.
+ * Layout constraints are defined in each layout container as static ints.
+ * To specify multiple constraints, use bitwise OR.
*
* @param c component to add to this container
*
- * @param constraints layout constraints (a
- * bitwise OR of static ints in the particular layout)
+ * @param constraints layout constraints (a bitwise OR of static ints in the
+ * particular layout)
*/
public void add(Component c, int constraints) {
m_panel.add(c, constraints);
}
/**
- * Returns true if this list contains the specified element.
- * More formally, returns true if and only if this list
- * contains at least
- * one element e such that (o==null ? e==null : o.equals(e)).
- *
- * This method returns true only if the component has been
- * directly added to this container. If this container contains another
- * container that contains this component, this method returns
+ * Returns
+ * true if this list contains the specified element. More
+ * formally, returns
+ * true if and only if this list contains at least one element
+ * e such that (o==null ? e==null : o.equals(e)).
This method returns
+ * true only if the component has been directly added to this
+ * container. If this container contains another container that contains
+ * this component, this method returns
* false.
*
- * @param o element whose presence in this container is to be tested
+ * @param o element whose presence in this container is to be tested
*
* @return true if this Container contains the specified
* component directly; false otherwise.
@@ -349,14 +346,12 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Returns the
- * component at the specified position. Each call to the add method
- * increments the index. Since the user has no control over the index
- * of added components (other than counting each call to add), this
- * method should be used in conjunction with indexOf.
+ * Returns the component at the specified position. Each call to the add
+ * method increments the index. Since the user has no control over the index
+ * of added components (other than counting each call to add), this method
+ * should be used in conjunction with indexOf.
*
- * @param index the index of the item to be retrieved from this
- * Container
+ * @param index the index of the item to be retrieved from this Container
*
* @return the component at the specified position in this container.
*/
@@ -365,25 +360,26 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Gets the index of a
- * component.
+ * Gets the index of a component.
*
* @param c component to search for
*
- * @return the index in this list of the first occurrence of the
- * specified element, or -1 if this list does not contain this element.
+ * @return the index in this list of the first occurrence of the specified
+ * element, or -1 if this list does not contain this element.
*
* @pre c != null
* @post contains(c) implies (return >= 0) && (return < size())
- * @post !contains(c) implies return == -1 */
+ * @post !contains(c) implies return == -1
+ */
public int indexOf(Component c) {
return m_panel.indexOf(c);
}
/**
- * Returns true if the container contains no components.
+ * Returns
+ * true if the container contains no components.
*
- * @return true if this container contains no
+ * @return true if this container contains no * *
* components; false otherwise.
*/
public boolean isEmpty() {
@@ -392,8 +388,8 @@ public class Page extends BlockStylable implements Container {
/**
* Returns the number of elements in this container. This does not
- * recursively count the components that are indirectly contained
- * in this container.
+ * recursively count the components that are indirectly contained in this
+ * container.
*
* @return the number of components directly in this container.
*/
@@ -407,8 +403,9 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Returns the panel that the Page uses for rendering its
- * components.
+ * Returns the panel that the
+ * Page uses for rendering its components.
+ *
* @return the panel.
*/
public final Container getPanel() {
@@ -427,9 +424,7 @@ public class Page extends BlockStylable implements Container {
}
/**
- *
- * Retrieves the title of this page. - *
+ *Retrieves the title of this page.
* * @return the static title of this page. */ @@ -468,16 +463,16 @@ public class Page extends BlockStylable implements Container { } /** - * Sets the {@link Component} that will display the validation errors - * in the current {@link PageState}. Any validation error in the - *PageState will cause the Page to completely
- * ignore all other components and render only the error display component.
- *
- * By default, a {@link PageErrorDisplay} component is used to display the
- * validation errors.
+ * Sets the {@link Component} that will display the validation errors in the
+ * current {@link PageState}. Any validation error in the
+ * PageState will cause the
+ * Page to completely ignore all other components and render
+ * only the error display component.
By default, a
+ * {@link PageErrorDisplay} component is used to display the validation
+ * errors.
*
- * @param c the component that will display the validation errors
- * in the current PageState
+ * @param c the component that will display the validation errors in the
+ * current PageState
*/
public final void setErrorDisplay(Component c) {
Assert.isUnlocked(this);
@@ -485,29 +480,29 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Gets the {@link Component} that will display the validation errors
- * in the current {@link PageState}. Any validation error in the
- * PageState will cause the Page to completely
- * ignore all other components and render only the error display component.
- *
- * By default, a {@link PageErrorDisplay} component is used to display the
- * validation errors.
+ * Gets the {@link Component} that will display the validation errors in the
+ * current {@link PageState}. Any validation error in the
+ * PageState will cause the
+ * Page to completely ignore all other components and render
+ * only the error display component.
By default, a
+ * {@link PageErrorDisplay} component is used to display the validation
+ * errors.
*
- * @return the component that will display the validation errors
- * in the current PageState.
+ * @return the component that will display the validation errors in the
+ * current PageState.
*/
public final Component getErrorDisplay() {
return m_errorDisplay;
}
/**
- * Adds a client-side stylesheet that should be used in HTML
- * output. Arbitrarily many client-side stylesheets can be added with
- * this method. To use a CSS stylesheet, call something like
+ * Adds a client-side stylesheet that should be used in HTML output.
+ * Arbitrarily many client-side stylesheets can be added with this method.
+ * To use a CSS stylesheet, call something like
* setStyleSheet("style.css", "text/css").
*
- *
These values will ultimately wind up in a <link> - * tag in the head of the HTML page. + *
These values will ultimately wind up in a <link> tag + * in the head of the HTML page. * *
Note that the stylesheet set with this call has nothing to do with * the XSLT stylesheet (transformer) that is applied to the XML generated @@ -515,7 +510,7 @@ public class Page extends BlockStylable implements Container { * * @param styleSheetURI the location of the stylesheet * @param mimeType the MIME type of the stylesheet, usually - * text/css + * text/css * @pre ! isLocked() */ public void addClientStylesheet(String styleSheetURI, String mimeType) { @@ -523,14 +518,14 @@ public class Page extends BlockStylable implements Container { } /** - * Adds a global state parameter to this page. Global parameters are - * values that need to be preserved between requests, but that have no - * special connection to any of the components on the page. For a page - * that displays details about an item, a global parameter would be - * used to identify the item. + * Adds a global state parameter to this page. Global parameters are values + * that need to be preserved between requests, but that have no special + * connection to any of the components on the page. For a page that displays + * details about an item, a global parameter would be used to identify the + * item. * - *
If the parameter was previously added as a component state - * parameter, its name is unmangled and stays unmangled. + *
If the parameter was previously added as a component state parameter, + * its name is unmangled and stays unmangled. * * @param p the global parameter to add * @@ -546,18 +541,17 @@ public class Page extends BlockStylable implements Container { } /** - * Constructs the top nodes of the DOM or JDOM tree. Used by - * generateXML(PageState, Document) below. - *
Generates DOM fragment: + * Constructs the top nodes of the DOM or JDOM tree. Used by + * generateXML(PageState, Document) below.
Generates DOM fragment: *
* <bebop:page>
* <bebop:title> ... value set with setTitle ... </bebop:title>
* <bebop:stylesheet href='styleSheetURI' type='mimeType'>
* ... page content gnerated by children ...
- * </bebop:page>
- * The content of the <title> element can be set by
- * calling {@link #setTitle setTitle}. The <stylesheet>
- * element will only be present if a stylesheet has been set with {@link
+ * </bebop:page> The content of the <title> element
+ * can be set by calling {@link #setTitle setTitle}. The
+ * <stylesheet> element will only be present if a stylesheet
+ * has been set with {@link
* #setStyleSheet setStyleSheet}.
*
* @param ps the page state for the current page
@@ -571,6 +565,9 @@ public class Page extends BlockStylable implements Container {
Element page = parent.createRootElement("bebop:page", BEBOP_XML_NS);
exportAttributes(page);
+ /* Generator information */
+ exportPageGenerator(page);
+
Element title = page.newChildElement("bebop:title", BEBOP_XML_NS);
title.setText(getTitle(ps).getLabel(ps));
@@ -582,10 +579,11 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Constructs a DOM or JDOM tree with all components on the page. The tree
- * represents the page that
- * results from the {@link javax.servlet.http.HttpServletRequest} kept in
- * the state.
+ * Constructs a DOM or JDOM tree with all components on the page. The tree
+ * represents the page that results from the
+ * {@link javax.servlet.http.HttpServletRequest} kept in the
+ * state.
+ *
* @param state the page state produced by {@link #process}
* @param parent the DOM node for the whole Document
* @see #process process
@@ -623,19 +621,18 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Do nothing. Top-level add nodes is meaningless.
+ * Do nothing. Top-level add nodes is meaningless.
*/
public void generateXML(PageState state, Element elt) {
return;
}
/**
- * Creates a PageState object and processes it by calling the
- * respond method on the
- * selected component. Processes a request by notifying the component
+ * Creates a PageState object and processes it by calling the respond method
+ * on the selected component. Processes a request by notifying the component
* from which the process originated and {@link #fireActionEvent
- * broadcasts} an {@link ActionEvent} to all the listeners that
- * registered with {@link #addActionListener addActionListener}.
+ * broadcasts} an {@link ActionEvent} to all the listeners that registered
+ * with {@link #addActionListener addActionListener}.
*
* @see #generateXML(PageState,Document) generateXML
* @pre isLocked()
@@ -643,7 +640,7 @@ public class Page extends BlockStylable implements Container {
* @pre response != null
*/
public PageState process(HttpServletRequest request,
- HttpServletResponse response)
+ HttpServletResponse response)
throws ServletException {
PageState result = new PageState(this, request, response);
@@ -657,9 +654,8 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Processes the supplied PageState object according to this
- * PageModel. Calls the respond method on the selected Bebop
- * component.
+ * Processes the supplied PageState object according to this PageModel.
+ * Calls the respond method on the selected Bebop component.
*/
public void process(PageState state) throws ServletException {
Assert.isLocked(this);
@@ -704,18 +700,17 @@ public class Page extends BlockStylable implements Container {
// return state;
// }
/**
- * Builds a DOM Document from the current request state by
- * doing a depth-first tree walk on the current set of components
- * in this Page, calling generateXML on each. Does NOT do the rendering.
- * If the HTTP response has already been committed, does not
- * build the XML document.
+ * Builds a DOM Document from the current request state by doing a
+ * depth-first tree walk on the current set of components in this Page,
+ * calling generateXML on each. Does NOT do the rendering. If the HTTP
+ * response has already been committed, does not build the XML document.
*
- * @return a DOM ready for rendering, or null if the response has
- * already been committed.
+ * @return a DOM ready for rendering, or null if the response has already
+ * been committed.
* @post res.isCommitted() == (return == null)
*/
public Document buildDocument(HttpServletRequest req,
- HttpServletResponse res)
+ HttpServletResponse res)
throws ServletException {
try {
Document doc = new Document();
@@ -743,8 +738,7 @@ public class Page extends BlockStylable implements Container {
/**
* Finishes building the page. The tree of components is traversed and each
- * component is told to add its state parameters to the page's state
- * model.
+ * component is told to add its state parameters to the page's state model.
*
* @pre ! isLocked()
*/
@@ -753,7 +747,6 @@ public class Page extends BlockStylable implements Container {
Assert.isUnlocked(this);
Traversal componentRegistrar = new Traversal() {
-
protected void act(Component c) {
addComponent(c);
c.register(Page.this);
@@ -784,7 +777,6 @@ public class Page extends BlockStylable implements Container {
}
m_stateModel.lock();
Traversal componentLocker = new Traversal() {
-
protected void act(Component c) {
c.lock();
}
@@ -800,8 +792,9 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Registers a listener that is notified whenever a request to this page
- * is made, after the selected component has had a chance to respond.
+ * Registers a listener that is notified whenever a request to this page is
+ * made, after the selected component has had a chance to respond.
+ *
* @pre l != null
* @pre ! isLocked()
*/
@@ -812,6 +805,7 @@ public class Page extends BlockStylable implements Container {
/**
* Remove a previously registered action listener.
+ *
* @pre l != null
* @pre ! isLocked()
*/
@@ -821,8 +815,9 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Registers a listener that is notified whenever a request to this page
- * is made, before the selected component has had a chance to respond.
+ * Registers a listener that is notified whenever a request to this page is
+ * made, before the selected component has had a chance to respond.
+ *
* @pre l != null
* @pre ! isLocked()
*/
@@ -833,6 +828,7 @@ public class Page extends BlockStylable implements Container {
/**
* Removes a previously registered request listener.
+ *
* @param 1 the listener to remove
* @pre l != null
* @pre ! isLocked()
@@ -843,9 +839,10 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Broadcasts an {@link ActionEvent} to all registered listeners. The
- * source of the event is this page, and the state recorded in the event
- * is the one resulting from processing the current request.
+ * Broadcasts an {@link ActionEvent} to all registered listeners. The source
+ * of the event is this page, and the state recorded in the event is the one
+ * resulting from processing the current request.
+ *
* @param the state for this event
*
* @pre state != null
@@ -869,10 +866,11 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Broadcasts a {@link RequestEvent} to all registered listeners. The
- * source of the event is this page, and the state recorded in the event
- * is the one resulting from processing the current request.
- * @param the state for this event
+ * Broadcasts a {@link RequestEvent} to all registered listeners. The source
+ * of the event is this page, and the state recorded in the event is the one
+ * resulting from processing the current request.
+ *
+ * @param state the state for this event
*
* @pre state != null
*/
@@ -894,6 +892,49 @@ public class Page extends BlockStylable implements Container {
}
}
+ final protected void addPageGeneratorInformation(String key, String value) {
+ if (key != null && !key.isEmpty()) {
+ m_pageGenerator.put(key, value);
+ }
+ }
+
+ final protected String getPageGeneratorInformation(String key) {
+ if (key != null && !key.isEmpty()) {
+ return m_pageGenerator.get(key);
+ } else {
+ return null;
+ }
+ }
+
+ final protected String removePageGeneratorInformation(String key) {
+ if (key != null && !key.isEmpty()) {
+ return m_pageGenerator.remove(key);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Export page generator information if set. The m_pageGenerator is a
+ * HashMap containing the information as key value. In general this should
+ * include generator name and generator version.
+ *
+ * @param page parent element - should be bebeop:page
+ *
+ * @pre m_pageGenerator != null && !m_pageGenerator.isEmpty()
+ */
+ final protected void exportPageGenerator(Element page) {
+ if (m_pageGenerator != null && !m_pageGenerator.isEmpty()) {
+ Element gen = page.newChildElement("bebop:pageGenerator", BEBOP_XML_NS);
+
+ Iteratortrue if the component is visible by default;
* false otherwise.
* @see #setVisibleDefault setVisibleDefault
- * @see Component#setVisible Component.setVisible
+ * @see Component#setVisible Component.setVisible
*/
public boolean isVisibleDefault(Component c) {
Assert.isTrue(stateContains(c));
@@ -1078,10 +1117,10 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Sets whether the specified component is visible by default. The
- * default visibility is used when a page is displayed for the first
- * time and on subsequent requests until the visibility of a component
- * is changed explicitly with {@link Component#setVisible
+ * Sets whether the specified component is visible by default. The default
+ * visibility is used when a page is displayed for the first time and on
+ * subsequent requests until the visibility of a component is changed
+ * explicitly with {@link Component#setVisible
* Component.setVisible}.
*
* When a component is first added to a page, it is visible.
@@ -1089,7 +1128,7 @@ public class Page extends BlockStylable implements Container {
* @param c a component whose visibility is to be set
* @param v true if the component is visible;
* false otherwise.
- * @see Component#setVisible Component.setVisible
+ * @see Component#setVisible Component.setVisible
* @see Component#register Component.register
*/
public void setVisibleDefault(Component c, boolean v) {
@@ -1105,7 +1144,8 @@ public class Page extends BlockStylable implements Container {
}
/**
- * The global name of the parameter name in the component
+ * The global name of the parameter
+ * name in the component
* c.
*/
public String parameterName(Component c, String name) {
@@ -1117,7 +1157,8 @@ public class Page extends BlockStylable implements Container {
}
/**
- * The global name of the parameter name.
+ * The global name of the parameter
+ * name.
*/
public String parameterName(String name) {
return parameterName(null, name);
@@ -1125,7 +1166,6 @@ public class Page extends BlockStylable implements Container {
void reset(final PageState ps, Component cmpnt) {
Traversal resetter = new Traversal() {
-
protected void act(Component c) {
Collection cp = getComponentParameters(c);
if (cp != null) {
@@ -1142,8 +1182,8 @@ public class Page extends BlockStylable implements Container {
}
/**
- * Return the prefix that is prepended to each component's state
- * parameters to keep them unique.
+ * Return the prefix that is prepended to each component's state parameters
+ * to keep them unique.
*/
private final String componentPrefix(Component c) {
if (c == null) {
@@ -1186,7 +1226,7 @@ public class Page extends BlockStylable implements Container {
private static String NAME = "name";
/**
- * Produces an XML fragment that captures the layout of this page.
+ * Produces an XML fragment that captures the layout of this page.
*/
private void showStructure(PageState s, Element root) {
final HttpServletRequest req = s.getRequest();
@@ -1248,7 +1288,7 @@ public class Page extends BlockStylable implements Container {
parent.newChildElement("bebop:param", BEBOP_XML_NS);
param.addAttribute(NAME, unmangle(p.getName()));
param.addAttribute("defaultValue",
- String.valueOf(req.getParameter(p.getName())));
+ String.valueOf(req.getParameter(p.getName())));
param.addAttribute("currentValue", String.valueOf(s.getValue(p)));
}
}
@@ -1267,21 +1307,21 @@ public class Page extends BlockStylable implements Container {
}
/**
- * return a string that represents an ordered list of component
- * ids used on the page. For situations where only the
- * components present is of importance, this may be used
- * by implementations of hashCode & equals
+ * return a string that represents an ordered list of component ids used on
+ * the page. For situations where only the components present is of
+ * importance, this may be used by implementations of hashCode & equals
+ *
* @return
*/
public String getComponentString() {
Iterator it = m_componentMap.keySet().iterator();
/*int hash = 0;
- while (it.hasNext()) {
- String componentId = (String)it.next();
- s_log.debug("component id = " + componentId);
- hash = hash | componentId.hashCode();
- s_log.debug("hash so far = " + hash);
- }*/
+ while (it.hasNext()) {
+ String componentId = (String)it.next();
+ s_log.debug("component id = " + componentId);
+ hash = hash | componentId.hashCode();
+ s_log.debug("hash so far = " + hash);
+ }*/
Date start = new Date();
StringBuffer hashString = new StringBuffer();
@@ -1290,7 +1330,7 @@ public class Page extends BlockStylable implements Container {
hashString.append(componentId);
}
s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.
- getTime()));
+ getTime()));
return hashString.toString();