|
|
[picocontainer-scm] [picocontainer] [3142] java/nanocontainer-nanowar/trunk: msg#00046
java.picocontainer.cvs
|
Subject: |
[picocontainer-scm] [picocontainer] [3142] java/nanocontainer-nanowar/trunk: Initial Checkin of JSF-Variable Resolver to NanoWAR integration with example app. |
- Revision
- 3142
- Author
- rimovm
- Date
- 2006-12-20 06:35:16 -0600 (Wed, 20 Dec 2006)
Log Message
Initial Checkin of JSF-Variable Resolver to NanoWAR integration with example app.
Added Paths
Diff
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/pom.xml (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/pom.xml (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/pom.xml 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ This POM provides build control over the project. To use this file you must have Maven2 installed. You can
+ download Maven2 from http://maven.codehaus.org
+
+ Once Maven is properly installed, you can use:
+
+ maven package
+
+ to create a WAR file. This file may be dropped into Tomcat, JeTTY, or other application containers. (See the
+ web container's documentation for specific directions).
+
+ Tomcat files and documentation may be downloaded from
+ http://tomcat.apache.org/
+
+ JeTTY files and documentation may be downloaded from
+ http://jetty.mortbay.org/
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.nanocontainer</groupId>
+ <artifactId>nanocontainer-nanowar-parent</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>nanocontainer-jsf-webapp</artifactId>
+ <name>NanoContainer Nanowar Example</name>
+ <packaging>war</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.nanocontainer</groupId>
+ <artifactId>nanocontainer-nanowar</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.nanocontainer</groupId>
+ <artifactId>nanocontainer-nanowar-example</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.myfaces.core</groupId>
+ <artifactId>myfaces-api</artifactId>
+ <version>1.1.4</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.myfaces.core</groupId>
+ <artifactId>myfaces-impl</artifactId>
+ <version>1.1.4</version>
+ <scope>runtime</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.13</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>groovy</groupId>
+ <artifactId>groovy-all</artifactId>
+ <version>1.0-RC-01</version>
+ <exclusions>
+ <exclusion>
+ <groupId>servletapi</groupId>
+ <artifactId>servletapi</artifactId>
+ </exclusion>
+ </exclusions>
+ <scope>runtime</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <inherited>false</inherited>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <links>
+ <link>
+ http://java.sun.com/j2se/1.4.2/docs/api/
+ </link>
+ <link>
+ http://proxytoys.codehaus.org/apidocs/
+ </link>
+ <link>
+ http://jakarta.apache.org/commons/logging/commons-logging-1.0.4/docs/apidocs/
+ </link>
+ </links>
+ <stylesheet>maven</stylesheet>
+ <header><![CDATA[<img class="logo" src=""
+ <linksource>true</linksource>
+ </configuration>
+ </plugin>
+ </plugins>
+ <finalName>jsf-webapp</finalName>
+ </build>
+</project>
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/log4j.properties (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/log4j.properties (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/log4j.properties 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,6 @@
+#Log4j Properties
+#Log4j will automatically pick up this file as long as it is in the webapp's classpath.
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%5p [%c] %m%n
+log4j.rootLogger=INFO, stdout
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/org/nanocontainer/nanowar/samples/jsf/AddCheeseController.java (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/org/nanocontainer/nanowar/samples/jsf/AddCheeseController.java (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/org/nanocontainer/nanowar/samples/jsf/AddCheeseController.java 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ * Copyright (c) 2003-2006 Centerline Computers, All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the *
+ * Centerline Binary Code License Agreement, a copy of which has been *
+ * included with this distribution in the LICENSE.txt file. *
+ * *
+ * Original code by Centerline Computers, Inc. *
+ *****************************************************************************/
+package org.nanocontainer.nanowar.samples.jsf;
+
+import java.io.Serializable;
+import org.nanocontainer.nanowar.sample.model.Cheese;
+import org.nanocontainer.nanowar.sample.service.CheeseService;
+
+/**
+ * AddCheeseController
+ * @author Michael Rimov
+ * @owner Centerline Computers, Inc.
+ */
+public class AddCheeseController implements Serializable {
+ /**
+ * Serial UUID.
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ private String name;
+
+ private String country;
+
+ private final CheeseService service;
+
+
+ public AddCheeseController(CheeseService service) {
+ this.service = service;
+ }
+
+
+ public String addCheese() {
+ Cheese cheese = new Cheese(name,country);
+ service.save(cheese);
+ return "addCheeseSuccess";
+ }
+
+
+ /**
+ * @return the country
+ */
+ public String getCountry() {
+ return country;
+ }
+
+
+ /**
+ * @param country the country to set
+ */
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+
+
+}
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/org/nanocontainer/nanowar/samples/jsf/ListCheeseController.java (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/org/nanocontainer/nanowar/samples/jsf/ListCheeseController.java (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/java/org/nanocontainer/nanowar/samples/jsf/ListCheeseController.java 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ * Copyright (c) 2003-2006 Centerline Computers, All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the *
+ * Centerline Binary Code License Agreement, a copy of which has been *
+ * included with this distribution in the LICENSE.txt file. *
+ * *
+ * Original code by Centerline Computers, Inc. *
+ *****************************************************************************/
+package org.nanocontainer.nanowar.samples.jsf;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIData;
+import javax.faces.context.FacesContext;
+import org.nanocontainer.nanowar.sample.model.Cheese;
+import org.nanocontainer.nanowar.sample.service.CheeseService;
+/**
+ * ListCheeseController
+ * @author Michael Rimov
+ */
+public class ListCheeseController implements Serializable {
+
+ private final CheeseService service;
+
+ private List cheeses;
+
+ private UIData cheeseList;
+
+
+ public ListCheeseController(CheeseService service) {
+ this.service = service;
+ }
+
+ public List getCheeses() {
+ if (cheeses == null) {
+ cheeses = new ArrayList(service.getCheeses());
+ }
+ return cheeses;
+ }
+
+
+ public int getNumCheeses() {
+ return cheeses.size();
+ }
+
+ /**
+ * @return the cheeseList
+ */
+ public UIData getCheeseList() {
+ return cheeseList;
+ }
+
+ /**
+ * @param cheeseList the cheeseList to set
+ */
+ public void setCheeseList(UIData cheeseList) {
+ this.cheeseList = cheeseList;
+ }
+
+ private String getSelectedCheeseName() {
+ Cheese project = (Cheese) cheeseList.getRowData(); // make sure it still exists
+ if (project == null) {
+ throw new NullPointerException("Project");
+ }
+
+ return project.getName();
+ }
+
+ public String removeCheese() {
+ Cheese tempCheese = new Cheese(getSelectedCheeseName(), "");
+ Cheese storedCheese = service.find(tempCheese);
+ if (storedCheese == null) {
+ FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Cheese " + tempCheese.getName() + " Not Found!"));
+ return "delete error";
+ }
+
+ service.remove(storedCheese);
+ FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Cheese Removed"));
+ return "ok";
+ }
+}
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/faces-config.xml (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/faces-config.xml (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/faces-config.xml 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE faces-config PUBLIC
+ "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
+ "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
+<faces-config>
+ <application>
+ <variable-resolver>
+ org.nanocontainer.nanowar.jsf.NanoWarDelegatingVariableResolver
+ </variable-resolver>
+ </application>
+ <managed-bean>
+ <description>CDI Injected Bean</description>
+ <managed-bean-name>cheeseBean</managed-bean-name>
+ <managed-bean-class>
+ org.nanocontainer.nanowar.samples.jsf.CheeseController
+ </managed-bean-class>
+ <managed-bean-scope>request</managed-bean-scope>
+ </managed-bean>
+ <managed-bean>
+ <description>Adds Cheeses</description>
+ <managed-bean-name>addCheeseBean</managed-bean-name>
+ <managed-bean-class>
+ org.nanocontainer.nanowar.samples.jsf.AddCheeseController
+ </managed-bean-class>
+ <managed-bean-scope>request</managed-bean-scope>
+ </managed-bean>
+ <navigation-rule>
+ <display-name>cheese</display-name>
+ <from-view-id>/cheese.jsp</from-view-id>
+ <navigation-case>
+ <to-view-id>/cheese.jsp</to-view-id>
+ <redirect />
+ </navigation-case>
+ </navigation-rule>
+</faces-config>
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/nanocontainer.groovy (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/nanocontainer.groovy (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/nanocontainer.groovy 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,9 @@
+pico = builder.container(parent: parent) {
+ if(assemblyScope instanceof javax.servlet.ServletContext) {
+ component(key: 'org.nanocontainer.nanowar.sample.dao.CheeseDao', class: 'org.nanocontainer.nanowar.sample.dao.simple.MemoryCheeseDao')
+ component(key: 'org.nanocontainer.nanowar.sample.service.CheeseService', class: 'org.nanocontainer.nanowar.sample.service.defaults.DefaultCheeseService')
+ } else if (assemblyScope instanceof javax.servlet.ServletRequest) {
+ component(key: 'cheeseBean', class: 'org.nanocontainer.nanowar.samples.jsf.ListCheeseController')
+ component(key: 'addCheeseBean', class: 'org.nanocontainer.nanowar.samples.jsf.AddCheeseController')
+ }
+}
\ No newline at end of file
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/web.xml (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/web.xml (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/WEB-INF/web.xml 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.4"
+ xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+ <display-name>NanoWAR-JSF Integration Demo</display-name>
+ <!-- Tell NanoWAR where to find its configuration script. -->
+ <context-param>
+ <param-name>nanocontainer.groovy</param-name>
+ <param-value>/WEB-INF/nanocontainer.groovy</param-value>
+ </context-param>
+
+ <!--
+ NanoWAR filter to build the request container with each request to the
+ faces servlet.
+ -->
+ <filter>
+ <filter-name>NanoWar</filter-name>
+ <filter-class>org.nanocontainer.nanowar.ServletRequestContainerFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>NanoWar</filter-name>
+ <servlet-name>Faces Servlet</servlet-name>
+ </filter-mapping>
+ <listener>
+ <listener-class>org.nanocontainer.nanowar.NanoWarContextListener</listener-class>
+ </listener>
+
+ <!--
+ JSF Installation.
+ -->
+ <servlet>
+ <servlet-name>Faces Servlet</servlet-name>
+ <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>Faces Servlet</servlet-name>
+ <url-pattern>*.jsf</url-pattern>
+ </servlet-mapping>
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+</web-app>
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/cheese.jsp (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/cheese.jsp (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/cheese.jsp 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,58 @@
+<%-- The actual Cheese listing page --%>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
+<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
+<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<f:view>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Sample Cheese List</title>
+</head>
+<body>
+<h1>Cheeses of The World Sample</h1>
+<h:panelGrid columns="1" id="MessageBlock">
+ <h:messages globalOnly="true"/>
+</h:panelGrid>
+<h:form>
+<h:panelGroup>
+<h:panelGroup rendered="#{not empty cheeseBean.cheeses}">
+<h:dataTable binding="#{cheeseBean.cheeseList}" id="CheeseTable" var="cheeseRow" value="#{cheeseBean.cheeses}" border="1">
+ <h:column id="rowName">
+ <f:facet name="header">
+ <h:outputText value="Cheese Name"/>
+ </f:facet>
+ <h:outputText value="#{cheeseRow.name}"/>
+ </h:column>
+ <h:column id="countryName">
+ <f:facet name="header">
+ <h:outputText value="Country of Origin"/>
+ </f:facet>
+ <h:outputText value="#{cheeseRow.country}"/>
+ </h:column>
+ <h:column id="actionName">
+ <f:facet name="header">
+ <h:outputText value="Delete"/>
+ </f:facet>
+ <h:commandButton id="deleteCheese" immediate="true" action="" value=" X " title="Delete This Cheese"/>
+ </h:column>
+</h:dataTable>
+</h:panelGroup>
+<h:outputText style="color: red" rendered="#{empty cheeseBean.cheeses}" value="No Cheeses Found!"></h:outputText>
+<h:outputText escape="false" value="<hr/>"/>
+<h:outputText escape="false" value="Add a Cheese"/>
+<h:panelGrid columns="3">
+ <h:outputLabel for="" value="Name:"/>
+ <h:inputText id="cheeseName" size="40" required="true" value="#{addCheeseBean.name}"/>
+ <h:message for="" style="color: red"/>
+ <h:outputLabel for="" value="Country:"/>
+ <h:inputText id="cheeseCountry" size="40" required="true" value="#{addCheeseBean.country}"/>
+ <h:message for="" style="color: red"/>
+</h:panelGrid>
+<h:commandButton action="" value="Add Cheese"></h:commandButton>
+</h:panelGroup>
+</h:form>
+</body>
+</f:view>
+</html>
\ No newline at end of file
Added: java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/index.jsp (0 => 3142)
--- java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/index.jsp (rev 0)
+++ java/nanocontainer-nanowar/trunk/examples/nanowar-jsf-webapp/src/main/webapp/index.jsp 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<%-- This file simply provides a redirect to cheese.jsf --%>
+<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
+ pageEncoding="ISO-8859-1"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Cheese Sample</title>
+</head>
+<body>
+ <%
+ response.sendRedirect(request.getContextPath() + "/cheese.jsf");
+ %>
+</body>
+</html>
\ No newline at end of file
Added: java/nanocontainer-nanowar/trunk/nanowar-jsf/pom.xml (0 => 3142)
--- java/nanocontainer-nanowar/trunk/nanowar-jsf/pom.xml (rev 0)
+++ java/nanocontainer-nanowar/trunk/nanowar-jsf/pom.xml 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.nanocontainer</groupId>
+ <artifactId>nanocontainer-nanowar-parent</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>nanocontainer-nanowar-jsf</artifactId>
+ <name>NanoContainer Nanowar JSF</name>
+ <description>NanoWAR-JSF integration for JSF API version 1.1</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.nanocontainer</groupId>
+ <artifactId>nanocontainer-nanowar</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.faces</groupId>
+ <artifactId>jsf-api</artifactId>
+ <version>1.1_02</version>
+ <optional>true</optional>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>cglib</groupId>
+ <artifactId>cglib-nodep</artifactId>
+ </dependency>
+ </dependencies>
+</project>
Added: java/nanocontainer-nanowar/trunk/nanowar-jsf/src/java/org/nanocontainer/nanowar/jsf/NanoWarDelegatingVariableResolver.java (0 => 3142)
--- java/nanocontainer-nanowar/trunk/nanowar-jsf/src/java/org/nanocontainer/nanowar/jsf/NanoWarDelegatingVariableResolver.java (rev 0)
+++ java/nanocontainer-nanowar/trunk/nanowar-jsf/src/java/org/nanocontainer/nanowar/jsf/NanoWarDelegatingVariableResolver.java 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,178 @@
+/*****************************************************************************
+ * Copyright (C) PicoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Centerline Computers, Inc. *
+ *****************************************************************************/
+package org.nanocontainer.nanowar.jsf;
+
+import java.util.Map;
+import javax.faces.context.FacesContext;
+import javax.faces.el.EvaluationException;
+import javax.faces.el.VariableResolver;
+import org.nanocontainer.nanowar.KeyConstants;
+import org.nanocontainer.nanowar.sample.service.CheeseService;
+import org.picocontainer.PicoContainer;
+
+/**
+ * This is a variable resolver implementation for Java ServerFaces.
+ * <h2>Installation</h2>
+ * <p>Add install this variable resolver by adding setting the application's variable resolver
+ * to <em>org.nanocontainer.nanowar.jsf.NanoWarDelegatingVariableResolver</em>. An example follows:</p>
+ * <hr/>
+ * <pre>
+ * <faces-config>
+ * <application>
+ * <strong>
+ * <variable-resolver>
+ * org.nanocontainer.nanowar.jsf.NanoWarDelegatingVariableResolver
+ * </variable-resolver>
+ * </strong>
+ * </application>
+ * ....
+ * </faces-config>
+ * </pre>
+ * <hr/>
+ * <h2>Usage</h2>
+ * <h4>Part 1 - Write your Constructor Dependency Injection (CDI) - based backing bean:</h4>
+ * <p>Even though you are writing a backing bean, you can utilize PicoContainers CDI capabilities to the fullest.
+ * Example:
+ * </p>
+ * <pre>
+ * //Imports and variables...
+ *
+ * public ListCheeseController(<strong>CheeseService service</strong>) {
+ * this.service = service;
+ * }
+ *
+ * //The rest of the class.
+ * </pre>
+ * <h4>Part 2 - Set up your NanoWAR services.</h4>
+ * <p>(This assumes you have installed NanoWAR properly. Please see the NanoWAR documentation for specific
+ * instructions)</p>
+ * <p>You need to name your services with the name you will be giving your <tt>Backing Bean</tt>. Example:
+ * <pre>
+ * pico = builder.container(parent: parent) {
+ * if(assemblyScope instanceof javax.servlet.ServletContext) {
+ * // Application Services would go here.
+ * } else if (assemblyScope instanceof javax.servlet.ServletRequest) {
+ * <strong>component(key: 'cheeseBean', class: 'org.nanocontainer.nanowar.samples.jsf.ListCheeseController')</strong>
+ * }
+ * }
+ * </pre>
+ * <h4>Part 3 - Set up your managed beans for JSF</h4>
+ * <p>Set the managed bean names in your <tt>faces-config</tt> to equal the names given to the backing
+ * beans in the nanowar composition script. Example:</p>
+ * <pre>
+ * <managed-bean>
+ * <description>CDI Injected Bean</description>
+ * <strong><managed-bean-name>cheeseBean</managed-bean-name></strong>
+ * <managed-bean-class>
+ * org.nanocontainer.nanowar.samples.jsf.CheeseController
+ * </managed-bean-class>
+ * <managed-bean-scope>request</managed-bean-scope>
+ * </managed-bean>
+ * </pre>
+ * <p>Notice how the same names were used in the <tt>faces-config</tt> as in the nanowar configuration.
+ * When the JSF page asks for the bean named 'addCheeseBean', the Nano variable resolver will take that name
+ * and check nanocontainer for an object of that instance. If it finds one, it will send it back to the
+ * page.</p>
+ * <em>Note:</em>
+ * <p>This class currently has only been tested using MyFaces. There are reports that this technique doesn't
+ * work on all reference implementation versions. We welcome success or failure feedback!</p>
+ * @author Michael Rimov
+ */
+public class NanoWarDelegatingVariableResolver extends VariableResolver {
+
+ /**
+ * The nested variable resolver.
+ */
+ private VariableResolver nested;
+
+ /**
+ * Decorated Variable resolver.
+ */
+ public NanoWarDelegatingVariableResolver(VariableResolver decorated) {
+ super();
+ if (decorated == null) {
+ throw new NullPointerException("decorated");
+ }
+ nested = decorated;
+ }
+
+ /**
+ * Retrieve the delegated value.
+ * @return the wrapped variable resolver.
+ */
+ protected VariableResolver getNested() {
+ return nested;
+ }
+
+ /**
+ * {@inheritDoc}
+ * @param facesContext
+ * @param name
+ * @return the resulting object, either resolved through NanoWAR, or passed onto the delegate resolver.
+ * @throws EvaluationException
+ * @see javax.faces.el.VariableResolver#resolveVariable(javax.faces.context.FacesContext, java.lang.String)
+ */
+ public Object resolveVariable(FacesContext facesContext, String name) throws EvaluationException {
+
+ PicoContainer nano = getPicoContainer(facesContext);
+
+ Object result = nano.getComponentInstance(name);
+ if (result == null) {
+ return nested.resolveVariable(facesContext, name);
+ }
+
+ return result;
+ }
+
+ /**
+ * Tries to locate the nanocontainer first at request level, and then if it doesn't find it
+ * there. (Filter might not be installed), it tries Application level. If that fails it throws
+ * an exception since you wouldn't expect the NanoWarDelegatingVariableResolver
+ * @param facesContext
+ * @return NanoContainer instance.
+ * @throws EvaluationException if it cannot find a NanoWAR instance.
+ */
+ protected PicoContainer getPicoContainer(FacesContext facesContext) throws EvaluationException {
+ Map requestAttributeMap = facesContext
+ .getExternalContext()
+ .getRequestMap();
+
+ PicoContainer container = null;
+
+ //First check request map.
+ if (requestAttributeMap != null) {
+ container = (PicoContainer)requestAttributeMap.get(KeyConstants.REQUEST_CONTAINER);
+ }
+
+ if (requestAttributeMap == null || container == null) {
+
+ //If that fails, check session for container.
+ Map sessionMap = facesContext.getExternalContext().getSessionMap();
+ if (sessionMap != null) {
+ //If there is a session.
+ container = (PicoContainer)sessionMap.get(KeyConstants.SESSION_CONTAINER);
+ }
+
+ if (sessionMap == null || container == null) {
+
+ //If that fails, check for App level container.
+ container = (PicoContainer) facesContext.getExternalContext().getApplicationMap().get(KeyConstants.APPLICATION_CONTAINER);
+ if (container == null) {
+ //If that fails... Fail.
+ throw new EvaluationException("The NanoWar delegating variable resolver is installed, however no NanoWar "
+ +"container was found in the request or application scope.");
+ }
+ }
+ }
+
+ return container;
+ }
+
+}
Added: java/nanocontainer-nanowar/trunk/nanowar-jsf/src/java/org/nanocontainer/nanowar/jsf/package.htm (0 => 3142)
--- java/nanocontainer-nanowar/trunk/nanowar-jsf/src/java/org/nanocontainer/nanowar/jsf/package.htm (rev 0)
+++ java/nanocontainer-nanowar/trunk/nanowar-jsf/src/java/org/nanocontainer/nanowar/jsf/package.htm 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,14 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>NanoWAR-JSF Integration Utilities</title>
+</head>
+<body>
+<p>This package provides utilities to help integrate <a href="" ServerFaces</a> with <a href=""
+<p>Currently the utilities include:</p>
+<ul>
+ <li>NanoWarDelegatingVariableResolver -- A variable resolver that locates services and backing beans that are managed by NanoWAR components. </li>
+</ul>
+</body>
+</html>
\ No newline at end of file
Added: java/nanocontainer-nanowar/trunk/nanowar-jsf/src/test/org/nanocontainer/nanowar/jsf/DelegatingResolverTestCase.java (0 => 3142)
--- java/nanocontainer-nanowar/trunk/nanowar-jsf/src/test/org/nanocontainer/nanowar/jsf/DelegatingResolverTestCase.java (rev 0)
+++ java/nanocontainer-nanowar/trunk/nanowar-jsf/src/test/org/nanocontainer/nanowar/jsf/DelegatingResolverTestCase.java 2006-12-20 12:35:16 UTC (rev 3142)
@@ -0,0 +1,188 @@
+/*****************************************************************************
+ * Copyright (C) PicoContainer Organization. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * The software in this package is published under the terms of the BSD *
+ * style license a copy of which has been included with this distribution in *
+ * the LICENSE.txt file. *
+ * *
+ * Original code by Centerline Computers, Inc. *
+ *****************************************************************************/
+package org.nanocontainer.nanowar.jsf;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.el.VariableResolver;
+import org.jmock.cglib.Mock;
+import org.jmock.cglib.MockObjectTestCase;
+import org.nanocontainer.nanowar.KeyConstants;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.defaults.DefaultPicoContainer;
+
+/**
+ * Basic testing for the NanoWAR variable resolver.
+ * DelegatingResolverTestCase
+ * @author Michael Rimov
+ */
+public class DelegatingResolverTestCase extends MockObjectTestCase {
+
+ private MutablePicoContainer appContainer = null;
+
+ private MutablePicoContainer sessionContainer = null;
+
+ private MutablePicoContainer requestContainer = null;
+
+ private Mock variableResolverMock = null;
+
+ private VariableResolver delegate;
+
+ private NanoWarDelegatingVariableResolver ourVariableResolver = null;
+
+ private FacesContext facesContext = null;
+
+ private Mock facesContextMock = null;
+
+ private Mock externalContextMock = null;
+
+ private ExternalContext externalContext = null;
+
+ private Map requestMap = null;
+
+ private Map sessionMap = null;
+
+ private Map appMap = null;
+
+ protected void setUp() {
+ appContainer = new DefaultPicoContainer();
+ appContainer.registerComponentImplementation("A", A.class);
+
+ sessionContainer = appContainer.makeChildContainer();
+ sessionContainer.registerComponentImplementation("B", B.class);
+
+ requestContainer = sessionContainer.makeChildContainer();
+ requestContainer.registerComponentImplementation("C", C.class);
+
+ facesContextMock = new Mock(FacesContext.class);
+ facesContext = (FacesContext) facesContextMock.proxy();
+
+ externalContextMock = new Mock(ExternalContext.class);
+ externalContext = (ExternalContext) externalContextMock.proxy();
+ // Set up getExternalContext common call.
+ facesContextMock.expects(atLeastOnce()).method("getExternalContext").will(returnValue(externalContext));
+
+ // Set up return for hashmap.
+ requestMap = new HashMap();
+ requestMap.put(KeyConstants.REQUEST_CONTAINER, requestContainer);
+ sessionMap = new HashMap();
+ sessionMap.put(KeyConstants.SESSION_CONTAINER, sessionContainer);
+ appMap = new HashMap();
+ appMap.put(KeyConstants.APPLICATION_CONTAINER, appContainer);
+
+ variableResolverMock = new Mock(VariableResolver.class);
+
+ // Sanity Check for containers.
+ assertNotNull(requestContainer.getComponentInstance("A"));
+ delegate = (VariableResolver) variableResolverMock.proxy();
+ ourVariableResolver = new NanoWarDelegatingVariableResolver(delegate);
+
+ }
+
+ protected void tearDown() {
+ delegate = null;
+ appContainer = null;
+ sessionContainer = null;
+ requestContainer = null;
+ variableResolverMock = null;
+ delegate = null;
+ ourVariableResolver = null;
+ facesContext = null;
+ externalContextMock = null;
+ externalContext = null;
+ }
+
+ public void testUnfoundObjectsPassOnToDelegator() {
+ externalContextMock.expects(once()).method("getRequestMap").will(returnValue(requestMap));
+ variableResolverMock.expects(once()).method("resolveVariable").with(ANYTHING, eq("D")).will(
+ returnValue(new D()));
+ Object result = ourVariableResolver.resolveVariable(facesContext, "D");
+ assertTrue(result instanceof D);
+ }
+
+ /**
+ * Checks to make sure the request level container is returned.
+ */
+ public void testRequestIsCheckedForRegisteredClasses() {
+ externalContextMock.expects(atLeastOnce()).method("getRequestMap").will(returnValue(requestMap));
+ externalContextMock.expects(never()).method("getSessionMap").will(returnValue(sessionMap));
+ externalContextMock.expects(never()).method("getApplicationMap").will(returnValue(appMap));
+ assertNotNull(ourVariableResolver.resolveVariable(facesContext,"C"));
+ assertNotNull(ourVariableResolver.resolveVariable(facesContext,"B"));
+ assertNotNull(ourVariableResolver.resolveVariable(facesContext,"A"));
+
+ }
+
+ /**
+ * Checks to make sure the session container only is returned.
+ */
+ public void testSessionIsCheckedForRegisteredClasses() {
+ requestMap.clear();
+ externalContextMock.expects(atLeastOnce()).method("getRequestMap").will(returnValue(requestMap));
+ externalContextMock.expects(atLeastOnce()).method("getSessionMap").will(returnValue(sessionMap));
+ externalContextMock.expects(never()).method("getApplicationMap").will(returnValue(appMap));
+ variableResolverMock.expects(once()).method("resolveVariable").with(ANYTHING, eq("C")).will(returnValue(null));
+ assertNull(ourVariableResolver.resolveVariable(facesContext,"C"));
+ assertNotNull(ourVariableResolver.resolveVariable(facesContext,"B"));
+ assertNotNull(ourVariableResolver.resolveVariable(facesContext,"A"));
+
+ }
+
+ /**
+ * Checks to make sure only the application container can be found if request and session containers
+ * don't exist.
+ *
+ */
+ public void testApplicationContextIsCheckedForRegisteredClasses() {
+ requestMap.clear();
+ sessionMap.clear();
+ externalContextMock.expects(atLeastOnce()).method("getRequestMap").will(returnValue(requestMap));
+ externalContextMock.expects(atLeastOnce()).method("getSessionMap").will(returnValue(sessionMap));
+ externalContextMock.expects(atLeastOnce()).method("getApplicationMap").will(returnValue(appMap));
+ variableResolverMock.expects(once()).method("resolveVariable").with(ANYTHING, eq("C")).will(returnValue(null));
+ variableResolverMock.expects(once()).method("resolveVariable").with(ANYTHING, eq("B")).will(returnValue(null));
+ assertNull(ourVariableResolver.resolveVariable(facesContext,"C"));
+ assertNull(ourVariableResolver.resolveVariable(facesContext,"B"));
+ assertNotNull(ourVariableResolver.resolveVariable(facesContext,"A"));
+
+ }
+
+ /**
+ * Test Class.
+ */
+ public static class A {
+
+ }
+
+ /**
+ * Test Class.
+ */
+ public static class B {
+
+ }
+
+ /**
+ * Test Class.
+ */
+ public static class C {
+
+ }
+
+ /**
+ * Test Class.
+ */
+ public static class D {
+
+ }
+
+}
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email
| |