Author: jaz
Date: Thu Feb 22 14:10:55 2007
New Revision: 510684
URL: http://svn.apache.org/viewvc?view=rev&rev=510684
Log:
some basic CMS events; will render full page content; updated worker methods to
call into screen widget to decorate when using a proper template
Modified:
ofbiz/trunk/applications/content/src/org/ofbiz/content/cms/CmsEvents.java
ofbiz/trunk/applications/content/src/org/ofbiz/content/content/ContentWorker.java
ofbiz/trunk/applications/content/src/org/ofbiz/content/data/DataResourceWorker.java
Modified:
ofbiz/trunk/applications/content/src/org/ofbiz/content/cms/CmsEvents.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/src/org/ofbiz/content/cms/CmsEvents.java?view=diff&rev=510684&r1=510683&r2=510684
==============================================================================
--- ofbiz/trunk/applications/content/src/org/ofbiz/content/cms/CmsEvents.java
(original)
+++ ofbiz/trunk/applications/content/src/org/ofbiz/content/cms/CmsEvents.java
Thu Feb 22 14:10:55 2007
@@ -19,20 +19,31 @@
package org.ofbiz.content.cms;
-import org.ofbiz.webapp.control.RequestHandler;
+import org.ofbiz.base.util.*;
+import org.ofbiz.base.util.collections.MapStack;
+import org.ofbiz.content.content.ContentWorker;
import org.ofbiz.entity.GenericDelegator;
-import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.GenericEntityException;
-import org.ofbiz.base.util.UtilMisc;
-import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.util.EntityUtil;
+import org.ofbiz.widget.screen.ScreenRenderer;
+import org.ofbiz.widget.html.HtmlFormRenderer;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletException;
import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Locale;
+import java.util.Iterator;
+
/**
* CmsEvents
@@ -41,8 +52,9 @@
public static final String module = CmsEvents.class.getName();
- public static String cms(HttpServletRequest request, HttpServletResponse
response) {
+ public static String cms(HttpServletRequest request, HttpServletResponse
response) {
GenericDelegator delegator = (GenericDelegator)
request.getAttribute("delegator");
+ ServletContext servletContext =
request.getSession().getServletContext();
HttpSession session = request.getSession();
String webSiteId = (String) session.getAttribute("webSiteId");
@@ -65,12 +77,16 @@
actualRequest = "";
}
+ // place holder for the content id
+ String contentId = null;
+ String mapKey = null;
+
String pathInfo = request.getPathInfo();
if (targetRequest.equals(actualRequest)) {
// was called directly -- path info is everything after the request
String[] pathParsed = pathInfo.split("/", 3);
if (pathParsed != null && pathParsed.length > 2) {
- pathInfo = "/" + pathParsed[2];
+ pathInfo = pathParsed[2];
} else {
pathInfo = null;
}
@@ -78,6 +94,14 @@
// check for path alias first
if (pathInfo != null) {
+ // clean up the pathinfo for parsing
+ pathInfo = pathInfo.trim();
+ if (pathInfo.startsWith("/")) {
+ pathInfo = pathInfo.substring(1);
+ }
+ if (pathInfo.endsWith("/")) {
+ pathInfo = pathInfo.substring(0, pathInfo.length() - 1);
+ }
Debug.log("Path INFO for Alias: " + pathInfo, module);
GenericValue pathAlias = null;
@@ -88,7 +112,9 @@
}
if (pathAlias != null) {
String alias = pathAlias.getString("aliasTo");
- if (UtilValidate.isNotEmpty(alias)) {
+ contentId = pathAlias.getString("contentId");
+ mapKey = pathAlias.getString("mapKey");
+ if (contentId == null && UtilValidate.isNotEmpty(alias)) {
if (!alias.startsWith("/")) {
alias = "/" + alias;
}
@@ -107,12 +133,137 @@
return null; // null to not process any views
}
}
- }
- // process through CMS
- // TODO: implement me!
+ // process through CMS -- using the mapKey (for now)
+ GenericValue userLogin = (GenericValue)
session.getAttribute("userLogin");
+ Timestamp fromDate = UtilDateTime.nowTimestamp();
+ Locale locale = UtilHttp.getLocale(request);
+
+ // get the contentId/mapKey from URL
+ if (contentId == null) {
+ Debug.log("Current PathInfo: " + pathInfo, module);
+ if (pathInfo.indexOf("/") != -1) {
+ String[] pathSplit = pathInfo.split("/");
+ Debug.log("Split pathinfo: " + pathSplit.length, module);
+ if (pathSplit != null && pathSplit.length > 0) {
+ contentId = pathSplit[0];
+ if (pathSplit.length > 1) {
+ mapKey = pathSplit[1];
+ }
+ }
+ } else {
+ contentId = pathInfo;
+ }
+ }
+
+ // verify the request content is associated with the current
website
+ boolean websiteOk;
+ try {
+ websiteOk = verifyContentToWebSite(delegator, webSiteId,
contentId);
+ } catch (GeneralException e) {
+ Debug.logError(e, module);
+ throw new GeneralRuntimeException(e.getMessage(), e);
+ }
+
+ if (websiteOk) {
+ // create the template map
+ MapStack templateMap = MapStack.create();
+ ScreenRenderer.populateContextForRequest(templateMap, null,
request, response, servletContext);
+ templateMap.put("formStringRenderer", new
HtmlFormRenderer(request, response));
+
+ Writer writer;
+ try {
+ // use UtilJ2eeCompat to get this setup properly
+ boolean useOutputStreamNotWriter = false;
+ if (servletContext != null) {
+ useOutputStreamNotWriter =
UtilJ2eeCompat.useOutputStreamNotWriter(servletContext);
+ }
+ if (useOutputStreamNotWriter) {
+ ServletOutputStream ros = response.getOutputStream();
+ writer = new OutputStreamWriter(ros, "UTF-8");
+ } else {
+ writer = response.getWriter();
+ }
+
+ // render
+ if (UtilValidate.isEmpty(mapKey)) {
+ ContentWorker.renderContentAsTextCache(delegator,
contentId, writer, templateMap, null, locale, "text/html");
+ } else {
+ ContentWorker.renderSubContentAsTextCache(delegator,
contentId, writer, mapKey, null, templateMap,
+ locale, "text/html", userLogin, fromDate,
Boolean.FALSE);
+ }
+
+ } catch (IOException e) {
+ throw new GeneralRuntimeException("Error in the response
writer/output stream: " + e.toString(), e);
+ } catch (GeneralException e) {
+ throw new GeneralRuntimeException("Error rendering
content: " + e.toString(), e);
+ }
+
+ return null;
+ } else {
+ Debug.log("No website [" + webSiteId + "] publish point found
for contentId: " + contentId, module);
+ }
+ }
// throw an unknown request error
- throw new RuntimeException("Unknown request; this request does not
exist or cannot be called directly.");
+ throw new GeneralRuntimeException("Unknown request; this request does
not exist or cannot be called directly.");
+ }
+
+ protected static boolean verifyContentToWebSite(GenericDelegator
delegator, String webSiteId, String contentId) throws GeneralException {
+ // first check the top level publish point
+ // get the root content id
+ List publishPoints = null;
+ try {
+ publishPoints = delegator.findByAndCache("WebSiteContent",
+ UtilMisc.toMap("webSiteId", webSiteId, "contentId",
contentId, "webSiteContentTypeId", "PUBLISH_POINT"),
+ UtilMisc.toList("-fromDate"));
+ } catch (GenericEntityException e) {
+ throw e;
+ }
+
+ publishPoints = EntityUtil.filterByDate(publishPoints);
+ if (publishPoints == null || publishPoints.size() == 0) {
+ List topLevel = delegator.findByAndCache("WebSiteContent",
+ UtilMisc.toMap("webSiteId", webSiteId, "webSiteContentTypeId",
"PUBLISH_POINT"),
+ UtilMisc.toList("-fromDate"));
+ topLevel = EntityUtil.filterByDate(topLevel);
+ if (topLevel != null) {
+ Iterator i = topLevel.iterator();
+ while (i.hasNext()) {
+ GenericValue point = (GenericValue) i.next();
+ if (verifySubContent(delegator, contentId,
point.getString("contentId"))) {
+ return true;
+ }
+ }
+ }
+ } else {
+ Debug.log("Found publish points: " + publishPoints, module);
+ return true;
+ }
+
+ return false;
+ }
+
+ protected static boolean verifySubContent(GenericDelegator delegator,
String contentId, String contentIdFrom) throws GeneralException {
+ List contentAssoc = delegator.findByAnd("ContentAssoc",
UtilMisc.toMap("contentId", contentIdFrom, "contentIdTo", contentId));
+ contentAssoc = EntityUtil.filterByDate(contentAssoc);
+ if (contentAssoc == null || contentAssoc.size() == 0) {
+ List assocs = delegator.findByAnd("ContentAssoc",
UtilMisc.toMap("contentId", contentIdFrom));
+ assocs = EntityUtil.filterByDate(assocs);
+ if (assocs != null) {
+ Iterator i = assocs.iterator();
+ while (i.hasNext()) {
+ GenericValue assoc = (GenericValue) i.next();
+ if (verifySubContent(delegator, contentId,
assoc.getString("contentIdTo"))) {
+ return true;
+ }
+ }
+ }
+ } else {
+ Debug.log("Found assocs: " + contentAssoc, module);
+ return true;
+ }
+
+ return false;
}
}
Modified:
ofbiz/trunk/applications/content/src/org/ofbiz/content/content/ContentWorker.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/src/org/ofbiz/content/content/ContentWorker.java?view=diff&rev=510684&r1=510683&r2=510684
==============================================================================
---
ofbiz/trunk/applications/content/src/org/ofbiz/content/content/ContentWorker.java
(original)
+++
ofbiz/trunk/applications/content/src/org/ofbiz/content/content/ContentWorker.java
Thu Feb 22 14:10:55 2007
@@ -1081,6 +1081,9 @@
templateRoot = new HashMap();
}
+ // hold on to the mapKey
+ templateRoot.put("mapKey", mapKey);
+
//templateRoot.put("contentId", contentIdSub);
//templateRoot.put("subContentId", null);
Modified:
ofbiz/trunk/applications/content/src/org/ofbiz/content/data/DataResourceWorker.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/content/src/org/ofbiz/content/data/DataResourceWorker.java?view=diff&rev=510684&r1=510683&r2=510684
==============================================================================
---
ofbiz/trunk/applications/content/src/org/ofbiz/content/data/DataResourceWorker.java
(original)
+++
ofbiz/trunk/applications/content/src/org/ofbiz/content/data/DataResourceWorker.java
Thu Feb 22 14:10:55 2007
@@ -69,6 +69,7 @@
import freemarker.template.Template;
import freemarker.template.TemplateException;
+import javolution.util.FastMap;
//import com.clarkware.profiler.Profiler;
@@ -619,21 +620,26 @@
}
} else if ("SCREEN_COMBINED".equals(dataTemplateTypeId)) {
try {
- Map context = MapStack.create(templateRoot);
- ScreenStringRenderer screenStringRenderer = null;
- ScreenRenderer screenRenderer =
(ScreenRenderer)context.get("screens");
- if (screenRenderer != null) {
- screenStringRenderer =
screenRenderer.getScreenStringRenderer();
- } else {
- if (screenStringRenderer == null) {
- screenStringRenderer = new HtmlScreenRenderer();
- }
- }
+ MapStack context = MapStack.create(templateRoot);
+ context.put("locale", locale);
+
+ // prepare the map for preRenderedContent
+ Map prc = FastMap.newInstance();
+ String mapKey = (String) context.get("mapKey");
+ String textData = (String) context.get("textData");
+ prc.put("body", textData);
+ context.put("preRenderedContent", prc);
+
+ ScreenRenderer screens = (ScreenRenderer)
context.get("screens");
+ if (screens == null) {
+ screens = new ScreenRenderer(out, context, new
HtmlScreenRenderer());
+ screens.getContext().put("screens", screens);
+ }
- String combinedName =
(String)dataResource.get("objectInfo");
+ ScreenStringRenderer renderer =
screens.getScreenStringRenderer();
+ String combinedName = (String)
dataResource.get("objectInfo");
ModelScreen modelScreen =
ScreenFactory.getScreenFromLocation(combinedName);
- modelScreen.renderScreenString(out, context,
screenStringRenderer);
-
+ modelScreen.renderScreenString(out, context, renderer);
} catch (SAXException e) {
throw new GeneralException("Error rendering Screen
template", e);
} catch(ParserConfigurationException e3) {