| 
   1  | 
import java.io.BufferedInputStream;  | 
    | 
   2  | 
import java.io.BufferedOutputStream;  | 
    | 
   3  | 
import java.io.FileOutputStream;  | 
    | 
   4  | 
import java.io.IOException;  | 
    | 
   5  | 
import java.io.InputStream;  | 
    | 
   6  | 
import java.util.Properties;  | 
    | 
   7  | 
 
     | 
    | 
   8  | 
import javax.activation.DataHandler;  | 
    | 
   9  | 
import javax.mail.Session;  | 
    | 
  10  | 
import javax.mail.internet.MimeBodyPart;  | 
    | 
  11  | 
import javax.mail.internet.MimeMessage;  | 
    | 
  12  | 
import javax.mail.internet.MimeMultipart;  | 
    | 
  13  | 
import javax.mail.internet.PreencodedMimeBodyPart;  | 
    | 
  14  | 
 
     | 
    | 
  15  | 
import org.apache.axis.utils.StringUtils;  | 
    | 
  16  | 
import org.apache.commons.httpclient.Header;  | 
    | 
  17  | 
import org.apache.commons.httpclient.HeaderElement;  | 
    | 
  18  | 
import org.apache.commons.httpclient.HttpClient;  | 
    | 
  19  | 
import org.apache.commons.httpclient.HttpException;  | 
    | 
  20  | 
import org.apache.commons.httpclient.HttpMethod;  | 
    | 
  21  | 
import org.apache.commons.httpclient.NameValuePair;  | 
    | 
  22  | 
import org.apache.commons.httpclient.methods.PostMethod;  | 
    | 
  23  | 
 
     | 
    | 
  24  | 
import com.sun.mail.util.LineInputStream;  | 
    | 
  25  | 
 
     | 
    | 
  26  | 
public class UCMDownloader {  | 
    | 
  27  | 
 
     | 
    | 
  28  | 
       
