001/** 002 * Copyright 2005-2016 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.kuali.rice.edl.impl.xml.export; 017 018import org.apache.log4j.Logger; 019import org.jdom.Element; 020import org.jdom.Namespace; 021import org.kuali.rice.core.api.impex.ExportDataSet; 022import org.kuali.rice.coreservice.api.style.Style; 023import org.kuali.rice.coreservice.api.style.StyleService; 024import org.kuali.rice.core.api.util.xml.XmlHelper; 025import org.kuali.rice.core.api.util.xml.XmlRenderer; 026import org.kuali.rice.core.framework.impex.xml.XmlExporter; 027import org.kuali.rice.coreservice.api.CoreServiceApiServiceLocator; 028import org.kuali.rice.edl.impl.bo.EDocLiteAssociation; 029import org.kuali.rice.edl.impl.bo.EDocLiteDefinition; 030import org.kuali.rice.edl.impl.service.EDocLiteService; 031import org.kuali.rice.edl.impl.service.EdlServiceLocator; 032 033import java.io.StringReader; 034import java.util.Iterator; 035import java.util.List; 036 037import static org.kuali.rice.core.api.impex.xml.XmlConstants.*; 038/** 039 * Exports EDocLite definitions to XML. 040 * 041 * @see EDocLiteDefinition 042 * 043 * @author Kuali Rice Team (rice.collab@kuali.org) 044 */ 045public class EDocLiteXmlExporter implements XmlExporter { 046 047 private static final Logger LOG = Logger.getLogger(EDocLiteXmlExporter.class); 048 049 private XmlRenderer renderer = new XmlRenderer(EDL_NAMESPACE); 050 051 @Override 052 public boolean supportPrettyPrint() { 053 return false; 054 } 055 056 public Element export(ExportDataSet exportDataSet) { 057 EdlExportDataSet dataSet = EdlExportDataSet.fromExportDataSet(exportDataSet); 058 if (!dataSet.getEdocLites().isEmpty()) { 059 Element rootElement = renderer.renderElement(null, EDL_EDOCLITE); 060 rootElement.setAttribute(SCHEMA_LOCATION_ATTR, EDL_SCHEMA_LOCATION, SCHEMA_NAMESPACE); 061 // create output in order of all edl followed by all stylesheets, followed by all associations, this is so multiple edoclite's can be ingested in a single xml file. 062 List<EDocLiteAssociation> assocList = dataSet.getEdocLites(); 063 // loop thru same list 3 times. 064 for (EDocLiteAssociation e : assocList) { 065 exportEdlDefinitions(rootElement, e); 066 } 067 for (EDocLiteAssociation e : assocList) { 068 exportStyles(rootElement, e); 069 } 070 for (EDocLiteAssociation e : assocList) { 071 exportAssociations(rootElement, e); 072 } 073 return rootElement; 074 } 075 return null; 076 } 077 078 private void exportEdlDefinitions(Element parentEl, EDocLiteAssociation edl) { 079 080 try { 081 EDocLiteService edlService = EdlServiceLocator.getEDocLiteService(); 082 if (edl.getDefinition() != null) { //this probably shouldn't be supported on the entry side... 083 EDocLiteDefinition def = edlService.getEDocLiteDefinition(edl.getDefinition()); 084 if (def == null) { 085 LOG.error("Attempted to export definition " + edl.getDefinition() + " which was not found"); 086 return; 087 } 088 Element defEl = XmlHelper.buildJDocument(new StringReader(def.getXmlContent())).getRootElement(); 089 setNamespace(defEl, EDL_NAMESPACE); 090 parentEl.addContent(defEl.detach()); 091 } 092 } catch (Exception e) { 093 throw new RuntimeException(e); 094 } 095 } 096 097 private void exportStyles(Element parentEl, EDocLiteAssociation edl) { 098 099 try { 100 StyleService styleService = CoreServiceApiServiceLocator.getStyleService(); 101 102 if (edl.getStyle() != null) {//this probably shouldn't be supported on the entry side... 103 Element styleWrapperEl = renderer.renderElement(parentEl, EDL_STYLE); 104 renderer.renderAttribute(styleWrapperEl, "name", edl.getStyle()); 105 Style style = styleService.getStyle(edl.getStyle()); 106 if (style == null) { 107 LOG.error("Attempted to export style " + edl.getStyle() + " which was not found"); 108 return; 109 } 110 Element styleEl = XmlHelper.buildJDocument(new StringReader(style.getXmlContent())).getRootElement(); 111 styleWrapperEl.addContent(styleEl.detach()); 112 } 113 } catch (Exception e) { 114 throw new RuntimeException(e); 115 } 116 } 117 118 private void exportAssociations(Element parentEl, EDocLiteAssociation edl) { 119 try { 120 Element associationEl = renderer.renderElement(parentEl, EDL_ASSOCIATION); 121 renderer.renderTextElement(associationEl, EDL_DOC_TYPE, edl.getEdlName()); 122 if (edl.getDefinition() != null) { 123 renderer.renderTextElement(associationEl, EDL_DEFINITION, edl.getDefinition()); 124 } 125 if (edl.getStyle() != null) { 126 renderer.renderTextElement(associationEl, EDL_STYLE, edl.getStyle()); 127 } 128 129 renderer.renderTextElement(associationEl, EDL_ACTIVE, edl.getActiveInd().toString()); 130 } catch (Exception e) { 131 throw new RuntimeException(e); 132 } 133 } 134 135 private void setNamespace(Element element, Namespace namespace) { 136 element.setNamespace(namespace); 137 for (Iterator iter = element.getChildren().iterator(); iter.hasNext();) { 138 setNamespace((Element)iter.next(), namespace); 139 } 140 } 141}