package com.plectix.simulator.simulationclasses.injections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.plectix.simulator.interfaces.ConnectedComponentInterface;
import com.plectix.simulator.simulationclasses.probability.WeightedItem;
import com.plectix.simulator.simulationclasses.solution.SuperSubstance;
import com.plectix.simulator.simulator.ThreadLocalData;
import com.plectix.simulator.staticanalysis.Agent;
import com.plectix.simulator.staticanalysis.ConnectedComponent;
import com.plectix.simulator.staticanalysis.Site;
/**
* Class implements Injection.
*
* @author avokhmin
*/
public final class Injection implements WeightedItem {
// idInConnectedComponent -> agent
private final Map<Integer, Agent> agentsCorrespondence;
private final List<Site> sites;
private final List<Site> changedSites;
private final ConnectedComponentInterface connectedComponent;
private SuperSubstance superSubstanceImage = null;
private long power = 1;
public Injection() {
sites = new LinkedList<Site>();
changedSites = null;
agentsCorrespondence = null;
connectedComponent = null;
}
public Injection(ConnectedComponent connectedComponent,
List<Site> sitesList, Map<Integer, Agent> agentLinkList) {
this.connectedComponent = connectedComponent;
this.sites = sitesList;
this.agentsCorrespondence = agentLinkList;
this.changedSites = new ArrayList<Site>();
}
public final void removeSiteFromSitesList(Site site) {
sites.remove(site);
}
/**
* This method adds given site to util list.<br>
* This list uses in NegativeUpdate.
*
* @param site
* given site
*/
public final void addToChangedSites(Site site) {
if (!(checkSiteExistanceAmongChangedSites(site)))
this.changedSites.add(site);
}
public final boolean checkSiteExistanceAmongChangedSites(Site site) {
for (Site chSite : this.changedSites)
if (chSite == site)
return true;
return false;
}
public final Agent getAgentFromImageById(int id) {
for (Map.Entry<Integer, Agent> agentLink : agentsCorrespondence.entrySet()) {
if (agentLink.getKey() == id) {
return agentLink.getValue();
}
}
return null;
}
public final List<Site> getChangedSites() {
return changedSites;
}
/**
* This method is required for tests only
* @return
*/
public final Map<Integer, Agent> getCorrespondence() {
return agentsCorrespondence;
}
public final Collection<Site> getSiteList() {
return sites;
}
public final ConnectedComponentInterface getConnectedComponent() {
return connectedComponent;
}
public final void setSuperSubstance(SuperSubstance substance) {
this.superSubstanceImage = substance;
power = substance.getQuantity();
}
public final SuperSubstance getSuperSubstance() {
return superSubstanceImage;
}
public final boolean isEmpty() {
return this == ThreadLocalData.getEmptyInjection();
}
public final Agent getImageAgent() {
if (agentsCorrespondence != null) {
for (Agent targetAgent : agentsCorrespondence.values()) {
return targetAgent;
}
}
return null;
}
public final boolean findInCollection(List<Injection> injections) {
int counter = 0;
for (Injection injection : injections) {
if (injection.getSiteList().size() == sites.size()) {
for (Site site : injection.getSiteList()) {
if (sites.contains(site))
counter++;
else {
counter = 0;
break;
}
}
if (counter == injection.getSiteList().size())
return true;
counter = 0;
}
}
return false;
}
@Override
public final double getWeight() {
return power;
}
public final boolean isSuper() {
return this.superSubstanceImage != null;
}
public final void setSimple() {
if (isSuper()) {
superSubstanceImage = null;
connectedComponent.updateInjection(this, 1);
}
}
public final void eliminate() {
connectedComponent.updateInjection(this, 0);
}
public final void incPower() {
connectedComponent.updateInjection(this, power + 1);
}
public final void setPower(long i) {
power = i;
}
}