| /******************************************************************************* |
| * 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.cms; |
| |
| import java.io.IOException; |
| import java.sql.Timestamp; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.concurrent.Callable; |
| |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| |
| import org.apache.commons.collections4.CollectionUtils; |
| import org.apache.commons.io.IOUtils; |
| import org.apache.ofbiz.base.lang.JSON; |
| 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.entity.Delegator; |
| import org.apache.ofbiz.entity.GenericEntityException; |
| import org.apache.ofbiz.entity.GenericEntityNotFoundException; |
| import org.apache.ofbiz.entity.GenericValue; |
| import org.apache.ofbiz.entity.condition.EntityCondition; |
| import org.apache.ofbiz.entity.transaction.TransactionUtil; |
| import org.apache.ofbiz.entity.util.EntityUtil; |
| |
| public class ContentJsonEvents { |
| |
| public static final int CONTENT_NAME_MAX_LENGTH = 27; |
| |
| public static String getContentAssocs(HttpServletRequest request, HttpServletResponse response) throws GenericEntityException, IOException { |
| Delegator delegator = (Delegator) request.getAttribute("delegator"); |
| |
| String contentId = request.getParameter("contentId"); |
| |
| EntityCondition condition = EntityCondition.makeCondition( |
| EntityCondition.makeCondition(UtilMisc.toMap("contentId", contentId)), |
| EntityUtil.getFilterByDateExpr() |
| ); |
| List<GenericValue> assocs = delegator.findList("ContentAssoc", condition, null, null, null, false); |
| |
| List<Map<String, Object>> nodes = new LinkedList<Map<String, Object>>(); |
| for (GenericValue assoc : assocs) { |
| nodes.add(getTreeNode(assoc)); |
| } |
| |
| Collections.sort(nodes, new Comparator<Map<String, Object>>() { |
| |
| @Override |
| public int compare(Map<String, Object> node1, Map<String, Object> node2) { |
| Map<String, Object> data1 = UtilGenerics.cast(node1.get("data")); |
| Map<String, Object> data2 = UtilGenerics.cast(node2.get("data")); |
| if (data1 == null || data2 == null) { |
| return 0; |
| } |
| |
| String title1 = (String) data1.get("title"); |
| String title2 = (String) data2.get("title"); |
| if (title1 == null || title2 == null) { |
| return 0; |
| } |
| |
| return title1.toLowerCase().compareTo(title2.toLowerCase()); |
| } |
| |
| }); |
| IOUtils.write(JSON.from(nodes).toString(), response.getOutputStream()); |
| |
| return "success"; |
| } |
| |
| public static String moveContent(HttpServletRequest request, HttpServletResponse response) throws GenericEntityException, IOException { |
| final Delegator delegator = (Delegator) request.getAttribute("delegator"); |
| |
| final String contentIdTo = request.getParameter("contentIdTo"); |
| final String contentIdFrom = request.getParameter("contentIdFrom"); |
| final String contentIdFromNew = request.getParameter("contentIdFromNew"); |
| final String contentAssocTypeId = request.getParameter("contentAssocTypeId"); |
| final Timestamp fromDate = Timestamp.valueOf(request.getParameter("fromDate")); |
| |
| final Timestamp now = UtilDateTime.nowTimestamp(); |
| GenericValue assoc = TransactionUtil.inTransaction(new Callable<GenericValue>() { |
| @Override |
| public GenericValue call() throws Exception { |
| GenericValue oldAssoc = delegator.findOne("ContentAssoc", UtilMisc.toMap("contentIdTo", contentIdTo, "contentId", contentIdFrom, "contentAssocTypeId", contentAssocTypeId, "fromDate", fromDate), false); |
| if (oldAssoc == null) { |
| throw new GenericEntityNotFoundException("Could not find ContentAssoc by primary key [contentIdTo: $contentIdTo, contentId: $contentIdFrom, contentAssocTypeId: $contentAssocTypeId, fromDate: $fromDate]"); |
| } |
| GenericValue newAssoc = (GenericValue) oldAssoc.clone(); |
| |
| oldAssoc.set("thruDate", now); |
| oldAssoc.store(); |
| |
| newAssoc.set("contentId", contentIdFromNew); |
| newAssoc.set("fromDate", now); |
| newAssoc.set("thruDate", null); |
| delegator.clearCacheLine(delegator.create(newAssoc)); |
| |
| return newAssoc; |
| } |
| }, String.format("move content [%s] from [%s] to [%s]", contentIdTo, contentIdFrom, contentIdFromNew), 0, true).call(); |
| |
| IOUtils.write(JSON.from(getTreeNode(assoc)).toString(), response.getOutputStream()); |
| |
| return "success"; |
| } |
| |
| public static String deleteContent(HttpServletRequest request, HttpServletResponse response) throws GenericEntityException { |
| Delegator delegator = (Delegator) request.getAttribute("delegator"); |
| String contentId = request.getParameter("contentId"); |
| |
| deleteContent(delegator, contentId); |
| |
| return "success"; |
| } |
| |
| public static void deleteContent(Delegator delegator, String contentId) throws GenericEntityException { |
| Timestamp now = UtilDateTime.nowTimestamp(); |
| EntityCondition condition = EntityCondition.makeCondition( |
| EntityCondition.makeCondition(UtilMisc.toMap("contentIdTo", contentId)), |
| EntityUtil.getFilterByDateExpr() |
| ); |
| List<GenericValue> assocs = delegator.findList("ContentAssoc", condition, null, null, null, true); |
| for (GenericValue assoc : assocs) { |
| assoc.set("thruDate", now); |
| delegator.store(assoc); |
| } |
| deleteWebPathAliases(delegator, contentId); |
| } |
| |
| private static void deleteWebPathAliases(Delegator delegator, String contentId) throws GenericEntityException { |
| Timestamp now = UtilDateTime.nowTimestamp(); |
| EntityCondition condition = EntityCondition.makeCondition( |
| EntityCondition.makeCondition(UtilMisc.toMap("contentId", contentId)), |
| EntityUtil.getFilterByDateExpr() |
| ); |
| List<GenericValue> pathAliases = delegator.findList("WebSitePathAlias", condition, null, null, null, true); |
| for (GenericValue alias : pathAliases) { |
| alias.set("thruDate", now); |
| delegator.store(alias); |
| } |
| List<GenericValue> subContents = delegator.findList("ContentAssoc", condition, null, null, null, true); |
| for (GenericValue subContentAssoc : subContents) { |
| deleteWebPathAliases(delegator, subContentAssoc.getString("contentIdTo")); |
| } |
| } |
| |
| private static Map<String, Object> getTreeNode(GenericValue assoc) throws GenericEntityException { |
| GenericValue content = assoc.getRelatedOne("ToContent", true); |
| String contentName = assoc.getString("contentIdTo"); |
| if (content != null && content.getString("contentName") != null) { |
| contentName = content.getString("contentName"); |
| if (contentName.length() > CONTENT_NAME_MAX_LENGTH) { |
| contentName = contentName.substring(0, CONTENT_NAME_MAX_LENGTH); |
| } |
| } |
| |
| Map<String, Object> data = UtilMisc.toMap( |
| "title", (Object) contentName |
| ); |
| |
| Map<String, Object> attr = UtilMisc.toMap( |
| "id", assoc.get("contentIdTo"), |
| "contentId", assoc.get("contentId"), |
| "fromDate", assoc.getTimestamp("fromDate").toString(), |
| "contentAssocTypeId", assoc.get("contentAssocTypeId") |
| ); |
| |
| Map<String, Object> node = UtilMisc.toMap("data", (Object) data, "attr", (Object) attr); |
| |
| List<GenericValue> assocChildren = content.getRelated("FromContentAssoc", null, null, true); |
| assocChildren = EntityUtil.filterByDate(assocChildren); |
| if (!CollectionUtils.isEmpty(assocChildren)) { |
| node.put("state", "closed"); |
| } |
| return node; |
| } |
| } |