src/share/jaxws_classes/javax/xml/bind/helpers/AbstractMarshallerImpl.java

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 397
b99d7e355d4b
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package javax.xml.bind.helpers;
    28 import javax.xml.bind.JAXBException;
    29 import javax.xml.bind.Marshaller;
    30 import javax.xml.bind.PropertyException;
    31 import javax.xml.bind.ValidationEventHandler;
    32 import javax.xml.bind.annotation.adapters.XmlAdapter;
    33 import javax.xml.bind.attachment.AttachmentMarshaller;
    34 import javax.xml.stream.XMLEventWriter;
    35 import javax.xml.stream.XMLStreamWriter;
    36 import javax.xml.transform.dom.DOMResult;
    37 import javax.xml.transform.sax.SAXResult;
    38 import javax.xml.transform.stream.StreamResult;
    39 import javax.xml.validation.Schema;
    40 import java.io.UnsupportedEncodingException;
    41 import java.io.File;
    42 import java.io.OutputStream;
    43 import java.io.FileOutputStream;
    44 import java.io.BufferedOutputStream;
    45 import java.io.IOException;
    46 // J2SE1.4 feature
    47 // import java.nio.charset.Charset;
    48 // import java.nio.charset.UnsupportedCharsetException;
    50 /**
    51  * Partial default <tt>Marshaller</tt> implementation.
    52  *
    53  * <p>
    54  * This class provides a partial default implementation for the
    55  * {@link javax.xml.bind.Marshaller} interface.
    56  *
    57  * <p>
    58  * The only methods that a JAXB Provider has to implement are
    59  * {@link Marshaller#marshal(Object, javax.xml.transform.Result) marshal(Object, javax.xml.transform.Result)},
    60  * {@link Marshaller#marshal(Object, javax.xml.transform.Result) marshal(Object, javax.xml.stream.XMLStreamWriter)}, and
    61  * {@link Marshaller#marshal(Object, javax.xml.transform.Result) marshal(Object, javax.xml.stream.XMLEventWriter)}.
    62  *
    63  * @author <ul><li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li></ul>
    64  * @see javax.xml.bind.Marshaller
    65  * @since JAXB1.0
    66  */
    67 public abstract class AbstractMarshallerImpl implements Marshaller
    68 {
    69     /** handler that will be used to process errors and warnings during marshal */
    70     private ValidationEventHandler eventHandler =
    71         new DefaultValidationEventHandler();
    73     //J2SE1.4 feature
    74     //private Charset encoding = null;
    76     /** store the value of the encoding property. */
    77     private String encoding = "UTF-8";
    79     /** store the value of the schemaLocation property. */
    80     private String schemaLocation = null;
    82     /** store the value of the noNamespaceSchemaLocation property. */
    83     private String noNSSchemaLocation = null;
    85     /** store the value of the formattedOutput property. */
    86     private boolean formattedOutput = false;
    88     /** store the value of the fragment property. */
    89     private boolean fragment = false;
    91     public final void marshal( Object obj, java.io.OutputStream os )
    92         throws JAXBException {
    94         checkNotNull( obj, "obj", os, "os" );
    95         marshal( obj, new StreamResult(os) );
    96     }
    98     public void marshal(Object jaxbElement, File output) throws JAXBException {
    99         checkNotNull(jaxbElement, "jaxbElement", output, "output" );
   100         try {
   101             OutputStream os = new BufferedOutputStream(new FileOutputStream(output));
   102             try {
   103                 marshal( jaxbElement, new StreamResult(os) );
   104             } finally {
   105                 os.close();
   106             }
   107         } catch (IOException e) {
   108             throw new JAXBException(e);
   109         }
   110     }
   112     public final void marshal( Object obj, java.io.Writer w )
   113         throws JAXBException {
   115         checkNotNull( obj, "obj", w, "writer" );
   116         marshal( obj, new StreamResult(w) );
   117     }
   119     public final void marshal( Object obj, org.xml.sax.ContentHandler handler )
   120         throws JAXBException {
   122         checkNotNull( obj, "obj", handler, "handler" );
   123         marshal( obj, new SAXResult(handler) );
   124     }
   126     public final void marshal( Object obj, org.w3c.dom.Node node )
   127         throws JAXBException {
   129         checkNotNull( obj, "obj", node, "node" );
   130         marshal( obj, new DOMResult(node) );
   131     }
   133     /**
   134      * By default, the getNode method is unsupported and throw
   135      * an {@link java.lang.UnsupportedOperationException}.
   136      *
   137      * Implementations that choose to support this method must
   138      * override this method.
   139      */
   140     public org.w3c.dom.Node getNode( Object obj ) throws JAXBException {
   142         checkNotNull( obj, "obj", Boolean.TRUE, "foo" );
   144         throw new UnsupportedOperationException();
   145     }
   147     /**
   148      * Convenience method for getting the current output encoding.
   149      *
   150      * @return the current encoding or "UTF-8" if it hasn't been set.
   151      */
   152     protected String getEncoding() {
   153         return encoding;
   154     }
   156     /**
   157      * Convenience method for setting the output encoding.
   158      *
   159      * @param encoding a valid encoding as specified in the Marshaller class
   160      * documentation
   161      */
   162     protected void setEncoding( String encoding ) {
   163         this.encoding = encoding;
   164     }
   166     /**
   167      * Convenience method for getting the current schemaLocation.
   168      *
   169      * @return the current schemaLocation or null if it hasn't been set
   170      */
   171     protected String getSchemaLocation() {
   172         return schemaLocation;
   173     }
   175     /**
   176      * Convenience method for setting the schemaLocation.
   177      *
   178      * @param location the schemaLocation value
   179      */
   180     protected void setSchemaLocation( String location ) {
   181         schemaLocation = location;
   182     }
   184     /**
   185      * Convenience method for getting the current noNamespaceSchemaLocation.
   186      *
   187      * @return the current noNamespaceSchemaLocation or null if it hasn't
   188      * been set
   189      */
   190     protected String getNoNSSchemaLocation() {
   191         return noNSSchemaLocation;
   192     }
   194     /**
   195      * Convenience method for setting the noNamespaceSchemaLocation.
   196      *
   197      * @param location the noNamespaceSchemaLocation value
   198      */
   199     protected void setNoNSSchemaLocation( String location ) {
   200         noNSSchemaLocation = location;
   201     }
   203     /**
   204      * Convenience method for getting the formatted output flag.
   205      *
   206      * @return the current value of the formatted output flag or false if
   207      * it hasn't been set.
   208      */
   209     protected boolean isFormattedOutput() {
   210         return formattedOutput;
   211     }
   213     /**
   214      * Convenience method for setting the formatted output flag.
   215      *
   216      * @param v value of the formatted output flag.
   217      */
   218     protected void setFormattedOutput( boolean v ) {
   219         formattedOutput = v;
   220     }
   223     /**
   224      * Convenience method for getting the fragment flag.
   225      *
   226      * @return the current value of the fragment flag or false if
   227      * it hasn't been set.
   228      */
   229     protected boolean isFragment() {
   230         return fragment;
   231     }
   233     /**
   234      * Convenience method for setting the fragment flag.
   235      *
   236      * @param v value of the fragment flag.
   237      */
   238     protected void setFragment( boolean v ) {
   239         fragment = v;
   240     }
   243     static String[] aliases = {
   244         "UTF-8", "UTF8",
   245         "UTF-16", "Unicode",
   246         "UTF-16BE", "UnicodeBigUnmarked",
   247         "UTF-16LE", "UnicodeLittleUnmarked",
   248         "US-ASCII", "ASCII",
   249         "TIS-620", "TIS620",
   251         // taken from the project-X parser
   252         "ISO-10646-UCS-2", "Unicode",
   254         "EBCDIC-CP-US", "cp037",
   255         "EBCDIC-CP-CA", "cp037",
   256         "EBCDIC-CP-NL", "cp037",
   257         "EBCDIC-CP-WT", "cp037",
   259         "EBCDIC-CP-DK", "cp277",
   260         "EBCDIC-CP-NO", "cp277",
   261         "EBCDIC-CP-FI", "cp278",
   262         "EBCDIC-CP-SE", "cp278",
   264         "EBCDIC-CP-IT", "cp280",
   265         "EBCDIC-CP-ES", "cp284",
   266         "EBCDIC-CP-GB", "cp285",
   267         "EBCDIC-CP-FR", "cp297",
   269         "EBCDIC-CP-AR1", "cp420",
   270         "EBCDIC-CP-HE", "cp424",
   271         "EBCDIC-CP-BE", "cp500",
   272         "EBCDIC-CP-CH", "cp500",
   274         "EBCDIC-CP-ROECE", "cp870",
   275         "EBCDIC-CP-YU", "cp870",
   276         "EBCDIC-CP-IS", "cp871",
   277         "EBCDIC-CP-AR2", "cp918",
   279         // IANA also defines two that JDK 1.2 doesn't handle:
   280         //  EBCDIC-CP-GR        --> CP423
   281         //  EBCDIC-CP-TR        --> CP905
   282     };
   284     /**
   285      * Gets the corresponding Java encoding name from an IANA name.
   286      *
   287      * This method is a helper method for the derived class to convert
   288      * encoding names.
   289      *
   290      * @exception UnsupportedEncodingException
   291      *      If this implementation couldn't find the Java encoding name.
   292      */
   293     protected String getJavaEncoding( String encoding ) throws UnsupportedEncodingException {
   294         try {
   295             "1".getBytes(encoding);
   296             return encoding;
   297         } catch( UnsupportedEncodingException e ) {
   298             // try known alias
   299             for( int i=0; i<aliases.length; i+=2 ) {
   300                 if(encoding.equals(aliases[i])) {
   301                     "1".getBytes(aliases[i+1]);
   302                     return aliases[i+1];
   303                 }
   304             }
   306             throw new UnsupportedEncodingException(encoding);
   307         }
   308         /* J2SE1.4 feature
   309         try {
   310             this.encoding = Charset.forName( _encoding );
   311         } catch( UnsupportedCharsetException uce ) {
   312             throw new JAXBException( uce );
   313         }
   314          */
   315     }
   317     /**
   318      * Default implementation of the setProperty method handles
   319      * the four defined properties in Marshaller. If a provider
   320      * needs to handle additional properties, it should override
   321      * this method in a derived class.
   322      */
   323     public void setProperty( String name, Object value )
   324         throws PropertyException {
   326         if( name == null ) {
   327             throw new IllegalArgumentException(
   328                 Messages.format( Messages.MUST_NOT_BE_NULL, "name" ) );
   329         }
   331         // recognize and handle four pre-defined properties.
   332         if( JAXB_ENCODING.equals(name) ) {
   333             checkString( name, value );
   334             setEncoding( (String)value );
   335             return;
   336         }
   337         if( JAXB_FORMATTED_OUTPUT.equals(name) ) {
   338             checkBoolean( name, value );
   339             setFormattedOutput((Boolean) value );
   340             return;
   341         }
   342         if( JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(name) ) {
   343             checkString( name, value );
   344             setNoNSSchemaLocation( (String)value );
   345             return;
   346         }
   347         if( JAXB_SCHEMA_LOCATION.equals(name) ) {
   348             checkString( name, value );
   349             setSchemaLocation( (String)value );
   350             return;
   351         }
   352         if( JAXB_FRAGMENT.equals(name) )  {
   353             checkBoolean(name, value);
   354             setFragment((Boolean) value );
   355             return;
   356         }
   358         throw new PropertyException(name, value);
   359     }
   361     /**
   362      * Default implementation of the getProperty method handles
   363      * the four defined properties in Marshaller.  If a provider
   364      * needs to support additional provider specific properties,
   365      * it should override this method in a derived class.
   366      */
   367     public Object getProperty( String name )
   368         throws PropertyException {
   370         if( name == null ) {
   371             throw new IllegalArgumentException(
   372                 Messages.format( Messages.MUST_NOT_BE_NULL, "name" ) );
   373         }
   375         // recognize and handle four pre-defined properties.
   376         if( JAXB_ENCODING.equals(name) )
   377             return getEncoding();
   378         if( JAXB_FORMATTED_OUTPUT.equals(name) )
   379             return isFormattedOutput()?Boolean.TRUE:Boolean.FALSE;
   380         if( JAXB_NO_NAMESPACE_SCHEMA_LOCATION.equals(name) )
   381             return getNoNSSchemaLocation();
   382         if( JAXB_SCHEMA_LOCATION.equals(name) )
   383             return getSchemaLocation();
   384         if( JAXB_FRAGMENT.equals(name) )
   385             return isFragment()?Boolean.TRUE:Boolean.FALSE;
   387         throw new PropertyException(name);
   388     }
   389     /**
   390      * @see javax.xml.bind.Marshaller#getEventHandler()
   391      */
   392     public ValidationEventHandler getEventHandler() throws JAXBException {
   393         return eventHandler;
   394     }
   396     /**
   397      * @see javax.xml.bind.Marshaller#setEventHandler(ValidationEventHandler)
   398      */
   399     public void setEventHandler(ValidationEventHandler handler)
   400         throws JAXBException {
   402         if( handler == null ) {
   403             eventHandler = new DefaultValidationEventHandler();
   404         } else {
   405             eventHandler = handler;
   406         }
   407     }
   412     /*
   413      * assert that the given object is a Boolean
   414      */
   415     private void checkBoolean( String name, Object value ) throws PropertyException {
   416         if(!(value instanceof Boolean))
   417             throw new PropertyException(
   418                 Messages.format( Messages.MUST_BE_BOOLEAN, name ) );
   419     }
   421     /*
   422      * assert that the given object is a String
   423      */
   424     private void checkString( String name, Object value ) throws PropertyException {
   425         if(!(value instanceof String))
   426             throw new PropertyException(
   427                 Messages.format( Messages.MUST_BE_STRING, name ) );
   428     }
   430     /*
   431      * assert that the parameters are not null
   432      */
   433     private void checkNotNull( Object o1, String o1Name,
   434                                Object o2, String o2Name ) {
   436         if( o1 == null ) {
   437             throw new IllegalArgumentException(
   438                 Messages.format( Messages.MUST_NOT_BE_NULL, o1Name ) );
   439         }
   440         if( o2 == null ) {
   441             throw new IllegalArgumentException(
   442                 Messages.format( Messages.MUST_NOT_BE_NULL, o2Name ) );
   443         }
   444     }
   446     public void marshal(Object obj, XMLEventWriter writer)
   447         throws JAXBException {
   449         throw new UnsupportedOperationException();
   450     }
   452     public void marshal(Object obj, XMLStreamWriter writer)
   453         throws JAXBException {
   455         throw new UnsupportedOperationException();
   456     }
   458     public void setSchema(Schema schema) {
   459         throw new UnsupportedOperationException();
   460     }
   462     public Schema getSchema() {
   463         throw new UnsupportedOperationException();
   464     }
   466     public void setAdapter(XmlAdapter adapter) {
   467         if(adapter==null)
   468             throw new IllegalArgumentException();
   469         setAdapter((Class)adapter.getClass(),adapter);
   470     }
   472     public <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter) {
   473         throw new UnsupportedOperationException();
   474     }
   476     public <A extends XmlAdapter> A getAdapter(Class<A> type) {
   477         throw new UnsupportedOperationException();
   478     }
   480     public void setAttachmentMarshaller(AttachmentMarshaller am) {
   481         throw new UnsupportedOperationException();
   482     }
   484     public AttachmentMarshaller getAttachmentMarshaller() {
   485         throw new UnsupportedOperationException();
   486     }
   488     public void setListener(Listener listener) {
   489         throw new UnsupportedOperationException();
   490     }
   492     public Listener getListener() {
   493         throw new UnsupportedOperationException();
   494     }
   495 }

mercurial