/******************************************************************************* * Copyright (c) 2000, 2010 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 API and implementation *******************************************************************************/ package org.eclipse.core.internal.resources; import java.util.Arrays; import org.eclipse.core.runtime.Platform; /** * Captures platform specific attributes relevant to the core resources plugin. This class is not * intended to be instantiated. */ public abstract class OS { private static final String INSTALLED_PLATFORM; public static final char[] INVALID_RESOURCE_CHARACTERS; private static final String[] INVALID_RESOURCE_BASENAMES; private static final String[] INVALID_RESOURCE_FULLNAMES; static { //find out the OS being used //setup the invalid names INSTALLED_PLATFORM= Platform.getOS(); if (INSTALLED_PLATFORM.equals(Platform.OS_WIN32)) { //valid names and characters taken from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp INVALID_RESOURCE_CHARACTERS= new char[] { '\\', '/', ':', '*', '?', '"', '<', '>', '|' }; INVALID_RESOURCE_BASENAMES= new String[] { "aux", "com1", "com2", "com3", "com4", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ "com5", "com6", "com7", "com8", "com9", "con", "lpt1", "lpt2", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "nul", "prn" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ Arrays.sort(INVALID_RESOURCE_BASENAMES); //CLOCK$ may be used if an extension is provided INVALID_RESOURCE_FULLNAMES= new String[] { "clock$" }; //$NON-NLS-1$ } else { //only front slash and null char are invalid on UNIXes //taken from http://www.faqs.org/faqs/unix-faq/faq/part2/section-2.html INVALID_RESOURCE_CHARACTERS= new char[] { '/', '\0', }; INVALID_RESOURCE_BASENAMES= null; INVALID_RESOURCE_FULLNAMES= null; } } /** * Returns true if the given name is a valid resource name on this operating system, and false * otherwise. */ public static boolean isNameValid(String name) { //. and .. have special meaning on all platforms if (name.equals(".") || name.equals("..")) //$NON-NLS-1$ //$NON-NLS-2$ return false; if (INSTALLED_PLATFORM.equals(Platform.OS_WIN32)) { //empty names are not valid final int length= name.length(); if (length == 0) return false; final char lastChar= name.charAt(length - 1); // filenames ending in dot are not valid if (lastChar == '.') return false; // file names ending with whitespace are truncated (bug 118997) if (Character.isWhitespace(lastChar)) return false; int dot= name.indexOf('.'); //on windows, filename suffixes are not relevant to name validity String basename= dot == -1 ? name : name.substring(0, dot); if (Arrays.binarySearch(INVALID_RESOURCE_BASENAMES, basename.toLowerCase()) >= 0) return false; return Arrays.binarySearch(INVALID_RESOURCE_FULLNAMES, name.toLowerCase()) < 0; } return true; } }