blob: a6880c8bb758dca7c92d42ad16d3d83f7dfe3ff5 [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
*
* 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 org.apache.ivy.plugins.namespace;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.util.Message;
public class MRIDTransformationRule implements NamespaceTransformer {
private static class MridRuleMatcher {
private static final String[] TYPES = new String[] {"o", "m", "b", "r"};
private Matcher[] matchers = new Matcher[TYPES.length];
public boolean match(MRIDRule src, ModuleRevisionId mrid) {
// CheckStyle:MagicNumber| OFF
matchers[0] = Pattern.compile(getPattern(src.getOrg())).matcher(mrid.getOrganisation());
if (!matchers[0].matches()) {
return false;
}
matchers[1] = Pattern.compile(getPattern(src.getModule())).matcher(mrid.getName());
if (!matchers[1].matches()) {
return false;
}
if (mrid.getBranch() == null) {
matchers[2] = null;
} else {
matchers[2] = Pattern.compile(getPattern(src.getBranch()))
.matcher(mrid.getBranch());
if (!matchers[2].matches()) {
return false;
}
}
matchers[3] = Pattern.compile(getPattern(src.getRev())).matcher(mrid.getRevision());
if (!matchers[3].matches()) {
return false;
}
return true;
// CheckStyle:MagicNumber| ON
}
public ModuleRevisionId apply(MRIDRule dest, ModuleRevisionId mrid) {
String org = applyRules(dest.getOrg(), "o");
String mod = applyRules(dest.getModule(), "m");
String branch = applyRules(dest.getBranch(), "b");
String rev = applyRules(dest.getRev(), "r");
return ModuleRevisionId.newInstance(org, mod, branch, rev,
mrid.getQualifiedExtraAttributes());
}
private String applyRules(String str, String type) {
for (int i = 0; i < TYPES.length; i++) {
str = applyTypeRule(str, TYPES[i], type, matchers[i]);
}
return str;
}
private String applyTypeRule(String rule, String type, String ruleType, Matcher m) {
if (m == null) {
return rule;
}
String res = rule == null ? "$" + ruleType + "0" : rule;
for (int i = 0; i < TYPES.length; i++) {
if (TYPES[i].equals(type)) {
res = res.replaceAll("([^\\\\])\\$" + type, "$1\\$");
res = res.replaceAll("^\\$" + type, "\\$");
} else {
res = res.replaceAll("([^\\\\])\\$" + TYPES[i], "$1\\\\\\$" + TYPES[i]);
res = res.replaceAll("^\\$" + TYPES[i], "\\\\\\$" + TYPES[i]);
}
}
StringBuffer sb = new StringBuffer();
m.reset();
m.find();
m.appendReplacement(sb, res);
String str = sb.toString();
// null rule not replaced, let it be null
if (rule == null && ("$" + ruleType + "0").equals(str)) {
return null;
}
return str;
}
private String getPattern(String p) {
return p == null ? ".*" : p;
}
}
private List src = new ArrayList();
private MRIDRule dest;
public void addSrc(MRIDRule src) {
this.src.add(src);
}
public void addDest(MRIDRule dest) {
if (this.dest != null) {
throw new IllegalArgumentException("only one dest is allowed per mapping");
}
this.dest = dest;
}
public ModuleRevisionId transform(ModuleRevisionId mrid) {
MridRuleMatcher matcher = new MridRuleMatcher();
for (Iterator iter = src.iterator(); iter.hasNext();) {
MRIDRule rule = (MRIDRule) iter.next();
if (matcher.match(rule, mrid)) {
ModuleRevisionId destMrid = matcher.apply(dest, mrid);
Message.debug("found matching namespace rule: " + rule + ". Applied " + dest
+ " on " + mrid + ". Transformed to " + destMrid);
return destMrid;
}
}
return mrid;
}
public boolean isIdentity() {
return false;
}
}