blob: 85d0f44a039c1ff52de52bac09d8ac9f94c3ea29 [file] [log] [blame]
/*
* Copyright 2004,2005 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 sample.mtom.filetransfer.service;
import org.apache.axiom.attachments.Attachments;
import org.apache.axiom.om.*;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.wsdl.WSDLConstants;
import javax.activation.DataHandler;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.xml.namespace.QName;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.Iterator;
public class MTOMService {
private OperationContext opcts;
private OMElement folder;
private OMElement files;
private OMElement file;
private String folderName;
public void setOperationContext(OperationContext oc) throws AxisFault {
opcts = oc;
}
/**
* @param element The OMElement handed by the Axis2 engine
* @return An OMElement containing the response of the operation
* @throws Exception
*/
public OMElement uploadFileUsingMTOM(OMElement element) throws Exception {
Iterator itr = element.getChildElements();
folder = (OMElement) itr.next(); // Get the folderName element
// Throw AxisFault if destination folder is null
if (folder == null) throw new AxisFault("Destination Folder is null");
folderName = folder.getText();
// Create destination folder hierarchy if it does not exist
File destFolder = new File(folderName);
if (!destFolder.exists()) {
destFolder.mkdirs();
}
files = (OMElement) itr.next(); // Get the files element
itr = files.getChildElements(); // Get iterator for file elements
int i = 1;
String fileName;
// loop through each file element
while (itr.hasNext()) {
file = (OMElement) itr.next(); // Get next file element
// Throw AxisFault if the file element is null
if (file == null) throw new AxisFault("File " + i + " is null");
OMText binaryNode = (OMText) file.getFirstOMChild();
binaryNode.setBinary(true);
DataHandler dataHandler;
dataHandler = (DataHandler) binaryNode.getDataHandler(); // Get corresponding DataHandler
fileName = createFileName(i);
writeData(dataHandler.getDataSource().getInputStream(), fileName);
i++;
}
// Create response element
OMFactory fac = OMAbstractFactory.getOMFactory(); // Get OMFactory
OMNamespace ns = fac.createOMNamespace("urn://fakenamespace", "ns"); // Create a namespace
OMElement ele = fac.createOMElement("response", ns); // Create response element
ele.setText("" + (i - 1) + " File(s) Saved Successfully on Server at " + folderName);
return ele;
}
/**
* @param element The OMElement handed by the Axis2 engine
* @return An OMElement containing the response of the operation
* @throws Exception
*/
public OMElement uploadFileUsingSwA(OMElement element) throws Exception {
Iterator itr = element.getChildElements();
folder = (OMElement) itr.next(); // Get the folderName element
// Throw AxisFault if destination folder is null
if (folder == null) throw new AxisFault("Destination Folder is null");
folderName = folder.getText();
// Create destination folder hierarchy if it does not exist
File destFolder = new File(folderName);
if (!destFolder.exists()) {
destFolder.mkdirs();
}
files = (OMElement) itr.next(); // Get the files element
itr = files.getChildElements(); // Get iterator for file elements
// Get attachements from the MessageContext
Attachments attachment = (opcts.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE)).getAttachmentMap();
// loop through each file element
int i = 1;
String fileName;
DataHandler dataHandler;
while (itr.hasNext()) {
file = (OMElement) itr.next();
if (file == null) throw new AxisFault("File " + i + " is null");
dataHandler = attachment.getDataHandler(file.getText()); // Get corresponding DataHandler
fileName = createFileName(i);
writeData(dataHandler.getDataSource().getInputStream(), fileName);
i++;
}
// Create response element
OMFactory fac = OMAbstractFactory.getOMFactory(); // Get OMFactory
OMNamespace ns = fac.createOMNamespace("urn://fakenamespace", "ns"); // Create a namespace
OMElement ele = fac.createOMElement("response", ns); // Create response element
ele.setText("" + (i - 1) + " File(s) Saved Successfully on Server at " + folderName);
return ele;
}
public OMElement sendReceiveUsingMTOM(OMElement element) {
element.buildWithAttachments();
element.detach();
return element;
}
public OMElement sendReceiveUsingSwA(OMElement element) throws Exception {
Attachments attachment = (opcts.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE)).getAttachmentMap();
opcts.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE).setAttachmentMap(attachment);
element.buildWithAttachments();
element.detach();
return element;
}
private String createFileName(int count) {
String fileName;
fileName = folderName + "/" + file.getAttributeValue(
new QName(file.getNamespace().getNamespaceURI(), "type"));
if (new File(fileName).exists()) {
fileName = folderName + "/copy(" + (count - 1) + ")" + file.getAttributeValue(
new QName(file.getNamespace().getNamespaceURI(), "type"));
while (new File(fileName).exists()) {
count ++;
fileName = folderName + "/copy(" + (count - 1) + ")" + file.getAttributeValue(
new QName(file.getNamespace().getNamespaceURI(), "type"));
}
}
return fileName;
}
/**
* @param inStrm An input stream linking to the data
* @param fileName The absolute path of the file to which the data should be written
* @throws Exception
*/
private void writeData(InputStream inStrm, String fileName) throws Exception {
RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
int b;
while (true) {
b = inStrm.read();
if (b == -1) {
break;
}
raf.writeByte(b);
}
inStrm.close();
raf.close();
}
}