001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.perseus.platform;
028:
029: import javax.microedition.io.Connector;
030: import javax.microedition.io.HttpConnection;
031: import javax.microedition.io.InputConnection;
032:
033: import java.io.InputStream;
034:
035: import java.io.IOException;
036:
037: /**
038: * This class is used to provide GZIP support to the Perseus engine by using
039: * a custom implementation of GZIPInputStream
040: * <code>com.sun.perseus.platform.GZIPInputStream</code>
041: *
042: *
043: */
044: public class GZIPSupport {
045:
046: /**
047: * Used for HTTP request headers
048: */
049: public static final String HTTP_ACCEPT_ENCODING = "Accept-Encoding";
050:
051: /**
052: * GZIP encoding
053: */
054: static final String HTTP_GZIP_ENCODING = "gzip";
055:
056: /**
057: * If GZIP encoding is supported, this method should setup the
058: * HTTP Request Header to declare that GZIP encoding is supported.
059: *
060: * @param svgURI the url of the requested SVG resource.
061: * @return a stream that does not handles GZIP uncompression.
062: * @throws IOException if an I/O error happens while opening the
063: * requested URI.
064: */
065: public static InputStream openHandleGZIP(String svgURI)
066: throws IOException {
067:
068: InputConnection svgURLConnection = (InputConnection) Connector
069: .open(svgURI, Connector.READ);
070:
071: try {
072: if (svgURLConnection instanceof HttpConnection) {
073: setupHttpEncoding((HttpConnection) svgURLConnection);
074: }
075:
076: return (svgURLConnection.openInputStream());
077:
078: } finally {
079: svgURLConnection.close();
080: }
081: }
082:
083: /**
084: *
085: */
086: static void setupHttpEncoding(final HttpConnection httpC)
087: throws IOException {
088: String encodings = httpC
089: .getRequestProperty(HTTP_ACCEPT_ENCODING);
090:
091: if (encodings == null) {
092: encodings = "";
093: }
094:
095: if (encodings.trim().length() > 0) {
096: encodings += ",";
097: }
098: encodings += HTTP_GZIP_ENCODING;
099: httpC.setRequestProperty(HTTP_ACCEPT_ENCODING, encodings);
100: }
101:
102: /**
103: * This method checks if the input stream is a GZIP stream.
104: * It reads the first two bytes of the stream and compares
105: * the short it reads with the GZIP magic number
106: * (see <code>java.util.zip.GZIPInputStream.GZIP_MAGIC).
107: *
108: * If the magic number matches, the method returns a
109: * <code>java.util.zip.GZIPInputStream</code> which wraps the
110: * input stream. Otherwise, the method returns either the
111: * unchanged stream or a <code>BufferedInputStream</code>
112: * if the input stream did not support marking, as defined
113: * by the <code>java.io.InputStream.mark</code> method.
114: *
115: * @param is the input stream that might be GZIPPed.
116: * @return a stream that handles GZIP uncompression, if any is
117: * needed.
118: * @throws IOException if an I/O error happens while building
119: * a GZIPInputStream.
120: */
121: public static InputStream handleGZIP(InputStream is)
122: throws IOException {
123: // Wrap the stream if it does not support marking.
124: // BufferedInputStream supports marking.
125:
126: //Temporary: wrap all input streams to workaround bug in WTK (CR 6335742)
127: //Temporary: //if (!is.markSupported())
128: is = new BufferedInputStream(is);
129:
130: int magicIn = 0;
131: try {
132: is.mark(2);
133: magicIn = 0x0000ffff & (is.read() | is.read() << 8);
134: } catch (IOException ex) {
135: // We were not able to read at least two bytes,
136: // this cannot be a GZIP stream as it does not
137: // even have the magic number header
138: is.reset();
139:
140: return is;
141:
142: } finally {
143: try {
144:
145: is.reset();
146:
147: } catch (IOException ioe) {
148: // This should _never_ happen because we do not fall
149: // into _any_ of the conditions that might cause a
150: // reset() to throw an IOException. If we got into that
151: // situation, it means we are in serious troubles.
152: throw new Error();
153: }
154: }
155: if (magicIn == GZIPInputStream.GZIP_MAGIC) {
156:
157: return new GZIPInputStream(is);
158:
159: }
160:
161: return is;
162:
163: }
164:
165: }
|