Package org.xdams.utility

Source Code of org.xdams.utility.RenumberUtils$Renumber

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);
  }
}
TOP

Related Classes of org.xdams.utility.RenumberUtils$Renumber

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.