/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. *******************************************************************************/ package org.apache.ofbiz.workeffort.content; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.sql.Timestamp; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.GeneralException; import org.apache.ofbiz.base.util.GeneralRuntimeException; import org.apache.ofbiz.base.util.StringUtil; import org.apache.ofbiz.base.util.UtilCodec; import org.apache.ofbiz.base.util.UtilHttp; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.base.util.cache.UtilCache; import org.apache.ofbiz.content.content.ContentWorker; import org.apache.ofbiz.content.content.ContentWrapper; import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.GenericValue; import org.apache.ofbiz.entity.model.ModelEntity; import org.apache.ofbiz.entity.model.ModelUtil; import org.apache.ofbiz.entity.util.EntityQuery; import org.apache.ofbiz.entity.util.EntityUtilProperties; import org.apache.ofbiz.service.LocalDispatcher; /** * WorkEffortContentWrapper; gets work effort content for display */ public class WorkEffortContentWrapper implements ContentWrapper { public static final String module = WorkEffortContentWrapper.class.getName(); public static final String CACHE_KEY_SEPARATOR = "::"; private static final UtilCache<String, String> workEffortContentCache = UtilCache.createUtilCache("workeffort.content.rendered", true); protected LocalDispatcher dispatcher; protected GenericValue workEffort; protected Locale locale; protected String mimeTypeId; public WorkEffortContentWrapper(LocalDispatcher dispatcher, GenericValue workEffort, Locale locale, String mimeTypeId) { this.dispatcher = dispatcher; this.workEffort = workEffort; this.locale = locale; this.mimeTypeId = mimeTypeId; } public WorkEffortContentWrapper(GenericValue workEffort, HttpServletRequest request) { this.workEffort = workEffort; this.locale = UtilHttp.getLocale(request); this.mimeTypeId = EntityUtilProperties.getPropertyValue("content", "defaultMimeType", "text/html; charset=utf-8", (Delegator) request.getAttribute("delegator")); } // interface implementation(s) public String get(String workEffortContentId, boolean useCache, String encoderType) { return getWorkEffortContentAsText(workEffort, workEffortContentId, locale, mimeTypeId, workEffort.getDelegator(), dispatcher, useCache, encoderType); } /** * Get the most current content data by the defined type * @param contentTypeId Type of content to return * @return String containing the content data */ public StringUtil.StringWrapper get(String contentTypeId, String encoderType) { return StringUtil.makeStringWrapper(get(contentTypeId, true, encoderType)); } /** * Get the ID from the most current content data by the defined type * @param contentTypeId Type of content to return * @return String containing the contentId */ public String getContentId(String contentTypeId) { GenericValue workEffortContent = getFirstWorkEffortContentByType(null, workEffort, contentTypeId, workEffort.getDelegator(), true); if (workEffortContent != null) { return workEffortContent.getString("contentId"); } else { return null; } } /** * Get the name of the most current content data by the defined type * @param contentTypeId Type of content to return * @return String containing the name of the content record */ public String getContentName(String contentTypeId) { GenericValue workEffortContent = getFirstWorkEffortContentByType(null, workEffort, contentTypeId, workEffort.getDelegator(), true); if (workEffortContent != null) { GenericValue content; try { content = workEffortContent.getRelatedOne("Content", false); } catch (GeneralException e) { Debug.logError(e, module); return null; } if (content != null) { return content.getString("contentName"); } } return null; } /** * Get the fromDate from teh most current content data by the defined type * @param contentTypeId Type of content to return * @return Timestamp of the fromDate field for this content type */ public Timestamp getFromDate(String contentTypeId) { GenericValue workEffortContent = getFirstWorkEffortContentByType(null, workEffort, contentTypeId, workEffort.getDelegator(), true); if (workEffortContent != null) { return workEffortContent.getTimestamp("fromDate"); } else { return null; } } public String getDataResourceId(String contentTypeId) { GenericValue workEffortContent = getFirstWorkEffortContentByType(null, workEffort, contentTypeId, workEffort.getDelegator(), true); if (workEffortContent != null) { GenericValue content; try { content = workEffortContent.getRelatedOne("Content", false); } catch (GeneralException e) { Debug.logError(e, module); return null; } if (content != null) { GenericValue dataResource; try { dataResource = content.getRelatedOne("DataResource", false); } catch (GeneralException e) { Debug.logError(e, module); return null; } if (dataResource != null) { return dataResource.getString("dataResourceId"); } } } return null; } public List<String> getList(String contentTypeId) { try { return getWorkEffortContentTextList(workEffort, contentTypeId, locale, mimeTypeId, workEffort.getDelegator(), dispatcher); } catch (Exception e) { Debug.logError(e, module); return null; } } public String getTypeDescription(String contentTypeId) { Delegator delegator = null; if (workEffort != null) { delegator = workEffort.getDelegator(); } if (delegator != null) { GenericValue contentType = null; try { contentType = EntityQuery.use(delegator).from("WorkEffortContentType").where("workEffortContentTypeId", contentTypeId).cache().queryOne(); } catch (GeneralException e) { Debug.logError(e, module); } if (contentType != null) { return contentType.getString("description"); } } return null; } public String getContent(String contentId, boolean useCache, String encoderType) { return getWorkEffortContentAsText(workEffort, contentId, null, locale, mimeTypeId, workEffort.getDelegator(), dispatcher, useCache, encoderType); } public String getContent(String contentId, String encoderType) { return getContent(contentId, true, encoderType); } // static method helpers public static String getWorkEffortContentAsText(GenericValue workEffort, String workEffortContentTypeId, HttpServletRequest request, String encoderType) { LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); String mimeTypeId = EntityUtilProperties.getPropertyValue("content", "defaultMimeType", "text/html; charset=utf-8", workEffort.getDelegator()); return getWorkEffortContentAsText(workEffort, workEffortContentTypeId, UtilHttp.getLocale(request), mimeTypeId, workEffort.getDelegator(), dispatcher, true, encoderType); } public static String getWorkEffortContentAsText(GenericValue workEffort, String workEffortContentTypeId, Locale locale, LocalDispatcher dispatcher, String encoderType) { return getWorkEffortContentAsText(workEffort, workEffortContentTypeId, locale, null, null, dispatcher, true, encoderType); } public static String getWorkEffortContentAsText(GenericValue workEffort, String workEffortContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, boolean useCache, String encoderType) { return getWorkEffortContentAsText(workEffort, null, workEffortContentTypeId, locale, mimeTypeId, delegator, dispatcher, useCache, encoderType); } public static String getWorkEffortContentAsText(GenericValue workEffort, String contentId, String workEffortContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, boolean useCache, String encoderType) { if (workEffort == null) { return null; } UtilCodec.SimpleEncoder encoder = UtilCodec.getEncoder(encoderType); String candidateFieldName = ModelUtil.dbNameToVarName(workEffortContentTypeId); String cacheKey; if (contentId != null) { cacheKey = contentId + CACHE_KEY_SEPARATOR + locale + CACHE_KEY_SEPARATOR + mimeTypeId + CACHE_KEY_SEPARATOR + workEffort.get("workEffortId"); } else { cacheKey = workEffortContentTypeId + CACHE_KEY_SEPARATOR + locale + CACHE_KEY_SEPARATOR + mimeTypeId + CACHE_KEY_SEPARATOR + workEffort.get("workEffortId"); } try { if (useCache) { String cachedValue = workEffortContentCache.get(cacheKey); if (cachedValue != null) { return cachedValue; } } Writer outWriter = new StringWriter(); getWorkEffortContentAsText(contentId, null, workEffort, workEffortContentTypeId, locale, mimeTypeId, delegator, dispatcher, outWriter, false); String outString = outWriter.toString(); if (UtilValidate.isEmpty(outString)) { outString = workEffort.getModelEntity().isField(candidateFieldName) ? workEffort.getString(candidateFieldName): ""; outString = outString == null? "" : outString; } outString = encoder.sanitize(outString, null); if (workEffortContentCache != null) { workEffortContentCache.put(cacheKey, outString); } return outString; } catch (GeneralException e) { Debug.logError(e, "Error rendering WorkEffortContent, inserting empty String", module); String candidateOut = workEffort.getModelEntity().isField(candidateFieldName) ? workEffort.getString(candidateFieldName): ""; return candidateOut == null? "" : encoder.sanitize(candidateOut, null); } catch (IOException e) { Debug.logError(e, "Error rendering WorkEffortContent, inserting empty String", module); String candidateOut = workEffort.getModelEntity().isField(candidateFieldName) ? workEffort.getString(candidateFieldName): ""; return candidateOut == null? "" : encoder.sanitize(candidateOut, null); } } public static void getWorkEffortContentAsText(String contentId, String workEffortId, GenericValue workEffort, String workEffortContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, Writer outWriter) throws GeneralException, IOException { getWorkEffortContentAsText(contentId, null, workEffort, workEffortContentTypeId, locale, mimeTypeId, delegator, dispatcher, outWriter, true); } public static void getWorkEffortContentAsText(String contentId, String workEffortId, GenericValue workEffort, String workEffortContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher, Writer outWriter, boolean cache) throws GeneralException, IOException { if (workEffortId == null && workEffort != null) { workEffortId = workEffort.getString("workEffortId"); } if (delegator == null && workEffort != null) { delegator = workEffort.getDelegator(); } if (UtilValidate.isEmpty(mimeTypeId)) { mimeTypeId = EntityUtilProperties.getPropertyValue("content", "defaultMimeType", "text/html; charset=utf-8", delegator); } if (delegator == null) { throw new GeneralRuntimeException("Unable to find a delegator to use!"); } // Honor work effort content over WorkEffort entity fields. GenericValue workEffortContent; if (contentId != null) { workEffortContent = EntityQuery.use(delegator).from("WorkEffortContent").where("workEffortId", workEffortId, "contentId", contentId).cache(cache).queryOne(); } else { workEffortContent = getFirstWorkEffortContentByType(workEffortId, workEffort, workEffortContentTypeId, delegator, cache); } if (workEffortContent != null) { // when rendering the product content, always include the Product and ProductContent records that this comes from Map<String, Object> inContext = new HashMap<String, Object>(); inContext.put("workEffort", workEffort); inContext.put("workEffortContent", workEffortContent); ContentWorker.renderContentAsText(dispatcher, workEffortContent.getString("contentId"), outWriter, inContext, locale, mimeTypeId, null, null, false); return; } // check for workeffort field String candidateFieldName = ModelUtil.dbNameToVarName(workEffortContentTypeId); ModelEntity workEffortModel = delegator.getModelEntity("WorkEffort"); if (workEffortModel != null && workEffortModel.isField(candidateFieldName)) { if (workEffort == null) { workEffort = EntityQuery.use(delegator).from("WorkEffort").where("workEffortId", workEffortId).cache().queryOne(); } if (workEffort != null) { String candidateValue = workEffort.getString(candidateFieldName); if (UtilValidate.isNotEmpty(candidateValue)) { outWriter.write(candidateValue); return; } } } } public static List<String> getWorkEffortContentTextList(GenericValue workEffort, String workEffortContentTypeId, Locale locale, String mimeTypeId, Delegator delegator, LocalDispatcher dispatcher) throws GeneralException, IOException { List<GenericValue> partyContentList = EntityQuery.use(delegator).from("WorkEffortContent") .where("workEffortId", workEffort.getString("partyId"), "workEffortContentTypeId", workEffortContentTypeId) .orderBy("-fromDate") .cache(true) .filterByDate() .queryList(); List<String> contentList = new LinkedList<String>(); if (partyContentList != null) { for (GenericValue workEffortContent: partyContentList) { StringWriter outWriter = new StringWriter(); Map<String, Object> inContext = new HashMap<String, Object>(); inContext.put("workEffort", workEffort); inContext.put("workEffortContent", workEffortContent); ContentWorker.renderContentAsText(dispatcher, workEffortContent.getString("contentId"), outWriter, inContext, locale, mimeTypeId, null, null, false); contentList.add(outWriter.toString()); } } return contentList; } public static GenericValue getFirstWorkEffortContentByType(String workEffortId, GenericValue workEffort, String workEffortContentTypeId, Delegator delegator, boolean cache) { if (workEffortId == null && workEffort != null) { workEffortId = workEffort.getString("workEffortId"); } if (delegator == null && workEffort != null) { delegator = workEffort.getDelegator(); } if (delegator == null) { throw new IllegalArgumentException("Delegator missing"); } GenericValue workEffortContent = null; try { workEffortContent = EntityQuery.use(delegator).from("WorkEffortContent") .where("workEffortId", workEffortId, "workEffortContentTypeId", workEffortContentTypeId) .orderBy("-fromDate") .filterByDate() .cache(cache) .queryFirst(); } catch (GeneralException e) { Debug.logError(e, module); } return workEffortContent; } public static WorkEffortContentWrapper makeWorkEffortContentWrapper(GenericValue workEffort, HttpServletRequest request) { return new WorkEffortContentWrapper(workEffort, request); } }