+ private String dir;
+ private String remoteDir;
+ private List<String> includes = new ArrayList<String>();
+
+ private List<String> excludes = new ArrayList<String>();
+
+ private PathMatcher pathMatcher;
+
+ public void run(Session session) {
+ if (StringUtils.hasText(dir)) {
+ if (!StringUtils.hasText(remoteDir))
+ throw new SlcException("Remote dir has to be specified.");
+
+ String dirOs = dir.replace('/', File.separatorChar);
+ if (dirOs.charAt(dir.length() - 1) != File.separatorChar) {
+ dirOs = dirOs + File.separator;
+ }
+
+ if (pathMatcher == null)
+ pathMatcher = new AntPathMatcher();
+
+ log.info("Start multiple scp based on " + dirOs);
+ scanDir(session, dirOs, "", includes, excludes);
+ }
+
+ if (localResource != null) {
+ try {
+ File lFile = localResource.getFile();
+ uploadFile(session, lFile, remotePath);
+ } catch (IOException e) {
+ OutputStream out = null;
+ InputStream in = null;
+ File tempFile = null;
+ try {
+ tempFile = File.createTempFile(getClass().getSimpleName()
+ + "-" + localResource.getFilename(), null);
+ out = FileUtils.openOutputStream(tempFile);
+ in = localResource.getInputStream();
+ IOUtils.copy(in, out);
+ uploadFile(session, tempFile, remotePath);
+ } catch (IOException e1) {
+ throw new SlcException("Can neither interpret resource "
+ + localResource
+ + " as file, nor create a temporary file", e1);
+ } finally {
+ IOUtils.closeQuietly(in);
+ IOUtils.closeQuietly(out);
+ FileUtils.deleteQuietly(tempFile);
+ }
+ }
+ }
+ }
+
+ protected void scanDir(Session session, String dir, String currentRelPath,
+ List<String> includes, List<String> excludes) {
+ File[] files = new File(dir).listFiles();
+ for (File file : files) {
+ if (!file.isDirectory()) {
+ String relPath = currentRelPath.concat(file.getName());
+ if (match(relPath, includes, excludes, false)) {
+ uploadFile(session, file, remoteDir + '/' + relPath);
+ }
+ } else {
+ String relPath = currentRelPath.concat(file.getName()).concat(
+ "/");
+ if (match(relPath, includes, excludes, true)) {
+ String nextDir = dir.concat(file.getName()).concat(
+ File.separator);
+ scanDir(session, nextDir, relPath, includes, excludes);
+ }
+ }
+ }
+ }
+
+ protected Boolean match(String path, List<String> includes,
+ List<String> excludes, boolean matchStart) {
+ for (String patternIn : includes) {
+ boolean matchIn = matchStart ? pathMatcher.matchStart(patternIn,
+ path) : pathMatcher.match(patternIn, path);
+ if (matchIn) {
+ // Could be included, check excludes
+ boolean excluded = false;
+ ex: for (String patternEx : excludes) {
+ boolean matchEx = matchStart ? pathMatcher.matchStart(
+ patternEx, path) : pathMatcher.match(patternEx,
+ path);
+
+ if (matchEx) {
+ excluded = true;
+ break ex;
+ }
+ }
+ if (!excluded)
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void uploadFile(Session session, File localFile, String remoteFile) {