/******************************************************************************* * 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.content; import java.math.BigDecimal; import java.nio.ByteBuffer; import java.sql.Timestamp; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.StringUtil; import org.apache.ofbiz.base.util.UtilDateTime; import org.apache.ofbiz.base.util.UtilGenerics; import org.apache.ofbiz.base.util.UtilMisc; import org.apache.ofbiz.base.util.UtilProperties; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.base.util.cache.UtilCache; import org.apache.ofbiz.content.content.ContentServices; import org.apache.ofbiz.content.content.ContentWorker; import org.apache.ofbiz.entity.Delegator; import org.apache.ofbiz.entity.GenericEntityException; import org.apache.ofbiz.entity.GenericValue; import org.apache.ofbiz.entity.condition.EntityCondition; import org.apache.ofbiz.entity.condition.EntityOperator; import org.apache.ofbiz.entity.model.ModelUtil; import org.apache.ofbiz.entity.util.EntityQuery; import org.apache.ofbiz.entity.util.EntityUtil; import org.apache.ofbiz.security.Security; import org.apache.ofbiz.service.DispatchContext; import org.apache.ofbiz.service.GenericServiceException; import org.apache.ofbiz.service.LocalDispatcher; import org.apache.ofbiz.service.ModelService; import org.apache.ofbiz.service.ServiceAuthException; import org.apache.ofbiz.service.ServiceUtil; import com.ibm.icu.util.Calendar; /** * ContentManagementServices Class */ public class ContentManagementServices { public static final String module = ContentManagementServices.class.getName(); public static final String resource = "ContentUiLabels"; /** * getSubContent * Finds the related subContent given the template Content and the mapKey. * This service calls a same-named method in ContentWorker to do the work. */ public static Map<String, Object> getSubContent(DispatchContext dctx, Map<String, ? extends Object> context) { Delegator delegator = dctx.getDelegator(); String contentId = (String) context.get("contentId"); String subContentId = (String) context.get("subContentId"); String mapKey = (String) context.get("mapKey"); GenericValue userLogin = (GenericValue)context.get("userLogin"); Timestamp fromDate = (Timestamp)context.get("fromDate"); List<String> assocTypes = UtilGenerics.checkList(context.get("assocTypes")); String assocTypesString = (String)context.get("assocTypesString"); if (UtilValidate.isNotEmpty(assocTypesString)) { List<String> lst = StringUtil.split(assocTypesString, "|"); if (assocTypes == null) { assocTypes = new LinkedList<String>(); } assocTypes.addAll(lst); } GenericValue content = null; GenericValue view = null; try { view = ContentWorker.getSubContentCache(delegator, contentId, mapKey, subContentId, userLogin, assocTypes, fromDate, Boolean.FALSE, null); content = ContentWorker.getContentFromView(view); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } Map<String, Object> results = ServiceUtil.returnSuccess(); results.put("view", view); results.put("content", content); return results; } /** * getContent * This service calls a same-named method in ContentWorker to do the work. */ public static Map<String, Object> getContent(DispatchContext dctx, Map<String, ? extends Object> context) { Delegator delegator = dctx.getDelegator(); String contentId = (String) context.get("contentId"); GenericValue view = null; try { view = ContentWorker.getContentCache(delegator, contentId); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } Map<String, Object> results = ServiceUtil.returnSuccess(); results.put("view", view); return results; } /** * persistContentAndAssoc * A combination method that will create or update all or one of the following: * a Content entity, a ContentAssoc related to the Content, and * the ElectronicText that may be associated with the Content. * The keys for determining if each entity is created is the presence * of the contentTypeId, contentAssocTypeId and dataResourceTypeId. * This service tries to handle DataResource fields with and * without "dr" prefixes. * Assumes binary data is always in field, "imageData". * * This service does not accept straight ContentAssoc parameters. They must be prefaced with "ca" + cap first letter */ public static Map<String, Object> persistContentAndAssoc(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException { Delegator delegator = dctx.getDelegator(); LocalDispatcher dispatcher = dctx.getDispatcher(); Map<String, Object> context = UtilMisc.makeMapWritable(rcontext); Locale locale = (Locale) context.get("locale"); // Knowing why a request fails permission check is one of the more difficult // aspects of content management. Setting "displayFailCond" to true will // put an html table in result.errorMessage that will show what tests were performed Boolean bDisplayFailCond = (Boolean)context.get("displayFailCond"); String mapKey = (String) context.get("mapKey"); // If "deactivateExisting" is set, other Contents that are tied to the same // contentIdTo will be deactivated (thruDate set to now) String deactivateString = (String) context.get("deactivateExisting"); boolean deactivateExisting = "true".equalsIgnoreCase(deactivateString); if (Debug.infoOn()) Debug.logInfo("in persist... mapKey(0):" + mapKey, module); // ContentPurposes can get passed in as a delimited string or a list. Combine. List<String> contentPurposeList = UtilGenerics.checkList(context.get("contentPurposeList")); if (contentPurposeList == null) { contentPurposeList = new LinkedList<String>(); } String contentPurposeString = (String) context.get("contentPurposeString"); if (UtilValidate.isNotEmpty(contentPurposeString)) { List<String> tmpPurposes = StringUtil.split(contentPurposeString, "|"); contentPurposeList.addAll(tmpPurposes); } if (contentPurposeList != null) { context.put("contentPurposeList", contentPurposeList); context.put("contentPurposeString", null); } if (Debug.infoOn()) { Debug.logInfo("in persist... contentPurposeList(0):" + contentPurposeList, module); Debug.logInfo("in persist... textData(0):" + context.get("textData"), module); } GenericValue content = delegator.makeValue("Content"); content.setPKFields(context); content.setNonPKFields(context); String contentId = (String) content.get("contentId"); String contentTypeId = (String) content.get("contentTypeId"); String origContentId = (String) content.get("contentId"); String origDataResourceId = (String) content.get("dataResourceId"); if (Debug.infoOn()) { Debug.logInfo("in persist... contentId(0):" + contentId, module); } GenericValue dataResource = delegator.makeValue("DataResource"); dataResource.setPKFields(context); dataResource.setNonPKFields(context); dataResource.setAllFields(context, false, "dr", null); String isPublic = (String) context.get("isPublic"); if(UtilValidate.isEmpty(isPublic)){ dataResource.set("isPublic", "N"); } context.putAll(dataResource); String dataResourceId = (String) dataResource.get("dataResourceId"); String dataResourceTypeId = (String) dataResource.get("dataResourceTypeId"); if (Debug.infoOn()) { Debug.logInfo("in persist... dataResourceId(0):" + dataResourceId, module); } GenericValue contentAssoc = delegator.makeValue("ContentAssoc"); String contentAssocTypeId = (String)context.get("contentAssocTypeId"); if (UtilValidate.isNotEmpty(contentAssocTypeId)) { context.put("caContentAssocTypeId", contentAssocTypeId); } contentAssocTypeId = (String)context.get("caContentAssocTypeId"); contentAssoc.setAllFields(context, false, "ca", null); contentAssoc.put("contentId", context.get("caContentId")); context.putAll(contentAssoc); GenericValue electronicText = delegator.makeValue("ElectronicText"); electronicText.setPKFields(context); electronicText.setNonPKFields(context); // save expected primary keys on result now in case there is no operation that uses them Map<String, Object> results = ServiceUtil.returnSuccess(); results.put("contentId", content.get("contentId")); results.put("dataResourceId", dataResource.get("dataResourceId")); results.put("drDataResourceId", dataResource.get("dataResourceId")); results.put("drDataResourceId", dataResource.get("dataResourceId")); results.put("caContentIdTo", contentAssoc.get("contentIdTo")); results.put("caContentId", contentAssoc.get("contentId")); results.put("caFromDate", contentAssoc.get("fromDate")); results.put("caContentAssocTypeId", contentAssoc.get("contentAssocTypeId")); // get user info for multiple use GenericValue userLogin = (GenericValue) context.get("userLogin"); boolean dataResourceExists = true; if (Debug.infoOn()) { Debug.logInfo("in persist... dataResourceTypeId(0):" + dataResourceTypeId, module); } if (UtilValidate.isNotEmpty(dataResourceTypeId)) { Map<String, Object> dataResourceResult = new HashMap<String, Object>(); try { dataResourceResult = persistDataResourceAndDataMethod(dctx, context); } catch (GenericServiceException e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } catch (GenericEntityException e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } catch (Exception e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } String errorMsg = ServiceUtil.getErrorMessage(dataResourceResult); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } dataResourceId = (String)dataResourceResult.get("dataResourceId"); results.put("dataResourceId", dataResourceId); results.put("drDataResourceId", dataResourceId); context.put("dataResourceId", dataResourceId); content.put("dataResourceId", dataResourceId); context.put("drDataResourceId", dataResourceId); } // Do update and create permission checks on Content if warranted. context.put("skipPermissionCheck", null); // Force check here boolean contentExists = true; if (Debug.infoOn()) { Debug.logInfo("in persist... contentTypeId:" + contentTypeId + " dataResourceTypeId:" + dataResourceTypeId + " contentId:" + contentId + " dataResourceId:" + dataResourceId, module); } if (UtilValidate.isNotEmpty(contentTypeId)) { if (UtilValidate.isEmpty(contentId)) { contentExists = false; } else { try { GenericValue val = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); if (val == null) contentExists = false; } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } } context.putAll(content); if (contentExists) { Map<String, Object> contentContext = new HashMap<String, Object>(); ModelService contentModel = dispatcher.getDispatchContext().getModelService("updateContent"); contentContext.putAll(contentModel.makeValid(content, "IN")); contentContext.put("userLogin", userLogin); contentContext.put("displayFailCond", bDisplayFailCond); contentContext.put("skipPermissionCheck", context.get("skipPermissionCheck")); Debug.logInfo("In persistContentAndAssoc calling updateContent with content: " + contentContext, module); Map<String, Object> thisResult = dispatcher.runSync("updateContent", contentContext); if (ServiceUtil.isError(thisResult) || ServiceUtil.isFailure(thisResult)) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentContentUpdatingError", UtilMisc.toMap("serviceName", "persistContentAndAssoc"), locale), null, null, thisResult); } } else { Map<String, Object> contentContext = new HashMap<String, Object>(); ModelService contentModel = dispatcher.getDispatchContext().getModelService("createContent"); contentContext.putAll(contentModel.makeValid(content, "IN")); contentContext.put("userLogin", userLogin); contentContext.put("displayFailCond", bDisplayFailCond); contentContext.put("skipPermissionCheck", context.get("skipPermissionCheck")); Debug.logInfo("In persistContentAndAssoc calling createContent with content: " + contentContext, module); Map<String, Object> thisResult = dispatcher.runSync("createContent", contentContext); if (ServiceUtil.isError(thisResult) || ServiceUtil.isFailure(thisResult)) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentContentCreatingError", UtilMisc.toMap("serviceName", "persistContentAndAssoc"), locale), null, null, thisResult); } contentId = (String) thisResult.get("contentId"); } results.put("contentId", contentId); context.put("contentId", contentId); context.put("caContentIdTo", contentId); // Add ContentPurposes if this is a create operation if (contentId != null && !contentExists) { try { if (contentPurposeList != null) { Set<String> contentPurposeSet = UtilMisc.makeSetWritable(contentPurposeList); for (String contentPurposeTypeId : contentPurposeSet) { GenericValue contentPurpose = delegator.makeValue("ContentPurpose", UtilMisc.toMap("contentId", contentId, "contentPurposeTypeId", contentPurposeTypeId)); contentPurpose.create(); } } } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } } } else if (UtilValidate.isNotEmpty(dataResourceTypeId) && UtilValidate.isNotEmpty(contentId)) { // If dataResource was not previously existing, then update the associated content with its id if (UtilValidate.isNotEmpty(dataResourceId) && !dataResourceExists) { Map<String, Object> map = new HashMap<String, Object>(); map.put("userLogin", userLogin); map.put("dataResourceId", dataResourceId); map.put("contentId", contentId); if (Debug.infoOn()) Debug.logInfo("in persist... context:" + context, module); Map<String, Object> r = ContentServices.updateContentMethod(dctx, map); boolean isError = ModelService.RESPOND_ERROR.equals(r.get(ModelService.RESPONSE_MESSAGE)); if (isError) return ServiceUtil.returnError((String)r.get(ModelService.ERROR_MESSAGE)); } } // Put contentId if (UtilValidate.isNotEmpty(contentId)) { contentAssoc.put("contentIdTo", contentId); } // If parentContentIdTo or parentContentIdFrom exists, create association with newly created content if (Debug.infoOn()) { Debug.logInfo("CREATING contentASSOC contentAssocTypeId:" + contentAssocTypeId, module); } // create content assoc if the key values are present.... if (Debug.infoOn()) Debug.logInfo("contentAssoc: " + contentAssoc.toString(), module); if (UtilValidate.isNotEmpty(contentAssocTypeId) && contentAssoc.get("contentId") != null && contentAssoc.get("contentIdTo") != null) { if (Debug.infoOn()) Debug.logInfo("in persistContentAndAssoc, deactivateExisting:" + deactivateExisting, module); Map<String, Object> contentAssocContext = new HashMap<String, Object>(); contentAssocContext.put("userLogin", userLogin); contentAssocContext.put("displayFailCond", bDisplayFailCond); contentAssocContext.put("skipPermissionCheck", context.get("skipPermissionCheck")); Map<String, Object> thisResult = null; try { GenericValue contentAssocExisting = EntityQuery.use(delegator).from("ContentAssoc").where(contentAssoc.getPrimaryKey()).queryOne(); if (contentAssocExisting == null) { ModelService contentAssocModel = dispatcher.getDispatchContext().getModelService("createContentAssoc"); Map<String, Object> ctx = contentAssocModel.makeValid(contentAssoc, "IN"); contentAssocContext.putAll(ctx); thisResult = dispatcher.runSync("createContentAssoc", contentAssocContext); String errMsg = ServiceUtil.getErrorMessage(thisResult); if (ServiceUtil.isError(thisResult) || ServiceUtil.isFailure(thisResult) || UtilValidate.isNotEmpty(errMsg)) { return ServiceUtil.returnError(errMsg); } results.put("caContentIdTo", thisResult.get("contentIdTo")); results.put("caContentId", thisResult.get("contentIdFrom")); results.put("caContentAssocTypeId", thisResult.get("contentAssocTypeId")); results.put("caFromDate", thisResult.get("fromDate")); results.put("caSequenceNum", thisResult.get("sequenceNum")); } else { if (deactivateExisting) { contentAssocExisting.put("thruDate", UtilDateTime.nowTimestamp()); } else if (UtilValidate.isNotEmpty(context.get("thruDate"))) { contentAssocExisting.put("thruDate", (Timestamp)context.get("thruDate")); } ModelService contentAssocModel = dispatcher.getDispatchContext().getModelService("updateContentAssoc"); Map<String, Object> ctx = contentAssocModel.makeValid(contentAssocExisting, "IN"); contentAssocContext.putAll(ctx); thisResult = dispatcher.runSync("updateContentAssoc", contentAssocContext); String errMsg = ServiceUtil.getErrorMessage(thisResult); if (ServiceUtil.isError(thisResult) || ServiceUtil.isFailure(thisResult) || UtilValidate.isNotEmpty(errMsg)) { return ServiceUtil.returnError(errMsg); } } } catch (GenericEntityException e) { throw new GenericServiceException(e.toString()); } catch (Exception e2) { throw new GenericServiceException(e2.toString()); } String errMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errMsg)) { return ServiceUtil.returnError(errMsg); } } context.remove("skipPermissionCheck"); context.put("contentId", origContentId); context.put("dataResourceId", origDataResourceId); context.remove("dataResource"); Debug.logInfo("results:" + results, module); return results; } /** Service for update publish sites with a ContentRole that will tie them to the passed in party. */ public static Map<String, Object> updateSiteRoles(DispatchContext dctx, Map<String, ? extends Object> context) { LocalDispatcher dispatcher = dctx.getDispatcher(); Delegator delegator = dctx.getDelegator(); GenericValue userLogin = (GenericValue)context.get("userLogin"); Map<String, Object> results = new HashMap<String, Object>(); String siteContentId = (String)context.get("contentId"); String partyId = (String)context.get("partyId"); if (UtilValidate.isEmpty(siteContentId) || UtilValidate.isEmpty(partyId)) return results; List<GenericValue> siteRoles = null; try { siteRoles = EntityQuery.use(delegator).from("RoleType").where("parentTypeId", "BLOG").cache().queryList(); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } for (GenericValue roleType : siteRoles) { Map<String, Object> serviceContext = new HashMap<String, Object>(); serviceContext.put("partyId", partyId); serviceContext.put("contentId", siteContentId); serviceContext.put("userLogin", userLogin); Debug.logInfo("updateSiteRoles, serviceContext(0):" + serviceContext, module); String siteRole = (String)roleType.get("roleTypeId"); // BLOG_EDITOR, BLOG_ADMIN, etc. String cappedSiteRole = ModelUtil.dbNameToVarName(siteRole); if (Debug.infoOn()) { Debug.logInfo("updateSiteRoles, cappediteRole(1):" + cappedSiteRole, module); } String siteRoleVal = (String)context.get(cappedSiteRole); if (Debug.infoOn()) { Debug.logInfo("updateSiteRoles, siteRoleVal(1):" + siteRoleVal, module); Debug.logInfo("updateSiteRoles, context(1):" + context, module); } Object fromDate = context.get(cappedSiteRole + "FromDate"); if (Debug.infoOn()) { Debug.logInfo("updateSiteRoles, fromDate(1):" + fromDate, module); } serviceContext.put("roleTypeId", siteRole); if (siteRoleVal != null && siteRoleVal.equalsIgnoreCase("Y")) { // for now, will assume that any error is due to duplicates - ignore if (fromDate == null) { try { Map<String, Object> newContext = new HashMap<String, Object>(); newContext.put("contentId", serviceContext.get("contentId")); newContext.put("partyId", serviceContext.get("partyId")); newContext.put("roleTypeId", serviceContext.get("roleTypeId")); newContext.put("userLogin", userLogin); Map<String, Object> permResults = dispatcher.runSync("deactivateAllContentRoles", newContext); serviceContext.put("fromDate", UtilDateTime.nowTimestamp()); if (Debug.infoOn()) Debug.logInfo("updateSiteRoles, serviceContext(1):" + serviceContext, module); permResults = dispatcher.runSync("createContentRole", serviceContext); String errMsg = ServiceUtil.getErrorMessage(permResults); if (UtilValidate.isNotEmpty(errMsg)) { return ServiceUtil.returnError(errMsg); } } catch (GenericServiceException e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } catch (Exception e2) { Debug.logError(e2, e2.toString(), module); return ServiceUtil.returnError(e2.toString()); } } } else { if (fromDate != null) { // for now, will assume that any error is due to non-existence - ignore try { Debug.logInfo("updateSiteRoles, serviceContext(2):" + serviceContext, module); Map<String, Object> newContext = new HashMap<String, Object>(); newContext.put("contentId", serviceContext.get("contentId")); newContext.put("partyId", serviceContext.get("partyId")); newContext.put("roleTypeId", serviceContext.get("roleTypeId")); newContext.put("userLogin", userLogin); Map<String, Object> permResults = dispatcher.runSync("deactivateAllContentRoles", newContext); String errMsg = ServiceUtil.getErrorMessage(permResults); if (UtilValidate.isNotEmpty(errMsg)) return ServiceUtil.returnError(errMsg); } catch (GenericServiceException e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } catch (Exception e2) { Debug.logError(e2, e2.toString(), module); return ServiceUtil.returnError(e2.toString()); } } } } return results; } public static Map<String, Object> persistDataResourceAndData(DispatchContext dctx, Map<String, ? extends Object> context) { LocalDispatcher dispatcher = dctx.getDispatcher(); Locale locale = (Locale) context.get("locale"); Map<String, Object> result = new HashMap<String, Object>(); try { ModelService checkPermModel = dispatcher.getDispatchContext().getModelService("checkContentPermission"); Map<String, Object> ctx = checkPermModel.makeValid(context, "IN"); Map<String, Object> thisResult = dispatcher.runSync("checkContentPermission", ctx); String permissionStatus = (String)thisResult.get("permissionStatus"); if (UtilValidate.isNotEmpty(permissionStatus) && permissionStatus.equalsIgnoreCase("granted")) { result = persistDataResourceAndDataMethod(dctx, context); } else { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentContentNoAccessToUploadImage", locale)); } } catch (GenericServiceException e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } catch (GenericEntityException e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } catch (Exception e) { Debug.logError(e, e.toString(), module); return ServiceUtil.returnError(e.toString()); } String errorMsg = ServiceUtil.getErrorMessage(result); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } return result; } public static Map<String, Object> persistDataResourceAndDataMethod(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException, GenericEntityException, Exception { Delegator delegator = dctx.getDelegator(); LocalDispatcher dispatcher = dctx.getDispatcher(); Map<String, Object> context = UtilMisc.makeMapWritable(rcontext); Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> newDrContext = new HashMap<String, Object>(); GenericValue dataResource = delegator.makeValue("DataResource"); dataResource.setPKFields(context); dataResource.setNonPKFields(context); dataResource.setAllFields(context, false, "dr", null); context.putAll(dataResource); GenericValue electronicText = delegator.makeValue("ElectronicText"); electronicText.setPKFields(context); electronicText.setNonPKFields(context); String textData = (String)electronicText.get("textData"); String dataResourceId = (String)dataResource.get("dataResourceId"); String dataResourceTypeId = (String)dataResource.get("dataResourceTypeId"); if (Debug.infoOn()) { Debug.logInfo("in persist... dataResourceId(0):" + dataResourceId, module); } context.put("skipPermissionCheck", "granted"); // TODO: a temp hack because I don't want to bother with DataResource permissions at this time. boolean dataResourceExists = true; if (UtilValidate.isEmpty(dataResourceId)) { dataResourceExists = false; } else { try { GenericValue val = EntityQuery.use(delegator).from("DataResource").where("dataResourceId", dataResourceId).queryOne(); if (val == null) { dataResourceExists = false; } } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } } GenericValue userLogin = (GenericValue) context.get("userLogin"); ModelService dataResourceModel = dispatcher.getDispatchContext().getModelService("updateDataResource"); Map<String, Object> ctx = dataResourceModel.makeValid(dataResource, "IN"); newDrContext.putAll(ctx); newDrContext.put("userLogin", userLogin); newDrContext.put("skipPermissionCheck", context.get("skipPermissionCheck")); ByteBuffer imageDataBytes = (ByteBuffer) context.get("imageData"); String mimeTypeId = (String) newDrContext.get("mimeTypeId"); if (imageDataBytes != null && (mimeTypeId == null || (mimeTypeId.indexOf("image") >= 0) || (mimeTypeId.indexOf("application") >= 0))) { mimeTypeId = (String) context.get("_imageData_contentType"); if (dataResourceTypeId.equals("IMAGE_OBJECT")) { String fileName = (String) context.get("_imageData_fileName"); newDrContext.put("objectInfo", fileName); } newDrContext.put("mimeTypeId", mimeTypeId); } if (!dataResourceExists) { // Create Map<String, Object> thisResult = dispatcher.runSync("createDataResource", newDrContext); String errorMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errorMsg)) { throw(new Exception(errorMsg)); } dataResourceId = (String)thisResult.get("dataResourceId"); if (Debug.infoOn()) { Debug.logInfo("in persist... dataResourceId(0):" + dataResourceId, module); } dataResource = (GenericValue)thisResult.get("dataResource"); Map<String, Object> fileContext = new HashMap<String, Object>(); fileContext.put("userLogin", userLogin); if (dataResourceTypeId.equals("IMAGE_OBJECT")) { if (imageDataBytes != null) { fileContext.put("dataResourceId", dataResourceId); fileContext.put("imageData", imageDataBytes); thisResult = dispatcher.runSync("createImage", fileContext); errorMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } } } else if (dataResourceTypeId.equals("SHORT_TEXT")) { } else if (dataResourceTypeId.startsWith("SURVEY")) { } else if (dataResourceTypeId.indexOf("_FILE") >=0) { Map<String, Object> uploadImage = new HashMap<String, Object>(); uploadImage.put("userLogin", userLogin); uploadImage.put("dataResourceId", dataResourceId); uploadImage.put("dataResourceTypeId", dataResourceTypeId); uploadImage.put("rootDir", context.get("objectInfo")); uploadImage.put("uploadedFile", imageDataBytes); uploadImage.put("_uploadedFile_fileName", (String) context.get("_imageData_fileName")); uploadImage.put("_uploadedFile_contentType", (String) context.get("_imageData_contentType")); dispatcher.runSync("attachUploadToDataResource", uploadImage); } else { // assume ELECTRONIC_TEXT if (UtilValidate.isNotEmpty(textData)) { fileContext.put("dataResourceId", dataResourceId); fileContext.put("textData", textData); thisResult = dispatcher.runSync("createElectronicText", fileContext); errorMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } } } } else { // Update Map<String, Object> thisResult = dispatcher.runSync("updateDataResource", newDrContext); String errorMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } Map<String, Object> fileContext = new HashMap<String, Object>(); fileContext.put("userLogin", userLogin); String forceElectronicText = (String)context.get("forceElectronicText"); if (dataResourceTypeId.equals("IMAGE_OBJECT")) { if (imageDataBytes != null || "true".equalsIgnoreCase(forceElectronicText)) { fileContext.put("dataResourceId", dataResourceId); fileContext.put("imageData", imageDataBytes); thisResult = dispatcher.runSync("updateImage", fileContext); errorMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } } } else if (dataResourceTypeId.equals("SHORT_TEXT")) { } else if (dataResourceTypeId.startsWith("SURVEY")) { } else if (dataResourceTypeId.indexOf("_FILE") >=0) { Map<String, Object> uploadImage = new HashMap<String, Object>(); uploadImage.put("userLogin", userLogin); uploadImage.put("dataResourceId", dataResourceId); uploadImage.put("dataResourceTypeId", dataResourceTypeId); uploadImage.put("rootDir", context.get("objectInfo")); uploadImage.put("uploadedFile", imageDataBytes); uploadImage.put("_uploadedFile_fileName", (String) context.get("_imageData_fileName")); uploadImage.put("_uploadedFile_contentType", (String) context.get("_imageData_contentType")); dispatcher.runSync("attachUploadToDataResource", uploadImage); } else { if (UtilValidate.isNotEmpty(textData) || "true".equalsIgnoreCase(forceElectronicText)) { fileContext.put("dataResourceId", dataResourceId); fileContext.put("textData", textData); thisResult = dispatcher.runSync("updateElectronicText", fileContext); errorMsg = ServiceUtil.getErrorMessage(thisResult); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } } } } result.put("dataResourceId", dataResourceId); result.put("drDataResourceId", dataResourceId); context.put("dataResourceId", dataResourceId); return result; } public static void addRoleToUser(Delegator delegator, LocalDispatcher dispatcher, Map<String, Object> serviceContext) throws GenericServiceException, GenericEntityException { List<GenericValue> userLoginList = EntityQuery.use(delegator).from("UserLogin").where("partyId", serviceContext.get("partyId")).queryList(); for (GenericValue partyUserLogin : userLoginList) { String partyUserLoginId = partyUserLogin.getString("userLoginId"); serviceContext.put("contentId", partyUserLoginId); // author contentId dispatcher.runSync("createContentRole", serviceContext); } } public static Map<String, Object> updateSiteRolesDyn(DispatchContext dctx, Map<String, ? extends Object> context) { LocalDispatcher dispatcher = dctx.getDispatcher(); Delegator delegator = dctx.getDelegator(); Map<String, Object> results = new HashMap<String, Object>(); Map<String, Object> serviceContext = new HashMap<String, Object>(); // siteContentId will equal "ADMIN_MASTER", "AGINC_MASTER", etc. // Remember that this service is called in the "multi" mode, // with a new siteContentId each time. // siteContentId could also have been name deptContentId, since this same // service is used for updating department roles, too. String siteContentId = (String)context.get("contentId"); String partyId = (String)context.get("partyId"); serviceContext.put("partyId", partyId); serviceContext.put("contentId", siteContentId); List<GenericValue> siteRoles = null; try { siteRoles = EntityQuery.use(delegator).from("RoleType").where("parentTypeId", "BLOG").cache().queryList(); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } for (GenericValue roleType : siteRoles) { String siteRole = (String)roleType.get("roleTypeId"); // BLOG_EDITOR, BLOG_ADMIN, etc. String cappedSiteRole = ModelUtil.dbNameToVarName(siteRole); String siteRoleVal = (String)context.get(cappedSiteRole); Object fromDate = context.get(cappedSiteRole + "FromDate"); serviceContext.put("roleTypeId", siteRole); if (siteRoleVal != null && siteRoleVal.equalsIgnoreCase("Y")) { // for now, will assume that any error is due to duplicates - ignore if (fromDate == null) { try { serviceContext.put("fromDate", UtilDateTime.nowTimestamp()); if (Debug.infoOn()) { Debug.logInfo("updateSiteRoles, serviceContext(1):" + serviceContext, module); } addRoleToUser(delegator, dispatcher, serviceContext); dispatcher.runSync("createContentRole", serviceContext); } catch (GenericServiceException e) { Debug.logError(e, e.toString(), module); } catch (Exception e2) { Debug.logError(e2, e2.toString(), module); } } } else { if (fromDate != null) { // for now, will assume that any error is due to non-existence - ignore //return ServiceUtil.returnError(e.toString()); try { Debug.logInfo("updateSiteRoles, serviceContext(2):" + serviceContext, module); Map<String, Object> newContext = new HashMap<String, Object>(); newContext.put("contentId", serviceContext.get("contentId")); newContext.put("partyId", serviceContext.get("partyId")); newContext.put("roleTypeId", serviceContext.get("roleTypeId")); dispatcher.runSync("deactivateAllContentRoles", newContext); } catch (GenericServiceException e) { Debug.logError(e, e.toString(), module); } catch (Exception e2) { Debug.logError(e2, e2.toString(), module); } } } } return results; } public static Map<String, Object> updateOrRemove(DispatchContext dctx, Map<String, ? extends Object> context) { Map<String, Object> results = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); String entityName = (String)context.get("entityName"); String action = (String)context.get("action"); String pkFieldCount = (String)context.get("pkFieldCount"); Map<String, String> pkFields = new HashMap<String, String>(); int fieldCount = Integer.parseInt(pkFieldCount); for (int i=0; i<fieldCount; i++) { String fieldName = (String)context.get("fieldName" + i); String fieldValue = (String)context.get("fieldValue" + i); if (UtilValidate.isEmpty(fieldValue)) { // It may be the case that the last row in a form is "empty" waiting for // someone to enter a value, in which case we do not want to throw an // error, we just want to ignore it. return results; } pkFields.put(fieldName, fieldValue); } boolean doLink = (action != null && action.equalsIgnoreCase("Y")) ? true : false; if (Debug.infoOn()) { Debug.logInfo("in updateOrRemove, context:" + context, module); } try { GenericValue entityValuePK = delegator.makeValue(entityName, pkFields); if (Debug.infoOn()) { Debug.logInfo("in updateOrRemove, entityValuePK:" + entityValuePK, module); } GenericValue entityValueExisting = EntityQuery.use(delegator).from(entityName).where(entityValuePK).cache().queryOne(); if (Debug.infoOn()) { Debug.logInfo("in updateOrRemove, entityValueExisting:" + entityValueExisting, module); } if (entityValueExisting == null) { if (doLink) { entityValuePK.create(); if (Debug.infoOn()) { Debug.logInfo("in updateOrRemove, entityValuePK: CREATED", module); } } } else { if (!doLink) { entityValueExisting.remove(); if (Debug.infoOn()) { Debug.logInfo("in updateOrRemove, entityValueExisting: REMOVED", module); } } } } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return results; } public static Map<String, Object> resequence(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); String contentIdTo = (String)context.get("contentIdTo"); Integer seqInc = (Integer)context.get("seqInc"); if (seqInc == null) { seqInc = Integer.valueOf(100); } int seqIncrement = seqInc.intValue(); List<String> typeList = UtilGenerics.checkList(context.get("typeList")); if (typeList == null) { typeList = new LinkedList<String>(); } String contentAssocTypeId = (String)context.get("contentAssocTypeId"); if (UtilValidate.isNotEmpty(contentAssocTypeId)) { typeList.add(contentAssocTypeId); } if (UtilValidate.isEmpty(typeList)) { typeList = UtilMisc.toList("PUBLISH_LINK", "SUB_CONTENT"); } EntityCondition conditionType = EntityCondition.makeCondition("contentAssocTypeId", EntityOperator.IN, typeList); EntityCondition conditionMain = EntityCondition.makeCondition(UtilMisc.toList(EntityCondition.makeCondition("contentIdTo", EntityOperator.EQUALS, contentIdTo), conditionType), EntityOperator.AND); try { List<GenericValue> listAll = EntityQuery.use(delegator).from("ContentAssoc") .where(conditionMain) .orderBy("sequenceNum", "fromDate", "createdDate") .filterByDate().queryList(); String contentId = (String)context.get("contentId"); String dir = (String)context.get("dir"); int seqNum = seqIncrement; String thisContentId = null; for (int i=0; i < listAll.size(); i++) { GenericValue contentAssoc = listAll.get(i); if (UtilValidate.isNotEmpty(contentId) && UtilValidate.isNotEmpty(dir)) { // move targeted entry up or down thisContentId = contentAssoc.getString("contentId"); if (contentId.equals(thisContentId)) { if (dir.startsWith("up")) { if (i > 0) { // Swap with previous entry try { GenericValue prevValue = listAll.get(i-1); Long prevSeqNum = (Long)prevValue.get("sequenceNum"); prevValue.put("sequenceNum", Long.valueOf(seqNum)); prevValue.store(); contentAssoc.put("sequenceNum", prevSeqNum); contentAssoc.store(); } catch (Exception e) { return ServiceUtil.returnError(e.toString()); } } } else { if (i < listAll.size()) { // Swap with next entry GenericValue nextValue = listAll.get(i+1); nextValue.put("sequenceNum", Long.valueOf(seqNum)); nextValue.store(); seqNum += seqIncrement; contentAssoc.put("sequenceNum", Long.valueOf(seqNum)); contentAssoc.store(); i++; // skip next one } } } else { contentAssoc.put("sequenceNum", Long.valueOf(seqNum)); contentAssoc.store(); } } else { contentAssoc.put("sequenceNum", Long.valueOf(seqNum)); contentAssoc.store(); } seqNum += seqIncrement; } } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> changeLeafToNode(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); LocalDispatcher dispatcher = dctx.getDispatcher(); String contentId = (String)context.get("contentId"); GenericValue userLogin = (GenericValue)context.get("userLogin"); String userLoginId = userLogin.getString("userLoginId"); Locale locale = (Locale) context.get("locale"); try { GenericValue content = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); if (content == null) { Debug.logError("content was null", module); return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", ""), locale)); } String dataResourceId = content.getString("dataResourceId"); content.set("dataResourceId", null); content.set("lastModifiedDate", UtilDateTime.nowTimestamp()); content.set("lastModifiedByUserLogin", userLoginId); content.store(); if (UtilValidate.isNotEmpty(dataResourceId)) { // add previous DataResource as part of new subcontent GenericValue contentClone = (GenericValue)content.clone(); contentClone.set("dataResourceId", dataResourceId); content.set("lastModifiedDate", UtilDateTime.nowTimestamp()); content.set("lastModifiedByUserLogin", userLoginId); content.set("createdDate", UtilDateTime.nowTimestamp()); content.set("createdByUserLogin", userLoginId); contentClone.set("contentId", null); ModelService modelService = dctx.getModelService("persistContentAndAssoc"); Map<String, Object> serviceIn = modelService.makeValid(contentClone, "IN"); serviceIn.put("userLogin", userLogin); serviceIn.put("contentIdTo", contentId); serviceIn.put("contentAssocTypeId", "SUB_CONTENT"); serviceIn.put("sequenceNum", Long.valueOf(50)); try { dispatcher.runSync("persistContentAndAssoc", serviceIn); } catch (ServiceAuthException e) { return ServiceUtil.returnError(e.toString()); } List<String> typeList = UtilMisc.toList("SUB_CONTENT"); ContentManagementWorker.updateStatsTopDown(delegator, contentId, typeList); } } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> updateLeafCount(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); List<String> typeList = UtilGenerics.checkList(context.get("typeList")); if (typeList == null) { typeList = UtilMisc.toList("PUBLISH_LINK", "SUB_CONTENT"); } String startContentId = (String)context.get("contentId"); try { int leafCount = ContentManagementWorker.updateStatsTopDown(delegator, startContentId, typeList); result.put("leafCount", Integer.valueOf(leafCount)); } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return result; } /** * This service changes the contentTypeId of the current content and its children depending on the pageMode. * if pageMode == "outline" then if the contentTypeId of children is not "OUTLINE_NODE" or "PAGE_NODE" * (it could be DOCUMENT or SUBPAGE_NODE) then it will get changed to PAGE_NODE.` * if pageMode == "page" then if the contentTypeId of children is not "PAGE_NODE" or "SUBPAGE_NODE" * (it could be DOCUMENT or OUTLINE_NODE) then it will get changed to SUBPAGE_NODE.` */ public static Map<String, Object> updatePageType(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException{ Delegator delegator = dctx.getDelegator(); Map<String, Object> context = UtilMisc.makeMapWritable(rcontext); Map<String, Object> results = new HashMap<String, Object>(); Locale locale = (Locale) context.get("locale"); Set<String> visitedSet = UtilGenerics.checkSet(context.get("visitedSet")); if (visitedSet == null) { visitedSet = new HashSet<String>(); context.put("visitedSet", visitedSet); } String pageMode = (String)context.get("pageMode"); String contentId = (String)context.get("contentId"); visitedSet.add(contentId); String contentTypeId = "PAGE_NODE"; if (pageMode != null && pageMode.toLowerCase().indexOf("outline") >= 0) contentTypeId = "OUTLINE_NODE"; GenericValue thisContent = null; try { thisContent = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); if (thisContent == null) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", contentId), locale)); } thisContent.set("contentTypeId", contentTypeId); thisContent.store(); List<GenericValue> kids = ContentWorker.getAssociatedContent(thisContent, "from", UtilMisc.toList("SUB_CONTENT"), null, null, null); for (GenericValue kidContent : kids) { if (contentTypeId.equals("OUTLINE_NODE")) { updateOutlineNodeChildren(kidContent, false, context); } else { updatePageNodeChildren(kidContent, context); } } } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return results; } public static Map<String, Object> resetToOutlineMode(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException{ Delegator delegator = dctx.getDelegator(); Map<String, Object> context = UtilMisc.makeMapWritable(rcontext); Map<String, Object> results = new HashMap<String, Object>(); Locale locale = (Locale) context.get("locale"); Set<String> visitedSet = UtilGenerics.checkSet(context.get("visitedSet")); if (visitedSet == null) { visitedSet = new HashSet<String>(); context.put("visitedSet", visitedSet); } String contentId = (String)context.get("contentId"); String pageMode = (String)context.get("pageMode"); String contentTypeId = "OUTLINE_NODE"; if (pageMode != null && pageMode.toLowerCase().indexOf("page") >= 0) { contentTypeId = "PAGE_NODE"; } GenericValue thisContent = null; try { thisContent = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); if (thisContent == null) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", contentId), locale)); } thisContent.set("contentTypeId", "OUTLINE_NODE"); thisContent.store(); List<GenericValue> kids = ContentWorker.getAssociatedContent(thisContent, "from", UtilMisc.toList("SUB_CONTENT"), null, null, null); for (GenericValue kidContent : kids) { if (contentTypeId.equals("OUTLINE_NODE")) { updateOutlineNodeChildren(kidContent, true, context); } else { kidContent.put("contentTypeId", "PAGE_NODE"); kidContent.store(); List<GenericValue> kids2 = ContentWorker.getAssociatedContent(kidContent, "from", UtilMisc.toList("SUB_CONTENT"), null, null, null); for (GenericValue kidContent2 : kids2) { updatePageNodeChildren(kidContent2, context); } } } } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return results; } public static Map<String, Object> clearContentAssocViewCache(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> results = new HashMap<String, Object>(); UtilCache<?, ?> utilCache = UtilCache.findCache("entitycache.entity-list.default.ContentAssocViewFrom"); if (utilCache != null) { utilCache.clear(); } utilCache = UtilCache.findCache("entitycache.entity-list.default.ContentAssocViewTo"); if (utilCache != null) { utilCache.clear(); } return results; } public static Map<String, Object> clearContentAssocDataResourceViewCache(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> results = new HashMap<String, Object>(); UtilCache<?, ?> utilCache = UtilCache.findCache("entitycache.entity-list.default.ContentAssocViewDataResourceFrom"); if (utilCache != null) { utilCache.clear(); } utilCache = UtilCache.findCache("entitycache.entity-list.default.ContentAssocViewDataResourceTo"); if (utilCache != null) { utilCache.clear(); } return results; } public static void updatePageNodeChildren(GenericValue content, Map<String, Object> context) throws GenericEntityException { String contentId = content.getString("contentId"); Set<String> visitedSet = UtilGenerics.checkSet(context.get("visitedSet")); if (visitedSet == null) { visitedSet = new HashSet<String>(); context.put("visitedSet", visitedSet); } else { if (visitedSet.contains(contentId)) { Debug.logWarning("visitedSet already contains:" + contentId, module); return; } else { visitedSet.add(contentId); } } String newContentTypeId = "SUBPAGE_NODE"; content.put("contentTypeId", newContentTypeId); content.store(); List<GenericValue> kids = ContentWorker.getAssociatedContent(content, "from", UtilMisc.toList("SUB_CONTENT"), null, null, null); for (GenericValue kidContent : kids) { updatePageNodeChildren(kidContent, context); } } public static void updateOutlineNodeChildren(GenericValue content, boolean forceOutline, Map<String, Object> context) throws GenericEntityException { String contentId = content.getString("contentId"); Set<String> visitedSet = UtilGenerics.checkSet(context.get("visitedSet")); if (visitedSet == null) { visitedSet = new HashSet<String>(); context.put("visitedSet", visitedSet); } else { if (visitedSet.contains(contentId)) { Debug.logWarning("visitedSet already contains:" + contentId, module); return; } else { visitedSet.add(contentId); } } String contentTypeId = content.getString("contentTypeId"); String newContentTypeId = contentTypeId; String dataResourceId = content.getString("dataResourceId"); Long branchCount = (Long)content.get("childBranchCount"); if (forceOutline) { newContentTypeId = "OUTLINE_NODE"; } else if (contentTypeId == null || contentTypeId.equals("DOCUMENT")) { if (UtilValidate.isEmpty(dataResourceId) || (branchCount != null && branchCount.intValue() > 0)) { newContentTypeId = "OUTLINE_NODE"; } else { newContentTypeId = "PAGE_NODE"; } } else if (contentTypeId.equals("SUBPAGE_NODE")) { newContentTypeId = "PAGE_NODE"; } content.put("contentTypeId", newContentTypeId); content.store(); if (contentTypeId == null || contentTypeId.equals("DOCUMENT") || contentTypeId.equals("OUTLINE_NODE")) { List<GenericValue> kids = ContentWorker.getAssociatedContent(content, "from", UtilMisc.toList("SUB_CONTENT"), null, null, null); for (GenericValue kidContent : kids) { updateOutlineNodeChildren(kidContent, forceOutline, context); } } } public static Map<String, Object> findSubNodes(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> results = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); String contentIdTo = (String)context.get("contentId"); try { List<GenericValue> lst = EntityQuery.use(delegator).from("ContentAssocDataResourceViewFrom") .where("caContentIdTo", contentIdTo, "caContentAssocTypeId", "SUB_CONTENT", "caThruDate", null) .orderBy("caSequenceNum", "caFromDate", "createdDate") .queryList(); results.put("_LIST_", lst); } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError(e.toString()); } return results; } public static String updateTypeAndFile(GenericValue dataResource, Map<String, Object> context) { String retVal = null; String mimeTypeId = (String) context.get("_imageData_contentType"); String fileName = (String) context.get("_imageData_fileName"); try { if (UtilValidate.isNotEmpty(fileName)) dataResource.set("objectInfo", fileName); if (UtilValidate.isNotEmpty(mimeTypeId)) dataResource.set("mimeTypeId", mimeTypeId); dataResource.store(); } catch (GenericEntityException e) { retVal = "Unable to update the DataResource record"; } return retVal; } public static Map<String, Object> initContentChildCounts(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Locale locale = (Locale) context.get("locale"); GenericValue content = (GenericValue)context.get("content"); if (content == null) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", ""), locale)); } Long leafCount = (Long)content.get("childLeafCount"); if (leafCount == null) { content.set("childLeafCount", Long.valueOf(0)); } Long branchCount = (Long)content.get("childBranchCount"); if (branchCount == null) { content.set("childBranchCount", Long.valueOf(0)); } return result; } public static Map<String, Object> incrementContentChildStats(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); Locale locale = (Locale) context.get("locale"); String contentId = (String)context.get("contentId"); String contentAssocTypeId = (String)context.get("contentAssocTypeId"); try { GenericValue content = EntityQuery.use(delegator).from("Content").where("contentId", contentId).cache().queryOne(); if (content == null) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", contentId), locale)); } Long leafCount = (Long)content.get("childLeafCount"); if (leafCount == null) { leafCount = Long.valueOf(0); } int changeLeafCount = leafCount.intValue() + 1; int changeBranchCount = 1; ContentManagementWorker.updateStatsBottomUp(delegator, contentId, UtilMisc.toList(contentAssocTypeId), changeBranchCount, changeLeafCount); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> decrementContentChildStats(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); Locale locale = (Locale) context.get("locale"); String contentId = (String)context.get("contentId"); String contentAssocTypeId = (String)context.get("contentAssocTypeId"); try { GenericValue content = EntityQuery.use(delegator).from("Content").where("contentId", contentId).cache().queryOne(); if (content == null) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentNoContentFound", UtilMisc.toMap("contentId", contentId), locale)); } Long leafCount = (Long)content.get("childLeafCount"); if (leafCount == null) { leafCount = Long.valueOf(0); } int changeLeafCount = -1 * leafCount.intValue() - 1; int changeBranchCount = -1; ContentManagementWorker.updateStatsBottomUp(delegator, contentId, UtilMisc.toList(contentAssocTypeId), changeBranchCount, changeLeafCount); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> updateContentChildStats(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); String contentId = (String)context.get("contentId"); String contentAssocTypeId = (String)context.get("contentAssocTypeId"); List<String> typeList = new LinkedList<String>(); if (UtilValidate.isNotEmpty(contentAssocTypeId)) { typeList.add(contentAssocTypeId); } else { typeList = UtilMisc.toList("PUBLISH_LINK", "SUB_CONTENT"); } try { ContentManagementWorker.updateStatsTopDown(delegator, contentId, typeList); } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> updateContentSubscription(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); LocalDispatcher dispatcher = dctx.getDispatcher(); Timestamp nowTimestamp = UtilDateTime.nowTimestamp(); String partyId = (String) context.get("partyId"); String webPubPt = (String) context.get("contentId"); String roleTypeId = (String) context.get("useRoleTypeId"); GenericValue userLogin = (GenericValue) context.get("userLogin"); Integer useTime = (Integer) context.get("useTime"); String useTimeUomId = (String) context.get("useTimeUomId"); boolean hasExistingContentRole = false; GenericValue contentRole = null; try { contentRole = EntityQuery.use(delegator).from("ContentRole") .where("partyId", partyId, "contentId", webPubPt, "roleTypeId", roleTypeId) .orderBy("fromDate DESC") .cache().filterByDate() .queryFirst(); if (contentRole != null) { hasExistingContentRole = true; } } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } if (contentRole == null) { contentRole = delegator.makeValue("ContentRole"); contentRole.set("contentId", webPubPt); contentRole.set("partyId", partyId); contentRole.set("roleTypeId", roleTypeId); contentRole.set("fromDate", nowTimestamp); } Timestamp thruDate = (Timestamp) contentRole.get("thruDate"); if (thruDate == null) { // no thruDate? start with NOW thruDate = nowTimestamp; } else { // there is a thru date... if it is in the past, bring it up to NOW before adding on the time period //don't want to penalize for skipping time, in other words if they had a subscription last year for a month and buy another month, we want that second month to start now and not last year if (thruDate.before(nowTimestamp)) { thruDate = nowTimestamp; } } Calendar calendar = Calendar.getInstance(); calendar.setTime(thruDate); int field = Calendar.MONTH; if ("TF_day".equals(useTimeUomId)) { field = Calendar.DAY_OF_YEAR; } else if ("TF_wk".equals(useTimeUomId)) { field = Calendar.WEEK_OF_YEAR; } else if ("TF_mon".equals(useTimeUomId)) { field = Calendar.MONTH; } else if ("TF_yr".equals(useTimeUomId)) { field = Calendar.YEAR; } else { Debug.logWarning("Don't know anything about useTimeUomId [" + useTimeUomId + "], defaulting to month", module); } calendar.add(field, useTime.intValue()); thruDate = new Timestamp(calendar.getTimeInMillis()); contentRole.set("thruDate", thruDate); try { if (hasExistingContentRole) { contentRole.store(); } else { Map<String, Object> map = new HashMap<String, Object>(); map.put("partyId", partyId); map.put("roleTypeId", roleTypeId); map.put("userLogin", userLogin); dispatcher.runSync("ensurePartyRole", map); contentRole.create(); } } catch (GenericEntityException e) { return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> updateContentSubscriptionByProduct(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException{ Map<String, Object> context = UtilMisc.makeMapWritable(rcontext); Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); Locale locale = (Locale) context.get("locale"); LocalDispatcher dispatcher = dctx.getDispatcher(); String productId = (String) context.get("productId"); Integer qty = (Integer) context.get("quantity"); if (qty == null) { qty = Integer.valueOf(1); } Timestamp orderCreatedDate = (Timestamp) context.get("orderCreatedDate"); if (orderCreatedDate == null) { orderCreatedDate = UtilDateTime.nowTimestamp(); } GenericValue productContent = null; try { List<GenericValue> lst = EntityQuery.use(delegator).from("ProductContent") .where("productId", productId, "productContentTypeId", "ONLINE_ACCESS") .orderBy("purchaseFromDate", "purchaseThruDate") .filterByDate("purchaseFromDate", "purchaseThruDate") .cache().queryList(); List<GenericValue> listThrusOnly = EntityUtil.filterOutByCondition(lst, EntityCondition.makeCondition("purchaseThruDate", EntityOperator.EQUALS, null)); if (listThrusOnly.size() > 0) { productContent = listThrusOnly.get(0); } else if (lst.size() > 0) { productContent = lst.get(0); } } catch (GenericEntityException e) { Debug.logError(e.toString(), module); return ServiceUtil.returnError(e.toString()); } if (productContent == null) { String msg = UtilProperties.getMessage(resource, "ContentNoProductContentFound", UtilMisc.toMap("productId", productId), locale); Debug.logError(msg, module); return ServiceUtil.returnError(msg); } Long useTime = (Long) productContent.get("useTime"); Integer newUseTime = null; if (UtilValidate.isNotEmpty(useTime)) { newUseTime = Integer.valueOf(useTime.intValue() * qty.intValue()); } context.put("useTime", newUseTime); context.put("useTimeUomId", productContent.get("useTimeUomId")); context.put("useRoleTypeId", productContent.get("useRoleTypeId")); context.put("contentId", productContent.get("contentId")); ModelService subscriptionModel = dispatcher.getDispatchContext().getModelService("updateContentSubscription"); Map<String, Object> ctx = subscriptionModel.makeValid(context, "IN"); result = dispatcher.runSync("updateContentSubscription", ctx); return result; } public static Map<String, Object> updateContentSubscriptionByOrder(DispatchContext dctx, Map<String, ? extends Object> rcontext) throws GenericServiceException{ Map<String, Object> context = UtilMisc.makeMapWritable(rcontext); Map<String, Object> result = new HashMap<String, Object>(); Delegator delegator = dctx.getDelegator(); Locale locale = (Locale) context.get("locale"); LocalDispatcher dispatcher = dctx.getDispatcher(); String orderId = (String) context.get("orderId"); Debug.logInfo("In updateContentSubscriptionByOrder service with orderId: " + orderId, module); GenericValue orderHeader = null; try { GenericValue orderRole = EntityQuery.use(delegator).from("OrderRole") .where("orderId", orderId, "roleTypeId", "END_USER_CUSTOMER") .queryFirst(); if (orderRole != null) { String partyId = (String) orderRole.get("partyId"); context.put("partyId", partyId); } else { String msg = "No OrderRole found for orderId:" + orderId; return ServiceUtil.returnFailure(msg); } orderHeader = EntityQuery.use(delegator).from("OrderHeader").where("orderId", orderId).queryOne(); if (orderHeader == null) { String msg = UtilProperties.getMessage(resource, "ContentNoOrderHeaderFound", UtilMisc.toMap("orderId", orderId), locale); return ServiceUtil.returnError(msg); } Timestamp orderCreatedDate = (Timestamp) orderHeader.get("orderDate"); context.put("orderCreatedDate", orderCreatedDate); List<GenericValue> orderItemList = orderHeader.getRelated("OrderItem", null, null, false); ModelService subscriptionModel = dispatcher.getDispatchContext().getModelService("updateContentSubscriptionByProduct"); for (GenericValue orderItem : orderItemList) { BigDecimal qty = orderItem.getBigDecimal("quantity"); String productId = (String) orderItem.get("productId"); long productContentCount = EntityQuery.use(delegator).from("ProductContent") .where("productId", productId, "productContentTypeId", "ONLINE_ACCESS") .filterByDate().queryCount(); if (productContentCount > 0) { context.put("productId", productId); context.put("quantity", Integer.valueOf(qty.intValue())); Map<String, Object> ctx = subscriptionModel.makeValid(context, "IN"); dispatcher.runSync("updateContentSubscriptionByProduct", ctx); } } } catch (GenericEntityException e) { Debug.logError(e.toString(), module); return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> followNodeChildren(DispatchContext dctx, Map<String, ? extends Object> context) throws GenericServiceException{ Map<String, Object> result = null; Delegator delegator = dctx.getDelegator(); LocalDispatcher dispatcher = dctx.getDispatcher(); Security security = dctx.getSecurity(); GenericValue userLogin = (GenericValue)context.get("userLogin"); Locale locale = (Locale) context.get("locale"); if (!security.hasEntityPermission("CONTENTMGR", "_ADMIN", userLogin)) { return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentPermissionNotGranted", locale)); } String contentId = (String)context.get("contentId"); String serviceName = (String)context.get("serviceName"); String contentAssocTypeId = (String)context.get("contentAssocTypeId"); List<String> contentAssocTypeIdList = new LinkedList<String>(); if (UtilValidate.isNotEmpty(contentAssocTypeId)) { contentAssocTypeIdList = StringUtil.split(contentAssocTypeId, "|"); } if (contentAssocTypeIdList.size() == 0) { contentAssocTypeIdList.add("SUB_CONTENT"); } Map<String, Object> ctx = new HashMap<String, Object>(); ctx.put("userLogin", userLogin); ctx.put("contentAssocTypeIdList", contentAssocTypeIdList); try { GenericValue content = EntityQuery.use(delegator).from("Content").where("contentId", contentId).queryOne(); result = followNodeChildrenMethod(content, dispatcher, serviceName, ctx); } catch (GenericEntityException e) { Debug.logError(e.toString(), module); return ServiceUtil.returnError(e.toString()); } return result; } public static Map<String, Object> followNodeChildrenMethod(GenericValue content, LocalDispatcher dispatcher, String serviceName, Map<String, Object> context) throws GenericEntityException, GenericServiceException { Map<String, Object> result = null; String contentId = content.getString("contentId"); List<String> contentAssocTypeIdList = UtilGenerics.checkList(context.get("contentAssocTypeIdList")); Locale locale = (Locale) context.get("locale"); Set<String> visitedSet = UtilGenerics.checkSet(context.get("visitedSet")); if (visitedSet == null) { visitedSet = new HashSet<String>(); context.put("visitedSet", visitedSet); } else { if (visitedSet.contains(contentId)) { Debug.logWarning("visitedSet already contains:" + contentId, module); return ServiceUtil.returnError(UtilProperties.getMessage(resource, "ContentVisitedSet", locale) + contentId); } else { visitedSet.add(contentId); } } GenericValue userLogin = (GenericValue)context.get("userLogin"); result = dispatcher.runSync(serviceName, UtilMisc.toMap("content", content, "userLogin", userLogin)); List<GenericValue> kids = ContentWorker.getAssociatedContent(content, "from", contentAssocTypeIdList, null, null, null); for (GenericValue kidContent : kids) { followNodeChildrenMethod(kidContent, dispatcher, serviceName, context); } return result; } public static Map<String, Object> persistContentWithRevision(DispatchContext dctx, Map<String, ? extends Object> context) { Map<String, Object> result = null; Delegator delegator = dctx.getDelegator(); LocalDispatcher dispatcher = dctx.getDispatcher(); GenericValue dataResource = null; String masterRevisionContentId = (String)context.get("masterRevisionContentId"); String oldDataResourceId = (String)context.get("drDataResourceId"); if (UtilValidate.isEmpty(oldDataResourceId)) { oldDataResourceId = (String)context.get("dataResourceId"); } if (UtilValidate.isNotEmpty(oldDataResourceId)) { try { dataResource = EntityQuery.use(delegator).from("DataResource").where("dataResourceId", oldDataResourceId).queryOne(); } catch (GenericEntityException e) { Debug.logError(e.toString(), module); return ServiceUtil.returnError(e.toString()); } } try { ModelService persistContentAndAssocModel = dispatcher.getDispatchContext().getModelService("persistContentAndAssoc"); Map<String, Object> ctx = persistContentAndAssocModel.makeValid(context, "IN"); if (dataResource != null) { ctx.remove("dataResourceId"); ctx.remove("drDataResourceId"); } result = dispatcher.runSync("persistContentAndAssoc", ctx); String errorMsg = ServiceUtil.getErrorMessage(result); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } String contentId = (String)result.get("contentId"); List<String> parentList = new LinkedList<String>(); if (UtilValidate.isEmpty(masterRevisionContentId)) { Map<String, Object> traversMap = new HashMap<String, Object>(); traversMap.put("contentId", contentId); traversMap.put("direction", "To"); traversMap.put("contentAssocTypeId", "COMPDOC_PART"); Map<String, Object> traversResult = dispatcher.runSync("traverseContent", traversMap); parentList = UtilGenerics.checkList(traversResult.get("parentList")); } else { parentList.add(masterRevisionContentId); } // Update ContentRevision and ContentRevisonItem Map<String, Object> contentRevisionMap = new HashMap<String, Object>(); contentRevisionMap.put("itemContentId", contentId); contentRevisionMap.put("newDataResourceId", result.get("dataResourceId")); contentRevisionMap.put("oldDataResourceId", oldDataResourceId); // need committedByPartyId for (int i=0; i < parentList.size(); i++) { String thisContentId = parentList.get(i); contentRevisionMap.put("contentId", thisContentId); result = dispatcher.runSync("persistContentRevisionAndItem", contentRevisionMap); errorMsg = ServiceUtil.getErrorMessage(result); if (UtilValidate.isNotEmpty(errorMsg)) { return ServiceUtil.returnError(errorMsg); } } } catch (GenericServiceException e) { Debug.logError(e.toString(), module); return ServiceUtil.returnError(e.toString()); } return result; } }