    public static void main(String[] args) {  | 
    | 
  29  | 
               
    HttpClient client = new HttpClient();  | 
    | 
  30  | 
               
    PostMethod method = new PostMethod(  | 
    | 
  31  | 
                               
    "http://www.oracle.com:16200/_dav/cs/idcplg");  | 
    | 
  32  | 
               
    long start = System.currentTimeMillis();  | 
    | 
  33  | 
               
    String fileName = "Test.txt";  | 
    | 
  34  | 
 
     | 
    | 
  35  | 
               
    try {  | 
    | 
  36  | 
 
     | 
    | 
  37  | 
                       
    method.addRequestHeader("SOAPAction",  | 
    | 
  38  | 
                                       
    "\"http://www.stellent.com/GetFile/\"");  | 
    | 
  39  | 
 
     | 
    | 
  40  | 
                       
    MimeMessage message = new MimeMessage(  | 
    | 
  41  | 
                                       
    Session.getDefaultInstance(new Properties()));  | 
    | 
  42  | 
                       
    MimeMultipart mp = new MimeMultipart();  | 
    | 
  43  | 
 
     | 
    | 
  44  | 
                       
    // Create the first
    body part  | 
    | 
  45  | 
                       
    StringBuffer requestXML = constructRequest(fileName);
     | 
    | 
  46  | 
                       
    long requestSize = requestXML.length();  | 
    | 
  47  | 
                       
    MimeBodyPart rootPart = new PreencodedMimeBodyPart("8bit");  | 
    | 
  48  | 
                       
    rootPart.setContentID("rootContent");  | 
    | 
  49  | 
                       
    rootPart.setDataHandler(new DataHandler(new RequestXmlDataSource(  | 
    | 
  50  | 
                                       
    requestXML.toString())));
     | 
    | 
  51  | 
 
     | 
    | 
  52  | 
                       
    mp.addBodyPart(rootPart, 0);  | 
    | 
  53  | 
 
     | 
    | 
  54  | 
                       
    message.setContent(mp);
     | 
    | 
  55  | 
                       
    message.saveChanges();
     | 
    | 
  56  | 
 
     | 
    | 
  57  | 
                       
    String cType = message.getHeader("Content-Type")[0];  | 
    | 
  58  | 
                       
    int idx = cType.indexOf("boundary");  | 
    | 
  59  | 
                       
    int boundryLength = 0;  | 
    | 
  60  | 
                       
    if (idx != -1) {  | 
    | 
  61  | 
                               
    boundryLength = cType.substring(idx + 9).length();  | 
    | 
  62  | 
                       
    }  | 
    | 
  63  | 
 
     | 
    | 
  64  | 
                       
    long contentLength = (boundryLength * 2) + 2 + requestSize + 6;  | 
    | 
  65  | 
 
     | 
    | 
  66  | 
 
     | 
    | 
  67  | 
                       
    method.setDoAuthentication(true);  | 
    | 
  68  | 
                       
    method.setRequestBody(requestXML.toString());  | 
    | 
  69  | 
 
     | 
    | 
  70  | 
                       
    method.addRequestHeader("Content-Length",  | 
    | 
  71  | 
                                       
    String.valueOf(requestXML.length()));  | 
    | 
  72  | 
                       
    method.addRequestHeader("Content-Type", "text/xml;charset=UTF-8");  | 
    | 
  73  | 
                       
    method.getParams().setParameter("http.socket.timeout",  | 
    | 
  74  | 
                                       
    new Integer(0));  | 
    | 
  75  | 
 
     | 
    | 
  76  | 
                       
    // send the request
     | 
    | 
  77  | 
                       
    int status = client.executeMethod(method);               
     | 
    | 
  78  | 
                       
     | 
    | 
  79  | 
                       
    // process the response
     | 
    | 
  80  | 
                       
    contentLength = getContentLength(method);
     | 
    | 
  81  | 
                       
     | 
    | 
  82  | 
                       
    String boundary = getBoundary(method);  | 
    | 
  83  | 
                       
    if (boundary != null) {  | 
    | 
  84  | 
                               
    // Boundary foe each
    Body Part  | 
    | 
  85  | 
                               
    boundary = "--" + boundary;  | 
    | 
  86  | 
                       
    }  | 
    | 
  87  | 
 
     | 
    | 
  88  | 
                       
    BufferedInputStream bin = new BufferedInputStream(  | 
    | 
  89  | 
                                       
    method.getResponseBodyAsStream());
     | 
    | 
  90  | 
                       
    LineInputStream lin = new LineInputStream(bin);  | 
    | 
  91  | 
 
     | 
    | 
  92  | 
                       
    boolean rootBoundaryEncountered = false;  | 
    | 
  93  | 
                       
    boolean attachmentBoundaryEncountered = false;  | 
    | 
  94  | 
 
     | 
    | 
  95  | 
                       
    String line = null;  | 
    | 
  96  | 
                       
    long readSoFar = 0;  | 
    | 
  97  | 
                       
    while ((line = lin.readLine()) != null) {  | 
    | 
  98  | 
                               
    readSoFar += line.length() +2; // 2 for \r\n  | 
    | 
  99  | 
                               
    if (line.equals(boundary)) {  | 
    | 
 100  | 
                                       
    if (!rootBoundaryEncountered) {
     | 
    | 
 101  | 
                                               
    // boundary for root
    body part  | 
    | 
 102  | 
                                               
    rootBoundaryEncountered = true;  | 
    | 
 103  | 
                                               
    continue;  | 
    | 
 104  | 
                                       
    } else { // root bodypart already read so we are ready to
     | 
    | 
 105  | 
                                                               
    // read next body part
     | 
    | 
 106  | 
                                               
    attachmentBoundaryEncountered = true;  | 
    | 
 107  | 
                                       
    }  | 
    | 
 108  | 
                               
    } else if (line.length() == boundary.length() + 2  | 
    | 
 109  | 
                                               
    && line.startsWith(boundary) && line.endsWith("--")) {  | 
    | 
 110  | 
                                               
    // End of response
     | 
    | 
 111  | 
                                       
    line = null;  | 
    | 
 112  | 
                                       
    break;  | 
    | 
 113  | 
                               
    } else if (!StringUtils.isEmpty(line)) {  | 
    | 
 114  | 
                                       
    System.out.println(line);  | 
    | 
 115  | 
                                       
    // header part and SOAP
    XML goes here  | 
    | 
 116  | 
                               
    } else { // the attachment content always follows the blank
    line  | 
    | 
 117  | 
                                       
    if (attachmentBoundaryEncountered) {
     | 
    | 
 118  | 
                                               
    // save the attachment
    content into file  | 
    | 
 119  | 
                                               
    saveAttachment(bin, boundary, contentLength, readSoFar);
     | 
    | 
 120  | 
                                               
    break;  | 
    | 
 121  | 
                                       
    }  | 
    | 
 122  | 
                               
    }  | 
    | 
 123  | 
                       
    }  | 
    | 
 124  | 
 
     | 
    | 
 125  | 
               
    } catch (HttpException e) {  | 
    | 
 126  | 
                       
    e.printStackTrace();
     | 
    | 
 127  | 
               
    } catch (IOException e) {  | 
    | 
 128  | 
                       
    e.printStackTrace();
     | 
    | 
 129  | 
               
    } catch (Exception e) {  | 
    | 
 130  | 
                       
    e.printStackTrace();
     | 
    | 
 131  | 
               
    } finally {  | 
    | 
 132  | 
                       
    long end = System.currentTimeMillis();  | 
    | 
 133  | 
                       
    System.out.println("Time taken for [" + fileName + "]: "  | 
    | 
 134  | 
                                       
    + (end - start));  | 
    | 
 135  | 
                       
    // release any
    connection resources used by the method  | 
    | 
 136  | 
                       
    method.releaseConnection();
     | 
    | 
 137  | 
               
    }  | 
    | 
 138  | 
       
    }  | 
    | 
 139  | 
 
