001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: * $Header:$
018: */
019: package org.apache.beehive.netui.pageflow.faces;
020:
021: import org.apache.beehive.netui.util.logging.Logger;
022: import org.apache.beehive.netui.pageflow.faces.internal.PageFlowApplication;
023:
024: import javax.faces.application.ApplicationFactory;
025: import javax.faces.application.Application;
026:
027: /**
028: * JavaServer Faces application factory that enables Page Flow integration. It is activated like this in
029: * faces-config.xml:
030: * <blockquote>
031: * <code>
032: * <factory><br/>
033: * <application-factory>org.apache.beehive.netui.pageflow.faces.PageFlowApplicationFactory</application-factory><br/>
034: * </factory>
035: * </code>
036: * </blockquote>
037: *
038: * JSF/Page Flow integration has the following features:
039: * <ul>
040: * <li>
041: * A JSF component like CommandLink or CommandButton can raise a Page Flow action simply by specifying the
042: * action name in its <code>action</code> attribute, like this:
043: * <blockquote>
044: * <code>
045: * <h:commandLink action="someAction" value="raise a Page Flow action"/>
046: * </code>
047: * </blockquote>
048: * The component can send a form bean to the action by adding a "submitFormBean" attribute with a binding
049: * expression that will determine the bean instance:
050: * <blockquote>
051: * <code>
052: * <h:commandLink action="someAction" value="submit a form bean to a Page Flow action"><br/>
053: * <f:attribute name="submitFormBean" value="backing.theForm"/><br/>
054: * </h:commandLink>
055: * </code>
056: * </blockquote>
057: * In the example above, the value returned from the backing bean's <code>getTheForm</code> method will be
058: * sent to the "someAction" action in the page flow.
059: * </li>
060: * <li>
061: * A {@link org.apache.beehive.netui.pageflow.FacesBackingBean} instance will be created whenever a
062: * corresponding JSF path is requested (e.g., an instance of FacesBackingBean-derived foo.MyPage will be created
063: * for the webapp-relative path "/foo/MyPage.faces"). The instance will be released (removed from the user
064: * session) when a non-matching path is requested. A faces backing bean can hold component references and
065: * event/command handlers, and it can raise actions with normal JSF command event handlers that are annotated
066: * with {@link org.apache.beehive.netui.pageflow.annotations.Jpf.CommandHandler @Jpf.CommandHandler}.
067: * The bean instance can be bound to with a JSF-style expression like <code>#{backing.myComponent}</code>.
068: * </li>
069: * <li>
070: * When a Page Flow action goes back to a JSF page through the <code>currentPage</code> or
071: * <code>previousPage</code> values for
072: * {@link org.apache.beehive.netui.pageflow.annotations.Jpf.Forward#navigateTo navigateTo}
073: * on {@link org.apache.beehive.netui.pageflow.annotations.Jpf.Forward @Jpf.Forward}, the page's backing
074: * bean and component tree are restored.
075: * </li>
076: * </ul>
077: */
078: public class PageFlowApplicationFactory extends ApplicationFactory {
079: private static final Logger _log = Logger
080: .getInstance(PageFlowApplicationFactory.class);
081:
082: private ApplicationFactory _delegate;
083: private PageFlowApplication _app;
084:
085: public PageFlowApplicationFactory(ApplicationFactory delegate) {
086: if (_log.isDebugEnabled()) {
087: _log.debug("Adapting ApplicationFactory" + delegate);
088: }
089:
090: _delegate = delegate;
091: _app = new PageFlowApplication(delegate.getApplication());
092: }
093:
094: public Application getApplication() {
095: return _app;
096: }
097:
098: public void setApplication(Application application) {
099: _delegate.setApplication(application);
100: _app = new PageFlowApplication(application);
101: }
102: }
|