blob: fbfdc6175ad1eb9a13e8ff433434d9023c5c1cbc [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.ofbiz.content.content;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.sql.Timestamp;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javolution.util.FastList;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.GeneralException;
import org.ofbiz.base.util.StringUtil;
import org.ofbiz.base.util.UtilDateTime;
import org.ofbiz.base.util.UtilFormatOut;
import org.ofbiz.base.util.UtilGenerics;
import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.condition.EntityCondition;
import org.ofbiz.entity.condition.EntityConditionList;
import org.ofbiz.entity.condition.EntityOperator;
import org.ofbiz.entity.util.EntityUtil;
import org.ofbiz.service.DispatchContext;
import org.ofbiz.service.GenericServiceException;
import org.ofbiz.service.LocalDispatcher;
import org.ofbiz.service.ModelService;
import org.ofbiz.service.ServiceUtil;
/**
* ContentServices Class
*/
public class ContentServices {
public static final String module = ContentServices.class.getName();
public static final String resource = "ContentUiLabels";
/**
* findRelatedContent Finds the related
*/
public static Map<String, Object> findRelatedContent(DispatchContext dctx, Map<String, ? extends Object> context) {
LocalDispatcher dispatcher = dctx.getDispatcher();
Map<String, Object> results = FastMap.newInstance();
GenericValue currentContent = (GenericValue) context.get("currentContent");
String fromDate = (String) context.get("fromDate");
String thruDate = (String) context.get("thruDate");
String toFrom = (String) context.get("toFrom");
Locale locale = (Locale) context.get("locale");
if (toFrom == null) {
toFrom = "TO";
} else {
toFrom = toFrom.toUpperCase();
}
List<String> assocTypes = UtilGenerics.checkList(context.get("contentAssocTypeList"));
List<String> targetOperations = UtilGenerics.checkList(context.get("targetOperationList"));
List<String> contentTypes = UtilGenerics.checkList(context.get("contentTypeList"));
List<GenericValue> contentList = null;
try {
contentList = ContentWorker.getAssociatedContent(currentContent, toFrom, assocTypes, contentTypes, fromDate, thruDate);
} catch (GenericEntityException e) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentAssocRetrievingError", UtilMisc.toMap("errorString", e.toString()), locale));
}
if (UtilValidate.isEmpty(targetOperations)) {
results.put("contentList", contentList);
return results;
}
Map<String, Object> serviceInMap = FastMap.newInstance();
serviceInMap.put("userLogin", context.get("userLogin"));
serviceInMap.put("targetOperationList", targetOperations);
serviceInMap.put("entityOperation", context.get("entityOperation"));
List<GenericValue> permittedList = FastList.newInstance();
Map<String, Object> permResults = null;
for(GenericValue content : contentList) {
serviceInMap.put("currentContent", content);
try {
permResults = dispatcher.runSync("checkContentPermission", serviceInMap);
} catch (GenericServiceException e) {
Debug.logError(e, "Problem checking permissions", "ContentServices");
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentPermissionNotGranted", locale));
}
String permissionStatus = (String) permResults.get("permissionStatus");
if (permissionStatus != null && permissionStatus.equalsIgnoreCase("granted")) {
permittedList.add(content);
}
}
results.put("contentList", permittedList);
return results;
}
/**
* This is a generic service for traversing a Content tree, typical of a blog response tree. It calls the ContentWorker.traverse method.
*/
public static Map<String, Object> findContentParents(DispatchContext dctx, Map<String, ? extends Object> context) {
Map<String, Object> results = FastMap.newInstance();
List<Object> parentList = FastList.newInstance();
results.put("parentList", parentList);
LocalDispatcher dispatcher = dctx.getDispatcher();
String contentId = (String)context.get("contentId");
String contentAssocTypeId = (String)context.get("contentAssocTypeId");
String direction = (String)context.get("direction");
if (UtilValidate.isEmpty(direction)) {
direction="To";
}
Map<String, Object> traversMap = FastMap.newInstance();
traversMap.put("contentId", contentId);
traversMap.put("direction", direction);
traversMap.put("contentAssocTypeId", contentAssocTypeId);
try {
Map<String, Object> thisResults = dispatcher.runSync("traverseContent", traversMap);
String errorMsg = ServiceUtil.getErrorMessage(thisResults);
if (UtilValidate.isNotEmpty(errorMsg)) {
Debug.logError("Problem in traverseContent. " + errorMsg, module);
return ServiceUtil.returnError(errorMsg);
}
Map<String, Object> nodeMap = UtilGenerics.checkMap(thisResults.get("nodeMap"));
walkParentTree(nodeMap, parentList);
} catch (GenericServiceException e) {
return ServiceUtil.returnFailure(e.getMessage());
}
return results;
}
private static void walkParentTree(Map<String, Object> nodeMap, List<Object> parentList) {
List<Map<String, Object>> kids = UtilGenerics.checkList(nodeMap.get("kids"));
if (UtilValidate.isEmpty(kids)) {
parentList.add(nodeMap.get("contentId"));
} else {
for(Map<String, Object> node : kids) {
walkParentTree(node, parentList);
}
}
}
/**
* This is a generic service for traversing a Content tree, typical of a blog response tree. It calls the ContentWorker.traverse method.
*/
public static Map<String, Object> traverseContent(DispatchContext dctx, Map<String, ? extends Object> context) {
Delegator delegator = dctx.getDelegator();
Map<String, Object> results = FastMap.newInstance();
Locale locale = (Locale) context.get("locale");
String contentId = (String) context.get("contentId");
String direction = (String) context.get("direction");
if (direction != null && direction.equalsIgnoreCase("From")) {
direction = "From";
} else {
direction = "To";
}
if (contentId == null) {
contentId = "PUBLISH_ROOT";
}
GenericValue content = null;
try {
content = delegator.findOne("Content", UtilMisc.toMap("contentId", contentId), false);
} catch (GenericEntityException e) {
Debug.logError(e, "Entity Error:" + e.getMessage(), module);
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", contentId), locale));
}
String fromDateStr = (String) context.get("fromDateStr");
String thruDateStr = (String) context.get("thruDateStr");
Timestamp fromDate = null;
if (UtilValidate.isNotEmpty(fromDateStr)) {
fromDate = UtilDateTime.toTimestamp(fromDateStr);
}
Timestamp thruDate = null;
if (UtilValidate.isNotEmpty(thruDateStr)) {
thruDate = UtilDateTime.toTimestamp(thruDateStr);
}
Map<String, Object> whenMap = FastMap.newInstance();
whenMap.put("followWhen", context.get("followWhen"));
whenMap.put("pickWhen", context.get("pickWhen"));
whenMap.put("returnBeforePickWhen", context.get("returnBeforePickWhen"));
whenMap.put("returnAfterPickWhen", context.get("returnAfterPickWhen"));
String startContentAssocTypeId = (String) context.get("contentAssocTypeId");
if (startContentAssocTypeId != null) {
startContentAssocTypeId = "PUBLISH";
}
Map<String, Object> nodeMap = FastMap.newInstance();
List<GenericValue> pickList = FastList.newInstance();
ContentWorker.traverse(delegator, content, fromDate, thruDate, whenMap, 0, nodeMap, startContentAssocTypeId, pickList, direction);
results.put("nodeMap", nodeMap);
results.put("pickList", pickList);
return results;
}
/**
* Create a Content service. The work is done in a separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> createContent(DispatchContext dctx, Map<String, ? extends Object> context) {
/*
context.put("entityOperation", "_CREATE");
List targetOperationList = ContentWorker.prepTargetOperationList(context, "_CREATE");
List contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList); // for checking permissions
//context.put("skipPermissionCheck", null);
*/
Map<String, Object> result = createContentMethod(dctx, context);
return result;
}
/**
* Create a Content method. The work is done in this separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> createContentMethod(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
context.put("entityOperation", "_CREATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_CREATE");
if (Debug.infoOn()) Debug.logInfo("in createContentMethod, targetOperationList: " + targetOperationList, null);
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
Map<String, Object> result = FastMap.newInstance();
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
String contentId = (String) context.get("contentId");
//String contentTypeId = (String) context.get("contentTypeId");
if (UtilValidate.isEmpty(contentId)) {
contentId = delegator.getNextSeqId("Content");
}
GenericValue content = delegator.makeValue("Content", UtilMisc.toMap("contentId", contentId));
content.setNonPKFields(context);
GenericValue userLogin = (GenericValue) context.get("userLogin");
String userLoginId = (String) userLogin.get("userLoginId");
// get first statusId for content out of the statusItem table if not provided
if (UtilValidate.isEmpty(context.get("statusId"))) {
try {
List<GenericValue> statusItems = delegator.findByAnd("StatusItem",UtilMisc.toMap("statusTypeId", "CONTENT_STATUS"), UtilMisc.toList("sequenceId"), false);
if (!UtilValidate.isEmpty(statusItems)) {
content.put("statusId", (statusItems.get(0)).getString("statusId"));
}
} catch (GenericEntityException e) {
return ServiceUtil.returnError(e.getMessage());
}
}
content.put("createdByUserLogin", userLoginId);
content.put("lastModifiedByUserLogin", userLoginId);
content.put("createdDate", nowTimestamp);
content.put("lastModifiedDate", nowTimestamp);
context.put("currentContent", content);
if (Debug.infoOn()) Debug.logInfo("in createContentMethod, context: " + context, null);
Map<String, Object> permResults = ContentWorker.callContentPermissionCheckResult(delegator, dispatcher, context);
String permissionStatus = (String) permResults.get("permissionStatus");
if (permissionStatus != null && permissionStatus.equalsIgnoreCase("granted")) {
try {
content.create();
} catch (GenericEntityException e) {
return ServiceUtil.returnError(e.getMessage());
} catch (Exception e2) {
return ServiceUtil.returnError(e2.getMessage());
}
result.put("contentId", contentId);
} else {
String errorMsg = (String) permResults.get(ModelService.ERROR_MESSAGE);
result.put(ModelService.ERROR_MESSAGE, errorMsg);
return ServiceUtil.returnFailure(errorMsg);
}
context.remove("currentContent");
return result;
}
/**
* Create a ContentAssoc service. The work is done in a separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> createContentAssoc(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
context.put("entityOperation", "_CREATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_CREATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
context.put("skipPermissionCheck", null);
Map<String, Object> result = null;
try {
result = createContentAssocMethod(dctx, context);
} catch (GenericServiceException e) {
return ServiceUtil.returnError(e.getMessage());
} catch (GenericEntityException e2) {
return ServiceUtil.returnError(e2.getMessage());
} catch (Exception e3) {
return ServiceUtil.returnError(e3.getMessage());
}
return result;
}
/**
* Create a ContentAssoc method. The work is done in this separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> createContentAssocMethod(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException, GenericEntityException {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_CREATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
Locale locale = (Locale) context.get("locale");
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Map<String, Object> result = FastMap.newInstance();
// This section guesses how contentId should be used (From or To) if
// only a contentIdFrom o contentIdTo is passed in
String contentIdFrom = (String) context.get("contentIdFrom");
String contentIdTo = (String) context.get("contentIdTo");
String contentId = (String) context.get("contentId");
int contentIdCount = 0;
if (UtilValidate.isNotEmpty(contentIdFrom))
contentIdCount++;
if (UtilValidate.isNotEmpty(contentIdTo))
contentIdCount++;
if (UtilValidate.isNotEmpty(contentId))
contentIdCount++;
if (contentIdCount < 2) {
Debug.logError("Not 2 out of ContentId/To/From.", "ContentServices");
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentCreateContentAssocMethodError", locale));
}
if (UtilValidate.isNotEmpty(contentIdFrom)) {
if (UtilValidate.isEmpty(contentIdTo))
contentIdTo = contentId;
}
if (UtilValidate.isNotEmpty(contentIdTo)) {
if (UtilValidate.isEmpty(contentIdFrom))
contentIdFrom = contentId;
}
/*
String deactivateExisting = (String) context.get("deactivateExisting");
if (deactivateExisting != null && deactivateExisting.equalsIgnoreCase("true")) {
Map andMap = FastMap.newInstance();
andMap.put("contentIdTo", contentIdTo);
andMap.put("contentAssocTypeId", context.get("contentAssocTypeId"));
String mapKey = (String) context.get("mapKey");
if (UtilValidate.isNotEmpty(mapKey)) {
andMap.put("mapKey", mapKey);
}
if (Debug.infoOn()) Debug.logInfo("DEACTIVATING CONTENTASSOC andMap: " + andMap, null);
List assocList = delegator.findByAnd("ContentAssoc", andMap);
Iterator iter = assocList.iterator();
while (iter.hasNext()) {
GenericValue val = (GenericValue) iter.next();
if (Debug.infoOn()) Debug.logInfo("DEACTIVATING CONTENTASSOC val: " + val, null);
val.set("thruDate", UtilDateTime.nowTimestamp());
val.store();
}
}
*/
GenericValue contentAssoc = delegator.makeValue("ContentAssoc", FastMap.newInstance());
contentAssoc.put("contentId", contentIdFrom);
contentAssoc.put("contentIdTo", contentIdTo);
contentAssoc.put("contentAssocTypeId", context.get("contentAssocTypeId"));
contentAssoc.put("contentAssocPredicateId", context.get("contentAssocPredicateIdFrom"));
contentAssoc.put("dataSourceId", context.get("dataSourceId"));
Timestamp fromDate = (Timestamp) context.get("fromDate");
if (fromDate == null) {
contentAssoc.put("fromDate", UtilDateTime.nowTimestamp());
} else {
contentAssoc.put("fromDate", fromDate);
}
Timestamp thruDate = (Timestamp) context.get("thruDate");
if (thruDate == null) {
contentAssoc.put("thruDate", null);
} else {
contentAssoc.put("thruDate", thruDate);
}
contentAssoc.put("sequenceNum", context.get("sequenceNum"));
contentAssoc.put("mapKey", context.get("mapKey"));
String upperCoordinateStr = (String) context.get("upperCoordinate");
if (UtilValidate.isEmpty(upperCoordinateStr)) {
contentAssoc.put("upperCoordinate", null);
} else {
contentAssoc.put("upperCoordinate", upperCoordinateStr);
}
String leftCoordinateStr = (String) context.get("leftCoordinate");
if (UtilValidate.isEmpty(leftCoordinateStr)) {
contentAssoc.put("leftCoordinate", null);
} else {
contentAssoc.put("leftCoordinate", leftCoordinateStr);
}
GenericValue userLogin = (GenericValue) context.get("userLogin");
String userLoginId = (String) userLogin.get("userLoginId");
String createdByUserLogin = userLoginId;
String lastModifiedByUserLogin = userLoginId;
Timestamp createdDate = UtilDateTime.nowTimestamp();
Timestamp lastModifiedDate = UtilDateTime.nowTimestamp();
contentAssoc.put("createdByUserLogin", createdByUserLogin);
contentAssoc.put("lastModifiedByUserLogin", lastModifiedByUserLogin);
contentAssoc.put("createdDate", createdDate);
contentAssoc.put("lastModifiedDate", lastModifiedDate);
Map<String, Object> serviceInMap = FastMap.newInstance();
String permissionStatus = null;
serviceInMap.put("userLogin", context.get("userLogin"));
serviceInMap.put("targetOperationList", targetOperationList);
serviceInMap.put("contentPurposeList", contentPurposeList);
serviceInMap.put("entityOperation", context.get("entityOperation"));
serviceInMap.put("contentAssocPredicateId", context.get("contentAssocPredicateId"));
serviceInMap.put("contentIdTo", contentIdTo);
serviceInMap.put("contentIdFrom", contentIdFrom);
serviceInMap.put("statusId", context.get("statusId"));
serviceInMap.put("privilegeEnumId", context.get("privilegeEnumId"));
serviceInMap.put("roleTypeList", context.get("roleTypeList"));
serviceInMap.put("displayFailCond", context.get("displayFailCond"));
Map<String, Object> permResults = null;
permResults = dispatcher.runSync("checkAssocPermission", serviceInMap);
permissionStatus = (String) permResults.get("permissionStatus");
if (permissionStatus != null && permissionStatus.equals("granted")) {
contentAssoc.create();
} else {
String errorMsg = (String)permResults.get(ModelService.ERROR_MESSAGE);
result.put(ModelService.ERROR_MESSAGE, errorMsg);
return ServiceUtil.returnFailure(errorMsg);
}
result.put("contentIdTo", contentIdTo);
result.put("contentIdFrom", contentIdFrom);
result.put("fromDate", contentAssoc.get("fromDate"));
result.put("contentAssocTypeId", contentAssoc.get("contentAssocTypeId"));
//Debug.logInfo("result:" + result, module);
//Debug.logInfo("contentAssoc:" + contentAssoc, module);
return result;
}
/**
* A service wrapper for the updateContentMethod method. Forces permissions to be checked.
*/
public static Map<String, Object> updateContent(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
context.put("entityOperation", "_UPDATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_UPDATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
context.put("skipPermissionCheck", null);
Map<String, Object> result = updateContentMethod(dctx, context);
return result;
}
/**
* Update a Content method. The work is done in this separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty of calling a service.
* DEJ20060610: why is this being done? It's a bad design because the service call overhead is not very big, but not calling through the service engine breaks functionality possibilities like ECAs and such
*/
public static Map<String, Object> updateContentMethod(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Map<String, Object> result = FastMap.newInstance();
context.put("entityOperation", "_UPDATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_UPDATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
GenericValue content = null;
Locale locale = (Locale) context.get("locale");
String contentId = (String) context.get("contentId");
try {
content = delegator.findOne("Content", UtilMisc.toMap("contentId", contentId), false);
} catch (GenericEntityException e) {
Debug.logWarning(e, module);
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", contentId), locale));
}
context.put("currentContent", content);
Map<String, Object> permResults = ContentWorker.callContentPermissionCheckResult(delegator, dispatcher, context);
String permissionStatus = (String) permResults.get("permissionStatus");
if (permissionStatus != null && permissionStatus.equalsIgnoreCase("granted")) {
GenericValue userLogin = (GenericValue) context.get("userLogin");
String userLoginId = (String) userLogin.get("userLoginId");
String lastModifiedByUserLogin = userLoginId;
Timestamp lastModifiedDate = UtilDateTime.nowTimestamp();
// update status first to see if allowed
if (UtilValidate.isNotEmpty(context.get("statusId"))) {
Map<String, Object> statusInMap = UtilMisc.<String, Object>toMap("contentId", context.get("contentId"), "statusId", context.get("statusId"), "userLogin", userLogin);
try {
dispatcher.runSync("setContentStatus", statusInMap);
} catch (GenericServiceException e) {
Debug.logError(e, "Problem updating content Status", "ContentServices");
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentStatusUpdateError", UtilMisc.toMap("errorString", e), locale));
}
}
content.setNonPKFields(context);
content.put("lastModifiedByUserLogin", lastModifiedByUserLogin);
content.put("lastModifiedDate", lastModifiedDate);
try {
content.store();
} catch (GenericEntityException e) {
return ServiceUtil.returnError(e.getMessage());
}
} else {
String errorMsg = ContentWorker.prepPermissionErrorMsg(permResults);
return ServiceUtil.returnError(errorMsg);
}
return result;
}
/**
* Update a ContentAssoc service. The work is done in a separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> updateContentAssoc(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
context.put("entityOperation", "_UPDATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_UPDATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
context.put("skipPermissionCheck", null);
Map<String, Object> result = updateContentAssocMethod(dctx, context);
return result;
}
/**
* Update a ContentAssoc method. The work is done in this separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> updateContentAssocMethod(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Locale locale = (Locale) context.get("locale");
Map<String, Object> result = FastMap.newInstance();
context.put("entityOperation", "_UPDATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_UPDATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
// This section guesses how contentId should be used (From or To) if
// only a contentIdFrom o contentIdTo is passed in
String contentIdFrom = (String) context.get("contentId");
String contentIdTo = (String) context.get("contentIdTo");
String contentId = (String) context.get("contentId");
String contentAssocTypeId = (String) context.get("contentAssocTypeId");
Timestamp fromDate = (Timestamp) context.get("fromDate");
GenericValue contentAssoc = null;
try {
contentAssoc = delegator.findOne("ContentAssoc", UtilMisc.toMap("contentId", contentId, "contentIdTo", contentIdTo, "contentAssocTypeId", contentAssocTypeId, "fromDate", fromDate), false);
} catch (GenericEntityException e) {
Debug.logError(e, "Entity Error:" + e.getMessage(), module);
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentAssocRetrievingError", UtilMisc.toMap("errorString", e.getMessage()), locale));
}
if (contentAssoc == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentAssocUpdateError", locale));
}
contentAssoc.put("contentAssocPredicateId", context.get("contentAssocPredicateId"));
contentAssoc.put("dataSourceId", context.get("dataSourceId"));
contentAssoc.set("thruDate", context.get("thruDate"));
contentAssoc.set("sequenceNum", context.get("sequenceNum"));
contentAssoc.put("mapKey", context.get("mapKey"));
String upperCoordinateStr = (String) context.get("upperCoordinate");
if (UtilValidate.isEmpty(upperCoordinateStr)) {
contentAssoc.put("upperCoordinate", null);
} else {
contentAssoc.setString("upperCoordinate", upperCoordinateStr);
}
String leftCoordinateStr = (String) context.get("leftCoordinate");
if (UtilValidate.isEmpty(leftCoordinateStr)) {
contentAssoc.put("leftCoordinate", null);
} else {
contentAssoc.setString("leftCoordinate", leftCoordinateStr);
}
GenericValue userLogin = (GenericValue) context.get("userLogin");
String userLoginId = (String) userLogin.get("userLoginId");
String lastModifiedByUserLogin = userLoginId;
Timestamp lastModifiedDate = UtilDateTime.nowTimestamp();
contentAssoc.put("lastModifiedByUserLogin", lastModifiedByUserLogin);
contentAssoc.put("lastModifiedDate", lastModifiedDate);
String permissionStatus = null;
Map<String, Object> serviceInMap = FastMap.newInstance();
serviceInMap.put("userLogin", context.get("userLogin"));
serviceInMap.put("targetOperationList", targetOperationList);
serviceInMap.put("contentPurposeList", contentPurposeList);
serviceInMap.put("entityOperation", context.get("entityOperation"));
serviceInMap.put("contentIdTo", contentIdTo);
serviceInMap.put("contentIdFrom", contentIdFrom);
Map<String, Object> permResults = null;
try {
permResults = dispatcher.runSync("checkAssocPermission", serviceInMap);
} catch (GenericServiceException e) {
Debug.logError(e, "Problem checking permissions", "ContentServices");
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentPermissionNotGranted", locale));
}
permissionStatus = (String) permResults.get("permissionStatus");
if (permissionStatus != null && permissionStatus.equals("granted")) {
try {
contentAssoc.store();
} catch (GenericEntityException e) {
return ServiceUtil.returnError(e.getMessage());
}
} else {
String errorMsg = ContentWorker.prepPermissionErrorMsg(permResults);
return ServiceUtil.returnError(errorMsg);
}
return result;
}
/**
* Update a ContentAssoc service. The work is done in a separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> deactivateContentAssoc(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
context.put("entityOperation", "_UPDATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_UPDATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
context.put("skipPermissionCheck", null);
Map<String, Object> result = deactivateContentAssocMethod(dctx, context);
return result;
}
/**
* Update a ContentAssoc method. The work is done in this separate method so that complex services that need this functionality do not need to incur the
* reflection performance penalty.
*/
public static Map<String, Object> deactivateContentAssocMethod(DispatchContext dctx, Map<String, ? extends Object> rcontext) {
Map<String, Object> context = UtilMisc.makeMapWritable(rcontext);
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Map<String, Object> result = FastMap.newInstance();
Locale locale = (Locale) context.get("locale");
context.put("entityOperation", "_UPDATE");
List<String> targetOperationList = ContentWorker.prepTargetOperationList(context, "_UPDATE");
List<String> contentPurposeList = ContentWorker.prepContentPurposeList(context);
context.put("targetOperationList", targetOperationList);
context.put("contentPurposeList", contentPurposeList);
GenericValue pk = delegator.makeValue("ContentAssoc");
pk.setAllFields(context, false, null, Boolean.TRUE);
pk.setAllFields(context, false, "ca", Boolean.TRUE);
//String contentIdFrom = (String) context.get("contentId");
//String contentIdTo = (String) context.get("contentIdTo");
//String contentId = (String) context.get("contentId");
//String contentAssocTypeId = (String) context.get("contentAssocTypeId");
//Timestamp fromDate = (Timestamp) context.get("fromDate");
GenericValue contentAssoc = null;
try {
//contentAssoc = delegator.findOne("ContentAssoc", UtilMisc.toMap("contentId", contentId, "contentIdTo", contentIdTo, "contentAssocTypeId", contentAssocTypeId, "fromDate", fromDate), false);
contentAssoc = delegator.findOne("ContentAssoc", pk, false);
} catch (GenericEntityException e) {
Debug.logError(e, "Entity Error:" + e.getMessage(), module);
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentAssocRetrievingError", UtilMisc.toMap("errorString", e.getMessage()), locale));
}
if (contentAssoc == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentAssocDeactivatingError", locale));
}
GenericValue userLogin = (GenericValue) context.get("userLogin");
String userLoginId = (String) userLogin.get("userLoginId");
String lastModifiedByUserLogin = userLoginId;
Timestamp lastModifiedDate = UtilDateTime.nowTimestamp();
contentAssoc.put("lastModifiedByUserLogin", lastModifiedByUserLogin);
contentAssoc.put("lastModifiedDate", lastModifiedDate);
contentAssoc.put("thruDate", UtilDateTime.nowTimestamp());
String permissionStatus = null;
Map<String, Object> serviceInMap = FastMap.newInstance();
serviceInMap.put("userLogin", context.get("userLogin"));
serviceInMap.put("targetOperationList", targetOperationList);
serviceInMap.put("contentPurposeList", contentPurposeList);
serviceInMap.put("entityOperation", context.get("entityOperation"));
serviceInMap.put("contentIdTo", contentAssoc.get("contentIdTo"));
serviceInMap.put("contentIdFrom", contentAssoc.get("contentId"));
Map<String, Object> permResults = null;
try {
permResults = dispatcher.runSync("checkAssocPermission", serviceInMap);
} catch (GenericServiceException e) {
Debug.logError(e, "Problem checking permissions", "ContentServices");
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentPermissionNotGranted", locale));
}
permissionStatus = (String) permResults.get("permissionStatus");
if (permissionStatus != null && permissionStatus.equals("granted")) {
try {
contentAssoc.store();
} catch (GenericEntityException e) {
return ServiceUtil.returnError(e.getMessage());
}
} else {
String errorMsg = ContentWorker.prepPermissionErrorMsg(permResults);
return ServiceUtil.returnError(errorMsg);
}
return result;
}
/**
* Deactivates any active ContentAssoc (except the current one) that is associated with the passed in template/layout contentId and mapKey.
*/
public static Map<String, Object> deactivateAssocs(DispatchContext dctx, Map<String, ? extends Object> context) {
Delegator delegator = dctx.getDelegator();
String contentIdTo = (String) context.get("contentIdTo");
String mapKey = (String) context.get("mapKey");
String contentAssocTypeId = (String) context.get("contentAssocTypeId");
String activeContentId = (String) context.get("activeContentId");
String contentId = (String) context.get("contentId");
Timestamp fromDate = (Timestamp) context.get("fromDate");
Locale locale = (Locale) context.get("locale");
Timestamp nowTimestamp = UtilDateTime.nowTimestamp();
String sequenceNum = null;
Map<String, Object> results = FastMap.newInstance();
try {
GenericValue activeAssoc = null;
if (fromDate != null) {
activeAssoc = delegator.findOne("ContentAssoc", UtilMisc.toMap("contentId", activeContentId, "contentIdTo", contentIdTo, "fromDate", fromDate, "contentAssocTypeId", contentAssocTypeId), false);
if (activeAssoc == null) {
return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentAssocNotFound", UtilMisc.toMap("activeContentId", activeContentId, "contentIdTo", contentIdTo, "contentAssocTypeId", contentAssocTypeId, "fromDate", fromDate), locale));
}
sequenceNum = (String) activeAssoc.get("sequenceNum");
}
List<EntityCondition> exprList = FastList.newInstance();
exprList.add(EntityCondition.makeCondition("mapKey", EntityOperator.EQUALS, mapKey));
if (sequenceNum != null) {
exprList.add(EntityCondition.makeCondition("sequenceNum", EntityOperator.EQUALS, sequenceNum));
}
exprList.add(EntityCondition.makeCondition("mapKey", EntityOperator.EQUALS, mapKey));
exprList.add(EntityCondition.makeCondition("thruDate", EntityOperator.EQUALS, null));
exprList.add(EntityCondition.makeCondition("contentIdTo", EntityOperator.EQUALS, contentIdTo));
exprList.add(EntityCondition.makeCondition("contentAssocTypeId", EntityOperator.EQUALS, contentAssocTypeId));
if (UtilValidate.isNotEmpty(activeContentId)) {
exprList.add(EntityCondition.makeCondition("contentId", EntityOperator.NOT_EQUAL, activeContentId));
}
if (UtilValidate.isNotEmpty(contentId)) {
exprList.add(EntityCondition.makeCondition("contentId", EntityOperator.EQUALS, contentId));
}
EntityConditionList<EntityCondition> assocExprList = EntityCondition.makeCondition(exprList, EntityOperator.AND);
List<GenericValue> relatedAssocs = delegator.findList("ContentAssoc", assocExprList, null, UtilMisc.toList("fromDate"), null, false);
//if (Debug.infoOn()) Debug.logInfo("in deactivateAssocs, relatedAssocs:" + relatedAssocs, module);
List<GenericValue> filteredAssocs = EntityUtil.filterByDate(relatedAssocs);
//if (Debug.infoOn()) Debug.logInfo("in deactivateAssocs, filteredAssocs:" + filteredAssocs, module);
for(GenericValue val : filteredAssocs) {
val.set("thruDate", nowTimestamp);
val.store();
//if (Debug.infoOn()) Debug.logInfo("in deactivateAssocs, val:" + val, module);
}
results.put("deactivatedList", filteredAssocs);
} catch (GenericEntityException e) {
return ServiceUtil.returnError(e.getMessage());
}
return results;
}
/**
* Get and render subcontent associated with template id and mapkey. If subContentId is supplied, that content will be rendered without searching for other
* matching content.
*/
public static Map<String, Object> renderSubContentAsText(DispatchContext dctx, Map<String, ? extends Object> context) {
Map<String, Object> results = FastMap.newInstance();
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Map<String,Object> templateContext = UtilGenerics.checkMap(context.get("templateContext"));
String contentId = (String) context.get("contentId");
// Timestamp fromDate = (Timestamp) context.get("fromDate");
// GenericValue userLogin = (GenericValue) context.get("userLogin");
if (templateContext != null && UtilValidate.isEmpty(contentId)) {
contentId = (String) templateContext.get("contentId");
}
String mapKey = (String) context.get("mapKey");
if (templateContext != null && UtilValidate.isEmpty(mapKey)) {
mapKey = (String) templateContext.get("mapKey");
}
//String subContentId = (String) context.get("subContentId");
//if (templateContext != null && UtilValidate.isEmpty(subContentId)) {
//subContentId = (String) templateContext.get("subContentId");
//}
String mimeTypeId = (String) context.get("mimeTypeId");
if (templateContext != null && UtilValidate.isEmpty(mimeTypeId)) {
mimeTypeId = (String) templateContext.get("mimeTypeId");
}
Locale locale = (Locale) context.get("locale");
if (templateContext != null && locale == null) {
locale = (Locale) templateContext.get("locale");
}
GenericValue subContentDataResourceView = (GenericValue) context.get("subContentDataResourceView");
if (subContentDataResourceView != null && subContentDataResourceView == null) {
subContentDataResourceView = (GenericValue) templateContext.get("subContentDataResourceView");
}
Writer out = (Writer) context.get("outWriter");
Writer outWriter = new StringWriter();
if (templateContext == null) {
templateContext = FastMap.newInstance();
}
try {
ContentWorker.renderSubContentAsText(dispatcher, delegator, contentId, outWriter, mapKey, templateContext, locale, mimeTypeId, true);
out.write(outWriter.toString());
results.put("textData", outWriter.toString());
} catch (GeneralException e) {
Debug.logError(e, "Error rendering sub-content text", module);
return ServiceUtil.returnError(e.toString());
} catch (IOException e) {
Debug.logError(e, "Error rendering sub-content text", module);
return ServiceUtil.returnError(e.toString());
}
return results;
}
/**
* Get and render subcontent associated with template id and mapkey. If subContentId is supplied, that content will be rendered without searching for other
* matching content.
*/
public static Map<String, Object> renderContentAsText(DispatchContext dctx, Map<String, ? extends Object> context) {
Map<String,Object> results = FastMap.newInstance();
LocalDispatcher dispatcher = dctx.getDispatcher();
Delegator delegator = dctx.getDelegator();
Writer out = (Writer) context.get("outWriter");
Map<String,Object> templateContext = UtilGenerics.checkMap(context.get("templateContext"));
//GenericValue userLogin = (GenericValue)context.get("userLogin");
String contentId = (String) context.get("contentId");
if (templateContext != null && UtilValidate.isEmpty(contentId)) {
contentId = (String) templateContext.get("contentId");
}
String mimeTypeId = (String) context.get("mimeTypeId");
if (templateContext != null && UtilValidate.isEmpty(mimeTypeId)) {
mimeTypeId = (String) templateContext.get("mimeTypeId");
}
Locale locale = (Locale) context.get("locale");
if (templateContext != null && locale == null) {
locale = (Locale) templateContext.get("locale");
}
if (templateContext == null) {
templateContext = FastMap.newInstance();
}
Writer outWriter = new StringWriter();
GenericValue view = (GenericValue)context.get("subContentDataResourceView");
if (view != null && view.containsKey("contentId")) {
contentId = view.getString("contentId");
}
try {
ContentWorker.renderContentAsText(dispatcher, delegator, contentId, outWriter, templateContext, locale, mimeTypeId, null, null, true);
if (out != null) out.write(outWriter.toString());
results.put("textData", outWriter.toString());
} catch (GeneralException e) {
Debug.logError(e, "Error rendering sub-content text", module);
return ServiceUtil.returnError(e.toString());
} catch (IOException e) {
Debug.logError(e, "Error rendering sub-content text", module);
return ServiceUtil.returnError(e.toString());
}
return results;
}
public static Map<String, Object> linkContentToPubPt(DispatchContext dctx, Map<String, ? extends Object> context) {
Map<String, Object> results = FastMap.newInstance();
Delegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
String contentId = (String) context.get("contentId");
String contentIdTo = (String) context.get("contentIdTo");
String contentAssocTypeId = (String) context.get("contentAssocTypeId");
String statusId = (String) context.get("statusId");
String privilegeEnumId = (String) context.get("privilegeEnumId");
GenericValue userLogin = (GenericValue) context.get("userLogin");
if (Debug.infoOn()) Debug.logInfo("in publishContent, statusId:" + statusId, module);
if (Debug.infoOn()) Debug.logInfo("in publishContent, userLogin:" + userLogin, module);
Map<String, Object> mapIn = FastMap.newInstance();
mapIn.put("contentId", contentId);
mapIn.put("contentIdTo", contentIdTo);
mapIn.put("contentAssocTypeId", contentAssocTypeId);
String publish = (String) context.get("publish");
try {
boolean isPublished = false;
GenericValue contentAssocViewFrom = ContentWorker.getContentAssocViewFrom(delegator, contentIdTo, contentId, contentAssocTypeId, statusId, privilegeEnumId);
if (contentAssocViewFrom != null)
isPublished = true;
if (Debug.infoOn()) Debug.logInfo("in publishContent, contentId:" + contentId + " contentIdTo:" + contentIdTo + " contentAssocTypeId:" + contentAssocTypeId + " publish:" + publish + " isPublished:" + isPublished, module);
if (UtilValidate.isNotEmpty(publish) && publish.equalsIgnoreCase("Y")) {
GenericValue content = delegator.findOne("Content", UtilMisc.toMap("contentId", contentId), false);
String contentStatusId = (String) content.get("statusId");
String contentPrivilegeEnumId = (String) content.get("privilegeEnumId");
if (Debug.infoOn()) Debug.logInfo("in publishContent, statusId:" + statusId + " contentStatusId:" + contentStatusId + " privilegeEnumId:" + privilegeEnumId + " contentPrivilegeEnumId:" + contentPrivilegeEnumId, module);
// Don't do anything if link was already there
if (!isPublished) {
//Map thisResults = dispatcher.runSync("deactivateAssocs", mapIn);
//String errorMsg = ServiceUtil.getErrorMessage(thisResults);
//if (UtilValidate.isNotEmpty(errorMsg)) {
//Debug.logError("Problem running deactivateAssocs. " + errorMsg, "ContentServices");
//return ServiceUtil.returnError(errorMsg);
//}
content.put("privilegeEnumId", privilegeEnumId);
content.put("statusId", statusId);
content.store();
mapIn = FastMap.newInstance();
mapIn.put("contentId", contentId);
mapIn.put("contentIdTo", contentIdTo);
mapIn.put("contentAssocTypeId", contentAssocTypeId);
mapIn.put("mapKey", context.get("mapKey"));
mapIn.put("fromDate", UtilDateTime.nowTimestamp());
mapIn.put("createdDate", UtilDateTime.nowTimestamp());
mapIn.put("lastModifiedDate", UtilDateTime.nowTimestamp());
mapIn.put("createdByUserLogin", userLogin.get("userLoginId"));
mapIn.put("lastModifiedByUserLogin", userLogin.get("userLoginId"));
delegator.create("ContentAssoc", mapIn);
}
} else {
// Only deactive if currently published
if (isPublished) {
Map<String, Object> thisResults = dispatcher.runSync("deactivateAssocs", mapIn);
String errorMsg = ServiceUtil.getErrorMessage(thisResults);
if (UtilValidate.isNotEmpty(errorMsg)) {
Debug.logError("Problem running deactivateAssocs. " + errorMsg, "ContentServices");
return ServiceUtil.returnError(errorMsg);
}
}
}
} catch (GenericEntityException e) {
Debug.logError(e, "Problem getting existing content", "ContentServices");
return ServiceUtil.returnError(e.getMessage());
} catch (GenericServiceException e) {
Debug.logError(e, "Problem running deactivateAssocs", "ContentServices");
return ServiceUtil.returnError(e.getMessage());
}
return results;
}
public static Map<String, Object> publishContent(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{
Map<String, Object> result = FastMap.newInstance();
GenericValue content = (GenericValue)context.get("content");
try {
content.put("statusId", "CTNT_PUBLISHED");
content.store();
} catch (GenericEntityException e) {
Debug.logError(e.getMessage(), module);
return ServiceUtil.returnError(e.getMessage());
}
return result;
}
public static Map<String, Object> getPrefixedMembers(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{
Map<String, Object> result = FastMap.newInstance();
Map<String, Object> mapIn = UtilGenerics.checkMap(context.get("mapIn"));
String prefix = (String)context.get("prefix");
Map<String, Object> mapOut = FastMap.newInstance();
result.put("mapOut", mapOut);
if (mapIn != null) {
Set<Map.Entry<String, Object>> entrySet = mapIn.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
String key = entry.getKey();
if (key.startsWith(prefix)) {
// String keyBase = key.substring(prefix.length());
Object value = entry.getValue();
mapOut.put(key, value);
}
}
}
return result;
}
public static Map<String, Object> splitString(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{
Map<String, Object> result = FastMap.newInstance();
List<String> outputList = FastList.newInstance();
String delimiter = UtilFormatOut.checkEmpty((String)context.get("delimiter"), "|");
String inputString = (String)context.get("inputString");
if (UtilValidate.isNotEmpty(inputString)) {
outputList = StringUtil.split(inputString, delimiter);
}
result.put("outputList", outputList);
return result;
}
public static Map<String, Object> joinString(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{
Map<String, Object> result = FastMap.newInstance();
String outputString = null;
String delimiter = UtilFormatOut.checkEmpty((String)context.get("delimiter"), "|");
List<String> inputList = UtilGenerics.checkList(context.get("inputList"));
if (inputList != null) {
outputString = StringUtil.join(inputList, delimiter);
}
result.put("outputString", outputString);
return result;
}
public static Map<String, Object> urlEncodeArgs(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{
Map<String, Object> result = FastMap.newInstance();
Map<String, Object> mapFiltered = FastMap.newInstance();
Map<String, Object> mapIn = UtilGenerics.checkMap(context.get("mapIn"));
if (mapIn != null) {
Set<Map.Entry<String, Object>> entrySet = mapIn.entrySet();
for (Map.Entry<String, Object> entry : entrySet) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof String) {
if (UtilValidate.isNotEmpty(value)) {
mapFiltered.put(key, value);
}
} else if (value != null) {
mapFiltered.put(key, value);
}
}
String outputString = UtilHttp.urlEncodeArgs(mapFiltered);
result.put("outputString", outputString);
}
return result;
}
}