/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.server;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;
import tern.TernException;
import tern.metadata.TernModuleMetadata;
import tern.utils.StringUtils;
/**
* Wrapper for {@link ITernModule} used to configure {@link ITernModule} :
*
* <ul>
* <li>version of the module</li>
* <li>options of the module if it's a plugin</li>
* </ul>
*
*/
public class TernModuleConfigurable implements ITernModuleConfigurable {
private ITernModule wrappedModule;
private final Map<String, ITernModule> modules;
private JsonValue options;
public TernModuleConfigurable(ITernModule module) {
this.modules = new LinkedHashMap<String, ITernModule>();
this.wrappedModule = module;
addModule(module);
}
@Override
public String getName() {
return wrappedModule.getName();
}
@Override
public String getOrigin() {
return wrappedModule.getOrigin();
}
@Override
public String getType() {
return wrappedModule.getType();
}
@Override
public String getVersion() {
return wrappedModule.getVersion();
}
@Override
public ModuleType getModuleType() {
return ModuleType.Configurable;
}
public void addModule(ITernModule module) {
if (!StringUtils.isEmpty(module.getVersion())) {
this.modules.put(module.getVersion(), module);
}
}
@Override
public ITernModule getWrappedModule() {
return wrappedModule;
}
@Override
public ITernModule setVersion(String version) throws TernException {
ITernModule module = modules.get(version);
if (module == null) {
throw new TernException("Unsupported version " + version + " for type " + getType());
}
wrappedModule = module;
return module;
}
@Override
public Set<String> getAvailableVersions() {
return modules.keySet();
}
@Override
public TernModuleMetadata getMetadata() {
return wrappedModule.getMetadata();
}
@Override
public JsonObject getOptionsObject() {
return options != null && options.isObject() ? (JsonObject) options : null;
}
@Override
public JsonValue getOptions() {
return options;
}
@Override
public void setOptions(JsonValue options) {
this.options = options;
}
@Override
public ITernModule getModule(String name) {
for (ITernModule module : modules.values()) {
if (name.equals(module.getName())) {
return module;
}
}
return null;
}
@Override
public Collection<ITernModule> getModules() {
return modules.values();
}
@Override
public boolean hasVersion() {
return !modules.isEmpty();
}
@Override
public String toString() {
return getType();
}
}