Author: nbelaevski
Date: 2008-11-26 10:32:01 -0500 (Wed, 26 Nov 2008)
New Revision: 11398
Added:
trunk/ui/core/src/test/java/org/ajax4jsf/component/LoadResourceComponentTest.java
trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.js
trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.xcss
trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.js
trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.xcss
Log:
https://jira.jboss.org/jira/browse/RF-4714
Added: trunk/ui/core/src/test/java/org/ajax4jsf/component/LoadResourceComponentTest.java
===================================================================
--- trunk/ui/core/src/test/java/org/ajax4jsf/component/LoadResourceComponentTest.java
(rev 0)
+++
trunk/ui/core/src/test/java/org/ajax4jsf/component/LoadResourceComponentTest.java 2008-11-26
15:32:01 UTC (rev 11398)
@@ -0,0 +1,364 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.ajax4jsf.component;
+
+import static org.ajax4jsf.resource.InternetResource.RESOURCE_URI_PREFIX;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
+import javax.faces.context.FacesContext;
+
+import org.ajax4jsf.javascript.AjaxScript;
+import org.ajax4jsf.renderkit.HeaderResourceProducer2;
+import org.ajax4jsf.renderkit.ProducerContext;
+import org.ajax4jsf.renderkit.RendererBase;
+import org.ajax4jsf.renderkit.RendererUtils.HTML;
+import org.ajax4jsf.resource.InternetResource;
+import org.ajax4jsf.resource.InternetResourceBuilder;
+import org.ajax4jsf.resource.ResourceNotFoundException;
+import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+
+import com.gargoylesoftware.htmlunit.html.HtmlLink;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlScript;
+
+/**
+ * @author Nick Belaevski
+ * @since 3.3.0
+ */
+
+public class LoadResourceComponentTest extends AbstractAjax4JsfTestCase {
+
+ private String componentJs;
+ private String userJs;
+
+ private String componentXcss;
+ private String userXcss;
+
+ /**
+ * @param name
+ */
+ public LoadResourceComponentTest(String name) {
+ super(name);
+ }
+
+ private void registerResource(String path) {
+ InternetResourceBuilder resourceBuilder = InternetResourceBuilder.getInstance();
+
+ try {
+ resourceBuilder.getResource(path);
+ } catch (ResourceNotFoundException e) {
+ resourceBuilder.createResource(null, path);
+ }
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ renderKit.addRenderer(ResourceDependentComponent.COMPONENT_FAMILY,
+ ResourceDependentComponent.COMPONENT_TYPE, new
ResourceDependentComponentRenderer());
+
+ String resourcePackage = getClass().getPackage().getName().replace('.',
'/') + "/";
+ componentJs = resourcePackage + "component.js";
+ componentXcss = resourcePackage + "component.xcss";
+
+ userJs = resourcePackage + "user.js";
+ userXcss = resourcePackage + "user.xcss";
+
+ registerResource(componentJs);
+ registerResource(userJs);
+ registerResource(componentXcss);
+ registerResource(userXcss);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+
+ componentJs = null;
+ userJs = null;
+
+ componentXcss = null;
+ userXcss = null;
+ }
+
+ private UIResource createLoadScriptComponent() {
+ return (UIResource) application.createComponent("org.ajax4jsf.LoadScript");
+ }
+
+ private UIResource createLoadStyleComponent() {
+ return (UIResource) application.createComponent("org.ajax4jsf.LoadStyle");
+ }
+
+ private List<HtmlScript> selectScriptsBySrc(HtmlPage page, String src) throws
Exception {
+ return Collections.checkedList(page.getByXPath("//script[@src[contains(string(.),
'" + src + "')]]"),
+ HtmlScript.class);
+ }
+
+ private List<HtmlLink> selectStylesByHhref(HtmlPage page, String src) throws
Exception {
+ return Collections.checkedList(page.getByXPath("//link[@type =
'text/css'][@rel = 'stylesheet'][@href[contains(string(.), '" +
src + "')]]"),
+ HtmlLink.class);
+ }
+
+ protected UIResource createAndAddScriptResource(Object src) {
+ UIResource scriptComponent = createLoadScriptComponent();
+ scriptComponent.setSrc(src);
+ facesContext.getViewRoot().getChildren().add(scriptComponent);
+
+ return scriptComponent;
+ }
+
+ protected UIResource createAndAddStyleResource(Object src) {
+ UIResource styleComponent = createLoadStyleComponent();
+ styleComponent.setSrc(src);
+ facesContext.getViewRoot().getChildren().add(styleComponent);
+
+ return styleComponent;
+ }
+
+ public void testRenderScript() throws Exception {
+ createAndAddScriptResource(RESOURCE_URI_PREFIX + userJs);
+ createAndAddScriptResource(RESOURCE_URI_PREFIX + componentJs).setRendered(false);
+
+ HtmlPage page = renderView();
+ List<HtmlScript> scripts;
+
+ scripts = selectScriptsBySrc(page, userJs);
+ assertEquals(1, scripts.size());
+
+ scripts = selectScriptsBySrc(page, componentJs);
+ assertEquals(0, scripts.size());
+ }
+
+ public void testRenderScriptResource() throws Exception {
+ InternetResourceBuilder resourceBuilder = InternetResourceBuilder.getInstance();
+ createAndAddScriptResource(resourceBuilder.getResourceForKey(userJs));
+ createAndAddScriptResource(resourceBuilder.getResourceForKey(componentJs)).setRendered(false);
+
+ HtmlPage page = renderView();
+ List<HtmlScript> scripts;
+
+ scripts = selectScriptsBySrc(page, userJs);
+ assertEquals(1, scripts.size());
+
+ scripts = selectScriptsBySrc(page, componentJs);
+ assertEquals(1, scripts.size());
+ }
+
+ public void testRenderStyle() throws Exception {
+ createAndAddStyleResource(RESOURCE_URI_PREFIX + userXcss);
+ createAndAddStyleResource(RESOURCE_URI_PREFIX + componentXcss).setRendered(false);
+
+ HtmlPage page = renderView();
+ List<HtmlLink> styles;
+ HtmlLink userLink;
+
+ styles = selectStylesByHhref(page, userXcss);
+ assertEquals(1, styles.size());
+ userLink = styles.get(0);
+ assertEquals("user", userLink.getClassAttribute());
+ assertEquals("", userLink.getMediaAttribute());
+
+ styles = selectStylesByHhref(page, componentXcss);
+ assertEquals(0, styles.size());
+ }
+
+ public void testRenderStyleResource() throws Exception {
+ InternetResourceBuilder resourceBuilder = InternetResourceBuilder.getInstance();
+ createAndAddStyleResource(resourceBuilder.getResourceForKey(userXcss));
+ createAndAddStyleResource(resourceBuilder.getResourceForKey(componentXcss)).setRendered(false);
+
+ UIResource styleComponent = createLoadStyleComponent();
+ styleComponent.setSrc(InternetResourceBuilder.getInstance().getResourceForKey(userXcss));
+ facesContext.getViewRoot().getChildren().add(styleComponent);
+
+ HtmlPage page = renderView();
+ List<HtmlLink> styles;
+ HtmlLink userLink;
+
+ styles = selectStylesByHhref(page, userXcss);
+ assertEquals(1, styles.size());
+ userLink = styles.get(0);
+ assertEquals("user", userLink.getClassAttribute());
+ assertEquals("", userLink.getMediaAttribute());
+
+ styles = selectStylesByHhref(page, componentXcss);
+ assertEquals(1, styles.size());
+ userLink = styles.get(0);
+ assertEquals("user", userLink.getClassAttribute());
+ assertEquals("", userLink.getMediaAttribute());
+ }
+
+ public void testRenderMedia() throws Exception {
+ createAndAddStyleResource(RESOURCE_URI_PREFIX + userXcss).
+ getAttributes().put(HTML.media_ATTRIBUTE, "screen print");
+
+ HtmlPage page = renderView();
+ List<HtmlLink> styles = selectStylesByHhref(page, userXcss);
+ assertEquals(1, styles.size());
+ HtmlLink userLink = styles.get(0);
+ assertEquals("user", userLink.getClassAttribute());
+ assertEquals("screen print", userLink.getMediaAttribute());
+ }
+
+ public void testRenderOverridenScript() throws Exception {
+ List<UIComponent> childrenList = facesContext.getViewRoot().getChildren();
+
+ UIResource userJsComponent = createLoadScriptComponent();
+ userJsComponent.setSrc(RESOURCE_URI_PREFIX + userJs);
+ childrenList.add(userJsComponent);
+
+ InternetResourceBuilder resourceBuilder = InternetResourceBuilder.getInstance();
+
+ childrenList.add(new ResourceDependentComponent(true,
+ resourceBuilder.getResourceForKey(componentJs),
+ resourceBuilder.getResourceForKey(userJs)));
+
+ UIResource componentJsComponent = createLoadScriptComponent();
+ componentJsComponent.setSrc(RESOURCE_URI_PREFIX + componentJs);
+ childrenList.add(componentJsComponent);
+
+ HtmlPage page = renderView();
+ List<HtmlScript> userScripts = selectScriptsBySrc(page, userJs);
+ assertEquals(1, userScripts.size());
+ List<HtmlScript> componentScripts = selectScriptsBySrc(page, componentJs);
+ assertEquals(1, componentScripts.size());
+ }
+
+ public void testRenderOverridenStyle() throws Exception {
+ List<UIComponent> childrenList = facesContext.getViewRoot().getChildren();
+
+ UIResource userXcssComponent = createLoadStyleComponent();
+ userXcssComponent.setSrc(RESOURCE_URI_PREFIX + userXcss);
+ childrenList.add(userXcssComponent);
+
+ InternetResourceBuilder resourceBuilder = InternetResourceBuilder.getInstance();
+
+ childrenList.add(new ResourceDependentComponent(false,
+ resourceBuilder.getResourceForKey(componentXcss),
+ resourceBuilder.getResourceForKey(userXcss)));
+
+ UIResource componentXcssComponent = createLoadStyleComponent();
+ componentXcssComponent.setSrc(RESOURCE_URI_PREFIX + componentXcss);
+ childrenList.add(componentXcssComponent);
+
+ HtmlPage page = renderView();
+ List<HtmlLink> styles = selectStylesByHhref(page, userXcss);
+ assertEquals(2, styles.size());
+ assertEquals("component", styles.get(0).getClassAttribute());
+ assertEquals("user", styles.get(1).getClassAttribute());
+
+ styles = selectStylesByHhref(page, componentXcss);
+ assertEquals(2, styles.size());
+ assertEquals("component", styles.get(0).getClassAttribute());
+ assertEquals("user", styles.get(1).getClassAttribute());
+ }
+
+ public void testRenderOverridenAjaxScript() throws Exception {
+ UIResource userComponent = createLoadScriptComponent();
+ userComponent.setSrc(RESOURCE_URI_PREFIX +
"/org/ajax4jsf/javascript/scripts/AJAX.js");
+
+ List<UIComponent> childrenList = facesContext.getViewRoot().getChildren();
+ childrenList.add(userComponent);
+
+ childrenList.add(new ResourceDependentComponent(true, new AjaxScript()));
+
+ HtmlPage page = renderView();
+ List<HtmlScript> scripts = selectScriptsBySrc(page, "AjaxScript");
+ assertEquals(1, scripts.size());
+
+ scripts = selectScriptsBySrc(page, "AJAX.js");
+ //TODO change to 0 after related issue resolution
+ assertEquals(1, scripts.size());
+ }
+}
+
+class ResourceDependentComponent extends UIComponentBase {
+
+ static String COMPONENT_TYPE =
"org.ajax4jsf.component.Test$ResourceDependentComponent";
+
+ static String COMPONENT_FAMILY = COMPONENT_TYPE;
+
+ private InternetResource[] resources;
+
+ private boolean useScripts;
+
+ public ResourceDependentComponent(boolean useScripts, InternetResource... resources) {
+ this.useScripts = useScripts;
+ this.resources = resources;
+ }
+
+ @Override
+ public String getFamily() {
+ return COMPONENT_FAMILY;
+ }
+
+ @Override
+ public String getRendererType() {
+ return COMPONENT_TYPE;
+ }
+
+ public InternetResource[] getScripts() {
+ return useScripts ? resources : null;
+ }
+
+ public InternetResource[] getStyles() {
+ return useScripts ? null : resources;
+ }
+}
+
+class ResourceDependentComponentRenderer extends RendererBase implements
HeaderResourceProducer2 {
+
+ @Override
+ protected Class<? extends UIComponent> getComponentClass() {
+ return ResourceDependentComponent.class;
+ }
+
+ public void encodeToHead(FacesContext context, UIComponent component,
+ ProducerContext pc) throws IOException {
+
+ ResourceDependentComponent resourceDependentComponent = (ResourceDependentComponent)
component;
+
+ if (pc.isProcessScripts()) {
+ InternetResource[] scripts = resourceDependentComponent.getScripts();
+ if (scripts != null) {
+ for (InternetResource script : scripts) {
+ script.encode(context, null);
+ }
+ }
+ }
+
+ if (pc.isProcessStyles()) {
+ InternetResource[] styles = resourceDependentComponent.getStyles();
+ if (styles != null) {
+ for (InternetResource script : styles) {
+ script.encode(context, null);
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
Added: trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.js
===================================================================
--- trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.js
(rev 0)
+++ trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.js 2008-11-26
15:32:01 UTC (rev 11398)
@@ -0,0 +1 @@
+/* dependency of org.ajax4jsf.component.LoadResourceComponentTest */
\ No newline at end of file
Added: trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.xcss
===================================================================
--- trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.xcss
(rev 0)
+++ trunk/ui/core/src/test/resources/org/ajax4jsf/component/component.xcss 2008-11-26
15:32:01 UTC (rev 11398)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<f:template
xmlns:f='http:/jsf.exadel.com/template'
+
xmlns:u='http:/jsf.exadel.com/template/util'
+
xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- dependency of org.ajax4jsf.component.LoadResourceComponentTest -->
+
+</f:template>
\ No newline at end of file
Added: trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.js
===================================================================
--- trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.js
(rev 0)
+++ trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.js 2008-11-26 15:32:01
UTC (rev 11398)
@@ -0,0 +1 @@
+/* dependency of org.ajax4jsf.component.LoadResourceComponentTest */
\ No newline at end of file
Added: trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.xcss
===================================================================
--- trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.xcss
(rev 0)
+++ trunk/ui/core/src/test/resources/org/ajax4jsf/component/user.xcss 2008-11-26 15:32:01
UTC (rev 11398)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<f:template
xmlns:f='http:/jsf.exadel.com/template'
+
xmlns:u='http:/jsf.exadel.com/template/util'
+
xmlns="http://www.w3.org/1999/xhtml">
+
+ <!-- dependency of org.ajax4jsf.component.LoadResourceComponentTest -->
+
+</f:template>
\ No newline at end of file