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