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

org.openlca.io.simapro.csv.Compartment Maven / Gradle / Ivy

The newest version!
package org.openlca.io.simapro.csv;

import java.util.Optional;

import org.openlca.core.model.Category;
import org.openlca.simapro.csv.enums.ElementaryFlowType;
import org.openlca.simapro.csv.enums.SubCompartment;
import org.openlca.util.Strings;

public record Compartment(ElementaryFlowType type, SubCompartment sub) {

	public static Compartment of(ElementaryFlowType type, SubCompartment sub) {
		return new Compartment(type, sub);
	}

	/**
	 * Try to find the compartment pair directly from the given compartment and
	 * sub-compartment name.
	 */
	public static Optional of(
		String compartment, String subCompartment) {

		if (compartment == null)
			return Optional.empty();
		var type = ElementaryFlowType.of(compartment);
		if (type == null)
			return  Optional.empty();

		if (Strings.nullOrEmpty(subCompartment)
			|| "unspecified".equalsIgnoreCase(subCompartment)
			|| "(unspecified)".equalsIgnoreCase(subCompartment))
			return Optional.of(Compartment.of(type, SubCompartment.UNSPECIFIED));

		var sub = SubCompartment.of(subCompartment);
		return sub == null
			? Optional.empty()
			: Optional.of(Compartment.of(type, sub));
	}

	public static Compartment fromPath(String path) {
		if (path == null)
			return null;
		var parts = path.split("/");
		int n = parts.length;
		if (n == 1) {
			var compartment = of(parts[0], null);
			if (compartment.isPresent())
				return compartment.get();
		} else if (n > 1) {
			String sub = parts[n - 1];
			String comp = parts[n - 2];
			var compartment = of(comp, sub);
			if (compartment.isPresent())
				return compartment.get();
		}
		return matchPath(path);
	}

	public static Compartment of(Category category) {
		if (category == null || category.name == null)
			return null;

		// try to directly identify the compartment
		// from the last two category names
		if (category.category == null) {
			var compartment = of(category.name, null);
			if (compartment.isPresent())
				return compartment.get();
		} else {
			String comp = category.category.name;
			String sub = category.name;
			if (comp != null) {
				var compartment =  of(comp, sub);
				if (compartment.isPresent())
					return compartment.get();
			}
		}

		// try to identify it from identifiers in the
		// full category path
		StringBuilder p = null;
		Category c = category;
		while (c != null) {
			String name = c.name == null ? "" : c.name;
			if (p == null) {
				p = new StringBuilder(name);
			} else {
				p.insert(0, name + '/');
			}
			c = c.category;
		}
		String path = p.toString().toLowerCase();
		return matchPath(path);
	}

	private static Compartment matchPath(String path) {
		// find compartments for the path
		// try to match more specific first

		// social flows
		if (match(path, "social")) {
			return Compartment.of(
				ElementaryFlowType.SOCIAL_ISSUES, SubCompartment.UNSPECIFIED);
		}

		// resources
		if (match(path, "resource")) {
			var type = ElementaryFlowType.RESOURCES;

			if (match(path, "bio"))
				return Compartment.of(
					type, SubCompartment.RESOURCES_BIOTIC);

			if (match(path, "water"))
				return Compartment.of(
					type, SubCompartment.RESOURCES_IN_WATER);

			if (match(path, "air"))
				return Compartment.of(
					type, SubCompartment.RESOURCES_IN_AIR);

			if (match(path, "land"))
				return Compartment.of(
					type, SubCompartment.RESOURCES_LAND);

			if (match(path, "ground"))
				return Compartment.of(
					type, SubCompartment.RESOURCES_IN_GROUND);

			return Compartment.of(type, SubCompartment.UNSPECIFIED);
		} // resources


		// air emissions
		if (match(path, "emission", "air")) {
			var type = ElementaryFlowType.EMISSIONS_TO_AIR;

			if (match(path, "stratosphere", "troposhere"))
				return Compartment.of(
					type, SubCompartment.AIR_STRATOSPHERE_TROPOSPHERE);

			if (match(path, "stratosphere"))
				return Compartment.of(
					type, SubCompartment.AIR_STRATOSPHERE);

			if (match(path, "low", "pop", "long", "term"))
				return Compartment.of(
					type, SubCompartment.AIR_LOW_POP_LONG_TERM);

			if (match(path, "low", "pop"))
				return Compartment.of(
					type, SubCompartment.AIR_LOW_POP);

			if (match(path, "high", "pop"))
				return Compartment.of(
					type, SubCompartment.AIR_HIGH_POP);

			if (match(path, "indoor"))
				return Compartment.of(
					type, SubCompartment.AIR_INDOOR);

			return Compartment.of(type, SubCompartment.UNSPECIFIED);
		} // air emissions


		// soil emissions
		if (match(path, "emission", "soil")) {
			var type = ElementaryFlowType.EMISSIONS_TO_SOIL;

			if (match(path, "non-agri"))
				return Compartment.of(
					type, SubCompartment.UNSPECIFIED);

			if (match(path, "agri"))
				return Compartment.of(
					type, SubCompartment.SOIL_AGRICULTURAL);

			if (match(path, "forest"))
				return Compartment.of(
					type, SubCompartment.SOIL_FORESTRY);

			if (match(path, "urban"))
				return Compartment.of(
					type, SubCompartment.SOIL_URBAN);

			if (match(path, "industrial"))
				return Compartment.of(
					type, SubCompartment.SOIL_INDUSTRIAL);

			return Compartment.of(type, SubCompartment.UNSPECIFIED);
		} // soil emissions

		// water emissions
		if (match(path, "emission", "water")) {
			var type = ElementaryFlowType.EMISSIONS_TO_WATER;

			if (match(path, "fossil"))
				return Compartment.of(
					type, SubCompartment.WATER_FOSSIL);

			if (match(path, "ground", "long", "term"))
				return Compartment.of(
					type, SubCompartment.WATER_GROUND_LONG_TERM);

			if (match(path, "ground"))
				return Compartment.of(
					type, SubCompartment.WATER_GROUND);

			if (match(path, "lake"))
				return Compartment.of(
					type, SubCompartment.WATER_LAKE);

			if (match(path, "ocean"))
				return Compartment.of(
					type, SubCompartment.WATER_LAKE);

			if (match(path, "river"))
				return Compartment.of(
					type, SubCompartment.WATER_RIVER);

			if (match(path, "river", "long", "term"))
				return Compartment.of(
					type, SubCompartment.WATER_RIVER_LONG_TERM);

			return Compartment.of(type, SubCompartment.UNSPECIFIED);
		} // water emissions

		if (match(path, "land")) {
			return Compartment.of(
				ElementaryFlowType.RESOURCES, SubCompartment.RESOURCES_LAND);
		}

		return null;
	}

	private static boolean match(String path, String... parts) {
		for (String part : parts) {
			if (!path.contains(part))
				return false;
		}
		return true;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy