1 package fr.in2p3.jsaga.impl.job.staging;
2
3 import fr.in2p3.jsaga.Base;
4 import org.ogf.saga.error.*;
5 import org.ogf.saga.job.JobDescription;
6 import org.ogf.saga.url.URL;
7 import org.ogf.saga.url.URLFactory;
8
9 import java.io.File;
10 import java.util.regex.Matcher;
11 import java.util.regex.Pattern;
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public class DataStagingFactory {
26 private static final String JSAGA_FACTORY = Base.getSagaFactory();
27 private static final Pattern PATTERN = Pattern.compile("([^<>]*) *(>>|>|<<|<) *([^<>]*)");
28
29 public static AbstractDataStaging create(String fileTransfer) throws NotImplementedException, BadParameterException, NoSuccessException {
30 Matcher m = PATTERN.matcher(fileTransfer);
31 if (m.matches() && m.groupCount()==3) {
32 String local = m.group(1).trim();
33 String operator = m.group(2).trim();
34 String worker = m.group(3).trim();
35
36
37 URL localURL;
38 if (isURL(local)) {
39 localURL = URLFactory.createURL(JSAGA_FACTORY, local);
40 } else if (new File(local).isAbsolute()) {
41 localURL = URLFactory.createURL(JSAGA_FACTORY, new File(local).toURI().toString());
42 } else {
43 localURL = URLFactory.createURL(JSAGA_FACTORY, "file:/" + local);
44 }
45
46
47 if (">>".equals(operator) || ">".equals(operator)) {
48 boolean append = ">>".equals(operator);
49 if (isURL(worker)) {
50 return new InputDataStagingToRemote(localURL, URLFactory.createURL(JSAGA_FACTORY, worker), append);
51 } else {
52 return new InputDataStagingToWorker(localURL, worker, append);
53 }
54 } else if ("<<".equals(operator) || "<".equals(operator)) {
55 boolean append = "<<".equals(operator);
56 if (isURL(worker)) {
57 return new OutputDataStagingFromRemote(localURL, URLFactory.createURL(JSAGA_FACTORY, worker), append);
58 } else {
59 return new OutputDataStagingFromWorker(localURL, worker, append);
60 }
61 } else {
62 throw new BadParameterException("[INTERNAL ERROR] Unexpected operator: " + operator);
63 }
64 } else {
65 throw new BadParameterException("Syntax error in attribute " + JobDescription.FILETRANSFER + ": " + fileTransfer);
66 }
67 }
68
69 private static boolean isURL(String file) {
70 final boolean hasProtocolScheme = file.contains(":/");
71 final boolean isLinuxAbsolutePath = file.startsWith("/");
72 final boolean isWindowsAbsolutePath = file.indexOf(':')<=1;
73 return hasProtocolScheme && ! (isLinuxAbsolutePath || isWindowsAbsolutePath);
74 }
75 }