001 /*
002 * Copyright 2005-2007 The Kuali Foundation
003 *
004 *
005 * Licensed under the Educational Community License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.opensource.org/licenses/ecl2.php
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.kuali.rice.kew.xml;
018
019 import java.io.FileOutputStream;
020 import java.io.IOException;
021 import java.io.InputStream;
022 import java.util.ArrayList;
023 import java.util.Iterator;
024 import java.util.List;
025
026 import javax.xml.parsers.DocumentBuilderFactory;
027 import javax.xml.parsers.FactoryConfigurationError;
028 import javax.xml.parsers.ParserConfigurationException;
029
030 import org.jdom.Document;
031 import org.jdom.Element;
032 import org.jdom.JDOMException;
033 import org.jdom.Namespace;
034 import org.jdom.input.DOMBuilder;
035 import org.jdom.output.XMLOutputter;
036 import org.kuali.rice.kew.help.HelpEntry;
037 import org.kuali.rice.kew.help.service.HelpService;
038 import org.kuali.rice.kew.service.KEWServiceLocator;
039 import org.xml.sax.SAXException;
040
041
042 /*
043 * A parser for help entry data. The underlying xml file format is:
044 *
045 * <pre>
046 * <helpEntries>
047 * <helpEntry>
048 * <helpName>name 1</helpName>
049 * <helpText>text 1</helpText>
050 * <helpKey>key 1</helpKey>
051 * </helpEntry>
052 *
053 * <helpEntry>
054 * <helpName>name 2</helpName>
055 * <helpText>text 2</helpText>
056 * <helpKey>key 2</helpKey>
057 * </helpEntry>
058 * </helpEntries>
059 * </pre>
060 *
061 * <p>The xml file can contain html tags as long as these tags are wrapped between "<![CDATA[" and "]]&rt;"
062 *
063 * @author Kuali Rice Team (rice.collab@kuali.org)
064 */
065 public class HelpEntryXmlParser {
066 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(HelpEntryXmlParser.class);
067
068 // Namespace for JDom
069 private static final Namespace NAMESPACE = Namespace.getNamespace("", "ns:workflow/Help");
070 private static final Namespace NAMESPACE1 = Namespace.getNamespace("xsi", "ns:workflow");
071 private static final String DATA_ELEMENT="data";
072 private static final String HELP_ENTRIES_ELEMENT = "helpEntries";
073 private static final String HELP_ENTRY_ELEMENT = "helpEntry";
074 private static final String HELP_NAME_ELEMENT = "helpName";
075 private static final String HELP_KEY_ELEMENT = "helpKey";
076 private static final String HELP_TEXT_ELEMENT = "helpText";
077
078 public List parseHelpEntries(InputStream file) throws JDOMException, SAXException, IOException, ParserConfigurationException, FactoryConfigurationError {
079 List helpEntries = new ArrayList();
080 LOG.debug("Enter parseHelpEntries(..)");
081 org.w3c.dom.Document w3cDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
082 Document document = new DOMBuilder().build(w3cDocument);
083 Element root = document.getRootElement();
084 LOG.debug("Begin parsing(..)");
085 LOG.debug(root.getName());
086
087 for (Iterator helpEntriesIt = root.getChildren(HELP_ENTRIES_ELEMENT, NAMESPACE).iterator(); helpEntriesIt.hasNext();) {
088 Element helpEntriesE = (Element) helpEntriesIt.next();
089 for (Iterator iterator = helpEntriesE.getChildren(HELP_ENTRY_ELEMENT, NAMESPACE).iterator(); iterator.hasNext();) {
090 Element helpEntryElement = (Element) iterator.next();
091 HelpEntry helpEntry = new HelpEntry();
092 LOG.debug(helpEntryElement.getChildText(HELP_NAME_ELEMENT, NAMESPACE));
093 helpEntry.setHelpName(helpEntryElement.getChildTextTrim(HELP_NAME_ELEMENT, NAMESPACE));
094 LOG.debug(helpEntryElement.getChildText(HELP_TEXT_ELEMENT, NAMESPACE));
095 String text=helpEntryElement.getChildTextTrim(HELP_TEXT_ELEMENT,NAMESPACE);
096 int start=text.indexOf("<![CDATA[");
097 int end=text.indexOf("]]>");
098 if (start!=-1 && end!=-1){
099 start+=9;
100 text=text.substring(start,end);
101 }
102 helpEntry.setHelpText(text);
103 LOG.debug(helpEntryElement.getChildText(HELP_KEY_ELEMENT, NAMESPACE));
104 helpEntry.setHelpKey(helpEntryElement.getChildTextTrim(HELP_KEY_ELEMENT, NAMESPACE));
105
106 try {
107 LOG.debug("Saving help entry " + helpEntry.getHelpName());
108 getHelpService().saveXmlEntry(helpEntry);
109 } catch (Exception e) {
110 LOG.error("error saving help entry", e);
111 LOG.debug(helpEntry.getHelpKey());
112 }
113
114 helpEntries.add(helpEntry);
115 }
116 }
117 LOG.debug("Exit parseHelpEntries(..)");
118 return helpEntries;
119 }
120
121 public FileOutputStream getEntriesToXml(List list) throws JDOMException, SAXException, IOException, ParserConfigurationException, FactoryConfigurationError{
122 FileOutputStream out=null;
123 Element root=new Element(DATA_ELEMENT,NAMESPACE1);
124 Element entries=new Element(HELP_ENTRIES_ELEMENT,NAMESPACE);
125 Iterator iEntry=list.iterator();
126 while(iEntry.hasNext()){
127 HelpEntry entry=(HelpEntry)iEntry.next();
128 Element helpentry=new Element(HELP_ENTRY_ELEMENT,NAMESPACE);
129 Element helpname=new Element(HELP_NAME_ELEMENT,NAMESPACE);
130 helpname.setText(entry.getHelpName());
131 Element helptext=new Element(HELP_TEXT_ELEMENT,NAMESPACE);
132 helptext.setText("<![CDATA["+entry.getHelpText()+"]]>");
133 Element helpkey=new Element(HELP_KEY_ELEMENT,NAMESPACE);
134 helpkey.setText(entry.getHelpKey());
135 helpentry.addContent(helpname);
136 helpentry.addContent(helptext);
137 helpentry.addContent(helpkey);
138 entries.addContent(helpentry);
139 }
140 root.addContent(entries);
141 Document doc = new Document(root);
142 out = new FileOutputStream("text.xml");
143 XMLOutputter serializer = new XMLOutputter();
144 serializer.output(doc, out);
145 out.flush();
146 return out;
147 }
148
149 private HelpService getHelpService(){
150 return (HelpService) KEWServiceLocator.getService(KEWServiceLocator.HELP_SERVICE);
151 }
152
153 }