Package org.springframework.ide.eclipse.beans.core.internal.model.namespaces

Source Code of org.springframework.ide.eclipse.beans.core.internal.model.namespaces.NamespaceDefinition

/*******************************************************************************
* Copyright (c) 2010 Spring IDE Developers
* 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:
*     Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.beans.core.internal.model.namespaces;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.osgi.framework.Bundle;
import org.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.internal.model.namespaces.ToolingAwareNamespacePlugins.Version;
import org.springframework.ide.eclipse.beans.core.model.INamespaceDefinition;

/**
* Default implementation of {@link INamespaceDefinition}.
* @author Christian Dupuis
*/
class NamespaceDefinition implements INamespaceDefinition {

  private Pattern versionPattern = Pattern.compile(".*-([0-9,.]*)\\.xsd");

  private Bundle bundle;

  private String iconPath;

  private String name;

  private String namespaceUri;

  private String prefix;

  private Set<String> schemaLocations = new CopyOnWriteArraySet<String>();

  private Set<String> uris = new CopyOnWriteArraySet<String>();

  private Properties uriMapping = new Properties();

  private String defaultSchemaLocation = null;

  public NamespaceDefinition(Properties uriMapping) {
    this.uriMapping = uriMapping;
  }

  public void addSchemaLocation(String schemaLocation) {
    schemaLocations.add(schemaLocation);
  }

  public void addUri(String uri) {
    uris.add(uri);
  }

  /**
   * {@inheritDoc}
   */
  public Bundle getBundle() {
    return bundle;
  }

  /**
   * {@inheritDoc}
   */
  public synchronized String getDefaultSchemaLocation() {
    if (defaultSchemaLocation == null) {
      // Per convention the version-less XSD is the default
      for (String schemaLocation : schemaLocations) {
        if (!versionPattern.matcher(schemaLocation).matches()) {
          defaultSchemaLocation = schemaLocation;
        }
      }
      if (defaultSchemaLocation == null && schemaLocations.size() > 0) {
        List<String> locations = new ArrayList<String>(schemaLocations);
        Collections.sort(locations);
        defaultSchemaLocation = locations.get(0);
      }
    }
    return defaultSchemaLocation;
  }

  /**
   * {@inheritDoc}
   */
  protected String getDefaultUri() {
    String defaultUri = null;
    Version version = Version.MINIMUM_VERSION;
    for (String uri : uris) {
      Version tempVersion = Version.MINIMUM_VERSION;
      Matcher matcher = versionPattern.matcher(uri);
      if (matcher.matches()) {
        tempVersion = new Version(matcher.group(1));
      }
      if (tempVersion.compareTo(version) >= 0) {
        version = tempVersion;
        defaultUri = uri;
      }
    }
    return defaultUri;
  }

  /**
   * {@inheritDoc}
   */
  public InputStream getIconStream() {
        if (bundle == null || iconPath == null) {
          return null;
        }

        int bundleState = bundle.getState();
        if (!((bundleState & (Bundle.RESOLVED | Bundle.STARTING | Bundle.ACTIVE | Bundle.STOPPING)) != 0)) {
      return null;
    }

        // look for the image (this will check both the plugin and fragment folders
        URL fullPathString = FileLocator.find(bundle, new Path(iconPath), null);
        if (fullPathString == null) {
            try {
                fullPathString = new URL(iconPath);
            } catch (MalformedURLException e) {
                return null;
            }
        }
       
        if (fullPathString != null) {
          try {
        return fullPathString.openStream();
      }
      catch (IOException e) {
        BeansCorePlugin.log(e);
      }
        }
        return null;
  }

  /**
   * {@inheritDoc}
   */
  public String getName() {
    return name;
  }

  /**
   * {@inheritDoc}
   */
  public String getNamespaceUri() {
    return namespaceUri;
  }

  /**
   * {@inheritDoc}
   */
  public String getPrefix() {
    if (prefix != null) {
      return prefix;
    }
    int ix = namespaceUri.lastIndexOf('/');
    if (ix > 0) {
      return namespaceUri.substring(ix + 1);
    }
    return null;
  }

  /**
   * {@inheritDoc}
   */
  public Set<String> getSchemaLocations() {
    return schemaLocations;
  }

  /**
   * {@inheritDoc}
   */
  public void setBundle(Bundle bundle) {
    this.bundle = bundle;
  }

  public void setIconPath(String iconPath) {
    this.iconPath = iconPath;
  }

  /**
   * {@inheritDoc}
   */
  public void setName(String name) {
    this.name = name;
  }

  /**
   * {@inheritDoc}
   */
  public void setNamespaceUri(String namespaceUri) {
    this.namespaceUri = namespaceUri;
  }

  /**
   * {@inheritDoc}
   */
  public void setPrefix(String prefix) {
    this.prefix = prefix;
  }

  /**
   * {@inheritDoc}
   */
  public Properties getUriMapping() {
    return this.uriMapping;
  }

  public String getIconPath() {
    return iconPath;
  }
 
  @Override
  public String toString() {
    return this.namespaceUri;
  }
}
TOP

Related Classes of org.springframework.ide.eclipse.beans.core.internal.model.namespaces.NamespaceDefinition

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.