| /******************************************************************************* |
| * Copyright (c) 2002, 2006 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.xml.core.internal.catalog; |
| |
| import java.io.IOException; |
| import java.net.URL; |
| |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.InvalidRegistryObjectException; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.wst.xml.core.internal.Logger; |
| import org.eclipse.wst.xml.core.internal.XMLCoreMessages; |
| import org.eclipse.wst.xml.core.internal.XMLCorePlugin; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalog; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogElement; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.ICatalogEntry; |
| import org.eclipse.wst.xml.core.internal.catalog.provisional.INextCatalog; |
| import org.osgi.framework.Bundle; |
| |
| public class CatalogContributorRegistryReader |
| { |
| protected static final String EXTENSION_POINT_ID = "catalogContributions"; //$NON-NLS-1$ |
| protected static final String TAG_CONTRIBUTION = "catalogContribution"; //$NON-NLS-1$ |
| /* |
| * this is a sample exptension |
| * <extension point="org.eclipse.wst.xml.core.catalogContributions"> |
| * <catalogContribution> |
| * <uri |
| * name="http://schemas.xmlsoap.org/wsdl/soap/" |
| * uri="xsd/soap.xsd"/> |
| * <public |
| * publicId="-//W3C//DTD XHTML 1.1//EN" |
| * uri="dtds/xhtml11-flat.dtd"/> |
| * <nextCatalog id="nestedCatalog" catalog="data/catalog1.xml"/> |
| * </catalogContribution> |
| * </extension> |
| * |
| */ |
| protected ICatalog catalog; |
| |
| protected String declaringExtensionId; |
| |
| protected CatalogContributorRegistryReader(ICatalog aCatalog) |
| { |
| catalog = aCatalog; |
| } |
| |
| /** |
| * read from plugin registry and parse it. |
| */ |
| protected void readRegistry() |
| { |
| IExtensionRegistry pluginRegistry = Platform.getExtensionRegistry(); |
| IExtensionPoint point = pluginRegistry.getExtensionPoint(XMLCorePlugin.getDefault().getBundle().getSymbolicName(), EXTENSION_POINT_ID); |
| if (point != null) |
| { |
| IConfigurationElement[] elements = point.getConfigurationElements(); |
| for (int i = 0; i < elements.length; i++) |
| { |
| readElement(elements[i]); |
| } |
| } |
| |
| } |
| |
| public static String resolvePath(URL platformURL, String path) |
| { |
| String fileLocation = path; |
| int jarPathStart = path.indexOf("jar:"); //$NON-NLS-1$ |
| jarPathStart = jarPathStart < 0 ? 0 : jarPathStart + "jar:".length(); //$NON-NLS-1$ |
| int jarPathEnd = path.indexOf("!"); //$NON-NLS-1$ |
| jarPathEnd = jarPathEnd < 0 ? path.length() : jarPathEnd; |
| fileLocation = path.substring(jarPathStart, jarPathEnd); |
| |
| String result = path; |
| String resolvedLocation = fileLocation; |
| URL resolvedURL = null; |
| if (fileLocation.startsWith("platform:/plugin")) //$NON-NLS-1$ |
| { |
| // this is the speclial case, where the resource is located relative |
| // to another plugin (not the one that declares the extension point) |
| // |
| try |
| { |
| resolvedURL = Platform.resolve(new URL(fileLocation)); |
| } catch (IOException e) |
| { |
| // do nothing |
| } |
| } |
| else{ |
| // this is the typical case, where the resource is located relative |
| // to the plugin that declares the extension point |
| try { |
| resolvedURL = new URL(Platform.resolve(platformURL), fileLocation); |
| } catch (IOException e) { |
| // do nothing |
| } |
| } |
| |
| if(resolvedURL != null){ |
| resolvedLocation = resolvedURL.toExternalForm().replace('\\', '/'); |
| result = result.replaceFirst(fileLocation, resolvedLocation); |
| } |
| return result; |
| } |
| |
| public static URL getPlatformURL(String pluginId){ |
| Bundle bundle = Platform.getBundle(pluginId); |
| if (bundle != null) |
| { |
| URL bundleEntry = bundle.getEntry("/"); //$NON-NLS-1$ |
| |
| if(bundleEntry != null){ |
| try |
| { |
| return Platform.resolve(bundleEntry); |
| } catch (IOException e) |
| { |
| Logger.logException(e); |
| } |
| } |
| } |
| return null; |
| } |
| |
| private String resolvePath(String path) |
| { |
| return resolvePath(getPlatformURL(declaringExtensionId), path); |
| } |
| |
| protected void readElement(IConfigurationElement element) |
| { |
| try |
| { |
| declaringExtensionId = element.getDeclaringExtension().getNamespace(); |
| } |
| catch (InvalidRegistryObjectException e) |
| { |
| Logger.logException(e); |
| } |
| |
| if (TAG_CONTRIBUTION.equals(element.getName())){ |
| IConfigurationElement[] mappingInfoElementList = element.getChildren(OASISCatalogConstants.TAG_PUBLIC); |
| processMappingInfoElements(mappingInfoElementList); |
| mappingInfoElementList = element.getChildren(OASISCatalogConstants.TAG_SYSTEM); |
| processMappingInfoElements(mappingInfoElementList); |
| mappingInfoElementList = element.getChildren(OASISCatalogConstants.TAG_URI); |
| processMappingInfoElements(mappingInfoElementList); |
| IConfigurationElement[] nextCatalogElementList = element.getChildren(OASISCatalogConstants.TAG_NEXT_CATALOG); |
| processNextCatalogElements(nextCatalogElementList); |
| |
| } |
| |
| } |
| |
| private void processMappingInfoElements(IConfigurationElement[] childElementList) |
| { |
| if (catalog == null) |
| return; |
| for (int i = 0; i < childElementList.length; i++) |
| { |
| IConfigurationElement childElement = childElementList[i]; |
| String name = childElement.getName(); |
| String key = null; |
| |
| int type = ICatalogEntry.ENTRY_TYPE_PUBLIC; |
| if (OASISCatalogConstants.TAG_PUBLIC.equals(name)) |
| { |
| key = childElement.getAttribute(OASISCatalogConstants.ATTR_PUBLIC_ID); |
| } |
| else if (OASISCatalogConstants.TAG_SYSTEM.equals(name)) |
| { |
| key = childElement.getAttribute(OASISCatalogConstants.ATTR_SYSTEM_ID); |
| type = ICatalogEntry.ENTRY_TYPE_SYSTEM; |
| } |
| else if (OASISCatalogConstants.TAG_URI.equals(name)) |
| { |
| key = childElement.getAttribute(OASISCatalogConstants.ATTR_NAME); |
| type = ICatalogEntry.ENTRY_TYPE_URI; |
| } |
| else if (OASISCatalogConstants.TAG_NEXT_CATALOG.equals(name)) |
| { |
| processNextCatalogElements(new IConfigurationElement[]{childElement}); |
| continue; |
| } |
| if (key == null || key.equals("")) //$NON-NLS-1$ |
| { |
| Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_entry_key_not_set); |
| continue; |
| } |
| String entryURI = childElement.getAttribute(OASISCatalogConstants.ATTR_URI); // mandatory |
| if (entryURI == null || entryURI.equals("")) //$NON-NLS-1$ |
| { |
| Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_entry_uri_not_set); |
| continue; |
| } |
| ICatalogElement catalogElement = catalog.createCatalogElement(type); |
| if (catalogElement instanceof ICatalogEntry) |
| { |
| ICatalogEntry entry = (ICatalogEntry) catalogElement; |
| entry.setKey(key); |
| String resolvedPath = resolvePath(entryURI); |
| entry.setURI(resolvedPath); |
| String id = childElement.getAttribute(OASISCatalogConstants.ATTR_ID); // optional |
| if (id != null && !id.equals("")) //$NON-NLS-1$ |
| { |
| entry.setId(id); |
| } |
| } |
| // process any other attributes |
| for (int j = 0; j < childElement.getAttributeNames().length; j++) |
| { |
| String attrName = childElement.getAttributeNames()[j]; |
| if (!attrName.equals(OASISCatalogConstants.ATTR_URI) && !attrName.equals(OASISCatalogConstants.ATTR_NAME) && !attrName.equals(OASISCatalogConstants.ATTR_PUBLIC_ID) |
| && !attrName.equals(OASISCatalogConstants.ATTR_SYSTEM_ID) && !attrName.equals(OASISCatalogConstants.ATTR_CATALOG) && !attrName.equals(OASISCatalogConstants.ATTR_ID) |
| && !attrName.equals(OASISCatalogConstants.ATTR_BASE)) |
| { |
| String attrValue = childElement.getAttribute(attrName); |
| if (attrValue != null && !attrValue.equals("")) //$NON-NLS-1$ |
| { |
| catalogElement.setAttributeValue(attrName, attrValue); |
| } |
| } |
| } |
| catalog.addCatalogElement(catalogElement); |
| } |
| } |
| |
| private void processNextCatalogElements(IConfigurationElement[] childElementList) |
| { |
| if (catalog == null) |
| return; |
| for (int i = 0; i < childElementList.length; i++) |
| { |
| IConfigurationElement childElement = childElementList[i]; |
| String location = childElement.getAttribute(OASISCatalogConstants.ATTR_CATALOG); // mandatory |
| if (location == null || location.equals("")) //$NON-NLS-1$ |
| { |
| Logger.log(Logger.ERROR, XMLCoreMessages.Catalog_next_catalog_location_uri_not_set); |
| continue; |
| } |
| INextCatalog nextCatalog = new NextCatalog(); |
| String resolvedPath = resolvePath(location); |
| nextCatalog.setCatalogLocation(resolvedPath); |
| String id = childElement.getAttribute(OASISCatalogConstants.ATTR_ID); |
| if (id != null && !id.equals("")) //$NON-NLS-1$ |
| { |
| nextCatalog.setId(id); |
| } |
| catalog.addCatalogElement(nextCatalog); |
| } |
| } |
| |
| |
| |
| } |