blob: e0e95515a13612f6abea026a31170859fe295617 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.util;
import java.io.*;
public class Util {
public static String OUTPUT_DIRECTORY = "comptest";
public static int MAX_PORT_NUMBER = 9999;
/**
* Copy the given source (a file or a directory that must exists) to the given destination (a directory that must exists).
*/
public static void copy(String sourcePath, String destPath) {
sourcePath = toNativePath(sourcePath);
destPath = toNativePath(destPath);
File source = new File(sourcePath);
if (!source.exists()) return;
File dest = new File(destPath);
if (!dest.exists()) return;
if (source.isDirectory()) {
String[] files = source.list();
if (files != null) {
for (int i = 0; i < files.length; i++) {
String file = files[i];
File sourceFile = new File(source, file);
if (sourceFile.isDirectory()) {
File destSubDir = new File(dest, file);
destSubDir.mkdir();
copy(sourceFile.getPath(), destSubDir.getPath());
} else {
copy(sourceFile.getPath(), dest.getPath());
}
}
}
} else {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(source);
File destFile = new File(dest, source.getName());
if (destFile.exists() && !destFile.delete()) {
throw new IOException(destFile + " is in use");
}
out = new FileOutputStream(destFile);
int bufferLength = 1024;
byte[] buffer = new byte[bufferLength];
int read = 0;
while (read != -1) {
read = in.read(buffer, 0, bufferLength);
if (read != -1) {
out.write(buffer, 0, read);
}
}
} catch (IOException e) {
throw new Error(e.toString());
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
}
}
/**
* Generate a display string from the given String.
* @param indent number of tabs are added at the begining of each line.
*
* Example of use: [org.eclipse.jdt.core.tests.util.Util.displayString("abc\ndef\tghi")]
*/
public static String displayString(String inputString){
return displayString(inputString, 0);
}
/**
* Generate a display string from the given String.
* It converts:
* <ul>
* <li>\t to \t</li>
* <li>\r to \\r</li>
* <li>\n to \n</li>
* <li>\b to \\b</li>
* <li>\f to \\f</li>
* <li>\" to \\\"</li>
* <li>\' to \\'</li>
* <li>\\ to \\\\</li>
* <li>All other characters are unchanged.</li>
* </ul>
* This method doesn't convert \r\n to \n.
* <p>
* Example of use:
* <o>
* <li>
* <pre>
* input string = "abc\ndef\tghi",
* indent = 3
* result = "\"\t\t\tabc\\n" +
* "\t\t\tdef\tghi\""
* </pre>
* </li>
* <li>
* <pre>
* input string = "abc\ndef\tghi\n",
* indent = 3
* result = "\"\t\t\tabc\\n" +
* "\t\t\tdef\tghi\\n\""
* </pre>
* </li>
* <li>
* <pre>
* input string = "abc\r\ndef\tghi\r\n",
* indent = 3
* result = "\"\t\t\tabc\\r\\n" +
* "\t\t\tdef\tghi\\r\\n\""
* </pre>
* </li>
* </ol>
* </p>
*
* @param inputString the given input string
* @param indent number of tabs are added at the begining of each line.
*
* @return the displayed string
*/
public static String displayString(String inputString, int indent) {
int length = inputString.length();
StringBuffer buffer = new StringBuffer(length);
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(inputString, "\n\r", true);
for (int i = 0; i < indent; i++) buffer.append("\t");
buffer.append("\"");
while (tokenizer.hasMoreTokens()){
String token = tokenizer.nextToken();
if (token.equals("\r")) {
buffer.append("\\r");
if (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
if (token.equals("\n")) {
buffer.append("\\n");
if (tokenizer.hasMoreTokens()) {
buffer.append("\" + \n");
for (int i = 0; i < indent; i++) buffer.append("\t");
buffer.append("\"");
}
continue;
} else {
buffer.append("\" + \n");
for (int i = 0; i < indent; i++) buffer.append("\t");
buffer.append("\"");
}
} else {
continue;
}
} else if (token.equals("\n")) {
buffer.append("\\n");
if (tokenizer.hasMoreTokens()) {
buffer.append("\" + \n");
for (int i = 0; i < indent; i++) buffer.append("\t");
buffer.append("\"");
}
continue;
}
StringBuffer tokenBuffer = new StringBuffer();
for (int i = 0; i < token.length(); i++){
char c = token.charAt(i);
switch (c) {
case '\r' :
tokenBuffer.append("\\r");
break;
case '\n' :
tokenBuffer.append("\\n");
break;
case '\b' :
tokenBuffer.append("\\b");
break;
case '\t' :
tokenBuffer.append("\t");
break;
case '\f' :
tokenBuffer.append("\\f");
break;
case '\"' :
tokenBuffer.append("\\\"");
break;
case '\'' :
tokenBuffer.append("\\'");
break;
case '\\' :
tokenBuffer.append("\\\\");
break;
default :
tokenBuffer.append(c);
}
}
buffer.append(tokenBuffer.toString());
}
buffer.append("\"");
return buffer.toString();
}
/**
* Reads the content of the given source file and converts it to a display string.
*
* Example of use: [org.eclipse.jdt.core.tests.util.Util.fileContentToDisplayString("c:/temp/X.java", 0)]
*/
public static String fileContentToDisplayString(String sourceFilePath, int indent) {
File sourceFile = new File(sourceFilePath);
if (!sourceFile.exists()) {
System.out.println("File " + sourceFilePath + " does not exists.");
return null;
}
if (!sourceFile.isFile()) {
System.out.println(sourceFilePath + " is not a file.");
return null;
}
StringBuffer sourceContentBuffer = new StringBuffer();
FileInputStream input = null;
try {
input = new FileInputStream(sourceFile);
} catch (FileNotFoundException e) {
return null;
}
try {
int read;
do {
read = input.read();
if (read != -1) {
sourceContentBuffer.append((char)read);
}
} while (read != -1);
input.close();
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
input.close();
} catch (IOException e2) {
}
}
return displayString(sourceContentBuffer.toString(), indent);
}
/**
* Reads the content of the given source file, converts it to a display string.
* If the destination file path is not null, writes the result to this file.
* Otherwise writes it to the console.
*
* Example of use: [org.eclipse.jdt.core.tests.util.Util.fileContentToDisplayString("c:/temp/X.java", 0, null)]
*/
public static void fileContentToDisplayString(String sourceFilePath, int indent, String destinationFilePath) {
String displayString = fileContentToDisplayString(sourceFilePath, indent);
if (destinationFilePath == null) {
System.out.println(displayString);
return;
}
writeToFile(displayString, destinationFilePath);
}
/**
* Flush content of a given directory (leaving it empty),
* no-op if not a directory.
*/
public static void flushDirectoryContent(File dir) {
if (dir.isDirectory()) {
String[] files = dir.list();
if (files == null) return;
for (int i = 0, max = files.length; i < max; i++) {
File current = new File(dir, files[i]);
if (current.isDirectory()) {
flushDirectoryContent(current);
}
current.delete();
}
}
}
/**
* Search the user hard-drive for a Java class library.
* Returns null if none could be found.
*
* Example of use: [org.eclipse.jdt.core.tests.util.Util.getJavaClassLib()]
*/
public static String getJavaClassLib() {
String jreDir = getJREDirectory();
if (jreDir == null) {
return null;
} else {
if ("J9".equals(System.getProperty("java.vm.name"))) {
return toNativePath(jreDir + "/lib/jclMax/classes.zip");
} else {
return toNativePath(jreDir + "/lib/rt.jar");
}
}
}
/**
* Returns the JRE directory this tests are running on.
* Returns null if none could be found.
*
* Example of use: [org.eclipse.jdt.core.tests.util.Util.getJREDirectory()]
*/
public static String getJREDirectory() {
return System.getProperty("java.home");
}
/**
* Search the user hard-drive for a possible output directory.
* Returns null if none could be found.
*
* Example of use: [org.eclipse.jdt.core.tests.util.Util.getOutputDirectory()]
*/
public static String getOutputDirectory() {
String container = System.getProperty("java.io.tmpdir");
if (container == null){
return null;
} else {
return toNativePath(container) + File.separator + OUTPUT_DIRECTORY;
}
}
/**
* Returns whether one of the arguments is "-expert".
*/
public static boolean isExpert(String[] args) {
for (int i = 0; i < args.length; i++) {
if (args[i].toLowerCase().equals("-expert")) {
return true;
}
}
return false;
}
/**
* Returns the next available port number on the local host.
*/
public static int nextAvailablePortNumber() {
for (int i = MAX_PORT_NUMBER; i > 1000; i--) {
int localPort = new SocketHelper().getAvailablePort(i);
if (localPort != -1) {
return localPort;
}
}
return -1;
}
/**
* Makes the given path a path using native path separators as returned by File.getPath()
* and trimming any extra slash.
*/
public static String toNativePath(String path) {
String nativePath = path.replace('\\', File.separatorChar).replace('/', File.separatorChar);
return
nativePath.endsWith("/") || nativePath.endsWith("\\") ?
nativePath.substring(0, nativePath.length() - 1) :
nativePath;
}
public static void writeToFile(String contents, String destinationFilePath) {
File destFile = new File(destinationFilePath);
FileOutputStream output = null;
try {
output = new FileOutputStream(destFile);
PrintWriter writer = new PrintWriter(output);
writer.print(contents);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
if (output != null) {
try {
output.close();
} catch (IOException e2) {
}
}
}
}
public static String convertToIndependantLineDelimiter(String source) {
StringBuffer buffer = new StringBuffer();
for (int i = 0, length = source.length(); i < length; i++) {
char car = source.charAt(i);
if (car == '\r') {
buffer.append('\n');
if (i < length-1 && source.charAt(i+1) == '\n') {
i++; // skip \n after \r
}
} else {
buffer.append(car);
}
}
return buffer.toString();
}
}