org.eclipse.core.internal.filesystem.local.Convert Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aspectjtools Show documentation
Show all versions of aspectjtools Show documentation
AspectJ tools most notably contains the AspectJ compiler (AJC). AJC applies aspects to Java classes during
compilation, fully replacing Javac for plain Java classes and also compiling native AspectJ or annotation-based
@AspectJ syntax. Furthermore, AJC can weave aspects into existing class files in a post-compile binary weaving step.
This library is a superset of AspectJ weaver and hence also of AspectJ runtime.
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Martin Oberhuber (Wind River) - [170317] add symbolic link support to API
*******************************************************************************/
package org.eclipse.core.internal.filesystem.local;
import java.io.UnsupportedEncodingException;
import org.eclipse.osgi.service.environment.Constants;
public class Convert {
/** Indicates the default string encoding on this platform */
private static String defaultEncoding = new java.io.InputStreamReader(new java.io.ByteArrayInputStream(new byte[0])).getEncoding();
/** Indicates if we are running on windows */
private static final boolean isWindows = Constants.OS_WIN32.equals(LocalFileSystem.getOS());
private static final String WIN32_FILE_PREFIX = "\\\\?\\"; //$NON-NLS-1$
private static final String WIN32_UNC_FILE_PREFIX = "\\\\?\\UNC"; //$NON-NLS-1$
/**
* Performs conversion of a long value to a byte array representation.
*
* @see #bytesToLong(byte[])
*/
public static byte[] longToBytes(long value) {
// A long value is 8 bytes in length.
byte[] bytes = new byte[8];
// Convert and copy value to byte array:
// -- Cast long to a byte to retrieve least significant byte;
// -- Left shift long value by 8 bits to isolate next byte to be converted;
// -- Repeat until all 8 bytes are converted (long = 64 bits).
// Note: In the byte array, the least significant byte of the long is held in
// the highest indexed array bucket.
for (int i = 0; i < bytes.length; i++) {
bytes[(bytes.length - 1) - i] = (byte) value;
value >>>= 8;
}
return bytes;
}
/**
* Performs conversion of a byte array to a long representation.
*
* @see #longToBytes(long)
*/
public static long bytesToLong(byte[] value) {
long longValue = 0L;
// See method convertLongToBytes(long) for algorithm details.
for (byte element : value) {
// Left shift has no effect through first iteration of loop.
longValue <<= 8;
longValue ^= element & 0xFF;
}
return longValue;
}
/**
* Calling new String(byte[] s) creates a new encoding object and other garbage.
* This can be avoided by calling new String(byte[] s, String encoding) instead.
* @param source buffer with String in platform bytes
* @param length number of relevant bytes in the buffer
* @return converted Java String
* @since org.eclipse.core.filesystem 1.1
*/
public static String fromPlatformBytes(byte[] source, int length) {
if (defaultEncoding == null)
return new String(source, 0, length);
// try to use the default encoding
try {
return new String(source, 0, length, defaultEncoding);
} catch (UnsupportedEncodingException e) {
// null the default encoding so we don't try it again
defaultEncoding = null;
return new String(source, 0, length);
}
}
/*
* This method is called via Reflection API from the legacy file system
* library (liblocalfile_1_0_0). Source for the native code is located
* in org.eclipse.core.filesystem/natives/unix/localfile.c.
*/
public static String fromPlatformBytes(byte[] source) {
return fromPlatformBytes(source, source.length);
}
/**
* Calling String.getBytes() creates a new encoding object and other garbage.
* This can be avoided by calling String.getBytes(String encoding) instead.
*/
public static byte[] toPlatformBytes(String target) {
if (defaultEncoding == null)
return target.getBytes();
// try to use the default encoding
try {
return target.getBytes(defaultEncoding);
} catch (UnsupportedEncodingException e) {
// null the default encoding so we don't try it again
defaultEncoding = null;
return target.getBytes();
}
}
/**
* Converts a file name to a unicode char[] suitable for use by native methods.
* See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp
*/
public static char[] toPlatformChars(String target) {
//Windows use special prefix to handle long filenames
if (!isWindows)
return target.toCharArray();
//convert UNC path of form \\server\path to unicode form \\?\UNC\server\path
if (target.startsWith("\\\\")) { //$NON-NLS-1$
int nameLength = target.length();
int prefixLength = WIN32_UNC_FILE_PREFIX.length();
char[] result = new char[prefixLength + nameLength - 1];
WIN32_UNC_FILE_PREFIX.getChars(0, prefixLength, result, 0);
target.getChars(1, nameLength, result, prefixLength);
return result;
}
//convert simple path of form c:\path to unicode form \\?\c:\path
int nameLength = target.length();
int prefixLength = WIN32_FILE_PREFIX.length();
char[] result = new char[prefixLength + nameLength];
WIN32_UNC_FILE_PREFIX.getChars(0, prefixLength, result, 0);
target.getChars(0, nameLength, result, prefixLength);
return result;
}
}