001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.nbbuild;
043:
044: import java.io.*;
045: import java.util.*;
046:
047: import org.apache.tools.ant.*;
048:
049: /** Changes content of a binary file. Usually used to change already compiled
050: * bytecode to contain, for example, a different method name. This is one way
051: * to cause two methods with the same name and arguments
052: * to differ in return type.
053: * <p>Differs little from the standard <code><replace></code> task,
054: * though a little more customized for binary files.
055: *
056: * @author Jaroslav Tulach
057: * @deprecated No longer used.
058: */
059: @Deprecated
060: public class Postprocess extends Task {
061: /** file to post process */
062: private File file;
063: /** string to replace */
064: private String oldString;
065: /** string to replace with */
066: private String newString;
067: /** minimum number of occurrences of the string */
068: private int min = 0;
069: /** maximum number of occurrences of the string */
070: private int max = 1;
071:
072: /** Set the file to work on.
073: * @param f the file
074: */
075: public void setFile(File f) {
076: this .file = f;
077: }
078:
079: /** Set the string to search for
080: */
081: public void setOld(String s) {
082: this .oldString = s;
083: }
084:
085: /** Set new string.
086: */
087: public void setNew(String s) {
088: this .newString = s;
089: }
090:
091: /** Sets the minimum number of string occurrences
092: */
093: public void setMin(int m) {
094: this .min = m;
095: }
096:
097: /** Sets the maximum number of string occurrences
098: */
099: public void setMax(int m) {
100: this .max = m;
101: }
102:
103: public void execute() throws BuildException {
104: if (file == null) {
105: throw new BuildException("A file must be specified"); // NOI18N
106: }
107:
108: if (oldString == null || newString == null
109: || oldString.length() != newString.length()) {
110: throw new BuildException(
111: "New and old strings must be specified and they must have the same length"); // NOI18N
112: }
113:
114: try {
115: int len = (int) file.length();
116: byte[] b = new byte[len];
117: FileInputStream is = new FileInputStream(file);
118: try {
119: if (is.read(b) != len)
120: throw new BuildException(
121: "Failed to read whole file", getLocation());
122: } finally {
123: is.close();
124: }
125:
126: int cnt = replaceString(b);
127:
128: if (cnt < min || cnt > max) {
129: throw new BuildException("String " + oldString
130: + " found " + cnt
131: + " times, that is out of min/max range"); // NOI18N
132: }
133:
134: if (cnt > 0) {
135: log("Replaced `" + oldString + "' by `" + newString
136: + "' " + cnt + " times in " + file);
137: FileOutputStream os = new FileOutputStream(file);
138: try {
139: os.write(b);
140: } finally {
141: os.close();
142: }
143: }
144:
145: } catch (IOException ex) {
146: throw new BuildException(ex);
147: }
148: }
149:
150: /** Scans the array and replaces the occurences of oldString by newString
151: * @param b the array
152: * @return the number of replaces
153: */
154: private int replaceString(byte[] b) {
155:
156: try {
157:
158: // This encoding is unadorned 8-bit.
159: String arr = new String(b, "ISO8859_1");
160: int cnt = 0;
161: int pos = -1;
162:
163: byte[] newbytes = newString.getBytes("ISO8859_1");
164: if (newbytes.length != oldString.getBytes("ISO8859_1").length) {
165: throw new BuildException(
166: "Strings to replace must be equal in length",
167: getLocation());
168: }
169: while ((pos = arr.indexOf(oldString, pos + 1)) != -1) {
170: System.arraycopy(newbytes, 0, b, pos, newbytes.length);
171: cnt++;
172: }
173:
174: return cnt;
175:
176: } catch (UnsupportedEncodingException e) {
177: throw new BuildException("Error replacing text", e,
178: getLocation());
179: }
180: }
181:
182: }
|