blob: b56e82072ce445d413d6112ae115985746db5743 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}