Package org.eclipse.wst.xml.core.internal.catalog

Source Code of org.eclipse.wst.xml.core.internal.catalog.CatalogContributorRegistryReader

/*******************************************************************************
* 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);
    }
  }
 
}
TOP

Related Classes of org.eclipse.wst.xml.core.internal.catalog.CatalogContributorRegistryReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.