blob: 862bc65dcbf81e337aeefdf5a8691cf1f158d742 [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.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.tools.ant.*;
/**
* It replaces paths in import element of buildscript. It is for
* converting xtest builscript of modules to test distribution layout. <br>
*
* Parameters:
* <ul>
* <li> oldname - name of build script (for example 'cfg-qa-functiona.xml')
* <li> newpath - new path if file (for example '../templates/cfg-qa-functional.xml')
* <li> attribute prefix - property name (example fir dist 'dist.dir' it add ${dist.dir}/ prefix)
* <li> file - build script
* </ul>
*/
public class ConvertImport extends Task {
private String oldName;
private String newPath;
private String propertyPrefixName;
private File file;
int endOfComment;
public void execute() throws BuildException {
if (!file.exists()) {
throw new BuildException("File " + file + " doesn't exist.");
}
byte bytes[] = new byte[(int)file.length()];
try {
try (FileInputStream fis = new FileInputStream(file)) {
fis.read(bytes);
}
String xml = new String(bytes);
String oldXml = xml;
int end = 0;
// <import ... file=" "/>
for (int offset = 0 ; offset < xml.length() ; offset = end + 1) {
int start = xml.indexOf("<import ",offset);
if (start == -1) {
break;
}
if (isComment(xml,offset,start)) {
end = endOfComment;
continue;
}
end = xml.indexOf("/>",start);
if (end == -1) {
continue;
}
int fileIndex = xml.indexOf("file",start);
int q1 = xml.indexOf("\"",fileIndex);
int q2 = xml.indexOf("\'",fileIndex);
int qStart = (q1 != -1 && ( q2 > q1 || q2 == -1)) ? q1 : q2;
if (qStart == -1 ) {
throw new BuildException("Invalid xml " + file);
}
char qCh = (qStart == q1) ? '"' : '\'';
int qEnd = xml.indexOf(qCh,qStart + 1);
if (qEnd == -1 || qEnd > end) {
throw new BuildException("Invalid xml : " + file);
}
int nameIdx = xml.indexOf(oldName,qCh);
if (nameIdx != -1 && nameIdx < qEnd) {
xml = replaceFileName(xml,qStart,qEnd);
end = xml.indexOf("/>",start);
}
} // while
if (oldXml != xml) {
// changed file
try ( PrintStream ps = new PrintStream(file)) {
ps.print(xml);
}
}
} catch (IOException ex) {
throw new BuildException(ex);
}
}
public String getOldName() {
return oldName;
}
public void setOldName(String oldName) {
this.oldName = oldName;
}
public String getNewPath() {
return newPath;
}
public void setNewPath(String newPath) {
this.newPath = newPath;
}
public String getPropertyPrefixName() {
return propertyPrefixName;
}
public void setPropertyPrefixName(String propertyPrefixName) {
this.propertyPrefixName = propertyPrefixName;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
private String replaceFileName(String xml, int qStart, int qEnd) {
StringBuffer sb = new StringBuffer();
sb.append(xml.substring(0,qStart + 1));
if (propertyPrefixName != null) {
sb.append("${" + propertyPrefixName + "}/");
}
sb.append(getNewPath());
sb.append(xml.substring(qEnd));
return sb.toString();
}
/** check if position pos is inside xml comment
*/
private boolean isComment(String xml, int offset, int position) {
boolean isComment = false;
while (offset < position) {
int i = -1;
if (isComment) {
i = xml.indexOf("-->",offset);
endOfComment = i + 2;
} else {
i = xml.indexOf("<!--",offset);
}
if (i < position && i != -1) {
isComment = !isComment;
offset = i;
} else {
break;
}
}
return isComment;
}
}