View Javadoc

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   * *** Centre de Calcul de l'IN2P3 - Lyon (France) ***
15   * ***             http://cc.in2p3.fr/             ***
16   * ***************************************************
17   * File:   DataStagingFactory
18   * Author: Sylvain Reynaud (sreynaud@in2p3.fr)
19   * Date:   3 juin 2009
20   * ***************************************************
21   * Description:                                      */
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              // set localURL
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              // create DataStaging
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;  // -1 or 1 (none or "_:")
73          return hasProtocolScheme && ! (isLinuxAbsolutePath || isWindowsAbsolutePath);
74      }
75  }