2 * Copyright (c) 2001-2007 Sun Microsystems, Inc. All rights reserved.
4 * The Sun Project JXTA(TM) Software License
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
16 * 3. The end-user documentation included with the redistribution, if any, must
17 * include the following acknowledgment: "This product includes software
18 * developed by Sun Microsystems, Inc. for JXTA(TM) technology."
19 * Alternately, this acknowledgment may appear in the software itself, if
20 * and wherever such third-party acknowledgments normally appear.
22 * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must
23 * not be used to endorse or promote products derived from this software
24 * without prior written permission. For written permission, please contact
25 * Project JXTA at http://www.jxta.org.
27 * 5. Products derived from this software may not be called "JXTA", nor may
28 * "JXTA" appear in their name, without prior written permission of Sun.
30 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
32 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN
33 * MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
34 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
36 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
37 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
38 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
39 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 * JXTA is a registered trademark of Sun Microsystems, Inc. in the United
42 * States and other countries.
44 * Please see the license information page at :
45 * <http://www.jxta.org/project/www/license.html> for instructions on use of
46 * the license in source files.
48 * ====================================================================
50 * This software consists of voluntary contributions made by many individuals
51 * on behalf of Project JXTA. For more information on Project JXTA, please see
52 * http://www.jxta.org.
54 * This license is based on the BSD license adopted by the Apache Foundation.
57 package net.jxta.impl.document;
60 import java.io.BufferedWriter;
61 import java.io.ByteArrayInputStream;
62 import java.io.InputStream;
63 import java.io.OutputStream;
64 import java.io.OutputStreamWriter;
65 import java.io.Reader;
66 import java.io.StringReader;
67 import java.io.StringWriter;
68 import java.io.Writer;
70 import java.io.IOException;
71 import java.security.ProviderException;
73 import net.jxta.document.MimeMediaType;
74 import net.jxta.document.StructuredDocument;
75 import net.jxta.document.StructuredDocumentFactory;
76 import net.jxta.document.StructuredTextDocument;
77 import net.jxta.document.TextElement;
78 import net.jxta.document.TextDocument;
82 * This class is an implementation of the StructuredDocument interface using
85 public class PlainTextDocument extends PlainTextElement implements StructuredTextDocument<PlainTextElement> {
87 private final static class Instantiator implements StructuredDocumentFactory.TextInstantiator {
90 * The MIME Media Types which this <CODE>StructuredDocument</CODE> is
91 * capable of emitting.
93 private static final MimeMediaType[] myTypes = {
94 MimeMediaType.TEXT_DEFAULTENCODING
97 // these are the file extensions which are likely to contain files of
99 private static final ExtensionMapping[] myExtensions = {
100 new ExtensionMapping("txt", myTypes[0]), new ExtensionMapping("text", myTypes[0]), new ExtensionMapping("txt", null) };
103 * Creates new PlainTextDocument
105 public Instantiator() {}
110 public MimeMediaType[] getSupportedMimeTypes() {
117 public ExtensionMapping[] getSupportedFileExtensions() {
118 return (myExtensions);
124 public StructuredDocument newInstance(MimeMediaType mimeType, String doctype) {
125 return new PlainTextDocument(mimeType, doctype);
131 public StructuredDocument newInstance(MimeMediaType mimeType, String doctype, String value) {
132 return new PlainTextDocument(mimeType, doctype, value);
138 public StructuredDocument newInstance(MimeMediaType mimeType, InputStream source) throws IOException {
139 throw new ProviderException("PlainTextDocument does not support input");
145 public StructuredDocument newInstance(MimeMediaType mimeType, Reader source) throws IOException {
146 throw new ProviderException("PlainTextDocument does not support input");
151 public static final StructuredDocumentFactory.TextInstantiator INSTANTIATOR = new Instantiator();
153 private MimeMediaType mimeType = null;
156 * Creates new PlainTextDocument
158 public PlainTextDocument(final MimeMediaType mimeType, String type) {
163 this.mimeType = mimeType;
167 * Creates new PlainTextDocument with a value for the root element
169 public PlainTextDocument(final MimeMediaType mimeType, final String type, final String value) {
170 super(null, type, value);
174 this.mimeType = mimeType;
181 public String toString() {
182 StringWriter stringOut = new StringWriter();
185 printNice(stringOut, 0, true);
187 } catch (IOException caught) {
191 return stringOut.toString();
197 public MimeMediaType getMimeType() {
204 public String getFileExtension() {
205 return TextDocumentCommon.Utils.getExtensionForMime(INSTANTIATOR.getSupportedFileExtensions(), getMimeType());
211 public PlainTextElement createElement(Object key) {
212 return createElement(key, null);
218 public PlainTextElement createElement(Object key, Object val) {
219 if (!String.class.isAssignableFrom(key.getClass())) {
220 throw new ClassCastException(key.getClass().getName() + " not supported by createElement.");
223 if ((null != val) && !String.class.isAssignableFrom(val.getClass())) {
224 throw new ClassCastException(val.getClass().getName() + " not supported by createElement.");
227 return new PlainTextElement(this, (String) key, (String) val);
233 public PlainTextElement createElement(String name) {
234 return new PlainTextElement(this, name);
240 public PlainTextElement createElement(String name, String val) {
241 return new PlainTextElement(this, name, val);
247 public InputStream getStream() throws IOException {
248 // XXX bondolo@jxta.org 20010307 Should be using a pipe
249 String charset = mimeType.getParameter("charset");
251 if (charset == null) {
252 return new ByteArrayInputStream(toString().getBytes());
254 return new ByteArrayInputStream(toString().getBytes(charset));
261 public void sendToStream(OutputStream stream) throws IOException {
262 String charset = mimeType.getParameter("charset");
266 if (charset == null) {
267 osw = new OutputStreamWriter(stream);
269 osw = new OutputStreamWriter(stream, charset);
272 Writer out = new BufferedWriter(osw);
281 public Reader getReader() {
282 // XXX bondolo@jxta.org 20010307 Should be using a pipe
284 return new StringReader(toString());
290 public void sendToWriter(Writer stream) throws IOException {
291 printNice(stream, 0, true);