| /******************************************************************************* |
| * 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.content; |
| |
| import java.sql.Timestamp; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Map; |
| |
| 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.UtilValidate; |
| 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.EntityConditionList; |
| import org.apache.ofbiz.entity.condition.EntityExpr; |
| import org.apache.ofbiz.entity.condition.EntityOperator; |
| import org.apache.ofbiz.entity.util.EntityQuery; |
| import org.apache.ofbiz.entity.util.EntityUtil; |
| import org.apache.ofbiz.minilang.MiniLangException; |
| import org.apache.ofbiz.minilang.SimpleMapProcessor; |
| import org.apache.ofbiz.service.DispatchContext; |
| import org.apache.ofbiz.service.ServiceUtil; |
| |
| |
| /** |
| * ContentServicesComplex Class |
| */ |
| public class ContentServicesComplex { |
| |
| public static final String module = ContentServicesComplex.class.getName(); |
| |
| |
| /* |
| * A service that returns a list of ContentAssocDataResourceViewFrom/To views that are |
| * associated with the passed in contentId. Other conditions are also applied, including: |
| * a list of contentAssocTypeIds or contentTypeIds that the result set views must match. |
| * A direction (From or To - case insensitive). |
| * From and thru dates or date strings. |
| * A mapKey value. |
| */ |
| public static Map<String, Object> getAssocAndContentAndDataResource(DispatchContext dctx, Map<String, ? extends Object> context) { |
| Delegator delegator = dctx.getDelegator(); |
| List<String> assocTypes = UtilGenerics.checkList(context.get("assocTypes")); |
| List<String> contentTypes = UtilGenerics.checkList(context.get("contentTypes")); |
| Timestamp fromDate = (Timestamp)context.get("fromDate"); |
| Timestamp thruDate = (Timestamp)context.get("thruDate"); |
| String fromDateStr = (String)context.get("fromDateStr"); |
| String thruDateStr = (String)context.get("thruDateStr"); |
| String contentId = (String)context.get("contentId"); |
| String direction = (String)context.get("direction"); |
| String mapKey = (String)context.get("mapKey"); |
| Map<String, Object> results = getAssocAndContentAndDataResourceMethod(delegator, contentId, mapKey, direction, fromDate, thruDate, fromDateStr, thruDateStr, assocTypes, contentTypes); |
| return results; |
| } |
| |
| public static Map<String, Object> getAssocAndContentAndDataResourceMethod(Delegator delegator, String contentId, String mapKey, String direction, Timestamp fromDate, Timestamp thruDate, String fromDateStr, String thruDateStr, List<String> assocTypes, List<String> contentTypes) { |
| List<EntityCondition> exprList = new LinkedList<EntityCondition>(); |
| EntityExpr joinExpr = null; |
| String viewName = null; |
| if (mapKey != null) { |
| EntityExpr mapKeyExpr = EntityCondition.makeCondition("caMapKey", EntityOperator.EQUALS, mapKey); |
| exprList.add(mapKeyExpr); |
| } |
| if (direction != null && direction.equalsIgnoreCase("From")) { |
| joinExpr = EntityCondition.makeCondition("caContentIdTo", EntityOperator.EQUALS, contentId); |
| viewName = "ContentAssocDataResourceViewFrom"; |
| } else { |
| joinExpr = EntityCondition.makeCondition("caContentId", EntityOperator.EQUALS, contentId); |
| viewName = "ContentAssocDataResourceViewTo"; |
| } |
| exprList.add(joinExpr); |
| if (UtilValidate.isNotEmpty(assocTypes)) { |
| exprList.add(EntityCondition.makeCondition("caContentAssocTypeId", EntityOperator.IN, assocTypes)); |
| } |
| if (UtilValidate.isNotEmpty(contentTypes)) { |
| exprList.add(EntityCondition.makeCondition("contentTypeId", EntityOperator.IN, contentTypes)); |
| } |
| |
| if (fromDate == null && fromDateStr != null) { |
| fromDate = UtilDateTime.toTimestamp(fromDateStr); |
| } |
| if (thruDate == null && thruDateStr != null) { |
| thruDate = UtilDateTime.toTimestamp(thruDateStr); |
| } |
| |
| if (fromDate != null) { |
| EntityExpr fromExpr = EntityCondition.makeCondition("caFromDate", EntityOperator.LESS_THAN, fromDate); |
| exprList.add(fromExpr); |
| } |
| if (thruDate != null) { |
| List<EntityExpr> thruList = new LinkedList<EntityExpr>(); |
| |
| EntityExpr thruExpr = EntityCondition.makeCondition("caThruDate", EntityOperator.LESS_THAN, thruDate); |
| thruList.add(thruExpr); |
| EntityExpr thruExpr2 = EntityCondition.makeCondition("caThruDate", EntityOperator.EQUALS, null); |
| thruList.add(thruExpr2); |
| EntityConditionList<EntityExpr> thruExprList = EntityCondition.makeCondition(thruList, EntityOperator.OR); |
| exprList.add(thruExprList); |
| } else if (fromDate != null) { |
| List<EntityExpr> thruList = new LinkedList<EntityExpr>(); |
| |
| EntityExpr thruExpr = EntityCondition.makeCondition("caThruDate", EntityOperator.GREATER_THAN, fromDate); |
| thruList.add(thruExpr); |
| EntityExpr thruExpr2 = EntityCondition.makeCondition("caThruDate", EntityOperator.EQUALS, null); |
| thruList.add(thruExpr2); |
| EntityConditionList<EntityExpr> thruExprList = EntityCondition.makeCondition(thruList, EntityOperator.OR); |
| exprList.add(thruExprList); |
| } |
| EntityConditionList<EntityCondition> assocExprList = EntityCondition.makeCondition(exprList, EntityOperator.AND); |
| List<GenericValue> relatedAssocs = null; |
| try { |
| relatedAssocs = EntityQuery.use(delegator).from(viewName).where(assocExprList).orderBy("caFromDate").queryList(); |
| } catch (GenericEntityException e) { |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| for (int i=0; i < relatedAssocs.size(); i++) { |
| GenericValue a = relatedAssocs.get(i); |
| Debug.logVerbose(" contentId:" + a.get("contentId") + " To:" + a.get("caContentIdTo") + " fromDate:" + a.get("caFromDate") + " thruDate:" + a.get("caThruDate") + " AssocTypeId:" + a.get("caContentAssocTypeId"), null); |
| } |
| Map<String, Object> results = new HashMap<String, Object>(); |
| results.put("entityList", relatedAssocs); |
| return results; |
| } |
| |
| /* |
| * A service that returns a list of ContentAssocDataResourceViewFrom/To views that are |
| * associated with the passed in contentId. Other conditions are also applied, including: |
| * a list of contentAssocTypeIds or contentTypeIds that the result set views must match. |
| * A direction (From or To - case insensitive). |
| * From and thru dates or date strings. |
| * A mapKey value. |
| */ |
| public static Map<String, Object> getAssocAndContentAndDataResourceCache(DispatchContext dctx, Map<String, ? extends Object> context) { |
| Delegator delegator = dctx.getDelegator(); |
| 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); |
| } |
| List<String> contentTypes = UtilGenerics.checkList(context.get("contentTypes")); |
| String contentTypesString = (String)context.get("contentTypesString"); |
| if (UtilValidate.isNotEmpty(contentTypesString)) { |
| List<String> lst = StringUtil.split(contentTypesString, "|"); |
| if (contentTypes == null) { |
| contentTypes = new LinkedList<String>(); |
| } |
| contentTypes.addAll(lst); |
| } |
| Timestamp fromDate = (Timestamp)context.get("fromDate"); |
| String fromDateStr = (String)context.get("fromDateStr"); |
| String contentId = (String)context.get("contentId"); |
| String direction = (String)context.get("direction"); |
| String mapKey = (String)context.get("mapKey"); |
| String contentAssocPredicateId = (String)context.get("contentAssocPredicateId"); |
| Boolean nullThruDatesOnly = (Boolean)context.get("nullThruDatesOnly"); |
| Map<String, Object> results = null; |
| try { |
| results = getAssocAndContentAndDataResourceCacheMethod(delegator, contentId, mapKey, direction, fromDate, fromDateStr, assocTypes, contentTypes, nullThruDatesOnly, contentAssocPredicateId, null); |
| } catch (GenericEntityException e) { |
| return ServiceUtil.returnError(e.getMessage()); |
| } catch (MiniLangException e2) { |
| return ServiceUtil.returnError(e2.getMessage()); |
| } |
| return results; |
| } |
| |
| public static Map<String, Object> getAssocAndContentAndDataResourceCacheMethod(Delegator delegator, String contentId, String mapKey, String direction, |
| Timestamp fromDate, String fromDateStr, List<String> assocTypes, List<String> contentTypes, Boolean nullThruDatesOnly, String contentAssocPredicateId, String orderBy) throws GenericEntityException, MiniLangException { |
| EntityExpr joinExpr = null; |
| String viewName = null; |
| String contentFieldName = null; |
| if (direction != null && direction.equalsIgnoreCase("From")) { |
| contentFieldName = "caContentIdTo"; |
| joinExpr = EntityCondition.makeCondition("caContentIdTo", EntityOperator.EQUALS, contentId); |
| } else { |
| contentFieldName = "caContentId"; |
| joinExpr = EntityCondition.makeCondition("contentId", EntityOperator.EQUALS, contentId); |
| } |
| if (direction != null && direction.equalsIgnoreCase("From")) { |
| viewName = "ContentAssocDataResourceViewFrom"; |
| } else { |
| viewName = "ContentAssocDataResourceViewTo"; |
| } |
| List<EntityCondition> conditionList = new ArrayList<EntityCondition>(); |
| conditionList.add(joinExpr); |
| if (UtilValidate.isNotEmpty(mapKey)) { |
| String mapKeyValue = "is null".equalsIgnoreCase(mapKey) ? null : mapKey; |
| conditionList.add(EntityCondition.makeCondition("caMapKey", mapKeyValue)); |
| } |
| if (UtilValidate.isNotEmpty(contentAssocPredicateId)) { |
| String contentAssocPredicateIdValue = "is null".equalsIgnoreCase(contentAssocPredicateId) ? null : contentAssocPredicateId; |
| conditionList.add(EntityCondition.makeCondition("caMapKey", contentAssocPredicateIdValue)); |
| } |
| if (nullThruDatesOnly != null && nullThruDatesOnly) { |
| conditionList.add(EntityCondition.makeCondition("caThruDate", null)); |
| } |
| |
| if (UtilValidate.isNotEmpty(assocTypes)) { |
| conditionList.add(EntityCondition.makeCondition("caContentAssocTypeId", EntityOperator.IN, assocTypes)); |
| } |
| |
| if (fromDate == null && fromDateStr != null) { |
| fromDate = UtilDateTime.toTimestamp(fromDateStr); |
| } |
| |
| List<GenericValue> contentAssocsTypeFiltered = EntityQuery.use(delegator).from(viewName) |
| .where(conditionList).orderBy("caSequenceNum", "-caFromDate").cache().queryList(); |
| |
| String assocRelationName = null; |
| if (direction != null && direction.equalsIgnoreCase("To")) { |
| assocRelationName = "ToContent"; |
| } else { |
| assocRelationName = "FromContent"; |
| } |
| |
| GenericValue contentAssocDataResourceView = null; |
| GenericValue content = null; |
| GenericValue dataResource = null; |
| List<GenericValue> contentAssocDataResourceList = new LinkedList<GenericValue>(); |
| Locale locale = Locale.getDefault(); // TODO: this needs to be passed in |
| try{ |
| for (GenericValue contentAssocView : contentAssocsTypeFiltered) { |
| GenericValue contentAssoc = EntityQuery.use(delegator).from("ContentAssoc").where(UtilMisc.toMap("contentId", contentAssocView.getString("contentId"), |
| "contentIdTo", contentAssocView.getString(contentFieldName), "contentAssocTypeId", contentAssocView.getString("caContentAssocTypeId"), |
| "fromDate", contentAssocView.getTimestamp("caFromDate"))).queryOne(); |
| content = contentAssoc.getRelatedOne(assocRelationName, true); |
| if (UtilValidate.isNotEmpty(contentTypes)) { |
| String contentTypeId = (String)content.get("contentTypeId"); |
| if (contentTypes.contains(contentTypeId)) { |
| contentAssocDataResourceView = delegator.makeValue(viewName); |
| contentAssocDataResourceView.setAllFields(content, true, null, null); |
| } |
| } else { |
| contentAssocDataResourceView = delegator.makeValue(viewName); |
| contentAssocDataResourceView.setAllFields(content, true, null, null); |
| } |
| SimpleMapProcessor.runSimpleMapProcessor("component://content/minilang/ContentManagementMapProcessors.xml", "contentAssocOut", contentAssoc, contentAssocDataResourceView, new LinkedList<Object>(), locale); |
| String dataResourceId = content.getString("dataResourceId"); |
| if (UtilValidate.isNotEmpty(dataResourceId)) |
| dataResource = content.getRelatedOne("DataResource", true); |
| if (dataResource != null) { |
| SimpleMapProcessor.runSimpleMapProcessor("component://content/minilang/ContentManagementMapProcessors.xml", "dataResourceOut", dataResource, contentAssocDataResourceView, new LinkedList<Object>(), locale); |
| } |
| contentAssocDataResourceList.add(contentAssocDataResourceView); |
| } |
| } catch (GenericEntityException e) { |
| Debug.logError(e, module); |
| return ServiceUtil.returnError(e.getMessage()); |
| } |
| |
| if (UtilValidate.isNotEmpty(orderBy)) { |
| List<String> orderByList = StringUtil.split(orderBy, "|"); |
| contentAssocDataResourceList = EntityUtil.orderBy(contentAssocDataResourceList, orderByList); |
| } |
| Map<String, Object> results = new HashMap<String, Object>(); |
| results.put("entityList", contentAssocDataResourceList); |
| if (UtilValidate.isNotEmpty(contentAssocDataResourceList)) { |
| results.put("view", contentAssocDataResourceList.get(0)); |
| } |
| return results; |
| } |
| } |