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

proguard.util.ListFunctionParser Maven / Gradle / Ivy

Go to download

ProGuardCORE is a free library to read, analyze, modify, and write Java class files.

There is a newer version: 9.1.6
Show newest version
/*
 * ProGuardCORE -- library to process Java bytecode.
 *
 * Copyright (c) 2002-2020 Guardsquare NV
 *
 * 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 proguard.util;

import java.util.List;

/**
 * This {@link StringFunctionParser} can create {@link StringFunction} instances for regular
 * expressions. The created function returns a String, or null if it doesn't match. The regular
 * expressions are either presented as a list, or they are interpreted as comma-separated lists,
 * optionally prefixed with '!' negators. If an entry with a negator matches, a negative match is
 * returned, without considering any subsequent entries in the list. The creation of {@link
 * StringFunction} instances for the entries is delegated to the given {@link StringFunctionParser}.
 *
 * @author Eric Lafortune
 */
public class ListFunctionParser implements StringFunctionParser {
  private final StringFunctionParser stringFunctionParser;

  /**
   * Creates a new ListFunctionParser that parses individual elements in the comma-separated list
   * with the given StringFunctionParser.
   */
  public ListFunctionParser(StringFunctionParser stringFunctionParser) {
    this.stringFunctionParser = stringFunctionParser;
  }

  // Implementations for StringFunctionParser.

  public StringFunction parse(String regularExpression) {
    // Split the regular expression to a list and parse it.
    return parse(ListUtil.commaSeparatedList(regularExpression));
  }

  /**
   * Creates a StringFunction for the given regular expression, which can be a list of optionally
   * negated simple entries.
   *
   * 

An empty list results in a StringFunction that matches any string. */ public StringFunction parse(List regularExpressions) { StringFunction listFunction = null; // Loop over all simple regular expressions, backward, creating a // linked list of functions. for (int index = regularExpressions.size() - 1; index >= 0; index--) { String regularExpression = (String) regularExpressions.get(index); StringFunction entryFunction = parseEntry(regularExpression); // Prepend the entry function. listFunction = listFunction == null ? entryFunction : isNegated(regularExpression) ? new AndStringFunction(entryFunction, listFunction) : new OrStringFunction(entryFunction, listFunction); } return listFunction == null ? StringFunction.IDENTITY_FUNCTION : listFunction; } // Small utility methods. /** * Creates a StringFunction for the given regular expression, which is a an optionally negated * simple expression. */ private StringFunction parseEntry(String regularExpression) { // Wrap the matcher if the regular expression starts with a '!' negator. return isNegated(regularExpression) ? new NotStringFunction(stringFunctionParser.parse(regularExpression.substring(1))) : stringFunctionParser.parse(regularExpression); } /** Returns whether the given simple regular expression is negated. */ private boolean isNegated(String regularExpression) { return regularExpression.length() > 0 && regularExpression.charAt(0) == '!'; } /** A main method for testing name matching and replacement. */ public static void main(String[] args) { try { System.out.println("Regular expression [" + args[0] + "]"); WildcardManager wildcardManager = new WildcardManager(); NameParser stringParser = new NameParser(wildcardManager); StringFunctionParser stringFunctionParser = new ListFunctionParser(new SingleFunctionParser(stringParser, wildcardManager)); StringFunction function = stringFunctionParser.parse(args[0]); for (int index = 1; index < args.length; index++) { String string = args[index]; System.out.print("String [" + string + "]"); System.out.println(" -> tranformed = " + function.transform(args[index])); } } catch (Exception ex) { ex.printStackTrace(); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy