All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openlca.io.ecospold1.input.DB Maven / Gradle / Ivy

The newest version!
package org.openlca.io.ecospold1.input;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.openlca.core.database.CategoryDao;
import org.openlca.core.database.Daos;
import org.openlca.core.database.IDatabase;
import org.openlca.core.model.AbstractEntity;
import org.openlca.core.model.Actor;
import org.openlca.core.model.Category;
import org.openlca.core.model.Flow;
import org.openlca.core.model.Location;
import org.openlca.core.model.ModelType;
import org.openlca.core.model.RootEntity;
import org.openlca.core.model.Source;
import org.openlca.ecospold.IExchange;
import org.openlca.ecospold.IPerson;
import org.openlca.ecospold.ISource;
import org.openlca.ecospold.io.DataSet;
import org.openlca.io.Categories;
import org.openlca.io.UnitMappingEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A wrapper for the database access and (semantic) search of entities for the
 * import of EcoSpold data sets.
 */
class DB {

	final IDatabase database;
	private final DBSearch search;
	private final Logger log = LoggerFactory.getLogger(getClass());

	private final Map categories = new HashMap<>();
	private final Map actors = new HashMap<>();
	private final Map sources = new HashMap<>();
	private final Map locations = new HashMap<>();
	private final Map flows = new HashMap<>();

	public DB(IDatabase database) {
		this.database = database;
		this.search = new DBSearch(database);
	}

	public Category getPutCategory(ModelType type, String parentName,
			String name) {
		String key = StringUtils.join(new Object[] { type.name(), parentName,
				name }, "/");
		Category category = categories.get(key);
		if (category != null)
			return category;
		try {
			CategoryDao dao = new CategoryDao(database);
			dao.getRootCategories(type);
			Category parent = null;
			if (parentName != null) {
				parent = Categories.findRoot(database, type, parentName);
				if (parent == null)
					parent = Categories.createRoot(database, type, parentName);
			}
			category = parent;
			if (name != null) {
				if (parent != null)
					category = Categories
							.findOrAddChild(database, parent, name);
				else
					category = Categories.createRoot(database, type, name);
			}
			categories.put(key, category);
			return category;
		} catch (Exception e) {
			log.error("Failed to get category " + key, e);
			return null;
		}
	}

	public Category getPutCategory(Category root, String parentName, String name) {
		String key = StringUtils.join(new Object[] { root.name,
				parentName, name }, "/");
		Category category = categories.get(key);
		if (category != null)
			return category;
		try {
			Category parent = root;
			if (parentName != null)
				parent = Categories.findOrAddChild(database, root, parentName);
			Category cat = parent;
			if (name != null)
				cat = Categories.findOrAddChild(database, parent, name);
			return cacheReturn(key, cat);
		} catch (Exception e) {
			log.error("Failed to find or add category", e);
			return null;
		}
	}

	private Category cacheReturn(String key, Category category) {
		categories.put(key, category);
		return category;
	}

	public Actor findActor(IPerson person, String genKey) {
		Actor actor = get(Actor.class, actors, genKey);
		if (actor != null)
			return actor;
		actor = search.findActor(person);
		if (actor != null)
			actors.put(genKey, actor);
		return actor;
	}

	public Source findSource(ISource eSource, String genKey) {
		Source source = get(Source.class, sources, genKey);
		if (source != null)
			return source;
		source = search.findSource(eSource);
		if (source != null)
			sources.put(genKey, source);
		return source;
	}

	public Location findLocation(String locationCode, String genKey) {
		Location location = get(Location.class, locations, genKey);
		if (location != null)
			return location;
		location = search.findLocation(locationCode);
		if (location != null)
			locations.put(genKey, location);
		return location;
	}

	public Flow findFlow(IExchange exchange, String genKey,
			UnitMappingEntry unitMapping) {
		Flow flow = get(Flow.class, flows, genKey);
		if (flow != null)
			return flow;
		flow = search.findFlow(exchange, unitMapping);
		if (flow != null)
			flows.put(genKey, flow);
		return flow;
	}

	public Flow findFlow(DataSet dataSet, String genKey,
			UnitMappingEntry unitMapping) {
		Flow flow = get(Flow.class, flows, genKey);
		if (flow != null)
			return flow;
		flow = search.findFlow(dataSet, unitMapping);
		if (flow != null)
			flows.put(genKey, flow);
		return flow;
	}

	private  T get(
			Class type, Map cache, String genKey) {
		T entity = cache.get(genKey);
		if (entity != null)
			return entity;
		entity = get(type, genKey);
		if (entity != null)
			cache.put(genKey, entity);
		return entity;
	}

	@SuppressWarnings("unchecked")
	public  T get(Class type, String id) {
		try {
			var modelType = ModelType.of(type);
			return (T) Daos.root(database, modelType).getForRefId(id);
		} catch (Exception e) {
			log.error("Failed to query database for " + type + " id=" + id, e);
			return null;
		}
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public  void put(T entity, String genKey) {
		if (entity == null)
			return;
		try {
			Class clazz = (Class) entity.getClass();
			Daos.base(database, clazz).insert(entity);
			Map cache = getCache(entity);
			if (cache != null)
				cache.put(genKey, entity);
		} catch (Exception e) {
			log.error("Failed to save entity " + entity + " id=" + genKey, e);
		}
	}

	private Map getCache(Object entity) {
		if (entity instanceof Actor)
			return actors;
		if (entity instanceof Source)
			return sources;
		if (entity instanceof Location)
			return locations;
		if (entity instanceof Flow)
			return flows;
		return null;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy