/* * (C) Copyright 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * 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. * * Contributors: * bstefanescu */ package org.nuxeo.ecm.automation.client.jaxrs.impl; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import javax.activation.DataHandler; import javax.mail.MessagingException; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; import org.apache.http.entity.AbstractHttpEntity; import org.nuxeo.ecm.automation.client.Constants; import org.nuxeo.ecm.automation.client.jaxrs.util.BlobDataSource; import org.nuxeo.ecm.automation.client.model.Blob; import org.nuxeo.ecm.automation.client.model.HasFile; /** * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a> */ public class MultipartRequestEntity extends AbstractHttpEntity { protected MimeMultipart mp; public MultipartRequestEntity() { this(new MimeMultipart("related")); } public MultipartRequestEntity(String subType) { this(new MimeMultipart(subType)); } public MultipartRequestEntity(MimeMultipart mp) { this.mp = mp; setContentType(mp.getContentType() + "; type=\"" + Constants.CTYPE_REQUEST_NOCHARSET + "\"; start=\"request\""); } public void setRequest(String content) throws MessagingException { MimeBodyPart part = new MimeBodyPart(); part.setText(content, "UTF-8"); part.setContentID("request"); part.setHeader("Content-Type", Constants.CTYPE_REQUEST); part.setHeader("Content-Transfer-Encoding", "8bit"); part.setHeader("Content-Length", Integer.toString(content.length())); mp.addBodyPart(part); } public void setBlob(Blob blob) throws MessagingException, IOException { setBlob(blob, "input"); } protected void setBlob(Blob blob, String id) throws MessagingException, IOException { MimeBodyPart part = new MimeBodyPart(); if (blob instanceof HasFile) { part.attachFile(((HasFile) blob).getFile()); } else { part.setDataHandler(new DataHandler(new BlobDataSource(blob))); part.setFileName(blob.getFileName()); } part.setHeader("Content-Type", blob.getMimeType()); part.setHeader("Content-Transfer-Encoding", "binary"); int length = blob.getLength(); if (length > -1) { part.setHeader("Content-Length", Integer.toString(length)); } part.setContentID(id); mp.addBodyPart(part); } public void setBlobs(List<Blob> blobs) throws MessagingException, IOException { for (int i = 0, size = blobs.size(); i < size; i++) { setBlob(blobs.get(i), "input#" + i); } } public boolean isRepeatable() { return false; } public boolean isStreaming() { return false; } public InputStream getContent() throws IOException, IllegalStateException { throw new UnsupportedOperationException("Not a streaming entity"); } public void writeTo(OutputStream arg0) throws IOException { try { mp.writeTo(arg0); } catch (MessagingException e) { IOException ioe = new IOException(e.getMessage()); ioe.initCause(e); throw ioe; } } public long getContentLength() { return -1; } }