/*******************************************************************************
* Copyright (c) 2013, 2014 Red Hat, Inc.
* 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:
* Red Hat Inc. - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.thym.core.plugin;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import org.eclipse.thym.core.HybridCore;
import org.eclipse.thym.core.engine.HybridMobileEngine;
import com.github.zafarkhaja.semver.Version;
public class CordovaPlugin extends PlatformObject{
private class EngineDefinition {
String name;
String version;
String platform;
}
private String id;
private String version;
private String name;
private String description;
private String license;
private String author;
private String keywords;
private List<EngineDefinition> supportedEngines;
private String info;
private List<PluginJavaScriptModule> modules;
private IFolder folder;
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getLicense() {
return license;
}
public void setLicense(String license) {
this.license = license;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getKeywords() {
return keywords;
}
public void setKeywords(String keywords) {
this.keywords = keywords;
}
public void addSupportedEngine(String name, String version, String platform) {
if (supportedEngines == null) {
supportedEngines = new ArrayList<EngineDefinition>();
}
EngineDefinition engine = new EngineDefinition();
engine.name = name;
engine.version = version;
engine.platform = platform;
supportedEngines.add(engine);
}
public List<PluginJavaScriptModule> getModules() {
if (modules == null)
return Collections.emptyList();
return Collections.unmodifiableList(modules);
}
public void addModule(PluginJavaScriptModule module) {
if (this.modules == null) {
modules = new ArrayList<PluginJavaScriptModule>();
}
this.modules.add(module);
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public IFolder getFolder(){
return folder;
}
public void setFolder(IFolder adapter) {
this.folder = adapter;
}
/**
* Checks if the given engine is compatible with this plug-in.
* Returns a {@link MultiStatus} as there may be more than one
* reason for an engine to fail.
*
* @param engine
* @return A WARNING or OK level status
*
*/
public IStatus isEngineCompatible(HybridMobileEngine engine) {
if(supportedEngines == null || supportedEngines.isEmpty() )
return Status.OK_STATUS;
MultiStatus status = new MultiStatus(HybridCore.PLUGIN_ID, 0, NLS.bind("Plug-in {0} is not compatible with {1} version {2}" , new Object[] {getLabel(), engine.getName(), engine.getVersion()}),null);
for (EngineDefinition definition : supportedEngines) {
status.add(isDefinitionSatisfied(definition, engine));
}
return status;
}
private IStatus isDefinitionSatisfied(EngineDefinition definition, HybridMobileEngine engine){
String reason;
if(engine.getId().equals(definition.name)){// Engine ids match
Version engineVer = Version.valueOf(engine.getVersion());
if(engineVer.satisfies(definition.version)){ // version is satisfied
return Status.OK_STATUS;
}else{
reason = "engine version: "+definition.version;
}
}else{
reason = "engine id: "+definition.name;
}
return new Status(IStatus.WARNING, HybridCore.PLUGIN_ID,
NLS.bind("Plug-in {0} does not support {1} version {2}. Fails version requirement: {3}",new Object[]{getLabel(),engine.getName(), engine.getVersion(), reason}));
}
/**
* Returns a label for the plug-in that can best be
* presented.
*
* @return a label string
*/
public String getLabel(){
return getName() != null ?getName() : getId();
}
@Override
public String toString() {
if(getId() == null )
return super.toString();
return getId()+(getVersion() ==null?"":"("+ getVersion()+")");
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof CordovaPlugin) {
CordovaPlugin that = (CordovaPlugin) obj;
return this.getId().equals(that.getId());
}
return super.equals(obj);
}
}