package de.randi2.jsf.wrappers;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import lombok.Getter;
import lombok.Setter;
import de.randi2.model.TrialSite;
import de.randi2.simulation.distribution.AbstractDistribution;
import de.randi2.simulation.distribution.ConcreteDistribution;
import de.randi2.simulation.distribution.UniformDistribution;
import de.randi2.utility.Pair;
public class DistributionTrialSiteWrapper {
public static enum DistributionId {
UNIFORM_DISTRIBUTION("uniformDistribution"), CONCRETE_DISTRIBUTION(
"concreteDistribution");
private String id = null;
private DistributionId(String id) {
this.id = id;
}
@Override
public String toString() {
return this.id;
}
}
@Getter
@Setter
private boolean seedTrialsite = false;
@Getter
@Setter
private long seed;
private Class<?> distributionClass = UniformDistribution.class;
public Class<?> getDistributionClass() {
return distributionClass;
}
public void setDistributionClass(
Class<? extends AbstractDistribution<? extends Serializable>> distributionClass) {
this.distributionClass = distributionClass;
}
@Getter
private String selectedDistributionId = DistributionId.UNIFORM_DISTRIBUTION.toString();
@Getter
private List<TrialSiteRatioWrapper> trialSitesRatioWrappers;
public DistributionTrialSiteWrapper(List<TrialSiteRatioWrapper> trialSitesRatioWrappers){
this.trialSitesRatioWrappers = trialSitesRatioWrappers;
}
private List<SelectItem> distributions;
public List<SelectItem> getDistributions() {
if (distributions == null) {
distributions = new ArrayList<SelectItem>();
distributions.add(new SelectItem(DistributionId.UNIFORM_DISTRIBUTION.toString()));
distributions.add(new SelectItem(DistributionId.CONCRETE_DISTRIBUTION.toString()));
}
return distributions;
}
public void setSelectedDistributionId(String selectedDistributionId) {
this.selectedDistributionId = selectedDistributionId;
if (selectedDistributionId
.equals(DistributionId.CONCRETE_DISTRIBUTION.toString())){
distributionClass = ConcreteDistribution.class;
}else if (selectedDistributionId
.equals(DistributionId.UNIFORM_DISTRIBUTION.toString())){
distributionClass = UniformDistribution.class;
}
}
public AbstractDistribution<TrialSite> getDistributionTrialSites(){
if(distributionClass == UniformDistribution.class){
List<TrialSite> trialSites = new ArrayList<TrialSite>();
for(TrialSiteRatioWrapper wrapper: trialSitesRatioWrappers){
trialSites.add(wrapper.getSite());
}
if(seedTrialsite){
return new UniformDistribution<TrialSite>(trialSites,seed);
}else{
return new UniformDistribution<TrialSite>(trialSites);
}
}else{
List<Pair<TrialSite, Integer>> trialSitesRatio = new ArrayList<Pair<TrialSite, Integer>>();
for(TrialSiteRatioWrapper wrapper: trialSitesRatioWrappers){
trialSitesRatio.add(Pair.of(wrapper.getSite(), wrapper.getRatio()));
}
if(seedTrialsite){
return new ConcreteDistribution<TrialSite>(seed, trialSitesRatio.toArray(new Pair[0]));
}else{
return new ConcreteDistribution<TrialSite>(trialSitesRatio.toArray(new Pair[0]));
}
}
}
public boolean isConcreteDistribution(){
return (distributionClass == ConcreteDistribution.class);
}
}