Mark,

this great!! unfortuantely the email munges the patches...can you
please open a jira bug and then upload the patch?
http://issues.apache.org/jira/

thanks,
dims


On Mon, 14 Mar 2005 11:08:03 -0500, Marc Dumontier
<[EMAIL PROTECTED]> wrote:
> Hi,
> 
> I wrote a small patch for axis 1.2 RC3 to allow me to take advantage
> DIME record chunking. This allows people who generate dynamic content
> who don't know the size of their data beforehand to stream out.
> 
> I've been streaming 2GB+ attachments out with no problem.
> 
> Using it is very simple
> 
> for example:
> 
> DynamicContentDataHandler datahandler = null;
> URL url = new URL("http",host,port,QUERY_STRING);
> URLDataSource dataSource = new URLDataSource(url);
> datahandler = new DynamicContentDataHandler(dataSource);
> datahandler.setChunkSize(10 * 1024 * 1024);
> 
> This will make dime record chunks of 10MB, and only buffer 20MB of data
> at any one time.
> 
> 
> Marc Dumontier
> Bioinformatics Software Developer
> Blueprint Initiative
> http://www.blueprint.org
> 
> 
> diff -Naur 
> ../../axis/axis-1_2RC3/src/org/apache/axis/attachments/DimeBodyPart.java 
> ./src/org/apache/axis/attachments/DimeBodyPart.java
> --- ../../axis/axis-1_2RC3/src/org/apache/axis/attachments/DimeBodyPart.java  
>   2005-02-28 22:41:19.000000000 -0500
> +++ ./src/org/apache/axis/attachments/DimeBodyPart.java 2005-03-11 
> 14:30:30.644650882 -0500
> @@ -21,14 +21,16 @@
>  package org.apache.axis.attachments;
> 
> -import org.apache.axis.components.logger.LogFactory;
> -import org.apache.axis.utils.Messages;
> -import org.apache.commons.logging.Log;
> +import java.io.BufferedInputStream;
> +import java.io.IOException;
> +import java.util.StringTokenizer;
> 
>  import javax.activation.DataHandler;
>  import javax.activation.DataSource;
> -import java.util.StringTokenizer;
> -import java.io.IOException;
> +
> +import org.apache.axis.components.logger.LogFactory;
> +import org.apache.axis.utils.Messages;
> +import org.apache.commons.logging.Log;
> 
>  /**
> @@ -220,10 +222,12 @@
>                      Messages.getMessage("attach.dimeMaxChunkSize0", "" + 
> maxchunk));
>          if (maxchunk > MAX_DWORD) throw new IllegalArgumentException(
>                      Messages.getMessage("attach.dimeMaxChunkSize1", "" + 
> maxchunk));
> -        if (data instanceof byte[]) send(os, position, (byte[]) data,
> -          maxchunk);
> -        if (data instanceof DataHandler) send(os, position,
> -        (DataHandler) data, maxchunk);
> +        if (data instanceof byte[])
> +               send(os, position, (byte[]) data, maxchunk);
> +        else if (data instanceof DynamicContentDataHandler) send(os, 
> position,
> +                (DynamicContentDataHandler) data, maxchunk);
> +        else if (data instanceof DataHandler) send(os, position,
> +                       (DataHandler) data, maxchunk);
>      }
> 
>      /**
> @@ -300,6 +304,57 @@
>          }
>  // END FIX: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17001
>      }
> +
> +    /**
> +     * Special case for dynamically generated content.
> +     * maxchunk is currently ignored since the default is 2GB.
> +     * The chunk size is retrieved from the DynamicContentDataHandler
> +     *
> +     * @param os
> +     * @param position
> +     * @param dh
> +     * @param maxchunk
> +     * @throws java.io.IOException
> +     */
> +    void send(java.io.OutputStream os, byte position, 
> DynamicContentDataHandler dh,
> +            final long maxchunk)
> +            throws java.io.IOException {
> +
> +               BufferedInputStream in = new 
> BufferedInputStream(dh.getInputStream());
> +
> +               final int myChunkSize = dh.getChunkSize();
> +
> +               byte[] buffer1 = new byte[myChunkSize];
> +               byte[] buffer2 = new byte[myChunkSize];
> +
> +               int bytesRead1 = 0 , bytesRead2 = 0;
> +               byte chunknext = 0;
> +
> +               bytesRead1 = in.read(buffer1);
> +
> +               if(bytesRead1 < 0) {
> +                       //no data all.should we be sending an empty dime 
> record?
> +                       throw new IOException("No data found to send in DIME 
> message");
> +               }
> +
> +               do {
> +                       bytesRead2 = in.read(buffer2);
> +
> +                       if(bytesRead2 < 0) {
> +                               //last record...do not set the chunk bit.
> +                               //buffer1 contains the last chunked record!
> +                               sendChunk(os, position, buffer1, 0, 
> bytesRead1, (byte)0);
> +                               break;
> +                       }
> +
> +                       sendChunk(os, position, buffer1, 0, bytesRead1, 
> (byte)CHUNK);
> +
> +                       //now that we have written out buffer1, copy buffer2 
> into to buffer1
> +                       System.arraycopy(buffer2,0,buffer1,0,myChunkSize);
> +                       bytesRead1 = bytesRead2;
> +
> +               }while(bytesRead2 > 0);
> +    }
> 
>      protected void sendChunk(java.io.OutputStream os,
>      final byte position,
> diff -Naur 
> ../../axis/axis-1_2RC3/src/org/apache/axis/attachments/DynamicContentDataHandler.java
>  ./src/org/apache/axis/attachments/DynamicContentDataHandler.java
> --- 
> ../../axis/axis-1_2RC3/src/org/apache/axis/attachments/DynamicContentDataHandler.java
>        1969-12-31 19:00:00.000000000 -0500
> +++ ./src/org/apache/axis/attachments/DynamicContentDataHandler.java    
> 2005-03-11 14:30:24.974794757 -0500
> @@ -0,0 +1,72 @@
> +/*
> + * Copyright 2001-2004 The Apache Software Foundation.
> + *
> + * 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 org.apache.axis.attachments;
> +
> +import java.net.URL;
> +
> +import javax.activation.DataHandler;
> +import javax.activation.DataSource;
> +
> +/**
> + * To be used with writing out DIME Attachments.
> + *
> + * AXIS will use DIME record chunking.
> + *
> + * @author Marc Dumontier ([EMAIL PROTECTED])
> + *
> + */
> +public class DynamicContentDataHandler extends DataHandler {
> +
> +       int chunkSize = 1*1024*1024;
> +
> +       /**
> +        * @param arg0
> +        */
> +       public DynamicContentDataHandler(DataSource arg0) {
> +               super(arg0);
> +       }
> +
> +       /**
> +        * @param arg0
> +        * @param arg1
> +        */
> +       public DynamicContentDataHandler(Object arg0, String arg1) {
> +               super(arg0, arg1);
> +       }
> +
> +       /**
> +        * @param arg0
> +        */
> +       public DynamicContentDataHandler(URL arg0) {
> +               super(arg0);
> +       }
> +
> +       /**
> +        * Get the DIME record chunk size
> +        * @return The value
> +        */
> +       public int getChunkSize() {
> +               return chunkSize;
> +       }
> +
> +       /**
> +        * Set the DIME record chunk size
> +        * @param chunkSize The value.
> +        */
> +       public void setChunkSize(int chunkSize) {
> +               this.chunkSize = chunkSize;
> +       }
> +}
> 
> 
> 


-- 
Davanum Srinivas - http://webservices.apache.org/~dims/

Reply via email to