     | 
    | 
 140  | 
       
    public static StringBuffer constructRequest(String fileName) {  | 
    | 
 141  | 
               
    StringBuffer request = new StringBuffer();  | 
    | 
 142  | 
               
    request.append("<soapenv:Envelope  | 
    | 
 143  | 
                       
    xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"  | 
    | 
 144  | 
                       
    xmlns:get=\"http://www.stellent.com/GetFile/\">\r\n"  | 
    | 
 145  | 
                               
    + "   <soapenv:Header/>\r\n"  | 
    | 
 146  | 
                               
    + "   <soapenv:Body>\r\n"  | 
    | 
 147  | 
                               
    + "     
    <get:GetFileByName>\r\n"  | 
    | 
 148  | 
                               
    + "        
    <get:dDocName>"+ fileName +"</get:dDocName>\r\n"  | 
    | 
 149  | 
                               
    + "        
    <get:revisionSelectionMethod>  | 
    | 
 150  | 
                               
    LatestReleased</get:revisionSelectionMethod>\r\n"  | 
    | 
 151  | 
                               
    + "        
    <get:rendition>primary</get:rendition>\r\n"  | 
    | 
 152  | 
                               
    + "        
    <get:extraProps>\r\n"  | 
    | 
 153  | 
                               
    + "           
    <get:property>\r\n"  | 
    | 
 154  | 
                               
    + "              
    <get:name>soapResponseType</get:name>\r\n"  | 
    | 
 155  | 
                               
    + "              
    <get:value>Multipart/Related</get:value>\r\n"  | 
    | 
 156  | 
                               
    + "           
    </get:property>\r\n"  | 
    | 
 157  | 
                               
    + "        
    </get:extraProps>\r\n"  | 
    | 
 158  | 
                               
    + "      </get:GetFileByName>\r\n"  | 
    | 
 159  | 
                               
    + "   </soapenv:Body>\r\n"  | 
    | 
 160  | 
                               
    + "</soapenv:Envelope>");  | 
    | 
 161  | 
 
     | 
    | 
 162  | 
               
    return request;  | 
    | 
 163  | 
       
    }  | 
    | 
 164  | 
 
     | 
    | 
 165  | 
       
