/*
* Copyright 1999-2006 University of Chicago
*
* 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 org.globus.io.streams;
import java.io.OutputStream;
import java.io.IOException;
import org.globus.ftp.FTPClient;
import org.globus.ftp.Session;
import org.globus.ftp.OutputStreamDataSource;
import org.globus.ftp.vanilla.TransferState;
import org.globus.ftp.exception.FTPException;
import org.globus.common.ChainedIOException;
public class FTPOutputStream extends GlobusOutputStream {
protected OutputStream output;
protected FTPClient ftp;
protected TransferState state;
protected FTPOutputStream() {
}
public FTPOutputStream(String host,
int port,
String user,
String pwd,
String file,
boolean append)
throws IOException, FTPException {
this(host, port, user, pwd, file, append,
true, Session.TYPE_IMAGE);
}
public FTPOutputStream(String host,
int port,
String user,
String pwd,
String file,
boolean append,
boolean passive,
int type)
throws IOException, FTPException {
this.ftp = new FTPClient(host, port);
this.ftp.authorize(user, pwd);
put(passive, type, file, append);
}
public void abort() {
if (this.output != null) {
try {
this.output.close();
} catch(Exception e) {}
}
try {
this.ftp.close();
} catch (IOException e) {
} catch (FTPException e) {
}
}
public void close()
throws IOException {
if (this.output != null) {
try {
this.output.close();
} catch(Exception e) {}
}
try {
if (this.state != null) {
this.state.waitForEnd();
}
} catch (FTPException e) {
throw new ChainedIOException("close failed.", e);
} finally {
try {
this.ftp.close();
} catch (FTPException ee) {
throw new ChainedIOException("close failed.", ee);
}
}
}
protected void put(boolean passive,
int type,
String remoteFile,
boolean append)
throws IOException, FTPException {
OutputStreamDataSource source = null;
try {
this.ftp.setType(type);
if (passive) {
this.ftp.setPassive();
this.ftp.setLocalActive();
} else {
this.ftp.setLocalPassive();
this.ftp.setActive();
}
source = new OutputStreamDataSource(2048);
this.state = this.ftp.asynchPut(remoteFile,
source,
null,
append);
this.state.waitForStart();
this.output = source.getOutputStream();
} catch (FTPException e) {
if (source != null) {
source.close();
}
close();
throw e;
}
}
public void write(byte [] msg)
throws IOException {
output.write(msg);
}
public void write(byte [] msg, int from, int length)
throws IOException {
output.write(msg, from, length);
}
public void write(int b)
throws IOException {
output.write(b);
}
public void flush()
throws IOException {
output.flush();
}
}