View Javadoc

1   // BSD License (http://www.galagosearch.org/license)
2   package org.galagosearch.tupleflow;
3   
4   import java.io.File;
5   import java.io.IOException;
6   import java.util.List;
7   import org.galagosearch.tupleflow.Parameters.Value;
8   import org.galagosearch.tupleflow.execution.ErrorHandler;
9   import org.galagosearch.tupleflow.types.FileName;
10  
11  /***
12   *
13   * @author trevor
14   */
15  @OutputClass(className = "org.galagosearch.tupleflow.types.FileName", order = {"+filename"})
16  public class FileSource implements ExNihiloSource<FileName> {
17      TupleFlowParameters parameters;
18      public Processor<FileName> processor;
19  
20      /*** Creates a new instance of FileSource */
21      public FileSource(TupleFlowParameters parameters) {
22          this.parameters = parameters;
23      }
24  
25      private void processDirectory(File root) throws IOException {
26          for (File file : root.listFiles()) {
27              if (file.isHidden()) {
28                  continue;
29              }
30              if (file.isDirectory()) {
31                  processDirectory(file);
32              } else {
33                  processor.process(new FileName(file.toString()));
34              }
35          }
36      }
37  
38      public void run() throws IOException {
39          if (parameters.getXML().containsKey("directory")) {
40              List<Value> directories = parameters.getXML().list("directory");
41  
42              for (Value directory : directories) {
43                  File directoryFile = new File(directory.toString());
44                  processDirectory(directoryFile);
45              }
46          } else if (parameters.getXML().containsKey("filename")) {
47              List<Value> files = parameters.getXML().list("filename");
48  
49              for (Value file : files) {
50                  String filename = file.toString();
51                  processor.process(new FileName(filename));
52              }
53          }
54  
55          processor.close();
56      }
57  
58      public void close() throws IOException {
59          processor.close();
60      }
61  
62      public void setProcessor(Step nextStage) throws IncompatibleProcessorException {
63          Linkage.link(this, nextStage);
64      }
65  
66      public static void verify(TupleFlowParameters parameters, ErrorHandler handler) {
67          if (!(parameters.getXML().containsKey("directory") || parameters.getXML().containsKey("filename"))) {
68              handler.addError("FileSource requires either at least one directory or filename parameter.");
69              return;
70          }
71  
72          if (parameters.getXML().containsKey("directory")) {
73              List<Value> directories = parameters.getXML().list("directory");
74  
75              for (Value directory : directories) {
76                  File directoryFile = new File(directory.toString());
77  
78                  if (directoryFile.exists() == false) {
79                      handler.addError("Directory " + directoryFile.toString() + " doesn't exist.");
80                  } else if (directoryFile.isDirectory() == false) {
81                      handler.addError(directoryFile.toString() + " exists, but it isn't a directory.");
82                  }
83              }
84          } else if (parameters.getXML().containsKey("filename")) {
85              List<Value> files = parameters.getXML().list("filename");
86  
87              for (Value file : files) {
88                  File f = new File(file.toString());
89  
90                  if (f.exists() == false) {
91                      handler.addError("File " + file.toString() + " doesn't exist.");
92                  } else if (f.isFile() == false) {
93                      handler.addError(file.toString() + " exists, but isn't a file.");
94                  }
95              }
96          }
97      }
98  }