    public static String getBoundary(HttpMethod httpMethod) {  | 
    | 
 166  | 
               
    Header h = null;  | 
    | 
 167  | 
               
    String boundary = null;  | 
    | 
 168  | 
 
     | 
    | 
 169  | 
               
    h = httpMethod.getResponseHeader("Content-Type");  | 
    | 
 170  | 
 
     | 
    | 
 171  | 
               
    if (h != null) {  | 
    | 
 172  | 
                       
    HeaderElement[] elements = h.getElements();  | 
    | 
 173  | 
 
     | 
    | 
 174  | 
                       
    for (HeaderElement element : elements) {  | 
    | 
 175  | 
                               
    String name = element.getName().toUpperCase();  | 
    | 
 176  | 
                               
    if (name.startsWith("MULTIPART/")) {  | 
    | 
 177  | 
                                       
    NameValuePair parameter = element  | 
    | 
 178  | 
                                                       
    .getParameterByName("boundary");  | 
    | 
 179  | 
                                       
    if (parameter != null) {  | 
    | 
 180  | 
                                               
    boundary = parameter.getValue();  | 
    | 
 181  | 
                                       
    }  | 
    | 
 182  | 
                               
    }  | 
    | 
 183  | 
                       
    }  | 
    | 
 184  | 
               
    }  | 
    | 
 185  | 
 
     | 
    | 
 186  | 
               
    return boundary;  | 
    | 
 187  | 
       
    }  | 
    | 
 188  | 
       
     | 
    | 
 189  | 
       
    public static long getContentLength(HttpMethod httpMethod) {  | 
    | 
 190  | 
               
    Header h = null;  | 
    | 
 191  | 
               
    String contentLen = "0";  | 
    | 
 192  | 
 
     | 
    | 
 193  | 
               
    h = httpMethod.getResponseHeader("Content-Length");  | 
    | 
 194  | 
               
    if (h != null) {  | 
    | 
 195  | 
                       
    contentLen = h.getValue();  | 
    | 
 196  | 
               
    }  | 
    | 
 197  | 
               
     | 
    | 
 198  | 
               
    long contentLength = Long.valueOf(contentLen).longValue();  | 
    | 
 199  | 
               
     | 
    | 
 200  | 
               
    return contentLength;
     | 
    | 
 201  | 
       
    }  | 
    | 
 202  | 
 
     | 
    | 
 203  | 
       
    public static void saveAttachment(BufferedInputStream responseStream,  | 
    | 
 204  | 
               
    String boundary, long totalBytes, long totalBytesRead) {  | 
    | 
 205  | 
               
    try {  | 
    | 
 206  | 
                       
    if (responseStream != null) {  | 
    | 
 207  | 
                               
    BufferedOutputStream out = new BufferedOutputStream(  | 
    | 
 208  | 
                                               
    new FileOutputStream(  | 
    | 
 209  | 
                                                               
    "c:\\temp\\test.txt"));  | 
    | 
 210  | 
                               
    byte data[] = new byte[4096];  | 
    | 
 211  | 
                               
    int bytesread = -1;  | 
    | 
 212  | 
                               
    boolean boundaryEndHit = false;  | 
    | 
 213  | 
                               
    int boundaryEnd = boundary.length()+6;  | 
    | 
 214  | 
                               
     | 
    | 
 215  | 
                               
    System.out.println("Attachment Starts Here ========= ");  | 
    | 
 216  | 
                               
     | 
    | 
 217  | 
                               
    while ((bytesread = responseStream.read(data)) != -1) {  | 
    | 
 218  | 
                                       
    totalBytesRead += bytesread;  | 
    | 
 219  | 
                                       
     | 
    | 
 220  | 
                                       
    if (totalBytesRead <= (totalBytes -  | 
    | 
 221  | 
                                               
    boundaryEnd)) {  | 
    | 
 222  | 
                                               
    out.write(data, 0, bytesread);  | 
    | 
 223  | 
                                       
    } else if (totalBytesRead > (totalBytes -  | 
    | 
 224  | 
                                               
    boundaryEnd)) {  | 
    | 
 225  | 
                                               
    out.write(data, 0, bytesread -  | 
    | 
 226  | 
                                                       
    (int) (totalBytesRead -  | 
    | 
 227  | 
                                                               
    (totalBytes - boundaryEnd)));
     | 
    | 
 228  | 
                                       
    }  | 
    | 
 229  | 
                               
    }  | 
    | 
 230  | 
                               
     | 
    | 
 231  | 
                               
    responseStream.close();  | 
    | 
 232  | 
                               
    out.close();  | 
    | 
 233  | 
                       
    }  | 
    | 
 234  | 
               
    } catch (Exception e) {  | 
    | 
 235  | 
                       
    e.printStackTrace();
     | 
    | 
 236  | 
               
    }  | 
    | 
 237  | 
       
    }  | 
    | 
 238  | 
}
     |