001: /*
002: * Copyright (C) 2004 TiongHiang Lee
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * Email: thlee@onemindsoft.org
019: */
020:
021: package org.onemind.swingweb.templaterender;
022:
023: import java.awt.Window;
024: import java.io.Writer;
025: import java.util.List;
026: import java.util.Map;
027: import java.util.logging.Level;
028: import java.util.logging.Logger;
029: import org.onemind.awtbridge.peer.BridgePeer;
030: import org.onemind.awtbridge.render.RenderDelegate;
031: import org.onemind.awtbridge.render.RenderingException;
032: import org.onemind.commons.java.lang.ConfigurationException;
033: import org.onemind.commons.java.xml.digest.*;
034: import org.onemind.commons.java.xml.digest.SaxDigesterHandler;
035: import org.onemind.swingweb.SwingWebContext;
036: import org.onemind.swingweb.render.AbstractSwingWebRenderContext;
037: import org.onemind.swingweb.render.SwingWebRenderContext;
038: import org.xml.sax.Attributes;
039: import org.xml.sax.SAXException;
040:
041: /**
042: * The template render context
043: * @author TiongHiang Lee (thlee@onemindsoft.org)
044: *
045: */
046: public class TemplateRenderContext extends
047: AbstractSwingWebRenderContext implements SwingWebRenderContext {
048:
049: /** the logger * */
050: private static final Logger _logger = Logger
051: .getLogger(TemplateRenderContext.class.getName());
052:
053: /** the template engine * */
054: private TemplateEngine _engine;
055:
056: /**
057: * Constructor
058: * @param context the bridge context
059: * @throws ConfigurationException if there's config problem
060: */
061: public TemplateRenderContext(SwingWebContext context)
062: throws ConfigurationException {
063: super (context);
064: }
065:
066: /**
067: * Set the template engine
068: * @param engine the engine
069: */
070: public void setTemplateEngine(TemplateEngine engine) {
071: _engine = engine;
072: }
073:
074: /**
075: * Install the peer delegate
076: * @param peer the peer
077: */
078: public void installRenderPeerDelegate(BridgePeer peer) {
079: Object obj = peer.getComponentObject();
080: RenderDelegate delegate = resolveDelegate(obj.getClass());
081: if (delegate == null) {
082: throw new RuntimeException(
083: "Cannot resolve render delegate for " + peer);
084: } else {
085: if (_logger.isLoggable(Level.FINEST)) {
086: _logger.finest("Assigning delegate " + delegate
087: + " to " + obj);
088: }
089: peer.setRenderDelegate(delegate);
090: }
091: }
092:
093: /**
094: * render the template
095: * @param peer the peer
096: * @param writer the writer
097: * @throws RenderingException if there's render problem
098: */
099: public void renderTemplate(BridgePeer peer, Writer writer)
100: throws RenderingException {
101: _engine.renderTemplate(this , peer, writer);
102: }
103:
104: /**
105: * {@inheritDoc}
106: */
107: public String getElementName() {
108: return "templaterender";
109: }
110:
111: /**
112: * {@inheritDoc}
113: */
114: public void renderOutput(Object comObject, Object output)
115: throws RenderingException {
116: BridgePeer peer = getContext().getPeer(comObject);
117: if (peer != null) {
118: peer.render(this , output);
119: } else {
120: throw new IllegalStateException("component " + comObject
121: + " has no peer");
122: }
123: }
124:
125: /**
126: * {@inheritDoc}
127: */
128: public void renderOutput(Window window, Object output)
129: throws RenderingException {
130: renderOutput((Object) window, output);
131: }
132:
133: /**
134: * {@inheritDoc}
135: */
136: public void renderOutput(Object output) throws RenderingException {
137: List consoleWindows = getContext().getComponentManager()
138: .getConsoleWindows();
139: for (int i = 0; i < consoleWindows.size(); i++) {
140: Window w = (Window) consoleWindows.get(i);
141: renderOutput(w, output);
142: }
143: List windows = getContext().getComponentManager().getWindows();
144: for (int i = 0; i < windows.size(); i++) {
145: Window w = (Window) windows.get(i);
146: renderOutput(w, output);
147: }
148: }
149:
150: /**
151: * {@inheritDoc}
152: */
153: public void startDigest(SaxDigesterHandler handler, Attributes attrs) {
154: super .startDigest(handler, attrs);
155: ElementCreatorDigester dig = new ChainedDigester(
156: "templateengine", "className", null);
157: dig.addListener(new ElementListener() {
158:
159: /**
160: * {@inheritDoc}
161: */
162: public void objectCreated(Object obj) {
163: setTemplateEngine((TemplateEngine) obj);
164: }
165: });
166: handler.addSubDigester(dig);
167: }
168:
169: /**
170: * {@inheritDoc}
171: */
172: public void endDigest(SaxDigesterHandler handler)
173: throws SAXException {
174: if (_engine == null) {
175: throw new SAXException(
176: "Template engine is not configured at "
177: + handler.getCurrentPath());
178: }
179: }
180:
181: /**
182: * {@inheritDoc}
183: */
184: public void getRuntimeInfo(BridgePeer peer, Map env) {
185: env.put("templaterenderdelegate", resolveDelegate(peer
186: .getComponentObject().getClass()));
187: _engine.getRuntimeInfo(peer, env);
188: }
189:
190: public void destroy() {
191: }
192: }
|