/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.glite.gridcake.gridftp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import org.globus.ftp.DataSinkStream;
import org.globus.ftp.DataSourceStream;
import org.globus.ftp.GridFTPClient;
import org.globus.ftp.Marker;
import org.globus.ftp.MarkerListener;
import org.globus.gsi.GlobusCredential;
import org.globus.gsi.gssapi.GlobusGSSCredentialImpl;
import org.ietf.jgss.GSSCredential;
/**
* Class for easy use of a GridFTP service.
* @author csuarez
*/
public class GridFTPService {
/**
* Hostname of the storage element.
*/
private String hostname;
/**
* Port of the GRIDFtp service.
*/
private int port;
/**
* Public constructor.
* @param hostname Hostname of the storage element.
* @param port Port of the GRIDFtp service.
*/
public GridFTPService(String hostname, int port) {
this.hostname = hostname;
this.port = port;
}
/**
* Downloads a file from a storage element using GRIDFtp.
* @param proxy Credentials to access to the service as a GlobusCredential object.
* @param urlTarget URL of the file to download.
* @return The file as a byte array.
* @throws Exception If something fails.
*/
public byte[] download(GlobusCredential proxy, String urlTarget) throws Exception {
byte[] digitalContent = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataSinkStream datasink = new DataSinkStream(bos);
GSSCredential credential = new GlobusGSSCredentialImpl(proxy, GSSCredential.INITIATE_AND_ACCEPT);
GridFTPClient client = new GridFTPClient(hostname, port);
client.authenticate(credential);
client.setType(org.globus.ftp.Session.TYPE_IMAGE);
client.setPassiveMode(true);
client.setMode(org.globus.ftp.Session.MODE_STREAM);
client.get(urlTarget.toString(), datasink, new MarkerListener() {
public void markerArrived(Marker arg0) {
}
});
client.close();
digitalContent = bos.toByteArray();
return digitalContent;
}
/**
* Uploads a file to a storage element using GRIDFtp.
* @param proxy Credentials to access to the service as a GlobusCredential object.
* @param digitalContent The file we want to upload as a byte array.
* @param urlTarget URL of the path where we want to upload our file.
* @throws Exception If something fails.
*/
public void upload(GlobusCredential proxy, byte[] digitalContent, String urlTarget) throws Exception {
GSSCredential credential = new GlobusGSSCredentialImpl(proxy, GSSCredential.INITIATE_AND_ACCEPT);
ByteArrayInputStream bis = new ByteArrayInputStream(digitalContent);
DataSourceStream source = new DataSourceStream(bis);
GridFTPClient client = new GridFTPClient(hostname, port);
client.authenticate(credential);
client.setType(org.globus.ftp.Session.TYPE_IMAGE);
client.setPassiveMode(true);
client.setMode(org.globus.ftp.Session.MODE_STREAM);
client.extendedPut(urlTarget.toString(), source,
new MarkerListener() {
public void markerArrived(Marker arg0) {
}
});
client.close();
}
/**
* Deletes a file from a storage element using GRIDFtp.
* @param proxy Credentials to access to the service as a GlobusCredential object.
* @param urlTarget URL of the file to download.
* @throws Exception If something fails.
*/
public void delete(GlobusCredential proxy, String urlTarget) throws Exception {
GSSCredential credential = new GlobusGSSCredentialImpl(proxy, GSSCredential.INITIATE_AND_ACCEPT);
GridFTPClient client = new GridFTPClient(hostname, port);
client.authenticate(credential);
client.setPassiveMode(true);
client.setType(org.globus.ftp.Session.TYPE_IMAGE);
client.setMode(org.globus.ftp.Session.MODE_STREAM);
client.deleteFile(urlTarget.toString());
client.close();
}
}