package org.openlca.core.database.references;
import org.openlca.core.Tests;
import org.openlca.core.model.Category;
import org.openlca.core.model.Exchange;
import org.openlca.core.model.Flow;
import org.openlca.core.model.FlowProperty;
import org.openlca.core.model.FlowPropertyFactor;
import org.openlca.core.model.ModelType;
import org.openlca.core.model.Parameter;
import org.openlca.core.model.ParameterRedef;
import org.openlca.core.model.ParameterScope;
import org.openlca.core.model.Process;
import org.openlca.core.model.ProcessLink;
import org.openlca.core.model.ProductSystem;
import org.openlca.core.model.Unit;
import org.openlca.core.model.UnitGroup;
public class ProductSystemReferenceSearchTest extends BaseReferenceSearchTest {
@Override
protected ModelType getModelType() {
return ModelType.PRODUCT_SYSTEM;
}
@Override
protected ProductSystem createModel() {
ProductSystem system = new ProductSystem();
system.setCategory(insertAndAddExpected("category", new Category()));
system.setReferenceProcess(createProcess());
system.setReferenceExchange(system.getReferenceProcess().getExchanges()
.get(0));
system.setTargetFlowPropertyFactor(system.getReferenceExchange()
.getFlowPropertyFactor());
system.setTargetUnit(system.getTargetFlowPropertyFactor()
.getFlowProperty().getUnitGroup().getUnits().get(0));
system.getProcesses().add(system.getReferenceProcess().getId());
Process p1 = insertAndAddExpected("processes", new Process());
Process p2 = insertAndAddExpected("processes", new Process());
Process p3 = insertAndAddExpected("processes", new Process());
system.getProcesses().add(p1.getId());
system.getProcesses().add(p2.getId());
system.getProcesses().add(p3.getId());
system.getProcessLinks().add(createLink(p1, p2));
system.getProcessLinks().add(createLink(p2, p3));
String n1 = generateName();
String n2 = generateName();
String n3 = generateName();
system.getParameterRedefs().add(createParameterRedef(n1, p1.getId()));
// formula with parameter to see if added as reference (unexpected)
system.getParameterRedefs().add(createParameterRedef(n2, n3 + "*5"));
Parameter globalUnreferenced = createParameter(n1, "3*3", true);
Parameter globalUnreferenced2 = createParameter(n3, "3*3", true);
// must be inserted manually
globalUnreferenced = Tests.insert(globalUnreferenced);
globalUnreferenced2 = Tests.insert(globalUnreferenced2);
return Tests.insert(system);
}
private Process createProcess() {
Process process = new Process();
process.getExchanges().add(createExchange());
process = insertAndAddExpected("processes", process);
addExpected("referenceExchange", process.getExchanges().get(0));
return process;
}
private Exchange createExchange() {
Exchange exchange = new Exchange();
exchange.setFlow(createFlow(true));
exchange.setFlowPropertyFactor(exchange.getFlow()
.getFlowPropertyFactors().get(0));
exchange.setUnit(exchange.getFlowPropertyFactor().getFlowProperty()
.getUnitGroup().getUnits().get(0));
return exchange;
}
private Flow createFlow(boolean reference) {
if (!reference)
return insertAndAddExpected("flow", new Flow());
Flow flow = new Flow();
FlowProperty property = new FlowProperty();
FlowPropertyFactor factor = new FlowPropertyFactor();
factor.setFlowProperty(property);
UnitGroup group = new UnitGroup();
Unit unit = new Unit();
unit.setName("unit");
group.getUnits().add(unit);
property.setUnitGroup(group);
flow.getFlowPropertyFactors().add(factor);
group = Tests.insert(group);
addExpected("targetUnit", group.getUnit(unit.getName()));
property = Tests.insert(property);
flow = Tests.insert(flow);
addExpected("targetFlowPropertyFactor", flow.getFactor(property));
return flow;
}
private ProcessLink createLink(Process p1, Process p2) {
ProcessLink link = new ProcessLink();
Flow flow = createFlow(false);
Exchange e1 = new Exchange();
e1.setFlow(flow);
p1.getExchanges().add(e1);
Exchange e2 = new Exchange();
e2.setFlow(flow);
p2.getExchanges().add(e2);
link.processId = p1.getId();
link.providerId = p2.getId();
link.flowId = flow.getId();
return link;
}
private ParameterRedef createParameterRedef(String name,
Object contextOrValue) {
ParameterRedef redef = new ParameterRedef();
redef.setName(name);
redef.setValue(1d);
if (contextOrValue instanceof Long) {
redef.setContextType(ModelType.PROCESS);
redef.setContextId((long) contextOrValue);
} else if (contextOrValue instanceof String) {
insertAndAddExpected("parameterRedefs",
createParameter(name, contextOrValue.toString(), true));
}
return redef;
}
private Parameter createParameter(String name, Object value, boolean global) {
Parameter parameter = new Parameter();
parameter.setName(name);
boolean formula = value instanceof String;
parameter.setInputParameter(!formula);
if (formula)
parameter.setFormula(value.toString());
else
parameter.setValue((double) value);
if (global)
parameter.setScope(ParameterScope.GLOBAL);
else
parameter.setScope(ParameterScope.PROCESS);
return parameter;
}
}