summaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/lll/mapper/writer/MappingWriter.java
blob: a884b3a30223c63098d220ea7e9097c5d55c17a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package ftbsc.lll.mapper.writer;

import ftbsc.lll.mapper.IMapper;
import ftbsc.lll.mapper.MapperProvider;
import org.apache.commons.cli.*;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

/**
 * Writes a mapping to a certain format.
 */
public class MappingWriter {

   /**
    * The main function, must be passed exactly two arguments
    * @param args the command line arguments
    * @throws IOException if something goes wrong while writing the file
    * @throws ParseException if something goes wrong while parsin arguments
    */
   public static void main(String[] args) throws IOException, ParseException {
      Options options = new Options()
         .addOption("r", "reverse", false, "Writes down inverted mappings");
      DefaultParser parser = new DefaultParser();
      CommandLine cmdLine = parser.parse(options, args);
      args = cmdLine.getArgs();

      //separate normal args from custom args
      int cursor;
      for(cursor = 0; cursor < args.length; cursor++)
         if(args[cursor].equals("-a"))
            break;
      String[] customArgs;
      if(cursor != args.length) {
         int len = args.length - cursor - 1;
         customArgs = new String[len];
         System.arraycopy(args, cursor + 1, customArgs, 0, len);
         String[] newArgs = new String[cursor];
         System.arraycopy(args, 0, newArgs, 0, cursor);
         args = newArgs;
      } else customArgs = new String[0];

      if(args.length < 4) {
         System.err.println("Bad argument count!");
         System.err.println("java -jar mapping-writer.jar [-r] <location> <format> <output> [-a <custom args]");
         return;
      }

      //load the mapper
      List<String> lines = MapperProvider.fetchFromLocalOrRemote(args[0]);
      IMapper mapper = MapperProvider.getMapper(lines);
      mapper.populate(lines, false);
      if(cmdLine.hasOption("reverse"))
         mapper = mapper.getInverted();

      //load the writers
      Map<String, IWriter> writerMap = new HashMap<>();
      for(IWriter w : ServiceLoader.load(IWriter.class))
         writerMap.put(w.uniqueId(), w);

      //get the one we need
      IWriter writer = writerMap.get(args[1]);
      if(writer == null) {
         System.err.printf("%s was not recognised as a valid format!", args[1]);
         return;
      }

      //now for the file
      File targetFile = new File(args[2]);

      if(!targetFile.createNewFile()) {
         System.err.println("File already exists!");
         return;
      }

      if(!targetFile.canWrite()) {
         System.err.println("Failed to write to file: access denied.");
         return;
      }

      //call the writer
      PrintWriter printWriter = new PrintWriter(new FileWriter(targetFile));
      writer.write(mapper, printWriter, customArgs);
      printWriter.close();
   }
}