All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.igormaznitsa.meta.checker.Utils Maven / Gradle / Ivy

/*
 * Copyright 2016 Igor Maznitsa (http://www.igormaznitsa.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.igormaznitsa.meta.checker;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import org.apache.bcel.classfile.Field;
import org.apache.bcel.classfile.FieldOrMethod;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.LineNumberTable;
import org.apache.bcel.classfile.LocalVariable;
import org.apache.bcel.classfile.LocalVariableTable;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.classfile.Utility;
import org.apache.bcel.generic.Type;
import org.joda.time.Duration;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

public abstract class Utils {

  private static final PeriodFormatter TIME_FORMATTER = new PeriodFormatterBuilder()
      .printZeroAlways()
      .minimumPrintedDigits(2)
      .appendHours().appendSeparator(":")
      .appendMinutes().appendSeparator(":")
      .appendSeconds().appendSeparator(".")
      .minimumPrintedDigits(3)
      .appendMillis().toFormatter();

  public static String extractClassName(final String className) {
    if (className == null) {
      return null;
    }
    final String normalized = className.indexOf('/') >= 0 ? classNameToNormalView(className) : className;
    return extractShortNameOfClass(normalized);
  }

  private Utils() {
  }

  public static String printTimeDelay(final long timeInMilliseconds) {
    final Duration duration = new Duration(timeInMilliseconds);
    final Period period = duration.toPeriod().normalizedStandard(PeriodType.time());
    return TIME_FORMATTER.print(period);
  }

  public static String extractShortNameOfClass(final String canonicalClassName) {
    int index = canonicalClassName.lastIndexOf('.');
    String text = index < 0 ? canonicalClassName : canonicalClassName.substring(index + 1);
    index = text.lastIndexOf('$');
    text = index < 0 ? text : text.substring(index);
    return text;
  }

  public static String classNameToNormalView(final String className) {
    if (className.startsWith("L") && className.endsWith(";")) {
      return className.substring(1, className.length() - 1).replace('/', '.');
    }
    else {
      return className;
    }
  }

  public static String makeSignatureForClass(final Class klazz) {
    return makeSignatureForClass(klazz.getName());
  }

  public static String makeSignatureForClass(final String name) {
    return 'L' + name.replace('.', '/') + ';';
  }

  public static String makeStr(final int len, final char ch) {
    final StringBuilder result = new StringBuilder(len);
    for (int i = 0; i < len; i++) {
      result.append(ch);
    }
    return result.toString();
  }

  public static String normalizeClassNameAndRemoveSubclassName(final String canonicalClassName) {
    String result = canonicalClassName.replace('.', '/');
    final int index = result.lastIndexOf('$');
    result = index >= 0 ? result.substring(0, index) : result;
    return result;
  }

  public static String extractOuterClassName(final String jvmInnerClassName) {
    final int lastDelimiter = jvmInnerClassName.lastIndexOf('$');
    String result = "";
    if (lastDelimiter>=0){
      result = jvmInnerClassName.substring(0, lastDelimiter).replace('.', '/');
    }
    return result;
  }
  
  public static String asString(final JavaClass clazz, final FieldOrMethod item) {
    final StringBuilder result = new StringBuilder();
    if (item != null) {
      if (item instanceof Field) {
        final Field field = (Field) item;
        final String type = Utility.signatureToString(field.getSignature());
        final String name = field.getName();
        result.append(type).append(' ').append(name);
      }
      else {
        final Method method = (Method) item;
        String type = Utility.methodSignatureReturnType(method.getSignature());

        String name = method.getName();
        if (name.equals("")) {
          name = Utils.extractClassName(clazz.getClassName());
          type = "";
        }
        else {
          type += ' ';
        }

        final String args[] = Utility.methodSignatureArgumentTypes(method.getSignature());
        final LocalVariableTable locVars = method.getLocalVariableTable();

        result.append(type).append(name).append('(');
        final int locVarOffset = method.isStatic() ? 0 : 1;
        int index = 0;
        for (final String a : args) {
          if (index > 0) {
            result.append(',');
          }
          result.append(a);
          final int argIndex = locVarOffset + index;
          if (locVars != null && argIndex < locVars.getTableLength()) {
            final LocalVariable localVariable = locVars.getLocalVariable(argIndex, 0);
            final String argName = localVariable == null ? "" : localVariable.getName();
            if (argName != null) {
              result.append(' ').append(argName);
            }
          }
          index++;
        }
        result.append(')');
      }
    }
    return result.toString();
  }

  public static int findLineNumber(final FieldOrMethod fieldOrMethod) {
    int result = -1;
    if (fieldOrMethod != null && fieldOrMethod instanceof Method) {
      final Method method = (Method) fieldOrMethod;
      final LineNumberTable lineTable = method.getLineNumberTable();
      if (lineTable != null && lineTable.getTableLength() > 0) {
        result = lineTable.getLineNumberTable()[0].getLineNumber();
        if (result > 1) {
          result--;
        }
      }
    }
    return result;
  }

  public static List splitToLines(final String str) {
    if (str == null || str.length() == 0) {
      return Collections.emptyList();
    }

    final String[] strarray = str.split("\\n");
    for (int i = 0; i < strarray.length; i++) {
      strarray[i] = strarray[i].replace("\t", "    ");
    }

    return Arrays.asList(strarray);
  }

  public static String escapeRegexToWildCat(final String text) {
    final StringBuilder result = new StringBuilder(text.length() * 3);
    result.append('^');
    for (final char c : text.toCharArray()) {
      switch (c) {
        case ' ':
          result.append("\\s");
          break;
        case '*':
          result.append(".*?");
          break;
        case '?':
          result.append(".");
          break;
        default:
          result.append(utfCode(c));
          break;
      }
    }
    result.append('$');
    return result.toString();
  }

  public static boolean isObjectType(final Type type) {
    final String text = type.getSignature();
    return text.endsWith(";");
  }

  private static String utfCode(final char ch) {
    final String s = Integer.toHexString(ch).toUpperCase(Locale.ENGLISH);
    return "\\u" + "0000".substring(0, 4 - s.length()) + s;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy