/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.submit.transports.http.support.attachments;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.wsdl.support.xsd.SchemaUtils;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.editor.inspectors.attachments.ContentTypeHandler;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.xmlbeans.SchemaType;
import org.apache.xmlbeans.XmlBase64Binary;
import org.apache.xmlbeans.XmlHexBinary;
import javax.activation.DataSource;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* DataSource for XOP/MTOM attachments
*
* @author ole.matzura
*/
public final class XOPPartDataSource implements DataSource {
private String content;
private final String contentType;
private final SchemaType schemaType;
private File source;
public XOPPartDataSource(String content, String contentType, SchemaType schemaType) {
this.content = content;
this.contentType = contentType;
this.schemaType = schemaType;
}
public XOPPartDataSource(File source, String contentType, SchemaType schemaType) {
this.source = source;
this.contentType = contentType;
this.schemaType = schemaType;
}
public String getContentType() {
return StringUtils.isNullOrEmpty(contentType) ? ContentTypeHandler.DEFAULT_CONTENTTYPE : contentType;
}
public InputStream getInputStream() throws IOException {
try {
if (source != null) {
return new FileInputStream(source);
}
if (SchemaUtils.isInstanceOf(schemaType, XmlHexBinary.type)) {
return new ByteArrayInputStream(Hex.decodeHex(content.toCharArray()));
} else if (SchemaUtils.isInstanceOf(schemaType, XmlBase64Binary.type)) {
return new ByteArrayInputStream(Base64.decodeBase64(content.getBytes()));
} else if (SchemaUtils.isAnyType(schemaType)) {
return new ByteArrayInputStream(content.getBytes());
} else {
throw new IOException("Invalid type for XOPPartDataSource; " + schemaType.getName());
}
} catch (Exception e) {
SoapUI.logError(e);
throw new IOException(e.toString());
}
}
public String getName() {
return String.valueOf(schemaType.getName());
}
public OutputStream getOutputStream() throws IOException {
return null;
}
}