+ 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) {
+ uploadResource(session, localResource);
+ }
+ }
+
+ 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 file, String remoteFile) {
+ try {
+ upload(session, new FileInputStream(file), file.length(), file
+ .getPath(), file.toString(), remoteFile);
+ } catch (FileNotFoundException e) {
+ throw new SlcException("Cannot upload " + file, e);
+ }
+ }
+
+ protected void uploadResource(Session session, Resource resource) {
+ String targetPath = remotePath != null ? remotePath : remoteDir + '/'
+ + resource.getFilename();
+ try {
+ File lFile = resource.getFile();
+ uploadFile(session, lFile, targetPath);
+ } catch (IOException e) {
+ // no underlying file found
+ // load the resource in memory before transferring it
+ InputStream in = null;
+ try {
+ byte[] arr;
+ String path;
+ if (resource instanceof ByteArrayResource) {
+ arr = ((ByteArrayResource) resource).getByteArray();
+ path = "bytearray";
+ } else {
+ in = resource.getInputStream();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ IOUtils.copy(in, out);
+ arr = out.toByteArray();
+ path = resource.getURL().getPath();
+ if (path.startsWith("/"))
+ path = path.substring(1);
+ }
+ ByteArrayInputStream content = new ByteArrayInputStream(arr);
+ upload(session, content, arr.length, path, resource.toString(),
+ targetPath);
+ arr = null;
+ } catch (IOException e1) {
+ throw new SlcException("Can not interpret resource "
+ + localResource, e1);
+ } finally {
+ IOUtils.closeQuietly(in);
+ // no need to close byte arrays streams
+ }
+ }
+ }
+
+ protected void upload(Session session, InputStream in, long size,
+ String path, String sourceDesc, String remoteFile) {