001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2008
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.shared.media;
034:
035: import com.flexive.shared.exceptions.FxApplicationException;
036:
037: import javax.xml.stream.XMLOutputFactory;
038: import javax.xml.stream.XMLStreamException;
039: import javax.xml.stream.XMLStreamWriter;
040: import java.io.StringWriter;
041: import java.io.Serializable;
042: import java.util.List;
043:
044: import org.apache.commons.lang.StringUtils;
045:
046: /**
047: * Generic media metadata
048: *
049: * @author Markus Plesser (markus.plesser@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
050: * @version $Rev
051: */
052: public abstract class FxMetadata {
053:
054: /**
055: * An item holding metadata
056: */
057: public static class FxMetadataItem implements Serializable {
058: private static final long serialVersionUID = -4856169406370122927L;
059:
060: private String key;
061: private String value;
062:
063: /**
064: * Ctor
065: *
066: * @param key key
067: * @param value valud
068: */
069: public FxMetadataItem(String key, String value) {
070: this .key = key;
071: this .value = value;
072: }
073:
074: /**
075: * Getter for the key
076: *
077: * @return key
078: */
079: public String getKey() {
080: return key;
081: }
082:
083: /**
084: * Getter for the value
085: *
086: * @return value
087: */
088: public String getValue() {
089: return value;
090: }
091: }
092:
093: /**
094: * Get the type of this metadata instance to allow easier upcasts
095: *
096: * @return type of this metadata instance
097: */
098: public abstract FxMediaType getMediaType();
099:
100: /**
101: * Get the mime type
102: *
103: * @return mime type
104: */
105: public abstract String getMimeType();
106:
107: /**
108: * Get the file name, can be <code>null</code> if unknown
109: *
110: * @return filename or <code>null</code>
111: */
112: public abstract String getFilename();
113:
114: /**
115: * Get a list of defined metadata items
116: *
117: * @return list of defined metadata items
118: */
119: public abstract List<FxMetadataItem> getMetadata();
120:
121: /**
122: * Get this metadata object as an FxImageMetadata instance
123: *
124: * @return FxImageMetadata instance
125: * @throws FxApplicationException on errors
126: */
127: public FxImageMetadata asImageMetadata()
128: throws FxApplicationException {
129: if (this instanceof FxImageMetadata)
130: return (FxImageMetadata) this ;
131: throw new FxApplicationException("ex.general.wrongClass", this
132: .getClass().getCanonicalName(), FxImageMetadata.class
133: .getCanonicalName());
134: }
135:
136: /**
137: * Get this metadata object as XML document
138: *
139: * @return XML document
140: * @throws FxApplicationException on errors
141: */
142: public String toXML() throws FxApplicationException {
143: StringWriter sw = new StringWriter(2000);
144: try {
145: XMLStreamWriter writer = XMLOutputFactory.newInstance()
146: .createXMLStreamWriter(sw);
147: writer.writeStartDocument();
148: writer.writeStartElement("metadata");
149: writer.writeAttribute("mediatype", getMediaType().name());
150: writer.writeAttribute("mimetype", getMimeType());
151: writer.writeAttribute("filename", getFilename());
152: writeXMLTags(writer);
153: for (FxMetadataItem mdi : getMetadata()) {
154: final String value = mdi.getValue().replaceAll(
155: "[\\x00-\\x1F]", ""); //filter out control characters
156: if (StringUtils.isEmpty(value))
157: continue;
158: writer.writeStartElement("meta");
159: writer.writeAttribute("key", mdi.getKey());
160: writer.writeCData(value);
161: writer.writeEndElement();
162: }
163: writer.writeEndElement();
164: writer.writeEndDocument();
165: writer.flush();
166: writer.close();
167: } catch (XMLStreamException e) {
168: throw new FxApplicationException(e, "ex.general.xml", e
169: .getMessage());
170: }
171: return sw.getBuffer().toString();
172: }
173:
174: /**
175: * Write implementation specific XML tags
176: *
177: * @param writer XMLStreamWriter
178: * @throws XMLStreamException on errors
179: */
180: protected abstract void writeXMLTags(XMLStreamWriter writer)
181: throws XMLStreamException;
182:
183: }
|