001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2007
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.tests.embedded.jsf.util;
034:
035: import com.flexive.faces.beans.MessageBean;
036: import com.sun.facelets.compiler.SAXCompiler;
037: import com.sun.faces.application.ApplicationAssociate;
038: import com.sun.faces.el.ELContextImpl;
039: import com.sun.faces.el.ImplicitObjectELResolver;
040:
041: import javax.el.ELContext;
042: import javax.faces.FactoryFinder;
043: import javax.faces.application.Application;
044: import javax.faces.application.ApplicationFactory;
045: import javax.faces.application.FacesMessage;
046: import javax.faces.application.FacesMessage.Severity;
047: import javax.faces.component.UIViewRoot;
048: import javax.faces.context.ExternalContext;
049: import javax.faces.context.FacesContext;
050: import javax.faces.context.ResponseStream;
051: import javax.faces.context.ResponseWriter;
052: import javax.faces.render.RenderKit;
053: import java.lang.reflect.Field;
054: import java.util.Iterator;
055:
056: /**
057: * Mock faces context - supports only some methods used in the backing beans.
058: */
059: public class MockFacesContext extends FacesContext {
060: private ExternalContext externalContext;
061: private Application application;
062: private ELContext elContext;
063:
064: /**
065: * Set the current instance in the faces threadlocal.
066: *
067: * @param ctx the mock context
068: */
069: public static void setMockContext(MockFacesContext ctx) {
070: setCurrentInstance(ctx);
071: }
072:
073: /**
074: * Default constructor
075: */
076: @SuppressWarnings("unchecked")
077: public MockFacesContext() {
078: this .externalContext = new MockExternalContext();
079: }
080:
081: @Override
082: public void addMessage(String clientId, FacesMessage message) {
083: System.out.println("Add message for " + clientId + ": "
084: + message.getSummary() + " / " + message.getDetail());
085: }
086:
087: @Override
088: public Application getApplication() {
089: if (application == null) {
090: ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder
091: .getFactory(FactoryFinder.APPLICATION_FACTORY);
092: this .application = appFactory.getApplication();
093: // FIXME: this is a really ugly hack for JSF-RI 1.2 - maybe we should use JBoss seam's mock classes?
094: try {
095: final Field associateField = this .application
096: .getClass().getDeclaredField("associate");
097: associateField.setAccessible(true);
098: ((ApplicationAssociate) associateField
099: .get(this .application))
100: .setExpressionFactory(new SAXCompiler()
101: .createExpressionFactory());
102: } catch (IllegalAccessException e) {
103: throw new RuntimeException(e);
104: } catch (NoSuchFieldException e) {
105: throw new RuntimeException(e);
106: }
107: }
108: return application;
109: }
110:
111: @Override
112: public ELContext getELContext() {
113: if (elContext == null) {
114: this .elContext = new ELContextImpl(
115: new ImplicitObjectELResolver());
116: this .elContext.putContext(FacesContext.class, this );
117: // store required managed beans in el context
118: this .elContext.getVariableMapper().setVariable(
119: "fxMessageBean",
120: getApplication().getExpressionFactory()
121: .createValueExpression(new MessageBean(),
122: MessageBean.class));
123: }
124: return elContext;
125: }
126:
127: @Override
128: public Iterator getClientIdsWithMessages() {
129: throw new RuntimeException("not implemented");
130: }
131:
132: @Override
133: public ExternalContext getExternalContext() {
134: return externalContext;
135: }
136:
137: @Override
138: public Severity getMaximumSeverity() {
139: throw new RuntimeException("not implemented");
140: }
141:
142: @Override
143: public Iterator getMessages() {
144: throw new RuntimeException("not implemented");
145: }
146:
147: @Override
148: public Iterator getMessages(String clientId) {
149: throw new RuntimeException("not implemented");
150: }
151:
152: @Override
153: public RenderKit getRenderKit() {
154: throw new RuntimeException("not implemented");
155: }
156:
157: @Override
158: public boolean getRenderResponse() {
159: throw new RuntimeException("not implemented");
160: }
161:
162: @Override
163: public boolean getResponseComplete() {
164: throw new RuntimeException("not implemented");
165: }
166:
167: @Override
168: public ResponseStream getResponseStream() {
169: throw new RuntimeException("not implemented");
170: }
171:
172: @Override
173: public ResponseWriter getResponseWriter() {
174: throw new RuntimeException("not implemented");
175: }
176:
177: @Override
178: public UIViewRoot getViewRoot() {
179: throw new RuntimeException("not implemented");
180: }
181:
182: @Override
183: public void release() {
184: throw new RuntimeException("not implemented");
185: }
186:
187: @Override
188: public void renderResponse() {
189: throw new RuntimeException("not implemented");
190: }
191:
192: @Override
193: public void responseComplete() {
194: throw new RuntimeException("not implemented");
195: }
196:
197: @Override
198: public void setResponseStream(ResponseStream responseStream) {
199: throw new RuntimeException("not implemented");
200: }
201:
202: @Override
203: public void setResponseWriter(ResponseWriter responseWriter) {
204: throw new RuntimeException("not implemented");
205: }
206:
207: @Override
208: public void setViewRoot(UIViewRoot root) {
209: throw new RuntimeException("not implemented");
210: }
211:
212: }
|