| //------------------------------------------------------------------------------ |
| //Copyright (c) 2005, 2007 IBM Corporation and others. |
| //All rights reserved. This program and the accompanying materials |
| //are made available under the terms of the Eclipse Public License v1.0 |
| //which accompanies this distribution, and is available at |
| //http://www.eclipse.org/legal/epl-v10.html |
| // |
| //Contributors: |
| //IBM Corporation - initial implementation |
| //------------------------------------------------------------------------------ |
| package org.eclipse.epf.search.utils; |
| |
| import java.io.File; |
| import java.io.InputStream; |
| import java.net.URL; |
| import java.util.NoSuchElementException; |
| import java.util.StringTokenizer; |
| import java.util.Vector; |
| |
| |
| public class UNCUtil { |
| public static final String UNC_FILE_PREFIX = "file:/"; //$NON-NLS-1$ |
| public static final String ALTERNATE_UNC_FILE_PREFIX = "file://"; //$NON-NLS-1$ |
| public static final String NETSCAPE_UNC_FILE_PREFIX = "file:///"; //$NON-NLS-1$ |
| public static final String UNC_FILE_ONLY = "file:"; //$NON-NLS-1$ |
| public static final String UNC_SEPARATOR = "/"; //$NON-NLS-1$ |
| |
| |
| /** |
| * Accounts for netscape unc file prefix. Converts to standard one. |
| * If not Netscape, nothing changes. |
| */ |
| public static String handleNetscapeFilePrefix(String filename) |
| { |
| String convertedName = null; |
| |
| if (filename.startsWith(NETSCAPE_UNC_FILE_PREFIX)) |
| { |
| convertedName = |
| ALTERNATE_UNC_FILE_PREFIX |
| + filename.substring( |
| NETSCAPE_UNC_FILE_PREFIX.length(), |
| filename.length()); |
| } |
| else |
| { |
| convertedName = filename; |
| } |
| |
| return (convertedName); |
| } |
| |
| /** |
| * Handles URL paths for Mozilla (and other browsers) over UNC. |
| */ |
| public static URL handleURLForUNC(URL originalUrl) |
| { |
| // handle special case for Mozilla over UNC |
| URL newUrl = null; |
| try |
| { |
| if (originalUrl.toString().startsWith("file://")) //$NON-NLS-1$ |
| { |
| // change "file://" to "file://///" |
| String extractedString = originalUrl.toString().substring(5); |
| newUrl = new URL("file", "", "///" + extractedString); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| } |
| else |
| { |
| newUrl = originalUrl; |
| } |
| } |
| catch (java.net.MalformedURLException mue) |
| { |
| newUrl = originalUrl; |
| } |
| |
| return (newUrl); |
| } |
| |
| /** |
| * Converts the UNC file to a regular, platform-dependent one. |
| */ |
| public static String convertFilename(String filename) |
| { |
| String convertedName = null; |
| |
| // remove any URL prefixes |
| String tempName = null; |
| if (filename.startsWith(UNC_FILE_PREFIX)) |
| { |
| tempName = filename.substring(UNC_FILE_PREFIX.length(), filename.length()); |
| int index = tempName.indexOf(":"); //$NON-NLS-1$ |
| if (index == -1) |
| { |
| // on Unix, add separator back to first character |
| tempName = UNC_SEPARATOR + tempName; |
| } |
| } |
| else |
| { |
| tempName = filename; |
| } |
| |
| // convert any UNC separators to the system default one |
| convertedName = |
| tempName.replace(UNC_SEPARATOR.charAt(0), File.separator.charAt(0)); |
| |
| return (convertedName); |
| } |
| |
| /** |
| * Converts the filename to a UNC filename. |
| */ |
| public static String convertFilenameToUNC(String filename) |
| { |
| // convert any UNC separators to the system default one |
| String convertedName = |
| filename.replace(File.separator.charAt(0), UNC_SEPARATOR.charAt(0)); |
| String finalName = convertFileSeparator(convertedName); |
| return (finalName); |
| } |
| |
| /** |
| * Converts the URL to one which can that matches a UNC convention. |
| */ |
| public static String convertToUNC(String url) |
| { |
| String convertedUrl = null; |
| if (url.startsWith(ALTERNATE_UNC_FILE_PREFIX)) |
| { |
| convertedUrl = |
| UNC_FILE_PREFIX |
| + url.substring(ALTERNATE_UNC_FILE_PREFIX.length(), url.length()); |
| } |
| else |
| { |
| convertedUrl = url; |
| } |
| return (convertedUrl); |
| |
| } |
| |
| /** |
| * Removes the "%20" that is used by some browsers for spaces |
| */ |
| public static String convertFileSpacing(String filename) |
| { |
| // now remove any "%20" |
| int start = 0; |
| String newFilename = ""; //$NON-NLS-1$ |
| while (start < filename.length()) |
| { |
| int index = filename.indexOf("%20", start); //$NON-NLS-1$ |
| if (index == -1) |
| { |
| index = filename.length(); |
| } |
| newFilename += filename.substring(start, index); |
| newFilename += " "; //$NON-NLS-1$ |
| start = index + 3; |
| } |
| |
| newFilename = newFilename.trim(); |
| |
| return (newFilename); |
| } |
| |
| /** |
| * Removes the "%5C" that is used by some browsers for file separator. |
| */ |
| public static String convertFileSeparator(String filename) |
| { |
| // remove any "%5C" |
| int start = 0; |
| String newFilename = ""; //$NON-NLS-1$ |
| while (start < filename.length()) |
| { |
| int index = filename.indexOf("%5C", start); //$NON-NLS-1$ |
| if (index == -1) |
| { |
| //index = filename.length(); |
| newFilename = filename.trim(); |
| break; |
| } |
| newFilename += filename.substring(start, index); |
| newFilename += UNC_SEPARATOR; |
| start = index + 3; |
| } |
| |
| newFilename = newFilename.trim(); |
| |
| // also if file separator equals unc separator, remove any Windows |
| // specific "\" |
| String windowsFileSeparator = "\\"; //$NON-NLS-1$ |
| if (!File.separator.equals(windowsFileSeparator) |
| && File.separator.equals(UNC_SEPARATOR)) |
| { |
| // on Unix |
| newFilename = |
| newFilename.replace( |
| windowsFileSeparator.charAt(0), |
| UNC_SEPARATOR.charAt(0)); |
| } |
| return (newFilename); |
| } |
| |
| /** |
| * Retrieves the file names from the specified directory |
| * that matches the given suffix. An example of a |
| * suffix is ".dat". |
| */ |
| public static Vector getFileList(String directory, String suffix) |
| { |
| if (directory.startsWith("http")) //$NON-NLS-1$ |
| { |
| // remote directory, use this instead |
| return (getFileListFromRemote(directory, suffix)); |
| } |
| |
| String tempDir = UNCUtil.convertFilename(directory); |
| File documentDirectory = new File(UNCUtil.convertFileSpacing(tempDir)); |
| String[] fileNameList = documentDirectory.list(); |
| |
| // now parse and only take those that end with the proper suffix |
| Vector finalList = new Vector(); |
| for (int i = 0; i < fileNameList.length; i++) |
| { |
| if (fileNameList[i].endsWith(suffix)) |
| { |
| finalList.addElement(fileNameList[i]); |
| } |
| } |
| |
| return (finalList); |
| } |
| |
| /** |
| * Retrieves the applicable default rup files from remote directory. |
| */ |
| private static Vector getFileListFromRemote(String directory, String suffix) |
| { |
| Vector filenames = new Vector(); |
| try |
| { |
| // get the listing using a URL |
| URL remoteUrl = new URL(directory); |
| InputStream inStream = remoteUrl.openStream(); |
| StringBuffer result = new StringBuffer(); |
| int c; |
| while ((c = inStream.read()) != -1) |
| { |
| result.append((char) c); |
| } |
| inStream.close(); |
| |
| // convert string to upper case to handle multiple server types such as Apache |
| String directoryResult = result.toString(); |
| directoryResult = directoryResult.replaceAll("href", "HREF"); //$NON-NLS-1$ //$NON-NLS-2$ |
| directoryResult = directoryResult.replaceAll("</a", "</A"); //$NON-NLS-1$ //$NON-NLS-2$ |
| directoryResult = directoryResult.replaceAll("<tt>", ""); //$NON-NLS-1$ //$NON-NLS-2$ |
| directoryResult = directoryResult.replaceAll("</tt>", ""); //$NON-NLS-1$ //$NON-NLS-2$ |
| directoryResult = directoryResult.replaceAll("<TT>", ""); //$NON-NLS-1$ //$NON-NLS-2$ |
| directoryResult = directoryResult.replaceAll("</TT>", ""); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| // parse the content |
| //StringTokenizer lineTokenizer = new StringTokenizer( result.toString() ); |
| StringTokenizer lineTokenizer = new StringTokenizer(directoryResult); |
| Vector lines = new Vector(); |
| try |
| { |
| while (true) |
| { |
| lineTokenizer.nextToken("REF"); //$NON-NLS-1$ |
| lineTokenizer.nextToken("\""); //$NON-NLS-1$ |
| String line = lineTokenizer.nextToken("\""); //$NON-NLS-1$ |
| |
| // strip out "</A"; needed this because StringTokenizer |
| // has problems parsing filenames that being with "A" |
| int index = line.indexOf("</A"); //$NON-NLS-1$ |
| if (index != -1 && index != 0) |
| { |
| String filename = line.substring(0, index); |
| lines.addElement(filename); |
| } |
| else |
| { |
| lines.addElement(line); |
| } |
| } |
| } |
| catch (NoSuchElementException ne) |
| { |
| // do nothing, end of content |
| } |
| |
| // parse each line |
| for (int i = 0; i < lines.size(); i++) |
| { |
| String line = (String) lines.elementAt(i); |
| |
| if (line.endsWith(suffix)) |
| { |
| // we want this |
| filenames.addElement(line); |
| } |
| } |
| } |
| catch (Exception e) |
| { |
| e.printStackTrace(); |
| } |
| return (filenames); |
| } |
| } |