package com.github.ss111;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.collections.map.MultiValueMap;
import org.apache.commons.io.FilenameUtils;
/**
* ConfigHelper is used to help with configuration files. It's main funtionality is the ability to parse Forge configuration files and store information about conflicting blocks/items.
* @author SS111
*/
public class ConfigHelper {
private static BufferedReader configReader;
private static String configLine;
private static MultiValueMap blockIDs = new MultiValueMap();
private static MultiValueMap itemIDs = new MultiValueMap();
private static MultiValueMap unknownIDs = new MultiValueMap();
private static Boolean blockComingUp = false;
private static Boolean itemComingUp = false;
public static Boolean isCommandLine = false;
/**
* Populates 3 <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>s with block/item information by parsing Forge configuration files. There will be a separate MultiValueMap for blocks, items, and unknown (IDs that may be block or items in an attempt to support non-supported configuration files).
* <p>
* The keys of the map will be the item/block ID.
* <p>
* The value(s) of the map will be {@link ArrayList}s. Each ArrayList will contain the name of the block/item, and the "pretty name" of the configuration file that the name came from.
* @author SS111
* @param path the path to the configuration directory
* @see <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
* @see ArrayList
* @see ConfigHelper#getPrettyName(String)
*/
public static void populateMaps(String path) {
File configDirectory = new File(path);
File[] configFiles = configDirectory.listFiles();
for (File configFile : configFiles) {
if (configFile.isFile() & FilenameUtils.getExtension(configFile.getAbsolutePath()).equals("cfg") || FilenameUtils.getExtension(configFile.getAbsolutePath()).equals("txt") || FilenameUtils.getExtension(configFile.getAbsolutePath()).equals("conf") || checkExtraFileExtensions(configFile, TableRenderer.getExtraFileExtensions())) {
try {
configReader = new BufferedReader(new FileReader(configFile.getAbsolutePath()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
while ((configLine = configReader.readLine()) != null) {
if (configLine == null) {
continue;
} else if (configLine.contains("}") && blockComingUp == true) {
blockComingUp = false;
continue;
} else if (configLine.contains("}") && itemComingUp == true) {
itemComingUp = false;
continue;
} else if (configLine.equals("# block")) {
blockComingUp = true;
continue;
} else if (configLine.equals("# item")) {
itemComingUp = true;
continue;
} else if (configLine.contains("I:") && blockComingUp == true && configLine.matches(".*\\d.*")) {
String[] blockNameSplit = configLine.split("=");
ArrayList<String> blockAndConfig = new ArrayList<String>();
blockAndConfig.add(blockNameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
blockAndConfig.add(getPrettyName(configFile.getAbsolutePath()));
blockIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), blockAndConfig);
continue;
} else if (configLine.contains("I:") && itemComingUp == true && configLine.matches(".*\\d.*")) {
String[] itemNameSplit = configLine.split("=");
ArrayList<String> itemAndConfig = new ArrayList<String>();
itemAndConfig.add(itemNameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
itemAndConfig.add(getPrettyName(configFile.getAbsolutePath()));
itemIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), itemAndConfig);
continue;
//& or &&?
} else if (configLine.contains("I:") & configLine.matches(".*\\d.*") & blockComingUp == false & itemComingUp == false) {
if (configLine.contains("block") || configLine.contains("Block") || configLine.contains("BLOCK") || configLine.contains("item") || configLine.contains("Item") || configLine.contains("ITEM")) {
String[] nameSplit = configLine.split("=");
ArrayList<String> unknownAndConfig = new ArrayList<String>();
unknownAndConfig.add(nameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
unknownAndConfig.add(getPrettyName(configFile.getAbsolutePath()));
unknownIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), unknownAndConfig);
continue;
} else {
continue;
}
} else {
continue;
}
}
configReader.close();
} catch (IOException e) {
e.printStackTrace();
}
} else if (configFile.isDirectory()) {
File[] configFilesDir1 = configFile.listFiles();
for (File configFile1 : configFilesDir1) {
if (configFile1.isFile() & FilenameUtils.getExtension(configFile1.getAbsolutePath()).equals("cfg") || FilenameUtils.getExtension(configFile1.getAbsolutePath()).equals("txt") || FilenameUtils.getExtension(configFile1.getAbsolutePath()).equals("conf") || checkExtraFileExtensions(configFile1, TableRenderer.getExtraFileExtensions())) {
try {
configReader = new BufferedReader(new FileReader(configFile1.getAbsolutePath()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
while ((configLine = configReader.readLine()) != null) {
if (configLine == null) {
continue;
} else if (configLine.contains("}") && blockComingUp == true) {
blockComingUp = false;
continue;
} else if (configLine.contains("}") && itemComingUp == true) {
itemComingUp = false;
continue;
} else if (configLine.equals("# block")) {
blockComingUp = true;
continue;
} else if (configLine.equals("# item")) {
itemComingUp = true;
} else if (configLine.contains("I:") && blockComingUp == true && configLine.matches(".*\\d.*")) {
String[] blockNameSplit = configLine.split("=");
ArrayList<String> blockAndConfig = new ArrayList<String>();
blockAndConfig.add(blockNameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
blockAndConfig.add(getPrettyName(configFile1.getAbsolutePath()));
blockIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), blockAndConfig);
continue;
} else if (configLine.contains("I:") && itemComingUp == true && configLine.matches(".*\\d.*")) {
String[] itemNameSplit = configLine.split("=");
ArrayList<String> itemAndConfig = new ArrayList<String>();
itemAndConfig.add(itemNameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
itemAndConfig.add(getPrettyName(configFile1.getAbsolutePath()));
itemIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), itemAndConfig);
continue;
//& or &&?
} else if (configLine.contains("I:") & configLine.matches(".*\\d.*") & blockComingUp == false & itemComingUp == false) {
if (configLine.contains("block") || configLine.contains("Block") || configLine.contains("BLOCK") || configLine.contains("item") || configLine.contains("Item") || configLine.contains("ITEM")) {
String[] nameSplit = configLine.split("=");
ArrayList<String> unknownAndConfig = new ArrayList<String>();
unknownAndConfig.add(nameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
unknownAndConfig.add(getPrettyName(configFile1.getAbsolutePath()));
unknownIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), unknownAndConfig);
continue;
} else {
continue;
}
} else {
continue;
}
}
configReader.close();
} catch (IOException e) {
e.printStackTrace();
}
} else if (configFile1.isDirectory()) {
File[] configFilesDir2 = configFile1.listFiles();
for (File configFile2 : configFilesDir2) {
if (configFile2.isFile() & FilenameUtils.getExtension(configFile2.getAbsolutePath()).equals("cfg") || FilenameUtils.getExtension(configFile2.getAbsolutePath()).equals("txt") || FilenameUtils.getExtension(configFile2.getAbsolutePath()).equals("conf") || checkExtraFileExtensions(configFile2, TableRenderer.getExtraFileExtensions())) {
try {
configReader = new BufferedReader(new FileReader(configFile2.getAbsolutePath()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
while ((configLine = configReader.readLine()) != null) {
if (configLine == null) {
continue;
} else if (configLine.contains("}") && blockComingUp == true) {
blockComingUp = false;
continue;
} else if (configLine.contains("}") && itemComingUp == true) {
itemComingUp = false;
continue;
} else if (configLine.equals("# block")) {
blockComingUp = true;
continue;
} else if (configLine.equals("# item")) {
itemComingUp = true;
} else if (configLine.contains("I:") && blockComingUp == true && configLine.matches(".*\\d.*")) {
String[] blockNameSplit = configLine.split("=");
ArrayList<String> blockAndConfig = new ArrayList<String>();
blockAndConfig.add(blockNameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
blockAndConfig.add(getPrettyName(configFile2.getAbsolutePath()));
blockIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), blockAndConfig);
continue;
} else if (configLine.contains("I:") && itemComingUp == true && configLine.matches(".*\\d.*")) {
String[] itemNameSplit = configLine.split("=");
ArrayList<String> itemAndConfig = new ArrayList<String>();
itemAndConfig.add(itemNameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
itemAndConfig.add(getPrettyName(configFile2.getAbsolutePath()));
itemIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), itemAndConfig);
continue;
//& or &&?
} else if (configLine.contains("I:") & configLine.matches(".*\\d.*") & blockComingUp == false & itemComingUp == false) {
if (configLine.contains("block") || configLine.contains("Block") || configLine.contains("BLOCK") || configLine.contains("item") || configLine.contains("Item") || configLine.contains("ITEM")) {
String[] nameSplit = configLine.split("=");
ArrayList<String> unknownAndConfig = new ArrayList<String>();
unknownAndConfig.add(nameSplit[0].replace("I:", "").replace(" ", "").replace("\"", ""));
unknownAndConfig.add(getPrettyName(configFile2.getAbsolutePath()));
unknownIDs.put(Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)), unknownAndConfig);
continue;
} else {
continue;
}
} else {
continue;
}
}
configReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
/**
* Returns the "pretty name" of a configuration file combined with it's absolute path. For example, calling this method on "C:\Users\Test\AppData\Roaming\.minecraft\config\test.cfg" will return "test.cfg".
* @author SS111
* @param input the input path
* @return String
* @see com.github.ss111.ConfigHelper
*/
public static String getPrettyName(String input) {
return input.substring(input.lastIndexOf(File.separator) + 1);
}
/**
* Returns a <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a> of all the block IDs and their corresponding name(s) and configuration file(s).
* @return <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
* @see <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
*/
public static MultiValueMap getBlockIDs() {
return blockIDs;
}
/**
* Returns a <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a> of all the item IDs and their corresponding name(s) and configuration file(s).
* @return <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
* @see <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
*/
public static MultiValueMap getItemIDs() {
return itemIDs;
}
/**
* Returns a <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a> of all the unknown IDs and their corresponding name(s) and configuration file(s).
* @return <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
* @see <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a>
*/
public static MultiValueMap getUnknownIDs() {
return unknownIDs;
}
private static boolean checkExtraFileExtensions(File configFile, ArrayList<String> otherExtensions) {
for (String s : otherExtensions) {
if (FilenameUtils.getExtension(configFile.getAbsolutePath()).equals(s)) {
return true;
}
}
return false;
}
}