001: /*
002: * Created on Mar 19, 2003
003: */
004: package net.sf.jportlet.service.velocity;
005:
006: import java.util.Iterator;
007: import java.util.Map;
008: import java.util.Properties;
009:
010: import javax.servlet.ServletConfig;
011:
012: import org.apache.velocity.Template;
013: import org.apache.velocity.VelocityContext;
014: import org.apache.velocity.app.Velocity;
015: import org.apache.velocity.app.VelocityEngine;
016: import org.apache.velocity.context.Context;
017: import org.apache.velocity.exception.ParseErrorException;
018: import org.apache.velocity.exception.ResourceNotFoundException;
019:
020: import net.sf.jportlet.impl.PortletRequestImpl;
021: import net.sf.jportlet.portlet.PortletRequest;
022: import net.sf.jportlet.portlet.PortletResponse;
023: import net.sf.jportlet.portlet.application.PortletProxy;
024: import net.sf.jportlet.service.PortletServiceAdapter;
025: import net.sf.jportlet.service.PortletServiceConfig;
026: import net.sf.jportlet.service.PortletServiceException;
027:
028: /**
029: * Implementation of {@link net.sf.jportlet.service.velocity.VelocityService}
030: *
031: * @author <a href="mailto:tchbansi@sourceforge.net">Herve Tchepannou</a>
032: */
033: public class VelocityServiceImpl extends PortletServiceAdapter
034: implements VelocityService {
035: //~ Instance fields --------------------------------------------------------
036:
037: private VelocityEngine _engine;
038:
039: //~ Methods ----------------------------------------------------------------
040:
041: /**
042: * @see net.sf.jportlet.service.velocity.VelocityService#merge(java.lang.String, net.sf.jportlet.portlet.PortletRequest, net.sf.jportlet.portlet.PortletResponse)
043: */
044: public void merge(String path, PortletRequest request,
045: PortletResponse response) throws PortletServiceException {
046: merge(path, request, response, null);
047: }
048:
049: /**
050: * @see net.sf.jportlet.service.velocity.VelocityService#merge(java.lang.String, net.sf.jportlet.portlet.PortletRequest, net.sf.jportlet.portlet.PortletResponse, java.util.Map)
051: */
052: public void merge(String path, PortletRequest request,
053: PortletResponse response, Map context)
054: throws PortletServiceException {
055: boolean debug = _log.isDebugEnabled();
056:
057: if (debug) {
058: _log.debug("merge(" + path + ", context=" + context + ")");
059: }
060:
061: try {
062: Context ctx = createContext(request, response, context);
063:
064: Template template = _engine.getTemplate(path);
065: template.merge(ctx, response.getWriter());
066: } catch (ParseErrorException p) {
067: _log.error("Unexpected error", p);
068: throw new PortletServiceException("Error in the template",
069: p);
070: } catch (ResourceNotFoundException r) {
071: _log.error("Unexpected error", r);
072: throw new PortletServiceException("Template not found: "
073: + path, r);
074: } catch (Exception e) {
075: _log.error("Unexpected error", e);
076: throw new PortletServiceException(e);
077: }
078: }
079:
080: private Context createContext(PortletRequest request,
081: PortletResponse response, Map context) {
082: VelocityContext ctx = new VelocityContext();
083:
084: /* Inherited context */
085: if (context != null) {
086: putAll(context, ctx);
087: }
088:
089: /* Request attributes */
090: PortletRequestImpl req = (PortletRequestImpl) request;
091: Map attributes = req.getAttributes();
092: putAll(attributes, ctx);
093:
094: /* Standard context variables */
095: PortletProxy proxy = req.getProxy();
096: put(PROXY, proxy, ctx);
097: put(PORTLET, proxy.getPortlet(), ctx);
098: put(REQUEST, request, ctx);
099: put(RESPONSE, response, ctx);
100: put(RUNTIME, new Runtime(), ctx);
101:
102: return ctx;
103: }
104:
105: private void putAll(Map map, Context ctx) {
106: Iterator it = map.keySet().iterator();
107:
108: while (it.hasNext()) {
109: String name = (String) it.next();
110: Object value = map.get(name);
111:
112: put(name, value, ctx);
113: }
114: }
115:
116: private void put(String name, Object value, Context ctx) {
117: if (value != null) {
118: if (_log.isDebugEnabled()) {
119: _log.debug("putting into VelocityContext: " + name
120: + "=" + value);
121: }
122:
123: ctx.put(name, value);
124: }
125: }
126:
127: private Properties getProperties(ServletConfig servletConfig) {
128: Properties props = new Properties();
129:
130: /* General */
131: props.put(Velocity.RESOURCE_LOADER, "file,class");
132:
133: /* Classpath resource loader */
134: props
135: .put("class.resource.loader.class",
136: "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
137:
138: /* File resource loader */
139: props.put(Velocity.FILE_RESOURCE_LOADER_CACHE, "true");
140: props.put(Velocity.FILE_RESOURCE_LOADER_PATH, servletConfig
141: .getServletContext().getRealPath("/"));
142:
143: /* Logging */
144: props.put(Velocity.RUNTIME_LOG, "jportlet_velocity.log");
145: props.put("runtime.log.logsystem.log4j.category",
146: VelocityEngine.class.getName());
147: props.put("resource.manager.logwhenfound", "false");
148:
149: /* Macros */
150: props.put("velocimacro.library",
151: "net/sf/jportlet/portlet/html/__macros.vm");
152:
153: return props;
154: }
155:
156: /**
157: * @see net.sf.jportlet.service.PortletService#getServiceName()
158: */
159: public String getServiceName() {
160: return VelocityService.NAME;
161: }
162:
163: /**
164: * @see net.sf.jportlet.service.PortletService#init(net.sf.jportlet.service.PortletServiceConfig)
165: */
166: public void init(PortletServiceConfig serviceConfig)
167: throws PortletServiceException {
168: super .init(serviceConfig);
169:
170: try {
171: _engine = new VelocityEngine();
172: _engine
173: .init(getProperties(serviceConfig
174: .getServletConfig()));
175: } catch (Exception e) {
176: throw new PortletServiceException(e);
177: }
178: }
179: }
|