blob: 19139a0c6263086a0453f150b5126964d85283cb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* https://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 org.apache.ivy.plugins.version;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.ivy.core.IvyContext;
import org.apache.ivy.core.IvyPatternHelper;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.plugins.matcher.Matcher;
import org.apache.ivy.plugins.matcher.PatternMatcher;
/**
*
*/
public class Match {
private String revision;
private String pattern;
private String args;
private String matcher;
public String getArgs() {
return args;
}
public void setArgs(String args) {
this.args = args;
}
public String getMatcher() {
return matcher;
}
public void setMatcher(String matcher) {
this.matcher = matcher;
}
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public String getRevision() {
return revision;
}
public void setRevision(String revision) {
this.revision = revision;
}
public Matcher getPatternMatcher(ModuleRevisionId askedMrid) {
String revision = askedMrid.getRevision();
List<String> args = split(getArgs());
List<String> argValues = getRevisionArgs(revision);
if (args.size() != argValues.size()) {
return new NoMatchMatcher();
}
Map<String, String> variables = new HashMap<>();
for (String arg : args) {
variables.put(arg, argValues.get(args.indexOf(arg)));
}
String pattern = getPattern();
pattern = IvyPatternHelper.substituteVariables(pattern, variables);
PatternMatcher pMatcher = IvyContext.getContext().getSettings().getMatcher(matcher);
return pMatcher.getMatcher(pattern);
}
private List<String> getRevisionArgs(String revision) {
int bracketStartIndex = revision.indexOf('(');
if (bracketStartIndex == -1) {
return Collections.emptyList();
}
int bracketEndIndex = revision.indexOf(')');
if (bracketEndIndex <= (bracketStartIndex + 1)) {
return Collections.emptyList();
}
return split(revision.substring(bracketStartIndex + 1, bracketEndIndex));
}
private static List<String> split(String string) {
if (string == null) {
return Collections.emptyList();
}
StringTokenizer tokenizer = new StringTokenizer(string, ", ");
List<String> tokens = new LinkedList<>();
while (tokenizer.hasMoreTokens()) {
tokens.add(tokenizer.nextToken());
}
return tokens;
}
private static class NoMatchMatcher implements Matcher {
public boolean isExact() {
return false;
}
public boolean matches(String str) {
return false;
}
}
}