package org.xdams.utility; import java.util.HashMap; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.StopWatch; public class RenumberUtils { public abstract static class Renumber { public String renumber() { return null; }; public String renumber(int level, boolean countBlock) { return null; }; } private static class IncrementRenumber extends Renumber { private String code; private int aux = 0; private IncrementRenumber(String code, int startIndex) { this.code = StringUtils.remove(code, '['); this.code = StringUtils.remove(this.code, ']'); if (startIndex > 0) { this.aux = startIndex; } } public String renumber() { aux++; return fillWithZeros(String.valueOf(aux), code.length()); } public String renumber(int level) { throw new RuntimeException("Il metodo non e supportato in quest'implementazione"); } } private static class SiblingRenumber extends Renumber { private String code; private int increment; private int numChars; private SiblingRenumber(String code, int increment, int numChars) { this.code = code; this.increment = increment; if (numChars >= 0) { this.numChars = numChars; } else { this.numChars = this.code.substring(code.lastIndexOf('.') + 1).length(); } } public String renumber() { String lastPart = ""; try { lastPart = code.substring(code.lastIndexOf('.') + 1); } catch (StringIndexOutOfBoundsException e) { lastPart = code; } String newCode = Integer.toString((Integer.parseInt(lastPart) + increment)); newCode = fillWithZeros(newCode, numChars); try { code = code.substring(0, code.lastIndexOf('.')) + "." + newCode; } catch (StringIndexOutOfBoundsException e) { code = newCode; } return code; } public String renumber(int level) { throw new RuntimeException("Il metodo non e supportato in quest'implementazione"); } } private static class SonsRenumber extends Renumber { private String code; private int increment; private int numChars; private int startIdx; private String buffer; private SonsRenumber(String code, int increment, int numChars, int startIdx) { this.code = code; this.increment = increment; this.numChars = numChars; this.startIdx = startIdx; this.buffer = ""; } public String renumber() { String newCode = ""; if (buffer.length() > 0) { newCode = buffer; code = newCode.substring(0, newCode.lastIndexOf('.')); newCode = newCode.substring(newCode.lastIndexOf('.') + 1); newCode = Integer.toString(Integer.parseInt(newCode) + increment); } else { newCode = "" + startIdx; } newCode = fillWithZeros(newCode, numChars); newCode = code + "." + newCode; buffer = newCode; return newCode; } public String renumber(int level) { throw new RuntimeException("Il metodo non e supportato in quest'implementazione"); } } private static class HierRenumber extends Renumber { private int prevLevel = -1; private int numChars = 0; private HashMap levels = null; private SiblingRenumber siblingRenumber = null; private HierRenumber(String code, int numChars) { this.levels = new HashMap(); this.levels.put("root-code", code); this.numChars = numChars; } public String renumber() { throw new RuntimeException("Il metodo non e supportato in quest'implementazione"); } public String renumber(int lvl, boolean countBlock) { Integer level = new Integer(lvl); String currentCode = null; if (!levels.containsKey(level)) { if (levels.size() == 1) { levels.put(level, levels.get("root-code")); prevLevel = lvl; return (String) levels.get("root-code"); } else { String newCode = (String) levels.get(new Integer(lvl - 1)); if (countBlock) { newCode = newCode + "." + fillWithZeros("1", numChars, lvl-1); } else { newCode = newCode + "." + fillWithZeros("1", numChars); } levels.put(level, newCode); prevLevel = lvl; // da applicare solo se SiblingRenumber garantisce che settare code direttamente e sempre sicuro /* * if(siblingRenumber == null){ siblingRenumber = (SiblingRenumber)getSiblingRenumber(newCode, 1); }else{ siblingRenumber.code = newCode; } */ siblingRenumber = (SiblingRenumber) getSiblingRenumber(newCode, 1); // ***1 return newCode; } } currentCode = (String) levels.get(level); if (prevLevel > lvl) { int count = lvl; while (levels.remove(new Integer(count)) != null) { count++; } } if (prevLevel != lvl || siblingRenumber == null) { // ***1 siblingRenumber = (SiblingRenumber) getSiblingRenumber(currentCode, 1); } // da applicare solo se SiblingRenumber garantisce che settare code direttamente e sempre sicuro /* * if(siblingRenumber == null){ siblingRenumber = (SiblingRenumber)getSiblingRenumber(currentCode, 1); }else if(prevLevel != lvl){ siblingRenumber.code = currentCode; } */ String newCode = siblingRenumber.renumber(); levels.put(level, newCode); prevLevel = lvl; return newCode; } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // System.out.println(nextStringNumber("00001.00003.00004.00005")); // RenumberUtils ru = new RenumberUtils(); /* * Renumber rn = RenumberUtils.getSiblingRenumber("", 1); * * System.out.println(rn.renumber()); System.out.println(rn.renumber()); System.out.println(rn.renumber()); System.out.println(rn.renumber()); System.out.println(rn.renumber()); System.out.println(rn.renumber()); */ StopWatch sw = new StopWatch(); RenumberUtils.Renumber hierRenumber = RenumberUtils.getHierRenumber("001.001", 1); sw.start(); // System.out.println("4: " + hierRenumber.renumber(4)); // System.out.println("\t5: " + hierRenumber.renumber(5)); // System.out.println("\t5: " + hierRenumber.renumber(5)); // System.out.println("\t\t6: " + hierRenumber.renumber(6)); // System.out.println("\t5: " + hierRenumber.renumber(5)); // System.out.println("\t\t6: " + hierRenumber.renumber(6)); // System.out.println("\t\t\t7: " + hierRenumber.renumber(7)); // System.out.println("\t\t\t\t8: " + hierRenumber.renumber(8)); // System.out.println("\t\t\t7: " + hierRenumber.renumber(7)); // System.out.println("\t\t\t7: " + hierRenumber.renumber(7)); // System.out.println("\t5: " + hierRenumber.renumber(5)); // System.out.println("\t5: " + hierRenumber.renumber(5)); // System.out.println("\t\t6: " + hierRenumber.renumber(6)); // System.out.println("\t\t6: " + hierRenumber.renumber(6)); // System.out.println("\t\t6: " + hierRenumber.renumber(6)); // System.out.println("\t\t\t7: " + hierRenumber.renumber(7)); // System.out.println("\t\t\t7: " + hierRenumber.renumber(7)); sw.stop(); System.out.println(sw.toString()); sw.reset(); hierRenumber = RenumberUtils.getIncrementRenumber("[###]", 0); System.out.println("\t\t\t7: " + hierRenumber.renumber()); System.out.println("\t\t\t7: " + hierRenumber.renumber()); System.out.println("\t\t\t7: " + hierRenumber.renumber()); System.out.println("\t\t\t7: " + hierRenumber.renumber()); } public static String fillWithZeros(String str, int numChars) { for (int i = str.length(); i < numChars; i++) { str = "0" + str; } return str; } public static String fillWithZeros(String str, int numChars, int lvl) { for (int i = str.length(); i < numChars - 1; i++) { str = "0" + str; } str = lvl + str; return str; } public static Renumber getSiblingRenumber(String code, int increment, int numChars) { return new RenumberUtils.SiblingRenumber(code, increment, numChars); } public static Renumber getSiblingRenumber(String code, int increment) { return new RenumberUtils.SiblingRenumber(code, increment, -1); } public static Renumber getSonsRenumber(String code, int increment, int numChars, int startIdx) { return new RenumberUtils.SonsRenumber(code, increment, numChars, startIdx); } public static Renumber getSonsRenumber(String code, int numChars, int startIdx) { return new RenumberUtils.SonsRenumber(code, 1, numChars, startIdx); } public static Renumber getSonsRenumber(String code, int numChars) { return new RenumberUtils.SonsRenumber(code, 1, numChars, 1); } public static Renumber getHierRenumber(String code, int numChars) { return new RenumberUtils.HierRenumber(code, numChars); } public static Renumber getIncrementRenumber(String code, int increment) { return new RenumberUtils.IncrementRenumber(code, increment); } }