Package org.pdtextensions.repos

Source Code of org.pdtextensions.repos.Vendor

/*******************************************************************************
* Copyright (c) 2012 The PDT Extension Group (https://github.com/pdt-eg)
* 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
******************************************************************************/
package org.pdtextensions.repos;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.pdtextensions.repos.api.IFindResult;
import org.pdtextensions.repos.api.IModule;
import org.pdtextensions.repos.api.IModuleVersion;
import org.pdtextensions.repos.api.IVendor;
import org.pdtextensions.repos.api.IVendorAwareProvider;

/**
* Default implementation of a vendor that already knows the modules or is able to fetch them on demand.
*
* @author mepeisen
*/
public class Vendor implements IVendor {
 
  private Map<String, IModule> modules;
  private String name;
  private IVendorAwareProvider provider;
 
  /**
   * Constructor for implementations that are aware or loading the modules on demand
   * @param name
   * @param provider
   */
  protected Vendor(String name, IVendorAwareProvider provider) {
    this.name = name;
    this.provider = provider;
  }
 
  /**
   * Constructor for implementations that are knowing their modules
   * @param name
   * @param provider
   * @param modules
   */
  public Vendor(String name, IVendorAwareProvider provider, IModule[] modules) {
    this.name = name;
    this.provider = provider;
    this.modules = new HashMap<String, IModule>();
    for (final IModule module : modules) {
      this.modules.put(module.getName().toLowerCase(), module);
    }
  }
 
  /**
   * Method to load modules; must be overwritten by implementations that are aware of loading the modules on demand
   * @return modules map; must not be null; key must be lower cased
   * @throws CoreException thrown on errors.
   */
  protected Map<String, IModule> loadModules() throws CoreException {
    return null;
  }
 
  /**
   * Init the modules
   * @throws CoreException thrown on errors.
   */
  private void init() throws CoreException {
    if (this.modules == null) {
      this.modules = this.loadModules();
    }
  }

  @Override
  public IVendorAwareProvider getProvider() {
    return this.provider;
  }

  @Override
  public String getName() {
    return this.name;
  }

  @SuppressWarnings("unchecked")
  @Override
  public IFindResult findModule(String name, String version, IProgressMonitor monitor) {
    try {
      this.init();
    } catch (CoreException e) {
      return new FindResult(new Status(IStatus.ERROR, PEXReposPlugin.PLUGIN_ID, "error loading modules", e), Collections.EMPTY_LIST);
    }
    final String searchName = name == null ? ".*" : PEXReposPlugin.maskSearchStringToRegexp(name);
    final String searchVersion = version == null ? "*" : version;
    final Pattern patternName = Pattern.compile(searchName);
    final List<IModuleVersion> result = new ArrayList<IModuleVersion>();
   
    for (final Map.Entry<String, IModule> module : this.modules.entrySet()) {
      if (monitor.isCanceled()) {
        break;
      }
      if (patternName.matcher(module.getKey().toLowerCase()).matches()) {
        final IFindResult findResult = module.getValue().findVersion(searchVersion, monitor);
        // return the error if there is any
        if (!findResult.isOk()) {
          return findResult;
        }
        for (final IModuleVersion v : findResult.moduleVersions()) {
          result.add(v);
        }
      }
    }
   
    return new FindResult(Status.OK_STATUS, result);
  }

  @Override
  public Iterable<IModule> listModules(IProgressMonitor monitor) throws CoreException {
    this.init();
    return new ArrayList<IModule>(modules.values());
  }

}
TOP

Related Classes of org.pdtextensions.repos.Vendor

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.