/** * Copyright (c) 2009 - 2011 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org> * * This file is part of org.appwork.utils.net.ftpserver * * This software is licensed under the Artistic License 2.0, * see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php * for details */ package org.appwork.utils.net.ftpserver; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Locale; /** * @author daniel * */ public abstract class FtpConnectionHandler<E extends FtpFile> { /** * @return */ public FtpConnectionState createNewConnectionState() { return new FtpConnectionState(); } public String formatFileList(final ArrayList<? extends FtpFile> list) { final String DEL = " "; final StringBuilder sb = new StringBuilder(); final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calendar.DAY_OF_MONTH, 1); cal.set(Calendar.MONTH, 0); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MINUTE, 0); final SimpleDateFormat dfCur = new SimpleDateFormat("MMM dd HH:mm", Locale.ENGLISH); final SimpleDateFormat dfHist = new SimpleDateFormat("MMM dd yyyy", Locale.ENGLISH); for (final FtpFile f : list) { // directory or not sb.append(f.isDirectory() ? "d" : "-"); // rights sb.append("rwxrwxrwx"); sb.append(DEL); sb.append("0"); sb.append(DEL); // group sb.append(f.getGroup()); sb.append(DEL); // user sb.append(f.getOwner()); sb.append(DEL); sb.append(f.getSize()); sb.append(DEL); if (f.getLastModified() > cal.getTimeInMillis()) { sb.append(dfCur.format(new Date(f.getLastModified()))); } else { sb.append(dfHist.format(new Date(f.getLastModified()))); } sb.append(DEL); sb.append(f.getName()); sb.append("\r\n"); } return sb.toString(); } /** * @param string * @return TODO * @throws IOException * @throws UnsupportedEncodingException */ public abstract ArrayList<E> getFileList(FtpConnectionState connectionState, String string) throws UnsupportedEncodingException, IOException, FtpException; /** * @param connectionState * @param buildParameter * @return */ public abstract long getSize(FtpConnectionState connectionState, String buildParameter) throws FtpException; public abstract FTPUser getUser(final String user); public abstract String getWelcomeMessage(FtpConnectionState ftpConnection); /** * @param connectionState * @param buildParameter */ public abstract void makeDirectory(FtpConnectionState connectionState, String buildParameter) throws FtpException; /** * @param dir * @param connectionState * @return */ public abstract void onDirectoryUp(FtpConnectionState connectionState) throws FtpException; public abstract String onLoginFailedMessage(FtpConnectionState ftpConnection) throws FtpException; public abstract String onLoginSuccessRequest(FtpConnectionState connectionState) throws FtpException; public abstract String onLogoutRequest(FtpConnectionState connectionState) throws FtpException; /** * @param connectionState * @param position */ public void onREST(final FtpConnectionState connectionState, final long position) throws FtpException { throw new FtpCommandNotImplementedException(); } /** * @param outputStream * @param connectionState * @param param */ public abstract long onRETR(OutputStream outputStream, FtpConnectionState connectionState, String param) throws IOException, FtpException; /** * @param inputStream * @param connectionState * @param buildParameter * @return * @throws FtpFileNotExistException * @throws IOException */ public abstract long onSTOR(InputStream inputStream, FtpConnectionState connectionState, boolean append, String buildParameter) throws FtpException, IOException; /** * @param connectionState * @param buildParameter * @throws FtpFileNotExistException * @throws FtpException */ public abstract void removeDirectory(FtpConnectionState connectionState, String buildParameter) throws FtpException; /** * @param connectionState * @param buildParameter */ public abstract void removeFile(FtpConnectionState connectionState, String buildParameter) throws FtpException; /** * @param connectionState * @param buildParameter */ /* * this function gets called twice: * * 1.) by RNFR, which should set the renameFile in connectionState if * renaming is possible * * 2.) by RNTO, which should do the actual renaming */ public abstract void renameFile(FtpConnectionState connectionState, String buildParameter) throws FtpException; /** * @param connectionState * @param cwd * @return */ public abstract void setCurrentDirectory(FtpConnectionState connectionState, String cwd) throws FtpException; }