You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by bu...@apache.org on 2002/08/13 17:17:14 UTC

cvs commit: xml-axis/java/src/org/apache/axis/utils JavaUtils.java

butek       2002/08/13 08:17:13

  Modified:    java/src/org/apache/axis/encoding
                        DefaultTypeMappingImpl.java
               java/src/org/apache/axis/providers/java RPCProvider.java
               java/src/org/apache/axis/utils JavaUtils.java
  Log:
  Fix for http://nagoya.apache.org/bugzilla/show_bug.cgi?id=11519.
  AXIS no longer requires activation.jar and mail.jar to run.  It DOES
  require them to build, however.
  
  Revision  Changes    Path
  1.44      +19 -15    xml-axis/java/src/org/apache/axis/encoding/DefaultTypeMappingImpl.java
  
  Index: DefaultTypeMappingImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DefaultTypeMappingImpl.java,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- DefaultTypeMappingImpl.java	13 Aug 2002 06:03:27 -0000	1.43
  +++ DefaultTypeMappingImpl.java	13 Aug 2002 15:17:13 -0000	1.44
  @@ -121,9 +121,11 @@
   
           // Since the last-registered type wins, I want to add the mime
           // String FIRST.
  -        myRegister(Constants.MIME_PLAINTEXT, java.lang.String.class,
  -                new JAFDataHandlerSerializerFactory(),
  -                new JAFDataHandlerDeserializerFactory(), false);
  +        if (JavaUtils.isAttachmentSupported()) {
  +            myRegister(Constants.MIME_PLAINTEXT, java.lang.String.class,
  +                    new JAFDataHandlerSerializerFactory(),
  +                    new JAFDataHandlerDeserializerFactory(), false);
  +        }
   
           // SOAP Encoded strings are treated as primitives.
           // Everything else is not.
  @@ -360,18 +362,20 @@
   
           // Register all the supported MIME types
           // (note that MIME_PLAINTEXT was registered near the top)
  -        myRegister(Constants.MIME_IMAGE, java.awt.Image.class,
  -                new JAFDataHandlerSerializerFactory(),
  -                new JAFDataHandlerDeserializerFactory(), false);
  -        myRegister(Constants.MIME_MULTIPART, javax.mail.internet.MimeMultipart.class,
  -                new JAFDataHandlerSerializerFactory(),
  -                new JAFDataHandlerDeserializerFactory(), false);
  -        myRegister(Constants.MIME_SOURCE, javax.xml.transform.Source.class,
  -                new JAFDataHandlerSerializerFactory(),
  -                new JAFDataHandlerDeserializerFactory(), false);
  -        myRegister(Constants.MIME_DATA_HANDLER, javax.activation.DataHandler.class,
  -                new JAFDataHandlerSerializerFactory(),
  -                new JAFDataHandlerDeserializerFactory(), false);
  +        if (JavaUtils.isAttachmentSupported()) {
  +            myRegister(Constants.MIME_IMAGE, java.awt.Image.class,
  +                    new JAFDataHandlerSerializerFactory(),
  +                    new JAFDataHandlerDeserializerFactory(), false);
  +            myRegister(Constants.MIME_MULTIPART, javax.mail.internet.MimeMultipart.class,
  +                    new JAFDataHandlerSerializerFactory(),
  +                    new JAFDataHandlerDeserializerFactory(), false);
  +            myRegister(Constants.MIME_SOURCE, javax.xml.transform.Source.class,
  +                    new JAFDataHandlerSerializerFactory(),
  +                    new JAFDataHandlerDeserializerFactory(), false);
  +            myRegister(Constants.MIME_DATA_HANDLER, javax.activation.DataHandler.class,
  +                    new JAFDataHandlerSerializerFactory(),
  +                    new JAFDataHandlerDeserializerFactory(), false);
  +        }
   
           // xsd:token
           myRegister(Constants.XSD_TOKEN, org.apache.axis.types.Token.class,
  
  
  
  1.84      +51 -8     xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java
  
  Index: RPCProvider.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/providers/java/RPCProvider.java,v
  retrieving revision 1.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- RPCProvider.java	9 Aug 2002 13:56:24 -0000	1.83
  +++ RPCProvider.java	13 Aug 2002 15:17:13 -0000	1.84
  @@ -70,6 +70,7 @@
   import org.apache.axis.message.SOAPEnvelope;
   import org.apache.axis.message.SOAPBodyElement;
   import org.apache.axis.soap.SOAPConstants;
  +import org.apache.axis.utils.ClassUtils;
   import org.apache.axis.utils.JavaUtils;
   
   import org.apache.axis.components.logger.LogFactory;
  @@ -82,6 +83,7 @@
   
   import java.io.IOException;
   
  +import java.lang.reflect.Constructor;
   import java.lang.reflect.Method;
   
   import java.util.Vector;
  @@ -230,8 +232,9 @@
                   value = JavaUtils.convert(value,
                                             sigType);
   
  -                if (value instanceof DataHandler) {
  -                    value = getDataFromDataHandler((DataHandler) value, paramDesc);
  +                if (value != null && value.getClass().getName().equals(
  +                        "javax.activation.DataHandler")) {
  +                    value = getDataFromDataHandler(value, paramDesc);
                   }
   
                   rpcParam.setValue(value);
  @@ -351,12 +354,16 @@
                       if ("Image".equals(MIMEName)) {
                       }
                       else if ("PlainText".equals(MIMEName)) {
  -                        value = new DataHandler(
  -                                new PlainTextDataSource("out", (String) value));
  +                        value = instantiateDataHandler(
  +                            "org.apache.axis.attachments.PlainTextDataSource",
  +                            "java.lang.String",
  +                            value);
                       }
                       else if ("Multipart".equals(MIMEName)) {
  -                        value = new DataHandler(new MimeMultipartDataSource(
  -                                "out", (MimeMultipart) value));
  +                        value = instantiateDataHandler(
  +                            "org.apache.axis.attachments.MultipartDataSource",
  +                            "javax.mail.internet.MimeMultipart",
  +                            value);
                       }
                       else if ("Source".equals(MIMEName)) {
                       }
  @@ -369,7 +376,43 @@
           resEnv.addBodyElement(resBody);
       }
   
  -    private Object getDataFromDataHandler(DataHandler handler, ParameterDesc paramDesc) {
  +    /**
  +     * This method is the same as:
  +     *   new DataHandler(new DataSource("out", value));
  +     * but we want to be able to instantiate an RPCProvider without
  +     * requiring activation.jar and mail.jar.  If we use the raw
  +     * new statement, we get an error on instantiation of RPCProvider.
  +     */
  +    private Object instantiateDataHandler(String dataSourceName,
  +            String valueClass, Object value) {
  +        try {
  +            // Instantiate the DataSource
  +            Class dataSource = ClassUtils.forName(dataSourceName);
  +            Class[] dsFormalParms = {String.class,
  +                    ClassUtils.forName(valueClass)};
  +            Object[] dsActualParms = {"out", value};
  +            Constructor ctor = dataSource.getConstructor(dsFormalParms);
  +            Object ds = ctor.newInstance(dsActualParms);
  +
  +            // Instantiate the DataHandler
  +            Class dataHandler = ClassUtils.forName(
  +                    "javax.activation.DataHandler");
  +            Class[] dhFormalParms = {ClassUtils.forName(
  +                    "javax.activation.DataSource")};
  +            Object[] dhActualParms = {ds};
  +            ctor = dataHandler.getConstructor(dhFormalParms);
  +            value = ctor.newInstance(dhActualParms);
  +        }
  +        catch (Throwable t) {
  +            // If we have a problem, just return the input value
  +        }
  +        return value;
  +    } // instantiateDataHandler
  +
  +    /**
  +     * Get the data from the DataHandler.
  +     */
  +    private Object getDataFromDataHandler(Object handler, ParameterDesc paramDesc) {
           Object value = handler;
           QName qname = paramDesc.getTypeQName();
           if (qname != null &&
  @@ -378,7 +421,7 @@
                    qname.equals(Constants.MIME_MULTIPART) ||
                    qname.equals(Constants.MIME_SOURCE))) {
               try {
  -                value = handler.getContent();
  +                value = ((DataHandler) handler).getContent();
               }
               catch (IOException ioe) {
                   // If there are any problems, just return the DataHandler.
  
  
  
  1.69      +32 -1     xml-axis/java/src/org/apache/axis/utils/JavaUtils.java
  
  Index: JavaUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/JavaUtils.java,v
  retrieving revision 1.68
  retrieving revision 1.69
  diff -u -r1.68 -r1.69
  --- JavaUtils.java	12 Aug 2002 22:52:13 -0000	1.68
  +++ JavaUtils.java	13 Aug 2002 15:17:13 -0000	1.69
  @@ -254,7 +254,8 @@
           }
   
           // Convert an AttachmentPart to the given destination class.
  -        if (arg instanceof AttachmentPart || arg instanceof DataHandler) {
  +        if (isAttachmentSupported() &&
  +                (arg instanceof AttachmentPart || arg instanceof DataHandler)) {
               try {
                   String destName = destClass.getName();
                   if (destClass == String.class
  @@ -1120,4 +1121,34 @@
               return null;
           }
       } // mimeToJava
  +
  +    //avoid testing and possibly failing everytime.
  +    private static boolean checkForAttchmentSupport = true;
  +    private static boolean attachmentSupportEnabled = false;
  +
  +    /**
  +     * Determine whether attachments are supported by checking if the following
  +     * classes are available:  javax.activation.DataHandler,
  +     * javax.mail.internet.MimeMultipart.
  +     */
  +    public static synchronized boolean isAttachmentSupported() {
  +
  +        if (checkForAttchmentSupport) {
  +            //aviod testing and possibly failing everytime.
  +            checkForAttchmentSupport = false;
  +            try {
  +                // Attempt to resolve DataHandler and MimeMultipart and
  +                // javax.xml.transform.Source, all necessary for full
  +                // attachment support
  +                ClassUtils.forName("javax.activation.DataHandler");
  +                ClassUtils.forName("javax.mail.internet.MimeMultipart");
  +                attachmentSupportEnabled = true;
  +            } catch (Throwable t) {
  +            }
  +        }
  +
  +        log.debug(JavaUtils.getMessage("attachEnabled") + "  " +
  +                attachmentSupportEnabled);
  +        return attachmentSupportEnabled;
  +    } // isAttachmentSupported
   }