001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
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.apache.camel;
018
019 import java.io.ByteArrayInputStream;
020 import java.io.Externalizable;
021 import java.io.IOException;
022 import java.io.InputStream;
023 import java.io.ObjectInput;
024 import java.io.ObjectOutput;
025 import java.io.Reader;
026 import java.io.StringReader;
027 import java.io.UnsupportedEncodingException;
028
029 import javax.xml.transform.stream.StreamSource;
030
031 /**
032 * A helper class which provides a JAXP {@link javax.xml.transform.Source
033 * Source} from a String which can be read as many times as required. Encoding
034 * is default UTF-8.
035 *
036 * @version
037 */
038 public class StringSource extends StreamSource implements Externalizable {
039 private String text;
040 private String encoding = "UTF-8";
041
042 public StringSource() {
043 }
044
045 public StringSource(String text) {
046 if (text == null) {
047 throw new IllegalArgumentException("text must be specified");
048 }
049 this.text = text;
050 }
051
052 public StringSource(String text, String systemId) {
053 this(text);
054 if (systemId == null) {
055 throw new IllegalArgumentException("systemId must be specified");
056 }
057 setSystemId(systemId);
058 }
059
060 public StringSource(String text, String systemId, String encoding) {
061 this(text, systemId);
062 if (encoding == null) {
063 throw new IllegalArgumentException("encoding must be specified");
064 }
065 this.encoding = encoding;
066 }
067
068 public InputStream getInputStream() {
069 try {
070 return new ByteArrayInputStream(text.getBytes(encoding));
071 } catch (UnsupportedEncodingException e) {
072 throw new RuntimeException(e);
073 }
074 }
075
076 public Reader getReader() {
077 return new StringReader(text);
078 }
079
080 public String toString() {
081 return "StringSource[" + text + "]";
082 }
083
084 public String getText() {
085 return text;
086 }
087
088 public String getEncoding() {
089 return encoding;
090 }
091
092 public void writeExternal(ObjectOutput out) throws IOException {
093 int b = (text != null ? 0x01 : 0x00) + (encoding != null ? 0x02 : 0x00) + (getPublicId() != null ? 0x04 : 0x00) + (getSystemId() != null ? 0x08 : 0x00);
094 out.writeByte(b);
095 if ((b & 0x01) != 0) {
096 out.writeUTF(text);
097 }
098 if ((b & 0x02) != 0) {
099 out.writeUTF(encoding);
100 }
101 if ((b & 0x04) != 0) {
102 out.writeUTF(getPublicId());
103 }
104 if ((b & 0x08) != 0) {
105 out.writeUTF(getSystemId());
106 }
107 }
108
109 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
110 int b = in.readByte();
111 if ((b & 0x01) != 0) {
112 text = in.readUTF();
113 }
114 if ((b & 0x02) != 0) {
115 encoding = in.readUTF();
116 }
117 if ((b & 0x04) != 0) {
118 setPublicId(in.readUTF());
119 }
120 if ((b & 0x08) != 0) {
121 setSystemId(in.readUTF());
122 }
123 }
124 }