aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.xml.internal.bind.v2.util; aoqi@0: aoqi@0: import java.io.IOException; aoqi@0: import java.io.InputStream; aoqi@0: import java.io.InputStreamReader; aoqi@0: import java.io.Reader; aoqi@0: aoqi@0: import javax.activation.DataHandler; aoqi@0: import javax.activation.DataSource; aoqi@0: import javax.activation.MimeType; aoqi@0: import javax.activation.MimeTypeParseException; aoqi@0: import javax.xml.transform.Source; aoqi@0: import javax.xml.transform.stream.StreamSource; aoqi@0: aoqi@0: /** aoqi@0: * {@link Source} implementation backed by {@link DataHandler}. aoqi@0: * aoqi@0: *

aoqi@0: * This implementation allows the same {@link Source} to be used aoqi@0: * mutliple times. aoqi@0: * aoqi@0: *

aoqi@0: * {@link Source} isn't really pluggable. As a consequence, aoqi@0: * this implementation is clunky --- weak against unexpected aoqi@0: * usage of the class. aoqi@0: * aoqi@0: * @author Kohsuke Kawaguchi aoqi@0: */ aoqi@0: public final class DataSourceSource extends StreamSource { aoqi@0: private final DataSource source; aoqi@0: aoqi@0: /** aoqi@0: * If null, default to the encoding declaration aoqi@0: */ aoqi@0: private final String charset; aoqi@0: aoqi@0: // remember the value we returned so that the 2nd invocation aoqi@0: // will return the same object, which is what's expeted out of aoqi@0: // StreamSource aoqi@0: private Reader r; aoqi@0: private InputStream is; aoqi@0: aoqi@0: public DataSourceSource(DataHandler dh) throws MimeTypeParseException { aoqi@0: this(dh.getDataSource()); aoqi@0: } aoqi@0: aoqi@0: public DataSourceSource(DataSource source) throws MimeTypeParseException { aoqi@0: this.source = source; aoqi@0: aoqi@0: String ct = source.getContentType(); aoqi@0: if(ct==null) { aoqi@0: charset = null; aoqi@0: } else { aoqi@0: MimeType mimeType = new MimeType(ct); aoqi@0: this.charset = mimeType.getParameter("charset"); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public void setReader(Reader reader) { aoqi@0: throw new UnsupportedOperationException(); aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public void setInputStream(InputStream inputStream) { aoqi@0: throw new UnsupportedOperationException(); aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public Reader getReader() { aoqi@0: try { aoqi@0: if(charset==null) return null; aoqi@0: if(r==null) aoqi@0: r = new InputStreamReader(source.getInputStream(),charset); aoqi@0: return r; aoqi@0: } catch (IOException e) { aoqi@0: // argh aoqi@0: throw new RuntimeException(e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: @Override aoqi@0: public InputStream getInputStream() { aoqi@0: try { aoqi@0: if(charset!=null) return null; aoqi@0: if(is==null) aoqi@0: is = source.getInputStream(); aoqi@0: return is; aoqi@0: } catch (IOException e) { aoqi@0: // argh aoqi@0: throw new RuntimeException(e); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: public DataSource getDataSource() { aoqi@0: return source; aoqi@0: } aoqi@0: }