package org.openlca.jsonld.output;
import org.openlca.core.database.BaseDao;
import org.openlca.core.model.Exchange;
import org.openlca.core.model.FlowProperty;
import org.openlca.core.model.ModelType;
import org.openlca.core.model.Process;
import org.openlca.core.model.ProcessLink;
import org.openlca.core.model.ProductSystem;
import org.openlca.core.model.RootEntity;
import org.openlca.jsonld.ExchangeKey;
import org.openlca.util.RefIdMap;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
class ProductSystemWriter extends Writer<ProductSystem> {
private BaseDao<Exchange> exchangeDao;
private RefIdMap<Long, String> idMap;
private ProductSystem system;
ProductSystemWriter(ExportConfig conf) {
super(conf);
if (conf.db != null) {
exchangeDao = new BaseDao<>(Exchange.class, conf.db);
idMap = RefIdMap.internalToRef(conf.db, Process.class);
} else {
idMap = new RefIdMap<>();
}
}
@Override
JsonObject write(ProductSystem system) {
JsonObject obj = super.write(system);
if (obj == null)
return null;
this.system = system;
Out.put(obj, "referenceProcess", system.getReferenceProcess(), conf);
String processRefId = null;
if (system.getReferenceProcess() != null)
processRefId = system.getReferenceProcess().getRefId();
JsonObject eObj = getExchange(processRefId, system.getReferenceExchange());
Out.put(obj, "referenceExchange", eObj);
FlowProperty property = null;
if (system.getTargetFlowPropertyFactor() != null)
property = system.getTargetFlowPropertyFactor().getFlowProperty();
Out.put(obj, "targetFlowProperty", property, conf);
Out.put(obj, "targetUnit", system.getTargetUnit(), conf);
Out.put(obj, "targetAmount", system.getTargetAmount());
ParameterRedefs.map(obj, system.getParameterRedefs(), conf.db, conf, (
type, id) -> processRef(id));
if (conf.db == null)
return obj;
mapProcesses(obj);
mapLinks(obj);
ParameterReferences.writeReferencedParameters(system, conf);
return obj;
}
private void mapLinks(JsonObject json) {
JsonArray links = new JsonArray();
for (ProcessLink link : system.getProcessLinks()) {
JsonObject obj = new JsonObject();
links.add(obj);
Out.put(obj, "@type", "ProcessLink");
Out.put(obj, "provider", processRef(link.providerId));
Out.put(obj, "flow", References.create(
ModelType.FLOW, link.flowId, conf, true));
JsonObject process = processRef(link.processId);
Out.put(obj, "process", process);
if (exchangeDao == null)
continue;
Exchange e = exchangeDao.getForId(link.exchangeId);
JsonObject exchange = getExchange(
process.get("@id").getAsString(), e);
Out.put(obj, "exchange", exchange);
}
Out.put(json, "processLinks", links);
}
private void mapProcesses(JsonObject json) {
JsonArray processes = new JsonArray();
for (Long pId : system.getProcesses())
processes.add(processRef(pId));
Out.put(json, "processes", processes);
}
private JsonObject processRef(Long id) {
if (id == null)
return null;
return References.create(ModelType.PROCESS, id, conf, true);
}
private JsonObject getExchange(String processRefId, Exchange e) {
if (e == null)
return null;
JsonObject obj = new JsonObject();
Out.put(obj, "@type", "Exchange");
String providerId = idMap.get(Process.class, e.getDefaultProviderId());
String id = ExchangeKey.get(processRefId, providerId, e);
Out.put(obj, "@id", id);
addRef(obj, "flow", e.getFlow());
addRef(obj, "unit", e.getUnit());
Out.put(obj, "amount", e.getAmountValue());
Out.put(obj, "input", e.isInput());
if (providerId != null) {
JsonObject providerRef = new JsonObject();
Out.put(providerRef, "@type", "Process");
Out.put(providerRef, "@id", providerId);
Out.put(obj, "defaultProvider", providerRef);
}
return obj;
}
private void addRef(JsonObject obj, String key, RootEntity ref) {
if (ref == null || ref.getRefId() == null)
return;
JsonObject refObj = new JsonObject();
obj.add(key, refObj);
Out.put(refObj, "@type", ref.getClass().getSimpleName());
Out.put(refObj, "@id", ref.getRefId());
Out.put(refObj, "name", ref.getName());
}
@Override
boolean isExportExternalFiles() {
// Product system files are using local ids, this must be changed first,
// otherwise this leads to problems after import
return false;
}
}