/******************************************************************************* * Copyright (c) 2001, 2005 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 * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.sse.core.internal.encoding; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.wst.sse.core.internal.encoding.util.Assert; /** * A convenience class to statically get preferenences. */ public abstract class ContentTypeEncodingPreferences { // actually a null/empty string also means use workbench default so this // constant might not really be necessary public static final String WORKBENCH_DEFAULT = "WORKBENCH_DEFAULT"; //$NON-NLS-1$ private static final String getJavaPlatformDefaultEncoding() { // note: its important to use this system property, // instead // of // ByteToCharConverter.getDefault().getCharacterEncoding() // inorder to handle changes "on the fly". the // ByteToCharConverter // default is apparently set only when VM starts. // There's not really any "cusomter scnererios" // that change the // default encoding "on the fly", but its at least // used during // our automated tests. String enc = System.getProperty("file.encoding"); //$NON-NLS-1$ // return blank as null if (enc != null && enc.trim().length() == 0) { enc = null; } return enc; } public static final String getPreferredNewLineDelimiter(String contentTypeId) { String result = null; String newLineCode = null; newLineCode = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.END_OF_LINE_CODE); if (newLineCode == null) result = null; else if (newLineCode.equals(CommonEncodingPreferenceNames.CR)) result = CommonEncodingPreferenceNames.STRING_CR; else if (newLineCode.equals(CommonEncodingPreferenceNames.LF)) result = CommonEncodingPreferenceNames.STRING_LF; else if (newLineCode.equals(CommonEncodingPreferenceNames.CRLF)) result = CommonEncodingPreferenceNames.STRING_CRLF; return result; } /** * Returns current output encoding preference for contentTypeIdentifier * (unique IANA encoding) */ public static final String getUserPreferredCharsetName(String contentTypeId) { String prefEncoding = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.OUTPUT_CODESET); String encoding = prefEncoding; // get workbench encoding preference if preference // requests it if (prefEncoding == null || prefEncoding.trim().length() == 0 || prefEncoding.equals(ContentTypeEncodingPreferences.WORKBENCH_DEFAULT)) { encoding = ContentTypeEncodingPreferences.getWorkbenchPreferredCharsetName(); } return encoding; } /** * Utility method to get specified preference. Subclasses can't override, * since we expect this to work in a consistent way. Note: this is * specific to HTML and CSS and is intended to supply a "default spec" * other than the workbench platform's default, only for those cases where * there is no encoding specified anywhere else, e.g. in the file, or as a * file or folder property. */ public static final String getUserSpecifiedDefaultEncodingPreference() { String ContentTypeID_HTML = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$ return getUserSpecifiedDefaultEncodingPreference(ContentTypeID_HTML); } public static final String getUserSpecifiedDefaultEncodingPreference(String contentTypeID) { String enc = null; // first try to get base's default encoding for content type IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeID); if (contentType != null) { enc = contentType.getDefaultCharset(); } // next try to get sse's default encoding for content type if (enc == null || enc.trim().length() == 0) { enc = ContentBasedPreferenceGateway.getPreferencesString(contentTypeID, CommonEncodingPreferenceNames.INPUT_CODESET); } // next, just try and use workbench encoding if (enc == null || enc.trim().length() == 0) { enc = getWorkbenchSpecifiedDefaultEncoding(); } // return blank as null if (enc != null && enc.trim().length() == 0) { enc = null; } return enc; } /** * Returns Workbench encoding preference. Note: if workbench encoding is * null, platform encoding will be returned. */ private static final String getWorkbenchPreferredCharsetName() { String charset = ResourcesPlugin.getEncoding(); charset = CommonCharsetNames.getIanaPreferredCharsetName(charset); return charset; } /** * Returns Workbench encoding preference. Will return null if none * specified. */ private static final String getWorkbenchSpecifiedDefaultEncoding() { ResourcesPlugin resourcePlugin = ResourcesPlugin.getPlugin(); String enc = resourcePlugin.getPluginPreferences().getString(ResourcesPlugin.PREF_ENCODING); // return blank as null if (enc != null && enc.trim().length() == 0) { enc = null; } return enc; } public static final String useDefaultNameRules(IResourceCharsetDetector encodingProvider) { String result = null; String enc = null; enc = encodingProvider.getSpecDefaultEncoding(); if (enc != null) { result = enc; } else { enc = getUserSpecifiedDefaultEncodingPreference(); if (enc != null && enc.trim().length() > 0) { result = enc; } else { if (enc == null || enc.trim().length() == 0) { enc = getWorkbenchSpecifiedDefaultEncoding(); if (enc != null) { result = enc; } } if (enc == null || enc.trim().length() == 0) { enc = getJavaPlatformDefaultEncoding(); // enc should never be null (but we'll // check anyway) if (enc != null) { result = enc; } } } } Assert.isNotNull(enc, "post condition invalid"); //$NON-NLS-1$ result = CodedIO.checkMappingOverrides(enc); return result; } }