/******************************************************************************* * 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 API and implementation *******************************************************************************/ package eu.esdihumboldt.hale.util.nonosgi.contenttype; import java.io.*; import java.util.*; import org.eclipse.core.internal.content.ContentMessages; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.content.*; import org.eclipse.core.runtime.preferences.*; import org.osgi.service.prefs.BackingStoreException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @since 3.1 */ @SuppressWarnings({"restriction", "rawtypes"}) public class ContentTypeMatcher implements IContentTypeMatcher { private static final Logger log = LoggerFactory.getLogger(ContentTypeMatcher.class); private IScopeContext context; private IContentTypeManager.ISelectionPolicy policy; public ContentTypeMatcher(IContentTypeManager.ISelectionPolicy policy, IScopeContext context) { this.policy = policy; this.context = context; } /** * @see IContentTypeMatcher */ public IContentType findContentTypeFor(InputStream contents, String fileName) throws IOException { ContentTypeCatalog currentCatalog = getCatalog(); IContentType[] all = currentCatalog.findContentTypesFor(this, contents, fileName); return all.length > 0 ? new ContentTypeHandler((ContentType) all[0], currentCatalog.getGeneration()) : null; } /** * @see IContentTypeMatcher */ public IContentType findContentTypeFor(String fileName) { // basic implementation just gets all content types ContentTypeCatalog currentCatalog = getCatalog(); IContentType[] associated = currentCatalog.findContentTypesFor(this, fileName); return associated.length == 0 ? null : new ContentTypeHandler((ContentType) associated[0], currentCatalog.getGeneration()); } /** * @see IContentTypeMatcher */ public IContentType[] findContentTypesFor(InputStream contents, String fileName) throws IOException { ContentTypeCatalog currentCatalog = getCatalog(); IContentType[] types = currentCatalog.findContentTypesFor(this, contents, fileName); IContentType[] result = new IContentType[types.length]; int generation = currentCatalog.getGeneration(); for (int i = 0; i < result.length; i++) result[i] = new ContentTypeHandler((ContentType) types[i], generation); return result; } /** * @see IContentTypeMatcher */ public IContentType[] findContentTypesFor(String fileName) { ContentTypeCatalog currentCatalog = getCatalog(); IContentType[] types = currentCatalog.findContentTypesFor(this, fileName); IContentType[] result = new IContentType[types.length]; int generation = currentCatalog.getGeneration(); for (int i = 0; i < result.length; i++) result[i] = new ContentTypeHandler((ContentType) types[i], generation); return result; } private ContentTypeCatalog getCatalog() { return ContentTypeManager.getInstance().getCatalog(); } /** * @see IContentTypeMatcher */ public IContentDescription getDescriptionFor(InputStream contents, String fileName, QualifiedName[] options) throws IOException { return getCatalog().getDescriptionFor(this, contents, fileName, options); } /** * @see IContentTypeMatcher */ public IContentDescription getDescriptionFor(Reader contents, String fileName, QualifiedName[] options) throws IOException { return getCatalog().getDescriptionFor(this, contents, fileName, options); } public IScopeContext getContext() { return context; } public IContentTypeManager.ISelectionPolicy getPolicy() { return policy; } /** * Enumerates all content types whose settings satisfy the given file spec type mask. */ public Collection getDirectlyAssociated(final ContentTypeCatalog catalog, final String fileSpec, final int typeMask) { //TODO: make sure we include built-in associations as well final IEclipsePreferences root = context.getNode(ContentTypeManager.CONTENT_TYPE_PREF_NODE); final Set result = new HashSet(3); try { root.accept(new IPreferenceNodeVisitor() { @SuppressWarnings("unchecked") public boolean visit(IEclipsePreferences node) { if (node == root) return true; String[] fileSpecs = ContentTypeSettings.getFileSpecs(node, typeMask); for (int i = 0; i < fileSpecs.length; i++) if (fileSpecs[i].equalsIgnoreCase(fileSpec)) { ContentType associated = catalog.getContentType(node.name()); if (associated != null) result.add(associated); break; } return false; } }); } catch (BackingStoreException bse) { log.error(ContentMessages.content_errorLoadingSettings, bse); } return result == null ? Collections.EMPTY_SET : result; } public IContentDescription getSpecificDescription(BasicDescription description) { if (description == null || ContentTypeManager.getInstance().getContext().equals(getContext())) // no need for specific content descriptions return description; // default description if (description instanceof DefaultDescription) // return an context specific description instead return new DefaultDescription(new ContentTypeSettings((ContentType) description.getContentTypeInfo(), context)); // non-default description // replace info object with context specific settings ((ContentDescription) description).setContentTypeInfo(new ContentTypeSettings((ContentType) description.getContentTypeInfo(), context)); return description; } }