001: /*
002: * Copyright 2001-2006 C:1 Financial Services GmbH
003: *
004: * This software is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License Version 2.1, as published by the Free Software Foundation.
007: *
008: * This software is distributed in the hope that it will be useful,
009: * but WITHOUT ANY WARRANTY; without even the implied warranty of
010: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
011: * Lesser General Public License for more details.
012: *
013: * You should have received a copy of the GNU Lesser General Public
014: * License along with this library; if not, write to the Free Software
015: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
016: */
017:
018: package de.finix.contelligent.xml.export;
019:
020: import java.io.File;
021: import java.io.IOException;
022: import java.io.Writer;
023: import java.util.Iterator;
024: import java.util.LinkedList;
025: import java.util.List;
026: import java.util.Map;
027:
028: import org.apache.log4j.Logger;
029:
030: import de.finix.contelligent.logging.LoggingService;
031: import de.finix.contelligent.xml.DTDCatalog;
032: import de.finix.contelligent.xml.elements.ClientModuleElement;
033: import de.finix.contelligent.xml.elements.DescriptionElement;
034: import de.finix.contelligent.xml.elements.PackageElement;
035: import de.finix.contelligent.xml.elements.PackageImportElement;
036: import de.finix.contelligent.xml.elements.PackageRequiresElement;
037: import de.zeigermann.xml.XMLEncode;
038:
039: final public class PackageXMLWriter {
040:
041: final static Logger log = LoggingService
042: .getLogger(PackageXMLWriter.class);
043:
044: /**
045: * Writes the package XML description to the given <code>Writer</code>.
046: *
047: * @param pkgElement
048: * a <code>PackageElement</code> value
049: * @param writer
050: * a <code>Writer</code> value
051: * @return a <code>String[]</code> containing additional files to export
052: * (relative to META-INF) or null.
053: * @exception IOException
054: * if an error occurs
055: */
056: public String[] writePackageElement(PackageElement pkgElement,
057: Writer writer) throws IOException {
058: DTDCatalog dtdCatalog = DTDCatalog.getInstance();
059: StringBuffer output = new StringBuffer(160);
060: output
061: .append(
062: "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE ")
063: .append(DTDCatalog.PACKAGE_DESCRIPTOR)
064: .append(" PUBLIC \"")
065: .append(
066: dtdCatalog
067: .getPublicId(DTDCatalog.PACKAGE_DESCRIPTOR))
068: .append("\" \"")
069: .append(DTDCatalog.PUBLICID_URLPREFIX)
070: .append(
071: dtdCatalog
072: .getFileName(DTDCatalog.PACKAGE_DESCRIPTOR))
073: .append("\">\n\n").append("<").append(
074: DTDCatalog.PACKAGE_DESCRIPTOR).append(" name=")
075: .append(
076: XMLEncode.xmlEncodeTextAsPCDATA(pkgElement
077: .getName(), true)).append(" version=")
078: .append(
079: XMLEncode.xmlEncodeTextAsPCDATA(pkgElement
080: .getVersion(), true)).append(">\n");
081:
082: writer.write(output.toString());
083:
084: writeOptionalElement("display-name", pkgElement
085: .getDisplayName(), writer);
086:
087: List descList = pkgElement.getDescriptionElementList();
088: if (descList != null && descList.size() > 0) {
089: Iterator it = descList.iterator();
090: while (it.hasNext()) {
091: DescriptionElement desc = (DescriptionElement) it
092: .next();
093: writeDescription(desc, writer);
094: }
095: }
096:
097: writeOptionalElement("provider", pkgElement.getProvider(),
098: writer);
099:
100: List requiredPkgs = pkgElement.getRequiredPackages();
101: if (requiredPkgs != null && requiredPkgs.size() > 0) {
102: Iterator it = requiredPkgs.iterator();
103: while (it.hasNext()) {
104: PackageRequiresElement reqPkg = (PackageRequiresElement) it
105: .next();
106: StringBuffer sb = new StringBuffer("<requires package=");
107: sb.append(
108: XMLEncode.xmlEncodeTextAsPCDATA(reqPkg
109: .getPackage(), true)).append(
110: " version=").append(
111: XMLEncode.xmlEncodeTextAsPCDATA(reqPkg
112: .getVersion(), true)).append(" />\n");
113: writer.write(sb.toString());
114: }
115: }
116:
117: writePackageImports("types", pkgElement.getTypes(), writer); // list
118: // of
119: // PackageImportElement
120: writePackageImports("components", pkgElement.getComponents(),
121: writer); // list
122: // of
123: // PackageImportElement
124: // additional files to export: (client-module JAR, relative to META-INF)
125: List files1 = writeClientModules(pkgElement.getClientModules(),
126: writer); // list
127: // of
128: // ClientModuleElement
129: // additional files to export: (relative to META-INF/files)
130: writer.write("</" + DTDCatalog.PACKAGE_DESCRIPTOR + ">\n");
131: writer.flush();
132:
133: if (files1.size() > 0) {
134: return ((String[]) files1
135: .toArray(new String[files1.size()]));
136: } else {
137: return null;
138: }
139: }
140:
141: private void writeOptionalElement(String element, String content,
142: Writer writer) throws IOException {
143: if (content != null && content.length() > 0) {
144: writer.write("<" + element + ">");
145: writer.write(XMLEncode.xmlEncodeTextAsPCDATA(content));
146: writer.write("</" + element + ">\n");
147: }
148: }
149:
150: // list of PackageImportElement
151: private void writePackageImports(String element, List list,
152: Writer writer) throws IOException {
153: if (list == null || list.isEmpty())
154: return;
155:
156: Iterator it = list.iterator();
157: while (it.hasNext()) {
158: PackageImportElement e = (PackageImportElement) it.next();
159: writer.write("<" + element + " order=\"");
160: writer.write(e.getOrder());
161: writer.write("\">");
162: String fName = e.getFileName();
163: fName = fName.replace(File.separatorChar, '/');
164: writer.write(XMLEncode.xmlEncodeTextAsPCDATA(fName));
165: writer.write("</" + element + ">\n");
166: }
167: }
168:
169: /**
170: * Describe <code>writeClientModules</code> method here.
171: *
172: * @param list
173: * a <code>List</code> of ClientModuleElement
174: * @param writer
175: * a <code>Writer</code> value
176: * @return a <code>List</code> of String instances containing the names of
177: * additional files to export (relative to META-INF)
178: * @exception IOException
179: * if an error occurs
180: */
181: private List writeClientModules(List list, Writer writer)
182: throws IOException {
183: if (list == null || list.isEmpty())
184: return new LinkedList();
185:
186: List files = new LinkedList();
187: Iterator it = list.iterator();
188: while (it.hasNext()) {
189: ClientModuleElement e = (ClientModuleElement) it.next();
190: writer.write("<client-module");
191: String s = e.getJar();
192: if (s != null) {
193: writer.write(" jar="
194: + XMLEncode.xmlEncodeTextAsPCDATA(s, true));
195: files.add(s);
196: }
197: writer.write(">\n");
198: Map guis = e.getGuis(); // map of (String, String)
199: Iterator entries = guis.entrySet().iterator();
200: while (entries.hasNext()) {
201: Map.Entry entry = (Map.Entry) entries.next();
202: writer.write("<gui name="
203: + XMLEncode.xmlEncodeTextAsPCDATA(
204: (String) entry.getKey(), true)
205: + " class="
206: + XMLEncode.xmlEncodeTextAsPCDATA(
207: (String) entry.getValue(), true)
208: + " />\n");
209: }
210: Map views = e.getViews(); // map of (String, String)
211: entries = views.entrySet().iterator();
212: while (entries.hasNext()) {
213: Map.Entry entry = (Map.Entry) entries.next();
214: writer.write("<view name="
215: + XMLEncode.xmlEncodeTextAsPCDATA(
216: (String) entry.getKey(), true)
217: + " class="
218: + XMLEncode.xmlEncodeTextAsPCDATA(
219: (String) entry.getValue(), true)
220: + " />\n");
221: }
222: Map modules = e.getViews(); // map of (String, String)
223: entries = modules.entrySet().iterator();
224: while (entries.hasNext()) {
225: Map.Entry entry = (Map.Entry) entries.next();
226: writer.write("<module name="
227: + XMLEncode.xmlEncodeTextAsPCDATA(
228: (String) entry.getKey(), true)
229: + " class="
230: + XMLEncode.xmlEncodeTextAsPCDATA(
231: (String) entry.getValue(), true)
232: + " />\n");
233: }
234: writer.write("</client-module>\n");
235: }
236: return files;
237: }
238:
239: private void writeDescription(DescriptionElement desc, Writer writer)
240: throws IOException {
241: StringBuffer sb = new StringBuffer("<description lang=");
242: sb
243: .append(
244: XMLEncode.xmlEncodeTextAsPCDATA(desc.getLang(),
245: true)).append(" title=").append(
246: XMLEncode.xmlEncodeTextAsPCDATA(
247: desc.getTitle(), true));
248: if (desc.getHelp() != null)
249: sb.append(" help=").append(
250: XMLEncode.xmlEncodeTextAsPCDATA(desc.getHelp(),
251: true));
252: sb.append(">").append(
253: XMLEncode.xmlEncodeTextAsPCDATA(desc.getValue()))
254: .append("</description>\n");
255: writer.write(sb.toString());
256: }
257:
258: }
|