You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@click.apache.org by sa...@apache.org on 2009/03/12 21:16:41 UTC
svn commit: r752994 - in
/incubator/click/trunk/click/framework/src/org/apache/click: Control.java
Page.java control/AbstractControl.java util/PageImports.java
Author: sabob
Date: Thu Mar 12 20:16:40 2009
New Revision: 752994
URL: http://svn.apache.org/viewvc?rev=752994&view=rev
Log:
renamed method getHtmlHeaders to getHeadElements
Modified:
incubator/click/trunk/click/framework/src/org/apache/click/Control.java
incubator/click/trunk/click/framework/src/org/apache/click/Page.java
incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java
incubator/click/trunk/click/framework/src/org/apache/click/util/PageImports.java
Modified: incubator/click/trunk/click/framework/src/org/apache/click/Control.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/Control.java?rev=752994&r1=752993&r2=752994&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/Control.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/Control.java Thu Mar 12 20:16:40 2009
@@ -169,7 +169,7 @@
* subclasses is forgetting to call <em>super.getHtmlImports</em>. Consider
* carefully whether you should call <em>super.getHtmlImports</em> or not.
*
- * @deprecated use the new {@link #getHtmlHeaders()} instead
+ * @deprecated use the new {@link #getHeadElements()} instead
*
* @return the HTML includes statements for the control stylesheet and
* JavaScript files, or null if no includes are available
@@ -263,7 +263,7 @@
*
* @return the list of HTML HEAD entries to be included in the page
*/
- public List getHtmlHeaders();
+ public List getHeadElements();
/**
* Return HTML element identifier attribute "id" value.
Modified: incubator/click/trunk/click/framework/src/org/apache/click/Page.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/Page.java?rev=752994&r1=752993&r2=752994&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/Page.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/Page.java Thu Mar 12 20:16:40 2009
@@ -154,10 +154,10 @@
protected List controls;
/**
- * The list of page HTML head entries including: JavaScript imports,
- * CSS imports, inline JavaScript and inline CSS.
+ * The list of page HTML HEAD elements including: Javascript imports,
+ * Css imports, inline Javascript and inline Css.
*/
- protected List htmlHeaders;
+ protected List headElements;
/** The Velocity template formatter object. */
protected Format format;
@@ -651,7 +651,7 @@
* @return the HTML includes statements for the control stylesheet and
* JavaScript files, by default this method returns null
*
- * @deprecated use the new {@link #getHtmlHeaders()} instead
+ * @deprecated use the new {@link #getHeadElements()} instead
*/
public String getHtmlImports() {
return null;
@@ -748,11 +748,11 @@
*
* @return the list of HTML HEAD entries to be included in the page
*/
- public List getHtmlHeaders() {
- if (htmlHeaders == null) {
- htmlHeaders = new ArrayList(2);
+ public List getHeadElements() {
+ if (headElements == null) {
+ headElements = new ArrayList(2);
}
- return htmlHeaders;
+ return headElements;
}
/**
Modified: incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java?rev=752994&r1=752993&r2=752994&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/control/AbstractControl.java Thu Mar 12 20:16:40 2009
@@ -127,10 +127,10 @@
protected ActionListener actionListener;
/**
- * The list of control HTML head entries including: JavaScript imports,
- * CSS imports, inline JavaScript and inline CSS.
+ * The list of page HTML HEAD elements including: Javascript imports,
+ * Css imports, inline Javascript and inline Css.
*/
- protected List htmlHeaders;
+ protected List headElements;
/** The Control attributes Map. */
protected Map attributes;
@@ -558,17 +558,17 @@
}
/**
- * @see org.apache.click.Control#getHtmlHeaders()
+ * @see org.apache.click.Control#getHeadElements()
*
- * @return the list of HTML HEAD entries to be included in the page
+ * @return the list of HTML HEAD elements to be included in the page
*/
- public List getHtmlHeaders() {
- if (htmlHeaders == null) {
- // Most controls won't provide their own html headers, so save
+ public List getHeadElements() {
+ if (headElements == null) {
+ // Most controls won't provide their own head elements, so save
// memory by creating an empty array list
- htmlHeaders = new ArrayList(0);
+ headElements = new ArrayList(0);
}
- return htmlHeaders;
+ return headElements;
}
/**
Modified: incubator/click/trunk/click/framework/src/org/apache/click/util/PageImports.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/framework/src/org/apache/click/util/PageImports.java?rev=752994&r1=752993&r2=752994&view=diff
==============================================================================
--- incubator/click/trunk/click/framework/src/org/apache/click/util/PageImports.java (original)
+++ incubator/click/trunk/click/framework/src/org/apache/click/util/PageImports.java Thu Mar 12 20:16:40 2009
@@ -30,6 +30,11 @@
import org.apache.click.Page;
import org.apache.click.control.Container;
import org.apache.click.control.Table;
+import org.apache.click.element.CssImport;
+import org.apache.click.element.CssStyle;
+import org.apache.click.element.Element;
+import org.apache.click.element.JsImport;
+import org.apache.click.element.JsScript;
import org.apache.click.service.LogService;
import org.apache.commons.lang.StringUtils;
@@ -92,6 +97,9 @@
/** The page imports initialized flag. */
protected boolean initialized = false;
+ /** The list of head elements. */
+ protected List headElements = new ArrayList();
+
/** The list of CSS import lines. */
protected List cssImports = new ArrayList();
@@ -123,40 +131,39 @@
/**
* Add the given HtmlHeader to the Page HTML imports.
*
- * @param htmlHeader the HtmlHeader to add
+ * @param element the HtmlHeader to add
*/
- public void add(HtmlHeader htmlHeader) {
- if (htmlHeader instanceof JavascriptImport) {
- if (jsImports.contains(htmlHeader)) {
+ public void add(Element element) {
+ if (element instanceof JsImport) {
+ if (jsImports.contains(element)) {
return;
}
- jsImports.add(htmlHeader);
+ jsImports.add(element);
- } else if (htmlHeader instanceof Javascript) {
- if (((Javascript) htmlHeader).isUnique()) {
- if (jsScripts.contains(htmlHeader)) {
+ } else if (element instanceof JsScript) {
+ if (((JsScript) element).isUnique()) {
+ if (jsScripts.contains(element)) {
return;
}
}
- jsScripts.add(htmlHeader);
+ jsScripts.add(element);
- } else if (htmlHeader instanceof CssImport) {
- if (cssImports.contains(htmlHeader)) {
+ } else if (element instanceof CssImport) {
+ if (cssImports.contains(element)) {
return;
}
- cssImports.add(htmlHeader);
+ cssImports.add(element);
- } else if (htmlHeader instanceof Css) {
- if (((Css) htmlHeader).isUnique()) {
- if (cssStyles.contains(htmlHeader)) {
+ } else if (element instanceof CssStyle) {
+ if (((CssStyle) element).isUnique()) {
+ if (cssStyles.contains(element)) {
return;
}
}
- cssStyles.add(htmlHeader);
+ cssStyles.add(element);
} else {
- throw new IllegalArgumentException(htmlHeader.getClass().getName()
- + " is not a supported type.");
+ headElements.add(element);
}
}
@@ -182,19 +189,19 @@
add(cssImport);
} else if (line.startsWith("<style") && line.indexOf("text/css") != -1) {
- Css css = asCss(lines[i]);
- css.setUnique(true);
- add(css);
+ CssStyle cssStyle = asCssStyle(lines[i]);
+ setUnique(cssStyle, cssStyle.getContent().toString());
+ add(cssStyle);
} else if (line.startsWith("<script")) {
if (line.indexOf(" src=") != -1) {
- JavascriptImport javascriptImport = asJavascriptImport(lines[i]);
- add(javascriptImport);
+ JsImport jsImport = asJsImport(lines[i]);
+ add(jsImport);
} else {
- Javascript javascript = asJavascript(lines[i]);
- javascript.setUnique(true);
- add(javascript);
+ JsScript jsScript = asJsScript(lines[i]);
+ setUnique(jsScript, jsScript.getContent().toString());
+ add(jsScript);
}
} else {
@@ -228,7 +235,27 @@
*/
public void popuplateTemplateModel(Map model) {
LogService logger = ClickUtils.getLogService();
- Object pop = model.put("imports", new Imports());
+
+ Object pop = model.put("headElements", new HeadElements());
+ if (pop != null && !page.isStateful()) {
+ String msg = page.getClass().getName() + " on " + page.getPath()
+ + " model contains an object keyed with reserved "
+ + "name \"headElements\". The page model object "
+ + pop + " has been replaced with a PageImports object";
+ logger.warn(msg);
+ }
+
+ pop = model.put("jsElements", new JsElements());
+ if (pop != null && !page.isStateful()) {
+ String msg = page.getClass().getName() + " on " + page.getPath()
+ + " model contains an object keyed with reserved "
+ + "name \"jsElements\". The page model object "
+ + pop + " has been replaced with a PageImports object";
+ logger.warn(msg);
+ }
+
+ // For backwards compatibility
+ pop = model.put("imports", new Imports());
if (pop != null && !page.isStateful()) {
String msg = page.getClass().getName() + " on " + page.getPath()
+ " model contains an object keyed with reserved "
@@ -237,7 +264,8 @@
logger.warn(msg);
}
- pop = model.put("cssImports", new CssImports());
+ // For backwards compatibility
+ pop = model.put("cssImports", new CssElements());
if (pop != null && !page.isStateful()) {
String msg = page.getClass().getName() + " on " + page.getPath()
+ " model contains an object keyed with reserved "
@@ -246,7 +274,8 @@
logger.warn(msg);
}
- pop = model.put("jsImports", new JsImports());
+ // For backwards compatibility
+ pop = model.put("jsImports", new JsElements());
if (pop != null && !page.isStateful()) {
String msg = page.getClass().getName() + " on " + page.getPath()
+ " model contains an object keyed with reserved "
@@ -264,6 +293,26 @@
*/
public void popuplateRequest(HttpServletRequest request, Map model) {
LogService logger = ClickUtils.getLogService();
+
+ request.setAttribute("headElements", new HeadElements());
+ if (model.containsKey("headElements")) {
+ String msg = page.getClass().getName() + " on " + page.getPath()
+ + " model contains an object keyed with reserved "
+ + "name \"headElements\". The request attribute "
+ + "has been replaced with a PageImports object";
+ logger.warn(msg);
+ }
+
+ request.setAttribute("jsElements", new JsElements());
+ if (model.containsKey("jeElements")) {
+ String msg = page.getClass().getName() + " on " + page.getPath()
+ + " model contains an object keyed with reserved "
+ + "name \"jsElements\". The request attribute "
+ + "has been replaced with a PageImports object";
+ logger.warn(msg);
+ }
+
+ // For backwards compatibility
request.setAttribute("imports", new Imports());
if (model.containsKey("imports")) {
String msg = page.getClass().getName() + " on " + page.getPath()
@@ -273,7 +322,8 @@
logger.warn(msg);
}
- request.setAttribute("cssImports", new CssImports());
+ // For backwards compatibility
+ request.setAttribute("cssImports", new CssElements());
if (model.containsKey("cssImports")) {
String msg = page.getClass().getName() + " on " + page.getPath()
+ " model contains an object keyed with reserved "
@@ -282,7 +332,8 @@
logger.warn(msg);
}
- request.setAttribute("jsImports", new JsImports());
+ // For backwards compatibility
+ request.setAttribute("jsImports", new JsElements());
if (model.containsKey("jsImports")) {
String msg = page.getClass().getName() + " on " + page.getPath()
+ " model contains an object keyed with reserved "
@@ -295,14 +346,35 @@
// ------------------------------------------------------ Protected Methods
/**
+ * Render an HTML representation of all the page's HTML head elements,
+ * including: CSS imports, CSS styles, Title and Meta elements.
+ *
+ * @param buffer the specified buffer to render the page's HTML imports to
+ */
+ protected void renderHeadElements(HtmlStringBuffer buffer) {
+ // First include miscellaneous elements e.g. Title and Meta elements.
+ for (Iterator it = headElements.iterator(); it.hasNext();) {
+ Element element = (Element) it.next();
+ element.render(buffer);
+ buffer.append('\n');
+ }
+
+ // Next include all CSS imports and styles.
+ renderCssElements(buffer);
+ }
+
+ /**
* Render an HTML representation of all the page's HTML imports,
* including: CSS imports, CSS styles, JS imports and JS scripts.
*
+ * @deprecated rather use {@link #renderHeadElements(org.apache.click.util.HtmlStringBuffer)}
+ * and {@link #renderJsElements(org.apache.click.util.HtmlStringBuffer)}
+ *
* @param buffer the specified buffer to render the page's HTML imports to
*/
protected void renderAllIncludes(HtmlStringBuffer buffer) {
- renderCssImports(buffer);
- renderJsImports(buffer);
+ renderCssElements(buffer);
+ renderJsElements(buffer);
}
/**
@@ -311,7 +383,7 @@
*
* @param buffer the specified buffer to render the page's HTML imports to
*/
- protected void renderCssImports(HtmlStringBuffer buffer) {
+ protected void renderCssElements(HtmlStringBuffer buffer) {
// First include all the imports e.g. <link href="...">
for (Iterator it = cssImports.iterator(); it.hasNext();) {
CssImport cssImport = (CssImport) it.next();
@@ -321,8 +393,8 @@
// Then include all the styles e.g. <style>...</style>
for (Iterator it = cssStyles.iterator(); it.hasNext();) {
- Css cssInclude = (Css) it.next();
- cssInclude.render(buffer);
+ CssStyle cssStyle = (CssStyle) it.next();
+ cssStyle.render(buffer);
buffer.append('\n');
}
}
@@ -333,18 +405,18 @@
*
* @param buffer the specified buffer to render the page's HTML imports to
*/
- protected void renderJsImports(HtmlStringBuffer buffer) {
+ protected void renderJsElements(HtmlStringBuffer buffer) {
// First include all the imports e.g. <script src="...">
for (Iterator it = jsImports.iterator(); it.hasNext();) {
- JavascriptImport javascriptImport = (JavascriptImport) it.next();
- javascriptImport.render(buffer);
+ JsImport jsImport = (JsImport) it.next();
+ jsImport.render(buffer);
buffer.append('\n');
}
// Then include all the scripts e.g. <script>...</script>
for (Iterator it = jsScripts.iterator(); it.hasNext();) {
- Javascript javascriptInclude = (Javascript) it.next();
- javascriptInclude.render(buffer);
+ JsScript jsScript = (JsScript) it.next();
+ jsScript.render(buffer);
buffer.append('\n');
}
}
@@ -366,14 +438,14 @@
// import from getHtmlImports
addImport(control.getHtmlImports());
- // import from getHtmlHeaders
+ // import from getHeadElement
processControl(control);
}
}
addImport(page.getHtmlImports());
- processHtmlHeaders(page.getHtmlHeaders());
+ processHtmlHeaders(page.getHeadElements());
}
/**
@@ -386,7 +458,7 @@
* @param control the control to process
*/
protected void processControl(Control control) {
- processHtmlHeaders(control.getHtmlHeaders());
+ processHtmlHeaders(control.getHeadElements());
if (control instanceof Container) {
Container container = (Container) control;
@@ -411,19 +483,19 @@
/**
* Process the given list of HTML headers.
* <p/>
- * This method invokes {@link #add(org.apache.click.util.HtmlHeader)} for
- * every <tt>HtmlHeader</tt> entry in the specified list.
+ * This method invokes {@link #add(org.apache.click.element.Element)} for
+ * every <tt>HeadElement</tt> entry in the specified list.
*
- * @param htmlHeaders the list of HTML headers to process
+ * @param headElements the list of HTML HEAD elements to process
*/
- protected void processHtmlHeaders(List htmlHeaders) {
- if (htmlHeaders == null || htmlHeaders.isEmpty()) {
+ protected void processHtmlHeaders(List headElements) {
+ if (headElements == null || headElements.isEmpty()) {
return;
}
- Iterator it = htmlHeaders.iterator();
+ Iterator it = headElements.iterator();
while (it.hasNext()) {
- add((HtmlHeader) it.next());
+ add((Element) it.next());
}
}
@@ -433,6 +505,30 @@
* This class enables lazy, on demand importing for
* {@link #renderAllIncludes(org.apache.click.util.HtmlStringBuffer)}.
*/
+ class HeadElements {
+
+ /**
+ * @see java.lang.Object#toString()
+ *
+ * @return a string representing miscellaneous head and CSS elements
+ */
+ public String toString() {
+ processPageControls();
+ HtmlStringBuffer buffer = new HtmlStringBuffer(
+ 80 * cssImports.size()
+ + 80 * cssStyles.size()
+ + 80 * headElements.size());
+ PageImports.this.renderHeadElements(buffer);
+ return buffer.toString();
+ }
+ }
+
+ /**
+ * This class enables lazy, on demand importing for
+ * {@link #renderAllIncludes(org.apache.click.util.HtmlStringBuffer)}.
+ *
+ * @deprecated rather use {@link HeadElements} and {@link JsImports}
+ */
class Imports {
/**
@@ -454,42 +550,42 @@
/**
* This class enables lazy, on demand importing for
- * {@link #renderJsImports(org.apache.click.util.HtmlStringBuffer)}.
+ * {@link #renderJsElements(org.apache.click.util.HtmlStringBuffer)}.
*/
- class JsImports {
+ class JsElements {
/**
* @see java.lang.Object#toString()
*
- * @return a string representing all JavaScript imports
+ * @return a string representing all JavaScript elements
*/
public String toString() {
processPageControls();
HtmlStringBuffer buffer = new HtmlStringBuffer(
80 * jsImports.size() + 80 * jsScripts.size());
- PageImports.this.renderJsImports(buffer);
+ PageImports.this.renderJsElements(buffer);
return buffer.toString();
}
}
/**
* This class enables lazy, on demand importing for
- * {@link #renderCssImports(org.apache.click.util.HtmlStringBuffer)}.
+ * {@link #renderCssElements(org.apache.click.util.HtmlStringBuffer)}.
*/
- class CssImports {
+ class CssElements {
/**
* @see java.lang.Object#toString()
*
- * @return a string representing all CSS imports
+ * @return a string representing all CSS elements
*/
public String toString() {
processPageControls();
HtmlStringBuffer buffer = new HtmlStringBuffer(
80 * cssImports.size() + 80 * cssStyles.size());
- PageImports.this.renderCssImports(buffer);
+ PageImports.this.renderCssElements(buffer);
return buffer.toString();
}
}
@@ -509,16 +605,16 @@
}
/**
- * Convert the given HTML import line to a {@link Css} instance.
+ * Convert the given HTML import line to a {@link CssStyle} instance.
*
* @param line the HTML import line to convert to a Css instance
* @return a Css instance
*/
- private Css asCss(String line) {
- Css css = new Css();
- copyAttributes(css, line);
- css.append(extractContent(line));
- return css;
+ private CssStyle asCssStyle(String line) {
+ CssStyle cssStyle = new CssStyle();
+ copyAttributes(cssStyle, line);
+ cssStyle.append(extractContent(line));
+ return cssStyle;
}
/**
@@ -527,10 +623,10 @@
* @param line the HTML import line to convert to a JavaScriptImport instance
* @return a JavascriptImport instance
*/
- private JavascriptImport asJavascriptImport(String line) {
- JavascriptImport javascriptImport = new JavascriptImport();
- copyAttributes(javascriptImport, line);
- return javascriptImport;
+ private JsImport asJsImport(String line) {
+ JsImport jsImport = new JsImport();
+ copyAttributes(jsImport, line);
+ return jsImport;
}
/**
@@ -539,11 +635,11 @@
* @param line the HTML import line to convert to a JavaScript instance
* @return a Javascript instance
*/
- private Javascript asJavascript(String line) {
- Javascript javascript = new Javascript();
- copyAttributes(javascript, line);
- javascript.append(extractContent(line));
- return javascript;
+ private JsScript asJsScript(String line) {
+ JsScript jsScript = new JsScript();
+ copyAttributes(jsScript, line);
+ jsScript.append(extractContent(line));
+ return jsScript;
}
/**
@@ -571,13 +667,13 @@
}
/**
- * Copy all available attributes from HTML import line to the HtmlHeader
+ * Copy all available attributes from HTML import line to the Element
* instance.
*
- * @param htmlHeader the HTML header to copy the attributes to
+ * @param element the HTML head element to copy the attributes to
* @param line the HTML import line to copy attributes from
*/
- private void copyAttributes(HtmlHeader htmlHeader, String line) {
+ private void copyAttributes(Element element, String line) {
// Find index where attributes start: the first space
int start = line.indexOf(' ');
if (start == -1) {
@@ -601,7 +697,29 @@
StringTokenizer attribute = new StringTokenizer(token, "=");
String key = attribute.nextToken();
String value = attribute.nextToken();
- htmlHeader.setAttribute(key, StringUtils.strip(value, "'\""));
+ element.setAttribute(key, StringUtils.strip(value, "'\""));
+ }
+ }
+
+ /**
+ * This method provides backwards compatibility with the String based
+ * HTML imports, to indicate whether Javascript and CSS must be unique
+ * or not. The replacement functionality is provided by the html
+ * {@link org.apache.click.element.Element#setId(java.lang.String) ID}
+ * attribute.
+ *
+ * @deprecated use {@link org.apache.click.element.Element#setId(java.lang.String) ID}
+ * instead
+ *
+ * @param cssStyle sets whether the HtmlHeader import should be unique or not
+ */
+ private void setUnique(Element element, String content) {
+ String id = element.getId();
+ // If Element is unique and ID is not defined, derive the ID from the
+ // content
+ if (StringUtils.isBlank(id) && content.length() > 0) {
+ int hash = Math.abs(content.hashCode());
+ element.setId(Integer.toString(hash));
}
}
}