logo       

[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>
+ *   &lt;faces-config&gt;
+ *      &lt;application&gt;
+ *          <strong>
+ *          &lt;variable-resolver&gt;
+ *              org.nanocontainer.nanowar.jsf.NanoWarDelegatingVariableResolver
+ *          &lt;/variable-resolver&gt;
+ *          </strong>
+ *      &lt;/application&gt;
+ *      ....
+ *   &lt;/faces-config&gt;
+ *  </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>
+ *    &lt;managed-bean&gt;
+ *        &lt;description&gt;CDI Injected Bean&lt;/description&gt;
+ *        <strong>&lt;managed-bean-name&gt;cheeseBean&lt;/managed-bean-name&gt;</strong>
+ *        &lt;managed-bean-class&gt;
+ *            org.nanocontainer.nanowar.samples.jsf.CheeseController
+ *        &lt;/managed-bean-class&gt;
+ *        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
+ *    &lt;/managed-bean&gt;
+ * </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

<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise