blob: 681d6180dff59751357a24170c16e8021bc9eb28 [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.netbeans.nbbuild;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.resources.FileResource;
import org.apache.tools.ant.util.FileUtils;
/**
* Converts cluster.path from value specified in platform.properties
* to value usable by harness.
*
* TODO - describe actual changes
*
* @author Richard Michalsky
*/
public class ConvertClusterPath extends Task {
private String from;
private String id;
private String basedir;
private String to;
/**
* Name of property to which stores
* @param to
*/
public void setTo(String to) {
this.to = to;
}
public void setBasedir(String basedir) {
this.basedir = basedir;
}
public void setFrom(String from) {
this.from = from;
}
public void setId(String id) {
this.id = id;
}
public ConvertClusterPath() {
}
@Override
public void execute() throws BuildException {
try {
if (from == null || from.length() == 0)
throw new BuildException("From parameter not specified.", getLocation());
if ((id == null || id.length() == 0)
&& (to == null && to.length() == 0))
throw new BuildException("Either 'to' or 'id' parameter for converted path must be specified.", getLocation());
if (basedir == null || basedir.length() == 0)
basedir = getProject().getBaseDir().getAbsolutePath();
log("Converting cluster.path from '" + from + "' relative to '" + basedir + "'.", Project.MSG_VERBOSE);
FileUtils fu = FileUtils.getFileUtils();
Project fakeproj = new Project();
fakeproj.setBasedir(basedir);
Path absPath = new Path(fakeproj, from);
log("Converted path: '" + absPath.toString() + "'.", Project.MSG_VERBOSE);
// When cluster does not exist, it is either bare name or one with different number
final Pattern pat = Pattern.compile("(?:.*[\\\\/])?([^/\\\\]*?)([0-9.]+)?[/\\\\]?$");
Path convPath = new Path(fakeproj);
for (Iterator<Resource> it = absPath.iterator(); it.hasNext();) {
FileResource element = (FileResource) it.next();
File f = element.getFile();
String fPath = f.getAbsolutePath();
final Matcher cm = pat.matcher(fPath);
if (f.exists()) {
if (! f.isDirectory())
throw new BuildException("Only directories can be elements of cluster.path. Got '" + fPath + "'", getLocation());
convPath.createPathElement().setLocation(f);
continue;
}
if (cm.matches()) {
// search for corresponding numbered cluster
File parent = f.getParentFile();
if (parent != null) {
File[] alternate = parent.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
Matcher am = pat.matcher(name);
return am.matches() && cm.group(1).equalsIgnoreCase(am.group(1));
}
});
if (alternate == null) {
Matcher matcher = Pattern.compile("^\\$\\{nbplatform\\.(.*)\\.netbeans\\.dest\\.dir\\}$").matcher(parent.getName());
if (matcher.matches()) {
throw new BuildException("Unknown platform name '" + matcher.group(1) + "'.", getLocation());
} else {
// cannot throw BuildException here, targets like 'clean' must run with nonexistent clusters as well
log("Warning: parent dir '" + parent.getAbsolutePath()
+ "' does not exist.", Project.MSG_WARN);
continue;
}
}
if (alternate.length > 0 && alternate[0].isDirectory()) {
if (cm.group(2) != null) // numbered cluster in cluster.path, found one with different number, warning
log("Warning: cluster '" + fPath + "' not found, using '" + alternate[0].getAbsolutePath() + "' instead.", Project.MSG_WARN);
else // bare name used
log("Cluster '" + alternate[0].getAbsolutePath() + "' found matching bare name '" + fPath + "'.", Project.MSG_VERBOSE);
convPath.createPathElement().setLocation(alternate[0]);
continue;
}
}
}
// no alternate cluster found
log("Warning: no numbered cluster matching bare name '" + fPath + "' found.", Project.MSG_WARN);
}
if (id != null && id.length() > 0)
getProject().addReference(id, convPath);
if (to != null && to.length() > 0)
getProject().setProperty(to, convPath.toString());
} catch (Exception e) {
throw new BuildException(e, getLocation());
}
}
}