blob: 7a84ab46711b8cd1e6b9e613c656e2729b923ac4 [file] [log] [blame]
package org.eclipse.cdt.internal.core.model;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICLogConstants;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICModelStatusConstants;
import org.eclipse.cdt.internal.core.model.IDebugLogConstants.DebugLogConstant;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
public class Util implements ICLogConstants {
public static boolean VERBOSE_PARSER = false;
public static boolean VERBOSE_MODEL = false;
public static boolean VERBOSE_CONTENTASSIST = false;
private Util() {
}
public static StringBuffer getContent(IFile file) throws IOException {
InputStream stream = null;
try {
stream = new BufferedInputStream(file.getContents(true));
} catch (CoreException e) {
throw new IOException(e.getMessage());
}
try {
char [] b = getInputStreamAsCharArray(stream, -1, null);
return new StringBuffer(b.length).append(b);
} finally {
try {
if (stream != null)
stream.close();
} catch (IOException e) {
}
}
}
/**
* Returns the given input stream's contents as a character array.
* If a length is specified (ie. if length != -1), only length chars
* are returned. Otherwise all chars in the stream are returned.
* Note this doesn't close the stream.
* @throws IOException if a problem occured reading the stream.
*/
public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding)
throws IOException {
InputStreamReader reader = null;
reader = encoding == null
? new InputStreamReader(stream)
: new InputStreamReader(stream, encoding);
char[] contents;
if (length == -1) {
contents = new char[0];
int contentsLength = 0;
int charsRead = -1;
do {
int available = stream.available();
// resize contents if needed
if (contentsLength + available > contents.length) {
System.arraycopy(
contents,
0,
contents = new char[contentsLength + available],
0,
contentsLength);
}
// read as many chars as possible
charsRead = reader.read(contents, contentsLength, available);
if (charsRead > 0) {
// remember length of contents
contentsLength += charsRead;
}
} while (charsRead > 0);
// resize contents if necessary
if (contentsLength < contents.length) {
System.arraycopy(
contents,
0,
contents = new char[contentsLength],
0,
contentsLength);
}
} else {
contents = new char[length];
int len = 0;
int readSize = 0;
while ((readSize != -1) && (len != length)) {
// See PR 1FMS89U
// We record first the read size. In this case len is the actual read size.
len += readSize;
readSize = reader.read(contents, len, length - len);
}
// See PR 1FMS89U
// Now we need to resize in case the default encoding used more than one byte for each
// character
if (len != length)
System.arraycopy(contents, 0, (contents = new char[len]), 0, len);
}
return contents;
}
public static void save (StringBuffer buffer, IFile file) throws CoreException {
byte[] bytes = buffer.toString().getBytes();
ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
// use a platform operation to update the resource contents
boolean force = true;
file.setContents(stream, force, true, null); // record history
}
/**
* Returns the given file's contents as a character array.
*/
public static char[] getResourceContentsAsCharArray(IFile file) throws CModelException {
return getResourceContentsAsCharArray(file, null);
}
public static char[] getResourceContentsAsCharArray(IFile file, String encoding) throws CModelException {
InputStream stream= null;
try {
stream = new BufferedInputStream(file.getContents(true));
} catch (CoreException e) {
throw new CModelException(e, ICModelStatusConstants.ELEMENT_DOES_NOT_EXIST);
}
try {
return Util.getInputStreamAsCharArray(stream, -1, encoding);
} catch (IOException e) {
throw new CModelException(e, ICModelStatusConstants.IO_EXCEPTION);
} finally {
try {
stream.close();
} catch (IOException e) {
}
}
}
/*
* Add a log entry
*/
public static void log(Throwable e, String message, LogConst logType) {
IStatus status= new Status(
IStatus.ERROR,
CCorePlugin.getDefault().getDescriptor().getUniqueIdentifier(),
IStatus.ERROR,
message,
e);
Util.log(status, logType);
}
public static void log(IStatus status, LogConst logType){
if (logType.equals(ICLogConstants.PDE)){
CCorePlugin.getDefault().getLog().log(status);
}
else if (logType.equals(ICLogConstants.CDT)){
CCorePlugin.getDefault().cdtLog.log(status);
}
}
public static void log(String message, LogConst logType){
IStatus status = new Status(IStatus.INFO,
CCorePlugin.getDefault().getDescriptor().getUniqueIdentifier(),
IStatus.INFO,
message,
null);
Util.log(status, logType);
}
public static void debugLog(String message, DebugLogConstant client) {
Util.debugLog(message, client, true);
}
public static void debugLog(String message, DebugLogConstant client, boolean addTimeStamp) {
if( CCorePlugin.getDefault() == null ) return;
if ( CCorePlugin.getDefault().isDebugging() && isActive(client)) {
// Time stamp
if(addTimeStamp)
message = MessageFormat.format( "[{0}] {1}", new Object[] { new Long( System.currentTimeMillis() ), message } );
while (message.length() > 100) {
String partial = message.substring(0, 100);
message = message.substring(100);
System.out.println(partial + "\\");
}
if (message.endsWith("\n")) {
System.err.print(message);
} else {
System.out.println(message);
}
}
}
/**
* @param client
* @return
*/
public static boolean isActive(DebugLogConstant client) {
if (client.equals(IDebugLogConstants.PARSER)){
return VERBOSE_PARSER;
}
else if (client.equals(IDebugLogConstants.MODEL)){
return VERBOSE_MODEL;
}
else if (client.equals(IDebugLogConstants.CONTENTASSIST)){
return VERBOSE_CONTENTASSIST;
}
return false;
}
public static void setDebugging(boolean value){
CCorePlugin.getDefault().setDebugging(value);
}
/**
* Combines two hash codes to make a new one.
*/
public static int combineHashCodes(int hashCode1, int hashCode2) {
return hashCode1 * 17 + hashCode2;
}
/**
* Compares two arrays using equals() on the elements.
* Either or both arrays may be null.
* Returns true if both are null.
* Returns false if only one is null.
* If both are arrays, returns true iff they have the same length and
* all elements compare true with equals.
*/
public static boolean equalArraysOrNull(Object[] a, Object[] b) {
if (a == b) return true;
if (a == null || b == null) return false;
int len = a.length;
if (len != b.length) return false;
for (int i = 0; i < len; ++i) {
if (a[i] == null) {
if (b[i] != null) return false;
} else {
if (!a[i].equals(b[i])) return false;
}
}
return true;
}
/**
* Compares two arrays using equals() on the elements.
* Either or both arrays may be null.
* Returns true if both are null.
* Returns false if only one is null.
* If both are arrays, returns true iff they have the same length and
* all elements are equal.
*/
public static boolean equalArraysOrNull(int[] a, int[] b) {
if (a == b)
return true;
if (a == null || b == null)
return false;
int len = a.length;
if (len != b.length)
return false;
for (int i = 0; i < len; ++i) {
if (a[i] != b[i])
return false;
}
return true;
}
/**
* Compares two objects using equals().
* Either or both array may be null.
* Returns true if both are null.
* Returns false if only one is null.
* Otherwise, return the result of comparing with equals().
*/
public static boolean equalOrNull(Object a, Object b) {
if (a == b) {
return true;
}
if (a == null || b == null) {
return false;
}
return a.equals(b);
}
}