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.io.FileUtils; /** * ConflictResolver is used to help resolve ID conflicts. It's only functionality is the ability to parse Forge configuration files and then solve ID conflicts based on the information given. * @author SS111 */ public class ConflictResolver { private static BufferedReader configReader; private static String configLine; private static Boolean blockComingUp = false; private static Boolean itemComingUp = false; /** * Resolves ID conflicts in the configuration files. * @author SS111 * @param path * @param unusedBlocks the unused block IDs * @param unusedItems the of unused item IDs * @param conflictingBlocks the conflicting block IDs * @param conflictingItems the conflicting item IDs * @see <a href="http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/MultiValueMap.html">MultiValueMap</a> * @see ArrayList */ public static void resolveConflicts(String path, ArrayList<Integer> unusedBlocks, ArrayList<Integer> unusedItems, ArrayList<Integer> conflictingBlocks, ArrayList<Integer> conflictingItems) { File configDirectory = new File(path); try { FileUtils.copyDirectory(configDirectory, new File(path.replace("config", "config_bak"))); } catch (Exception e) { e.printStackTrace(); } File[] configFiles = configDirectory.listFiles(); for (File configFile : configFiles) { ArrayList<String> lines = new ArrayList<String>(); if (configFile.isFile() & configFile.getAbsolutePath().contains(".cfg") || configFile.getAbsolutePath().contains(".txt") || configFile.getAbsolutePath().contains(".conf")) { try { configReader = new BufferedReader(new FileReader(configFile.getAbsolutePath())); } catch (FileNotFoundException e) { e.printStackTrace(); } try { while ((configLine = configReader.readLine()) != null) { if (configLine == null) { lines.add(configLine); continue; } else if (configLine.contains("}") && blockComingUp == true) { blockComingUp = false; lines.add(configLine); continue; } else if (configLine.contains("}") && itemComingUp == true) { itemComingUp = false; lines.add(configLine); continue; } else if (configLine.equals("# block")) { blockComingUp = true; lines.add(configLine); continue; } else if (configLine.equals("# item")) { itemComingUp = true; lines.add(configLine); continue; } else if (configLine.contains("I:") && blockComingUp == true) { Boolean writeDefault = new Boolean(true); Integer ID = Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)); forLoop: for (Integer conflictID : conflictingBlocks) { if (ID.equals(conflictID)) { String newConfigLine = configLine.split("=")[0]; newConfigLine = newConfigLine + "=" + unusedBlocks.get(0); lines.add(newConfigLine); unusedBlocks.remove(0); writeDefault = false; break forLoop; } } if (writeDefault == true) { lines.add(configLine); } continue; } else if (configLine.contains("I:") && itemComingUp == true) { Boolean writeDefault = new Boolean(true); Integer ID = Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)); forLoop: for (Integer conflictID : conflictingItems) { if (ID.equals(conflictID)) { String newConfigLine = configLine.split("=")[0]; newConfigLine = newConfigLine + "=" + unusedItems.get(0); lines.add(newConfigLine); unusedItems.remove(0); writeDefault = false; break forLoop; } } if (writeDefault == true) { lines.add(configLine); } continue; //& or &&? } else if (configLine.contains("I:") & blockComingUp == false & itemComingUp == false) { lines.add(configLine); continue; } else { lines.add(configLine); continue; } } configReader.close(); FileUtils.writeLines(configFile.getAbsoluteFile(), lines); } catch (IOException e) { e.printStackTrace(); } } else if (configFile.isDirectory()) { File[] configFilesDir1 = configFile.listFiles(); for (File configFile1 : configFilesDir1) { ArrayList<String> lines1 = new ArrayList<String>(); if (configFile1.isFile() & configFile1.getAbsolutePath().contains(".cfg") || configFile1.getAbsolutePath().contains(".txt") || configFile1.getAbsolutePath().contains(".conf")) { try { configReader = new BufferedReader(new FileReader(configFile1.getAbsolutePath())); } catch (FileNotFoundException e) { e.printStackTrace(); } try { while ((configLine = configReader.readLine()) != null) { if (configLine == null) { lines1.add(configLine); continue; } else if (configLine.contains("}") && blockComingUp == true) { blockComingUp = false; lines1.add(configLine); continue; } else if (configLine.contains("}") && itemComingUp == true) { itemComingUp = false; lines1.add(configLine); continue; } else if (configLine.equals("# block")) { blockComingUp = true; lines1.add(configLine); continue; } else if (configLine.equals("# item")) { itemComingUp = true; lines1.add(configLine); continue; } else if (configLine.contains("I:") && blockComingUp == true) { Boolean writeDefault = new Boolean(true); Integer ID = Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)); forLoop: for (Integer conflictID : conflictingBlocks) { if (ID.equals(conflictID)) { String newConfigLine = configLine.split("=")[0]; newConfigLine = newConfigLine + "=" + unusedBlocks.get(0); lines1.add(newConfigLine); unusedBlocks.remove(0); writeDefault = false; break forLoop; } } if (writeDefault == true) { lines1.add(configLine); } continue; } else if (configLine.contains("I:") && itemComingUp == true) { Boolean writeDefault = new Boolean(true); Integer ID = Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)); forLoop: for (Integer conflictID : conflictingItems) { if (ID.equals(conflictID)) { String newConfigLine = configLine.split("=")[0]; newConfigLine = newConfigLine + "=" + unusedItems.get(0); lines1.add(newConfigLine); unusedItems.remove(0); writeDefault = false; break forLoop; } } if (writeDefault == true) { lines1.add(configLine); } continue; //& or &&? } else if (configLine.contains("I:") & blockComingUp == false & itemComingUp == false) { lines1.add(configLine); continue; } else { lines1.add(configLine); continue; } } configReader.close(); FileUtils.writeLines(configFile1.getAbsoluteFile(), lines1); } catch (IOException e) { e.printStackTrace(); } } else if (configFile1.isDirectory()) { File[] configFilesDir2 = configFile1.listFiles(); for (File configFile2 : configFilesDir2) { ArrayList<String> lines2 = new ArrayList<String>(); if (configFile2.isFile() & configFile2.getAbsolutePath().contains(".cfg") || configFile2.getAbsolutePath().contains(".txt") || configFile2.getAbsolutePath().contains(".conf")) { try { configReader = new BufferedReader(new FileReader(configFile2.getAbsolutePath())); } catch (FileNotFoundException e) { e.printStackTrace(); } try { while ((configLine = configReader.readLine()) != null) { if (configLine == null) { lines2.add(configLine); continue; } else if (configLine.contains("}") && blockComingUp == true) { blockComingUp = false; lines2.add(configLine); continue; } else if (configLine.contains("}") && itemComingUp == true) { itemComingUp = false; lines2.add(configLine); continue; } else if (configLine.equals("# block")) { blockComingUp = true; lines2.add(configLine); continue; } else if (configLine.equals("# item")) { itemComingUp = true; lines2.add(configLine); continue; } else if (configLine.contains("I:") && blockComingUp == true) { Boolean writeDefault = new Boolean(true); Integer ID = Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)); forLoop: for (Integer conflictID : conflictingBlocks) { if (ID.equals(conflictID)) { String newConfigLine = configLine.split("=")[0]; newConfigLine = newConfigLine + "=" + unusedBlocks.get(0); lines2.add(newConfigLine); unusedBlocks.remove(0); writeDefault = false; break forLoop; } } if (writeDefault == true) { lines2.add(configLine); } continue; } else if (configLine.contains("I:") && itemComingUp == true) { Boolean writeDefault = new Boolean(true); Integer ID = Integer.valueOf(configLine.substring(configLine.lastIndexOf("=") + 1)); forLoop: for (Integer conflictID : conflictingItems) { if (ID.equals(conflictID)) { String newConfigLine = configLine.split("=")[0]; newConfigLine = newConfigLine + "=" + unusedItems.get(0); lines2.add(newConfigLine); unusedItems.remove(0); writeDefault = false; break forLoop; } } if (writeDefault == true) { lines2.add(configLine); } continue; //& or &&? } else if (configLine.contains("I:") & blockComingUp == false & itemComingUp == false) { lines2.add(configLine); continue; } else { lines2.add(configLine); continue; } } configReader.close(); FileUtils.writeLines(configFile2.getAbsoluteFile(), lines2); } catch (IOException e) { e.printStackTrace(); } } } } } } } } }