Merge branch 'master' of ssh://svjatoslav.eu:10006/home/n0/git/meviz
[meviz.git] / src / main / java / eu / svjatoslav / meviz / renamer / Main.java
1 /*
2  * Meviz - Various tools collection to work with multimedia.
3  * Copyright (C) 2012 -- 2017, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
4  * 
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public License
7  * as published by the Free Software Foundation.
8  */
9
10 package eu.svjatoslav.meviz.renamer;
11
12 import eu.svjatoslav.commons.string.WildCardMatcher;
13 import eu.svjatoslav.meviz.Module;
14
15 import java.io.File;
16 import java.util.Arrays;
17
18 public class Main implements Module {
19
20     private final CommandlineHandler commandlineHandler = new CommandlineHandler();
21     private int processedFilesCount;
22     private RenamingOptions options;
23
24     /**
25      * Verify that program has enough information to start executing
26      *
27      * @return true if all is ok, false if errors were found
28      */
29     private boolean checkThatThereIsEnoughDataToProceed() {
30         if (options.inputPatterns.size() == 0) {
31             System.out.println("Error: no input patterns given.");
32             return false;
33         }
34
35         if (options.outputPattern == null) {
36             System.out.println("Error: no output pattern given.");
37             return false;
38         }
39
40         return true;
41     }
42
43     private boolean fileMatchesInputPattern(final File file) {
44         final String fileName = file.getName();
45
46         for (final String inputPattern : options.inputPatterns)
47             if (WildCardMatcher.match(fileName, inputPattern))
48                 return true;
49
50         return false;
51     }
52
53     @Override
54     public String getDescription() {
55         return "Mass rename files according to given pattern.";
56     }
57
58     @Override
59     public String getModuleCommand() {
60         return "rename";
61     }
62
63     private void processDirectory(final File directory) {
64         final File[] directoryContents = directory.listFiles();
65
66         // sort directory contents alphabetically
67         Arrays.sort(directoryContents);
68
69         for (final File subFile : directoryContents)
70             if (subFile.isDirectory()) {
71                 if (options.recursive)
72                     processFileOrDirectory(subFile);
73             } else
74                 processFileOrDirectory(subFile);
75     }
76
77     private void processFile(final File file) {
78         final StringBuilder targetFilePath = new StringBuilder();
79
80         targetFilePath.append(file.getParent());
81         targetFilePath.append("/");
82
83         for (int i = 0; i < options.outputPattern.length(); i++) {
84
85             final char c = options.outputPattern.charAt(i);
86
87             if (c == '*')
88                 targetFilePath.append(file.getName());
89             else if (c == '%') {
90
91                 final String processedFileCountString = String
92                         .valueOf(processedFilesCount);
93
94                 for (int j = 0; j < (5 - processedFileCountString.length()); j++)
95                     targetFilePath.append(0);
96
97                 targetFilePath.append(processedFileCountString);
98                 processedFilesCount++;
99             } else if (c == '_')
100                 targetFilePath.append(" ");
101             else
102                 targetFilePath.append(c);
103         }
104
105         final File targetFile = new File(targetFilePath.toString());
106
107         if (!options.testOnly) {
108
109             if (targetFile.exists())
110                 System.out.println("Renaming aborted because target file: "
111                         + targetFile.getAbsolutePath() + " already exists.");
112             else
113                 file.renameTo(targetFile);
114
115         } else {
116             System.out.println("About to rename file: "
117                     + file.getAbsolutePath());
118             System.out.println("into: " + targetFile.getAbsolutePath());
119         }
120     }
121
122     private void processFileOrDirectory(final File file) {
123         if (!file.exists()) {
124             System.out.println("Error: file \"" + file.getAbsolutePath()
125                     + "\" does not exist.");
126             return;
127         }
128
129         if (file.isDirectory())
130             processDirectory(file);
131         else if (file.isFile())
132             if (fileMatchesInputPattern(file))
133                 processFile(file);
134
135     }
136
137     private void rename() {
138         processFileOrDirectory(options.targetDirectory);
139     }
140
141     @Override
142     public void run(final String[] args) {
143
144         options = commandlineHandler.parseCommandlineArguments(args);
145
146         if (options == null) {
147             showCommandlineHelp();
148             return;
149         }
150
151         if (checkThatThereIsEnoughDataToProceed()) {
152
153             System.out.println("Renaming using input patterns: ");
154             for (final String inputPattern : options.inputPatterns)
155                 System.out.println("    " + inputPattern);
156
157             rename();
158         } else
159             showCommandlineHelp();
160     }
161
162     @Override
163     public void showCommandlineHelp() {
164         commandlineHandler.parser.showHelp();
165         System.out.println("");
166         System.out.println("Output pattern special symbols:");
167         System.out.println("    % - file number");
168         System.out.println("    * - original file name");
169     }
170
171 }