Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java')
-rw-r--r--bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java578
1 files changed, 0 insertions, 578 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java
deleted file mode 100644
index ba67eef69..000000000
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/util/Util.java
+++ /dev/null
@@ -1,578 +0,0 @@
-/*******************************************************************************
- * 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.team.internal.ccvs.core.util;
-
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.team.internal.ccvs.core.*;
-import org.eclipse.team.internal.ccvs.core.CVSException;
-import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
-import org.eclipse.team.internal.ccvs.core.CVSTag;
-import org.eclipse.team.internal.ccvs.core.ICVSFolder;
-import org.eclipse.team.internal.ccvs.core.ICVSResource;
-import org.eclipse.team.internal.ccvs.core.Policy;
-import org.eclipse.team.internal.ccvs.core.client.Session;
-import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
-import org.eclipse.team.internal.ccvs.core.syncinfo.FolderSyncInfo;
-import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
-
-/**
- * Unsorted static helper-methods
- */
-public class Util {
-
- /**
- * Return the last segment of the given path
- * @param path
- * @return String
- */
- public static String getLastSegment(String path) {
- int index = path.lastIndexOf(Session.SERVER_SEPARATOR);
- if (index == -1) {
- return path;
- }
- if (index == path.length() - 1) {
- return getLastSegment(path.substring(0, index));
- }
- return path.substring(index + 1);
-
- }
-
- /**
- * Return the the given path with the last segment removed
- * @param path
- * @return String
- */
- public static String removeLastSegment(String path) {
- int index = path.lastIndexOf(Session.SERVER_SEPARATOR);
- if (index == -1)
- return ""; //$NON-NLS-1$
- else
- return path.substring(0, index);
-
- }
- /**
- * Return the path without a trailing /
- * @param path
- * @return String
- */
- public static String asPath(String path) {
- if (path.endsWith(Session.SERVER_SEPARATOR)) {
- return path.substring(0, path.length() - Session.SERVER_SEPARATOR.length());
- }
- return path;
- }
- /*
- * *
- * Get the extention of the path of resource
- * relative to the path of root
- *
- * @throws CVSException if root is not a root-folder of resource
- */
- public static String getRelativePath(String rootName, String resourceName)
- throws CVSException {
-
- if (!resourceName.startsWith(rootName) || rootName.length() > resourceName.length()) {
- throw new CVSException(Policy.bind("Util.Internal_error,_resource_does_not_start_with_root_3")); //$NON-NLS-1$
- }
-
- // Otherwise we would get an ArrayOutOfBoundException
- // in case of two equal Resources
- if (rootName.length() == resourceName.length()) {
- return ""; //$NON-NLS-1$
- }
-
- // Remove leading slash if there is one
- String result = resourceName.substring(rootName.length()).replace('\\', '/');
- if (result.startsWith("/")) { //$NON-NLS-1$
- result = result.substring(1);
- }
- return result;
- }
-
- /**
- * Append the prefix and suffix to form a valid CVS path.
- */
- public static String appendPath(String prefix, String suffix) {
- if (prefix.length() == 0 || prefix.equals(Session.CURRENT_LOCAL_FOLDER)) {
- return suffix;
- } else if (prefix.endsWith(Session.SERVER_SEPARATOR)) {
- if (suffix.startsWith(Session.SERVER_SEPARATOR))
- return prefix + suffix.substring(1);
- else
- return prefix + suffix;
- } else if (suffix.startsWith(Session.SERVER_SEPARATOR))
- return prefix + suffix;
- else
- return prefix + Session.SERVER_SEPARATOR + suffix;
- }
-
- public static void logError(String message, Throwable throwable) {
- CVSProviderPlugin.log(IStatus.ERROR, message, throwable);
- }
-
- /**
- * If the number of segments in the relative path of <code>resource</code> to <code>root</code> is
- * greater than <code>split</code> then the returned path is truncated to <code>split</code> number
- * of segments and '...' is shown as the first segment of the path.
- */
- public static String toTruncatedPath(ICVSResource resource, ICVSFolder root, int split) {
- try {
- String stringPath = resource.getRelativePath(root);
- if (stringPath.equals(Session.CURRENT_LOCAL_FOLDER)) {
- return resource.getName();
- }
- String truncatedPath = toTruncatedPath(stringPath, split);
- // Special handling when the root is a project.
- // Append project name to the beginning of the path
- IResource iResource = root.getIResource();
- if (iResource != null && iResource.getType() == IResource.PROJECT) {
- truncatedPath = iResource.getName() + Session.SERVER_SEPARATOR + truncatedPath;
- }
- return truncatedPath;
- } catch(CVSException e) {
- return resource.getName();
- }
- }
-
- public static String toTruncatedPath(String stringPath, int split) {
- // Search backwards until split separators are found
- int count = 0;
- int index = stringPath.length();
- while (count++ < split && index != -1) {
- index = stringPath.lastIndexOf(Session.SERVER_SEPARATOR, index - 1);
- }
- if (index == -1) {
- return stringPath;
- } else {
- return Policy.bind("Util.truncatedPath", stringPath.substring(index)); //$NON-NLS-1$
- }
- }
-
- /**
- * Helper method that will time out when making a socket connection.
- * This is required because there is no way to provide a timeout value
- * when creating a socket and in some instances, they don't seem to
- * timeout at all.
- */
- public static Socket createSocket(final String host, final int port, IProgressMonitor monitor) throws UnknownHostException, IOException {
-
- // Start a thread to open a socket
- final Socket[] socket = new Socket[] { null };
- final Exception[] exception = new Exception[] {null };
- final Thread thread = new Thread(new Runnable() {
- public void run() {
- try {
- Socket newSocket = new Socket(host, port);
- synchronized (socket) {
- if (Thread.interrupted()) {
- // we we're either cancelled or timed out so just close the socket
- newSocket.close();
- } else {
- socket[0] = newSocket;
- }
- }
- } catch (UnknownHostException e) {
- exception[0] = e;
- } catch (IOException e) {
- exception[0] = e;
- }
- }
- });
- thread.start();
-
- // Wait the appropriate number of seconds
- int timeout = CVSProviderPlugin.getPlugin().getTimeout();
- if (timeout == 0) timeout = CVSProviderPlugin.DEFAULT_TIMEOUT;
- for (int i = 0; i < timeout; i++) {
- try {
- // wait for the thread to complete or 1 second, which ever comes first
- thread.join(1000);
- } catch (InterruptedException e) {
- // I think this means the thread was interupted but not necessarily timed out
- // so we don't need to do anything
- }
- synchronized (socket) {
- // if the user cancelled, clean up before preempting the operation
- if (monitor.isCanceled()) {
- if (thread.isAlive()) {
- thread.interrupt();
- }
- if (socket[0] != null) {
- socket[0].close();
- }
- // this method will throw the proper exception
- Policy.checkCanceled(monitor);
- }
- }
- }
- // If the thread is still running (i.e. we timed out) signal that it is too late
- synchronized (socket) {
- if (thread.isAlive()) {
- thread.interrupt();
- }
- }
- if (exception[0] != null) {
- if (exception[0] instanceof UnknownHostException)
- throw (UnknownHostException)exception[0];
- else
- throw (IOException)exception[0];
- }
- if (socket[0] == null) {
- throw new InterruptedIOException(Policy.bind("Util.timeout", host)); //$NON-NLS-1$
- }
- return socket[0];
- }
-
- /**
- * Helper method that will time out when running an external command.
- * This is required because there is no way to provide a timeout value
- * when executing an external command and in some instances, they don't seem to
- * timeout at all.
- */
- public static Process createProcess(final String[] command, IProgressMonitor monitor) throws IOException {
-
- // Start a thread to execute the command and get a handle to the process
- final Process[] process = new Process[] { null };
- final Exception[] exception = new Exception[] {null };
- final Thread thread = new Thread(new Runnable() {
- public void run() {
- try {
- Process newProcess = Runtime.getRuntime().exec(command);
- synchronized (process) {
- if (Thread.interrupted()) {
- // we we're either cancelled or timed out so just destroy the process
- newProcess.destroy();
- } else {
- process[0] = newProcess;
- }
- }
- } catch (IOException e) {
- exception[0] = e;
- }
- }
- });
- thread.start();
-
- // Wait the appropriate number of seconds
- int timeout = CVSProviderPlugin.getPlugin().getTimeout();
- if (timeout == 0) timeout = CVSProviderPlugin.DEFAULT_TIMEOUT;
- for (int i = 0; i < timeout; i++) {
- try {
- // wait for the thread to complete or 1 second, which ever comes first
- thread.join(1000);
- } catch (InterruptedException e) {
- // I think this means the thread was interupted but not necessarily timed out
- // so we don't need to do anything
- }
- synchronized (process) {
- // if the user cancelled, clean up before preempting the operation
- if (monitor.isCanceled()) {
- if (thread.isAlive()) {
- thread.interrupt();
- }
- if (process[0] != null) {
- process[0].destroy();
- }
- // this method will throw the proper exception
- Policy.checkCanceled(monitor);
- }
- }
- }
- // If the thread is still running (i.e. we timed out) signal that it is too late
- synchronized (process) {
- if (thread.isAlive()) {
- thread.interrupt();
- }
- }
- if (exception[0] != null) {
- throw (IOException)exception[0];
- }
- if (process[0] == null) {
- throw new InterruptedIOException(Policy.bind("Util.processTimeout", command[0])); //$NON-NLS-1$
- }
- return process[0];
- }
-
- public static String[] parseIntoSubstrings(String string, String delimiter) {
- List result = new ArrayList();
- int start = 0;
- int index = string.indexOf(delimiter);
- String next;
- while (index != -1) {
- next = string.substring(start, index);
- result.add(next);
- start = index + 1;
- index = string.indexOf(delimiter, start);
- }
- if (start >= string.length()) {
- next = "";//$NON-NLS-1$
- } else {
- next = string.substring(start);
- }
- result.add(next);
- return (String[]) result.toArray(new String[result.size()]);
- }
-
- /**
- * Return the substring at the given index (starting at 0) where each
- * element is delimited by the provided delimiter.
- *
- * @param bytes
- * @param delimiter
- * @param index
- * @param includeRest
- * @return String
- */
- public static String getSubstring(byte[] bytes, byte delimiter, int index, boolean includeRest) {
- byte[] bytesForSlot = getBytesForSlot(bytes, delimiter, index, includeRest);
- if (bytesForSlot == null) {
- return null;
- }
- return new String(bytesForSlot);
- }
-
- /**
- * Return the offset the the Nth delimeter from the given start index.
- * @param bytes
- * @param delimiter
- * @param start
- * @param n
- * @return int
- */
- public static int getOffsetOfDelimeter(byte[] bytes, byte delimiter, int start, int n) {
- int count = 0;
- for (int i = start; i < bytes.length; i++) {
- if (bytes[i] == delimiter) count++;
- if (count == n) return i;
- }
- // the Nth delimeter was not found
- return -1;
- }
-
- /**
- * Method getBytesForSlot.
- * @param syncBytes
- * @param SEPARATOR_BYTE
- * @param i
- * @param b
- * @return byte[]
- */
- public static byte[] getBytesForSlot(byte[] bytes, byte delimiter, int index, boolean includeRest) {
- // Find the starting index
- int start;
- if (index == 0) {
- // make start -1 so that end determination will start at offset 0.
- start = -1;
- } else {
- start = getOffsetOfDelimeter(bytes, delimiter, 0, index);
- if (start == -1) return null;
- }
- // Find the ending index
- int end = getOffsetOfDelimeter(bytes, delimiter, start + 1, 1);
- // Calculate the length
- int length;
- if (end == -1 || includeRest) {
- length = bytes.length - start - 1;
- } else {
- length = end - start - 1;
- }
- byte[] result = new byte[length];
- System.arraycopy(bytes, start + 1, result, 0, length);
- return result;
- }
-
- /**
- * Method equals.
- * @param syncBytes
- * @param oldBytes
- * @return boolean
- */
- public static boolean equals(byte[] syncBytes, byte[] oldBytes) {
- if (syncBytes == null || oldBytes == null) return syncBytes == oldBytes;
- if (syncBytes.length != oldBytes.length) return false;
- for (int i = 0; i < oldBytes.length; i++) {
- if (oldBytes[i] != syncBytes[i]) return false;
- }
- return true;
- }
-
- /**
- * Workaround a CVS bug where a CVS Folder with no immediately contained files has an incorrect
- * Tag type stored in the TAG file. In this case, the tag type is always BRANCH (Tv1)
- *
- * The fix is for folders with no files, use the tag type for the containing project. Since projects almost
- * always have files the TAG file is usually correct.
- *
- * For the case where the folder tag name does not match the project tag name we can not do much so we just
- * return the folder tag which will currently always be a branch.
- *
- * @param resource The IResource being tested. Can not be null.
- * @param tag The CVSTag as reported by CVS for the IResource. May be null.
- * @return CVSTag The corrected tag for the resource. May be null.
- */
-
- public static CVSTag getAccurateFolderTag(IResource resource, CVSTag tag) {
-
- // Determine if the folder contains files as immediate children.
- if (resource.getType() != IResource.FOLDER) {
- return tag;
- }
-
- IResource[] members = null;
- try {
- members = ((IFolder) resource).members();
- } catch (CoreException e1) {
- return tag;
- }
-
- for (int i = 0; i < members.length; i++) {
- if (members[i].getType() == IResource.FILE) {
- return tag;
- }
- }
-
- // Folder contains no files so this may not really be a branch.
- // Make the type the same as the project tag type if both are the same tag name.
- IProject project = resource.getProject();
- if (project == null) {
- return tag;
- }
-
- ICVSFolder projectFolder = CVSWorkspaceRoot.getCVSFolderFor(project);
- FolderSyncInfo projectSyncInfo;
- try {
- projectSyncInfo = projectFolder.getFolderSyncInfo();
- } catch (CVSException e) {
- return tag;
- }
-
- if (projectSyncInfo == null) {
- return tag;
- }
-
- CVSTag projectTag = projectSyncInfo.getTag();
-
- if (projectTag != null && projectTag.getName().equals(tag.getName())) {
- return projectTag;
- } else {
- return tag;
- }
- }
-
- /**
- * Workaround for CVS "bug" where CVS ENTRIES file does not contain correct
- * Branch vs. Version info. Entries files always record a Tv1 so all entries would
- * appear as branches.
- *
- * By comparing the revision number to the tag name
- * you can determine if the tag is a branch or version.
- *
- * @param cvsResource the resource to test. Must nut be null.
- * @return the correct cVSTag. May be null.
- */
-
- public static CVSTag getAccurateFileTag(ICVSResource cvsResource) throws CVSException {
-
- CVSTag tag = null;
- ResourceSyncInfo info = cvsResource.getSyncInfo();
- if(info != null) {
- tag = info.getTag();
- }
-
- FolderSyncInfo parentInfo = cvsResource.getParent().getFolderSyncInfo();
- CVSTag parentTag = null;
- if(parentInfo != null) {
- parentTag = parentInfo.getTag();
- }
-
- if(tag != null) {
- if(tag.getName().equals(info.getRevision())) {
- tag = new CVSTag(tag.getName(), CVSTag.VERSION);
- } else if(parentTag != null){
- tag = new CVSTag(tag.getName(), parentTag.getType());
- }
- } else {
- // if a file doesn't have tag info, very possible for example
- // when the file is in HEAD, use the parents.
- tag = parentTag;
- }
-
- return tag;
- }
-
- /**
- * Return the fullest path that we can obtain for the given resource
- * @param resource
- * @return
- */
- public static String getFullestPath(ICVSResource resource) {
- try {
- IResource local = resource.getIResource();
- if (local != null) {
- return local.getFullPath().toString();
- }
- } catch (CVSException e) {
- // Ignore and try the next method;
- }
- try {
- String remotePath = resource.getRepositoryRelativePath();
- if (remotePath != null) {
- return remotePath;
- }
- } catch (CVSException e) {
- // Ignore and try the next method;
- }
- return resource.getName();
- }
-
- public static String getVariablePattern(String pattern, String variableName) {
- return "(" + variableName + ":" + pattern + ":" + variableName + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
- }
-
- /**
- * @param localRevision
- * @return
- */
- public static int[] convertToDigits(String localRevision) {
- try {
- String digitStrings[] = localRevision.split("\\."); //$NON-NLS-1$
- int[] digits = new int[digitStrings.length];
- for (int i = 0; i < digitStrings.length; i++) {
- String digitString = digitStrings[i];
- digits[i] = Integer.parseInt(digitString);
- }
- return digits;
- } catch (NumberFormatException e) {
- CVSProviderPlugin.log(CVSException.wrapException(e));
- return new int[0];
- }
- }
-
- public static String toTruncatedPath(ICVSStorage file, ICVSFolder localRoot, int i) {
- if (file instanceof ICVSResource) {
- return toTruncatedPath((ICVSResource)file, localRoot, i);
- }
- return file.getName();
- }
-}

Back to the top