package org.kisst.gft.filetransfer; import java.io.File; import java.util.regex.Pattern; import org.kisst.gft.filetransfer.action.DestinationFile; import org.kisst.gft.filetransfer.action.SourceFile; import org.kisst.gft.task.JmsXmlTask; import org.kisst.jms.JmsMessage; import org.kisst.props4j.SimpleProps; import org.kisst.util.StringUtil; import org.kisst.util.XmlNode; import org.kisst.util.exception.BasicFunctionalException; public abstract class FileTransferTask extends JmsXmlTask implements SourceFile, DestinationFile { public final Channel channel; //public final String srcpath; //public final String destpath; public final String filename; private final FileLocation src; private final FileLocation dest; private final FileLocation finaldest; private static Pattern validCharacters = Pattern.compile("[A-Za-z0-9./_-]*"); public FileTransferTask(Channel channel, String id, JmsMessage msg, XmlNode content) { super(channel.gft, channel, id, msg, content); this.channel= channel; this.filename = getFilename(); if ( filename.length()>1024) throw new BasicFunctionalException("Filename length should not exceed 1024 characters, in channel "+channel.getName()+", filename "+filename); if (! validCharacters.matcher(filename).matches()) throw new BasicFunctionalException("Filename should only contain alphanumeric characters / . - or _ in channel "+channel.getName()+", filename ["+filename+"]"); if (filename.indexOf("..")>=0) throw new BasicFunctionalException("Filename ["+filename+"] is not allowed to contain .. pattern, , in channel "+channel.getName()); this.src=new FileLocation(channel.getSourceFile(), filename); String destfilename=filename; if (channel.renamePattern!=null) destfilename=replaceFileName(channel.renamePattern, filename); this.dest=new FileLocation(channel.getDestinationFile(), destfilename); if (channel.getFinalDestinationFile()==null) this.finaldest=null; else this.finaldest=new FileLocation(channel.getFinalDestinationFile(),destfilename); } private String replaceFileName(String renamePattern, String filename) { SimpleProps props=new SimpleProps(); props.put("filename", filename); int pos=filename.lastIndexOf('.'); if (pos>0) { props.put("extension", filename.substring(pos + 1)); props.put("basename", filename.substring(0, pos)); } renamePattern = StringUtil.substituteDate(renamePattern); return StringUtil.substitute(renamePattern,props); } abstract protected String getFilename(); @Override public String toString() { return toString(src.getShortString()+"==>"+dest.getShortString()); } @Override public void run() { channel.run(this); } @Override public File getTempFile() { return getTempFile(filename); } @Override public FileLocation getSourceFile() { return subsituteDynamicPath(src); } @Override public FileLocation getDestinationFile() { return subsituteDynamicPath(dest); } @Override public FileLocation getFinalDestinationFile() { return subsituteDynamicPath(finaldest); } }