| /******************************************************************************* |
| * 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; |
| } |
| |
| } |