/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.core.api.impl;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import net.xeoh.plugins.base.Plugin;
import net.xeoh.plugins.base.PluginManager;
import net.xeoh.plugins.base.impl.PluginManagerFactory;
import net.xeoh.plugins.base.util.PluginManagerUtil;
import com.opendoorlogistics.api.Functions;
import com.opendoorlogistics.api.IO;
import com.opendoorlogistics.api.ODLApi;
import com.opendoorlogistics.api.StandardComponents;
import com.opendoorlogistics.api.StringConventions;
import com.opendoorlogistics.api.Tables;
import com.opendoorlogistics.api.Values;
import com.opendoorlogistics.api.app.ODLAppProperties;
import com.opendoorlogistics.api.cache.ObjectCachePool;
import com.opendoorlogistics.api.components.ODLComponentProvider;
import com.opendoorlogistics.api.geometry.Geometry;
import com.opendoorlogistics.api.scripts.Scripts;
import com.opendoorlogistics.api.ui.UIFactory;
import com.opendoorlogistics.core.AppProperties;
import com.opendoorlogistics.core.api.impl.scripts.ScriptsImpl;
import com.opendoorlogistics.core.cache.ApplicationCache;
import com.opendoorlogistics.core.components.ODLGlobalComponents;
public class ODLApiImpl implements ODLApi{
private volatile StringConventions conventions;
private volatile StandardComponents standardComponents;
private volatile Values conversionApi;
private volatile Tables tables;
private volatile Geometry geometry;
private volatile UIFactory uiFactory;
private volatile Functions functions;
private volatile IO io;
private volatile Scripts scripts;
@Override
public Values values() {
if(conversionApi==null){
conversionApi = new ValuesImpl();
}
return conversionApi;
}
@Override
public Tables tables() {
if(tables==null){
tables = new TablesImpl(this);
}
return tables;
}
@Override
public StringConventions stringConventions() {
if(conventions==null){
conventions = new StringConventionsImpl();
}
return conventions;
}
@Override
public Geometry geometry() {
if(geometry==null){
geometry = new GeometryImpl();
}
return geometry;
}
@Override
public UIFactory uiFactory() {
if(uiFactory==null){
uiFactory = new UIFactoryImpl(this);
}
return uiFactory;
}
@Override
public StandardComponents standardComponents() {
if(standardComponents==null){
standardComponents = new StandardComponentsImpl();
}
return standardComponents;
}
@Override
public ODLComponentProvider registeredComponents() {
return ODLGlobalComponents.getProvider();
}
@Override
public Functions functions() {
if(functions==null){
functions = new Functions() {
@Override
public boolean isFunctionError(Object functionReturnValue) {
return functionReturnValue == com.opendoorlogistics.core.formulae.Functions.EXECUTION_ERROR;
}
};
}
return functions;
}
@Override
public IO io() {
if(io == null){
io = new IOImpl();
}
return io;
}
@Override
public Scripts scripts() {
if(scripts == null){
scripts = new ScriptsImpl(this);
}
return scripts;
}
@Override
public <T extends Plugin> List<T> loadPlugins(Class<T> cls) {
// register plugins from plugins directory
PluginManager pm = PluginManagerFactory.createPluginManager();
pm.addPluginsFrom(new File("." + File.separator + "plugins").toURI());
PluginManagerUtil pmu = new PluginManagerUtil(pm);
ArrayList<T> ret = new ArrayList<T>();
Collection<T> plugins = pmu.getPlugins(cls);
if(plugins!=null){
ret.addAll(plugins);
}
return ret;
}
@Override
public ODLAppProperties properties() {
return new ODLAppProperties(){
@Override
public Double getDouble(String key) {
return AppProperties.getDouble(key);
}
@Override
public Double getDouble(String key, double defaultValueIfKeyMissing) {
return AppProperties.getDouble(key, defaultValueIfKeyMissing);
}
@Override
public String getString(String key) {
return AppProperties.getString(key);
}
@Override
public void add(Properties properties) {
AppProperties.add(properties);
}
@Override
public Boolean getBool(String key) {
return AppProperties.getBool(key);
}
@Override
public Set<String> getKeys() {
return AppProperties.getKeys();
}
@Override
public void put(String key, Object value) {
AppProperties.put(key,value);
}
@Override
public boolean isTrue(String key) {
Boolean b = getBool(key);
return b!=null && b;
}
};
}
@Override
public ObjectCachePool cache() {
return ApplicationCache.singleton();
}
}