Package org.eclipse.osgi.internal.resolver

Source Code of org.eclipse.osgi.internal.resolver.NativeCodeSpecificationImpl

/*******************************************************************************
* Copyright (c) 2007, 2011 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
*     Rob Harrop - SpringSource Inc. (bug 247522)
*******************************************************************************/
package org.eclipse.osgi.internal.resolver;

import java.util.*;
import org.eclipse.osgi.framework.internal.core.AliasMapper;
import org.eclipse.osgi.framework.internal.core.Constants;
import org.eclipse.osgi.service.resolver.*;
import org.osgi.framework.Filter;
import org.osgi.framework.Version;

public class NativeCodeSpecificationImpl extends VersionConstraintImpl implements NativeCodeSpecification {
  private static final NativeCodeDescription[] EMPTY_NATIVECODEDESCRIPTIONS = new NativeCodeDescription[0];
  private static AliasMapper aliasMapper = new AliasMapper();
  private NativeCodeDescription[] possibleSuppliers;
  private boolean optional;

  public NativeCodeDescription[] getPossibleSuppliers() {
    synchronized (this.monitor) {
      if (possibleSuppliers == null)
        return EMPTY_NATIVECODEDESCRIPTIONS;
      return possibleSuppliers;
    }
  }

  void setPossibleSuppliers(NativeCodeDescription[] possibleSuppliers) {
    synchronized (this.monitor) {
      this.possibleSuppliers = possibleSuppliers;
    }
  }

  public boolean isOptional() {
    synchronized (this.monitor) {
      return optional;
    }
  }

  void setOptional(boolean optional) {
    synchronized (this.monitor) {
      this.optional = optional;
    }
  }

  public boolean isSatisfiedBy(BaseDescription supplier) {
    if (!(supplier instanceof NativeCodeDescription))
      return false;
    State containingState = getBundle().getContainingState();
    if (containingState == null)
      return false;
    Dictionary<Object, Object>[] platformProps = containingState.getPlatformProperties();
    NativeCodeDescription nativeSupplier = (NativeCodeDescription) supplier;
    Filter filter = nativeSupplier.getFilter();
    boolean match = false;
    for (int i = 0; i < platformProps.length && !match; i++) {
      @SuppressWarnings("rawtypes")
      Dictionary props = platformProps[i];
      if (filter != null && !filter.matchCase(props))
        continue;
      String[] osNames = nativeSupplier.getOSNames();
      if (osNames.length == 0)
        match = true;
      else {
        Object platformOS = platformProps[i].get(Constants.FRAMEWORK_OS_NAME);
        Object aliasedPlatformOS = platformOS == null || !(platformOS instanceof String) ? platformOS : aliasMapper.aliasOSName((String) platformOS);
        Object[] platformOSes;
        if (aliasedPlatformOS instanceof Collection)
          platformOSes = ((Collection<?>) aliasedPlatformOS).toArray();
        else
          platformOSes = aliasedPlatformOS == null ? new Object[0] : new Object[] {aliasedPlatformOS};
        for (int j = 0; j < osNames.length && !match; j++) {
          Object aliasedName = aliasMapper.aliasOSName(osNames[j]);
          for (int k = 0; k < platformOSes.length; k++) {
            if (aliasedName instanceof String) {
              if (platformOSes[k].equals(aliasedName))
                match = true;
            } else {
              for (Iterator<?> iAliases = ((Collection<?>) aliasedName).iterator(); iAliases.hasNext() && !match;)
                if (platformOSes[k].equals(iAliases.next()))
                  match = true;
            }
          }
        }
      }
      if (!match)
        continue;
      match = false;

      String[] processors = nativeSupplier.getProcessors();
      if (processors.length == 0)
        match = true;
      else {
        Object platformProcessor = platformProps[i].get(Constants.FRAMEWORK_PROCESSOR);
        Object aliasedPlatformProcessor = platformProcessor == null || !(platformProcessor instanceof String) ? platformProcessor : aliasMapper.aliasProcessor((String) platformProcessor);
        if (aliasedPlatformProcessor != null)
          for (int j = 0; j < processors.length && !match; j++) {
            String aliasedProcessor = aliasMapper.aliasProcessor(processors[j]);
            if (aliasedPlatformProcessor.equals(aliasedProcessor))
              match = true;
          }
      }
      if (!match)
        return false;
      match = false;

      String[] languages = nativeSupplier.getLanguages();
      if (languages.length == 0)
        match = true;
      else {
        Object platformLanguage = platformProps[i].get(Constants.FRAMEWORK_LANGUAGE);
        if (platformLanguage != null)
          for (int j = 0; j < languages.length && !match; j++) {
            if ((platformLanguage instanceof String) ? ((String) platformLanguage).equalsIgnoreCase(languages[j]) : platformLanguage.equals(languages[j]))
              match = true;
          }
      }
      if (!match)
        return false;
      match = false;

      VersionRange[] osVersions = nativeSupplier.getOSVersions();
      if (osVersions.length == 0 || platformProps[i].get(Constants.FRAMEWORK_OS_VERSION) == null)
        match = true;
      else {
        Version osversion;
        try {
          osversion = Version.parseVersion((String) platformProps[i].get(Constants.FRAMEWORK_OS_VERSION));
        } catch (Exception e) {
          osversion = Version.emptyVersion;
        }
        for (int j = 0; j < osVersions.length && !match; j++) {
          if (osVersions[j].isIncluded(osversion))
            match = true;
        }
      }
    }
    return match;
  }

  public String toString() {
    StringBuffer sb = new StringBuffer();
    NativeCodeDescription[] suppliers = getPossibleSuppliers();
    for (int i = 0; i < suppliers.length; i++) {
      if (i > 0)
        sb.append(", "); //$NON-NLS-1$
      sb.append(suppliers[i].toString());
    }

    return sb.toString();
  }

  @SuppressWarnings("unchecked")
  protected Map<String, String> getInternalDirectives() {
    return Collections.EMPTY_MAP;
  }

  @SuppressWarnings("unchecked")
  protected Map<String, Object> getInteralAttributes() {
    return Collections.EMPTY_MAP;
  }

  @Override
  protected String getInternalNameSpace() {
    return null;
  }
}
TOP

Related Classes of org.eclipse.osgi.internal.resolver.NativeCodeSpecificationImpl

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.