/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.portal.action; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import com.jinhe.tss.core.sso.Environment; import com.jinhe.tss.core.util.BeanUtil; import com.jinhe.tss.core.util.XMLDocUtil; import com.jinhe.tss.core.util.URLUtil; import com.jinhe.tss.core.web.dispaly.tree.ILevelTreeNode; import com.jinhe.tss.core.web.dispaly.tree.ITreeNode; import com.jinhe.tss.core.web.dispaly.tree.ITreeParser; import com.jinhe.tss.core.web.dispaly.tree.TreeAttributesMap; import com.jinhe.tss.core.web.dispaly.tree.TreeEncoder; import com.jinhe.tss.core.web.dispaly.tree.TreeNode; import com.jinhe.tss.portal.engine.FreeMarkerSupportAction; import com.jinhe.tss.portal.engine.HTMLGenerator; import com.jinhe.tss.portal.engine.model.DecoratorConfigable; import com.jinhe.tss.portal.engine.model.DecoratorNode; import com.jinhe.tss.portal.engine.model.LayoutConfigable; import com.jinhe.tss.portal.engine.model.LayoutNode; import com.jinhe.tss.portal.engine.model.PageNode; import com.jinhe.tss.portal.engine.model.PortalNode; import com.jinhe.tss.portal.engine.model.SubNode; import com.jinhe.tss.portal.entity.Decorator; import com.jinhe.tss.portal.entity.ElementGroup; import com.jinhe.tss.portal.entity.Layout; import com.jinhe.tss.portal.entity.Theme; import com.jinhe.tss.portal.helper.IElement; import com.jinhe.tss.portal.service.IElementService; import com.jinhe.tss.portal.service.IPortalService; import freemarker.template.TemplateException; /** * 门户自定义管理 */ public class PersonalAction extends FreeMarkerSupportAction { private static final long serialVersionUID = 7962803663565353148L; private Long id; private Long newId; private Long themeId; private String method; // browse/view/maintain private String personalXML; private String elementType; //组件类型 private String newElementType; //组件类型 private IPortalService portalService; private IElementService elementService; public String addElement() throws IOException, TemplateException{ return null; } public String changeElement() throws IOException, TemplateException{ PortalNode portalNode = (PortalNode) portalService.getPortal(portalId, themeId, method).clone(); SubNode content = null; if("Portlet".equals(elementType) && "Portlet".equals(newElementType)){ content = (SubNode) portalNode.getNodesMap().get(newId); //newId: 新Portlet实例ID } else if("Layout".equals(elementType) && "Portlet".equals(newElementType)){ content = (SubNode) portalNode.getNodesMap().get(newId); //newId: 新Portlet实例ID } else if("Layout".equals(elementType) && "Layout".equals(newElementType)){ //id : 版面或页面的ID //newId: 新布局器ID content = (SubNode) portalNode.getNodesMap().get(id); Layout d = (Layout) elementService.getElementInfo(Layout.class, newId); ((LayoutConfigable)content).setLayoutNode(new LayoutNode(d, (SubNode)content)); } else if("Decorator".equals(elementType) && "Decorator".equals(newElementType)){ //id : 修饰器所在门户结构ID //newId: 新布局器ID content = (SubNode) portalNode.getNodesMap().get(id); Decorator d = (Decorator) elementService.getElementInfo(Decorator.class, newId); ((DecoratorConfigable)content).setDecoratorNode(new DecoratorNode(d, (SubNode)content)); } if(content instanceof PageNode){ HTMLGenerator gen = new HTMLGenerator(portalNode, content.getId(), getFreemarkerParser()); return printHTML(gen.toHTML(), false); } HTMLGenerator gen = new HTMLGenerator(portalNode, content.getId(), content.getParent().getId(), null); return print("Change", gen.toXML()); } public String getThemeList4Personal(){ List<?> list = portalService.getThemesByPortal(portalId); StringBuffer sb = new StringBuffer("<data>"); for( Object temp : list ){ Theme theme = (Theme) temp; sb.append("<row themeId=\"" + theme.getId()+ "\" themeName=\"" + theme.getName() + "\"/>"); } return print("ThemeList", sb.append("</data>")); } public String removePersonalInfo() { portalService.removePersonalInfo(portalId, themeId, Environment.getOperatorId(), id); return printSuccessMessage("成功还原为默认"); } public String savePersonalInfo() throws IOException, TemplateException { portalService.savePersonalInfo(portalId, themeId, Environment.getOperatorId(), id, personalXML); return printSuccessMessage("保存自定义成功"); } public String savePersonalTheme() throws IOException, TemplateException { portalService.savePersonalTheme(portalId, Environment.getOperatorId(), themeId); return printSuccessMessage("更改主题成功"); } public String getElementParamTemplate() { Integer type = translateElementType(elementType); String desDir = URLUtil.getWebFileUrl(ElementGroup.getBasePathByType(type)).getPath(); IElement element = (IElement) elementService.getElementInfo(ElementGroup.getClassByType(type), id); String templateUri = desDir + element.getCode() + element.getId() + "/paramsXForm.xml"; if(!new File(templateUri).exists()) return print("Settings", ""); Document doc = XMLDocUtil.openDocument(templateUri); return print("Settings", doc.selectSingleNode("//xform").asXML()); } private Integer translateElementType(String elementType){ Integer type = null; if("Portlet".equals(elementType)){ type = new Integer(ElementGroup.PORTLET_TYPE); } if("Decorator".equals(elementType)){ type = new Integer(ElementGroup.DECORATOR_TYPE); } if("Layout".equals(elementType)){ type = new Integer(ElementGroup.LAYOUT_TYPE); } return type; } public String getSimilarElements() { List<?> layouts = new ArrayList<Object>(); if("Layout".equals(elementType)) layouts = elementService.getLayouts(); List<?> decorators = new ArrayList<Object>(); if("Decorator".equals(elementType)) decorators = elementService.getDecorators(); List<?> portletInstanses = new ArrayList<Object>(); if("Layout".equals(elementType) || "Portlet".equals(elementType)) portletInstanses = portalService.getPortletInstansesInPortal(portalId); TreeEncoder encoder = new TreeEncoder(new Object[]{layouts, decorators, portletInstanses}, new ITreeParser(){ public TreeNode parse(Object data) { TreeNode root = new TreeNode(); String[] types = new String[]{"Layout", "Decorator", "Portlet"}; TreeNode secondRoots[] = new TreeNode[3]; secondRoots[0] = createTreeNode(new Long(-1), "布局器", "0"); secondRoots[1] = createTreeNode(new Long(-2), "修饰器", "0"); secondRoots[2] = createTreeNode(new Long(-3), "portlet实例", "0"); for(int i = 0; i < secondRoots.length; i++){ List<?> list = (List<?>) ((Object[])data)[i]; for(Iterator<?> it = list.iterator(); it.hasNext();){ ILevelTreeNode temp = (ILevelTreeNode) it.next(); String name = (String)BeanUtil.getPropertyValue(temp, "name"); TreeNode treeNode = createTreeNode(temp.getId(), name, types[i]); secondRoots[i].addChild(treeNode); } } root.getChildren().addAll(Arrays.asList(secondRoots)); return root; } }); encoder.setNeedRootNode(false); return print("ListTree", encoder.toXml()); } private TreeNode createTreeNode(final Long id, final String name, final String type){ return new TreeNode(new ITreeNode(){ public TreeAttributesMap getAttributes() { TreeAttributesMap map = new TreeAttributesMap(id, name); map.put("type", type); return map; } }); } public void setPortalService(IPortalService service) { this.portalService = service; } public void setElementService(IElementService elementService) { this.elementService = elementService; } public void setId(Long id) { this.id = id; } public void setThemeId(Long themeId) { this.themeId = themeId; } public void setMethod(String method) { this.method = method; } public void setPersonalXML(String personalXML) { this.personalXML = personalXML; } public void setElementType(String elementType) { this.elementType = elementType; } public void setNewElementType(String newElementType) { this.newElementType = newElementType; } public void setNewId(Long newId) { this.newId = newId; } }