package org.openlca.core.model;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "tbl_impact_methods")
public class ImpactMethod extends CategorizedEntity {
@OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinColumn(name = "f_impact_method")
private final List<ImpactCategory> impactCategories = new ArrayList<>();
@OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinColumn(name = "f_impact_method")
private final List<NwSet> nwSets = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "f_owner")
private final List<Parameter> parameters = new ArrayList<>();
@Override
public ImpactMethod clone() {
ImpactMethod clone = new ImpactMethod();
Util.cloneRootFields(this, clone);
clone.setCategory(getCategory());
HashMap<ImpactCategory, ImpactCategory> impactMap = new HashMap<>();
for (ImpactCategory origCat : getImpactCategories()) {
ImpactCategory clonedCat = origCat.clone();
impactMap.put(origCat, clonedCat);
clone.getImpactCategories().add(clonedCat);
}
for (Parameter parameter : getParameters())
clone.getParameters().add(parameter.clone());
cloneNwSets(clone, impactMap);
return clone;
}
private void cloneNwSets(ImpactMethod clone,
HashMap<ImpactCategory, ImpactCategory> impactMap) {
for (NwSet nwSet : getNwSets()) {
NwSet clonedSet = nwSet.clone();
clone.getNwSets().add(clonedSet);
for (NwFactor factor : clonedSet.getFactors()) {
ImpactCategory clonedCat = impactMap.get(factor
.getImpactCategory());
factor.setImpactCategory(clonedCat);
}
}
}
public List<ImpactCategory> getImpactCategories() {
return impactCategories;
}
public List<NwSet> getNwSets() {
return nwSets;
}
public List<Parameter> getParameters() {
return parameters;
}
}