blob: fe225fb5835ca223ab6789db1d95f3aeb0bb4a40 [file] [log] [blame]
/*
* Copyright 2009 Mike Cumings
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kenai.jbosh;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.Map;
/**
* Implementation of the {@code AbstractBody} class which allows for the
* definition of messages from pre-existing message content. Instances of
* this class are based on the underlying data and therefore cannot be
* modified. In order to obtain the wrapper element namespace and
* attribute information, the body content is partially parsed.
* <p/>
* This class does only minimal syntactic and semantic checking with respect
* to what the generated XML will look like. It is up to the developer to
* protect against the definition of malformed XML messages when building
* instances of this class.
* <p/>
* Instances of this class are immutable and thread-safe.
*/
final class StaticBody extends AbstractBody {
/**
* Selected parser to be used to process raw XML messages.
*/
private static final BodyParser PARSER =
new BodyParserXmlPull();
/**
* Size of the internal buffer when copying from a stream.
*/
private static final int BUFFER_SIZE = 1024;
/**
* Map of all attributes to their values.
*/
private final Map<BodyQName, String> attrs;
/**
* This body message in raw XML form.
*/
private final String raw;
///////////////////////////////////////////////////////////////////////////
// Constructors:
/**
* Prevent direct construction.
*/
private StaticBody(
final Map<BodyQName, String> attrMap,
final String rawXML) {
attrs = attrMap;
raw = rawXML;
}
/**
* Creates an instance which is initialized by reading a body
* message from the provided stream.
*
* @param inStream stream to read message XML from
* @return body instance
* @throws BOSHException on parse error
*/
public static StaticBody fromStream(
final InputStream inStream)
throws BOSHException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
try {
byte[] buffer = new byte[BUFFER_SIZE];
int read;
do {
read = inStream.read(buffer);
if (read > 0) {
byteOut.write(buffer, 0, read);
}
} while (read >= 0);
} catch (IOException iox) {
throw(new BOSHException(
"Could not read body data", iox));
}
return fromString(byteOut.toString());
}
/**
* Creates an instance which is initialized by reading a body
* message from the provided raw XML string.
*
* @param rawXML raw message XML in string form
* @return body instance
* @throws BOSHException on parse error
*/
public static StaticBody fromString(
final String rawXML)
throws BOSHException {
BodyParserResults results = PARSER.parse(rawXML);
return new StaticBody(results.getAttributes(), rawXML);
}
/**
* {@inheritDoc}
*/
public Map<BodyQName, String> getAttributes() {
return Collections.unmodifiableMap(attrs);
}
/**
* {@inheritDoc}
*/
public String toXML() {
return raw;
}
}