blob: da40d8711dc4d9a53dbd3a19290edd3858211385 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}