package com.plectix.simulator.staticanalysis;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.plectix.simulator.interfaces.ConnectedComponentInterface;
import com.plectix.simulator.simulationclasses.injections.Injection;
import com.plectix.simulator.simulationclasses.injections.LiftElement;
/**
* This class implements Site entity.
*
* @author avokhmin
*/
public final class Site extends NamedEntity {
public static final String DEFAULT_NAME = "SITE_DEFAULT_NAME";
private final String name;
private final Link linkState;
private InternalState internalState = InternalState.EMPTY_STATE;
private Agent parentAgent = null;
private int linkIndex = -1;
private final Set<LiftElement> liftElements = new LinkedHashSet<LiftElement>();
/**
* Constructor by id
* @param name name of new site.
*/
public Site(String name) {
this.name = name.intern();
linkState = new Link();
}
//------------------------GETTERS AND SETTERS------------------------------
/**
* Constructor by id and "parent" agent
* @param id name of new site.
* @param agent "parent" agent
*/
public Site(String name, Agent agent) {
this.name = name.intern();
linkState = new Link();
parentAgent = agent;
}
/**
* Adds <code>liftElement</code> to <code>liftList</code>.
* @param liftElement lift element to add
*/
public final void addToLift(LiftElement liftElement) {
this.liftElements.add(liftElement);
}
/**
* This method returns list of lift elements of this site
* @return list of lift elements of this site
*/
public final Set<LiftElement> getLift() {
return liftElements;
}
/**
* This method returns list of injections from given connected component, which point to this site
* @param component given connected component
* @return list of injections from given connected component, which point to this site
*/
public final List<Injection> getInjectionFromLift(ConnectedComponentInterface component) {
List<Injection> list = new ArrayList<Injection>();
for (LiftElement liftElement : this.liftElements)
if (liftElement.getConnectedComponent() == component)
list.add(liftElement.getInjection());
return list;
}
/**
* Returns link state of this site.
* @return link state of this site.
*/
public final Link getLinkState() {
return linkState;
}
/**
* This method sets link to the "parent" agent.
* @param agent "parent" agent
*/
public final void setParentAgent(Agent agent) {
if (agent == null)
return;
this.parentAgent = agent;
}
/**
* This method returns agent, which is parent for this site
* @return agent, which is parent for this site
*/
public final Agent getParentAgent() {
return parentAgent;
}
/**
* This method sets internal state for current site.
* @param internalState new value
*/
public final void setInternalState(InternalState internalState) {
this.internalState = internalState;
}
/**
* This method returns internal state for current site.
* @return internal state for current site.
*/
public final InternalState getInternalState() {
return internalState;
}
/**
* This method returns <tt>true</tt>, if current site equals
* to given site (by name and {@link Agent#equalz(Agent) equalz},
* otherwise <tt>false</tt>).
* @param site given site
* @return <tt>true</tt>, if current site equals to given site,
* otherwise <tt>false</tt>)
*/
public final boolean equalz(Site site) {
if (this == site) {
return true;
}
if (site == null) {
return false;
}
if (!name.equals(site.name)) {
return false;
}
if (parentAgent == null) {
return site.getParentAgent() == null;
} else {
return parentAgent.equalz(site.getParentAgent());
}
}
/**
* This method compares this site to a given one, according to it's internal states,
* link states. This one has boolean flag which is working mode for this method.
* @param solutionSite given site
* @param completeComparision working mode of this method
* @return <tt>true</tt> if current site equals given site, otherwise <tt>false</tt>.
*/
public final boolean expandedEqualz(Site solutionSite, boolean completeComparision) {
Link currentLinkState = linkState;
Link solutionLinkState = solutionSite.getLinkState();
InternalState currentInternalState = internalState;
InternalState solutionInternalState = solutionSite.getInternalState();
if (!completeComparision)
return (currentLinkState.compare(solutionLinkState) && currentInternalState
.compareInternalStates(solutionInternalState));
else
return (currentLinkState.equalz(solutionLinkState) && currentInternalState
.equalz(solutionInternalState));
}
/**
* This method sets link index to this site<br>
* For example site "x" of agent C in (A(x!1), B(y!2, y!1), C(x!2)) has link index == 2
* @param index new value
*/
public final void setLinkIndex(int index) {
this.linkIndex = index;
}
/**
* This method returns link index to this site<br>
* For example site "x" of agent C in (A(x!1), B(y!2, y!1), C(x!2)) has link index == 2
* @return link index to this site
*/
public final int getLinkIndex() {
return linkIndex;
}
/**
* This method returns name of this site
* @see com.plectix.simulator.util.NameDictionary NameDictionary
* @return name of this site
*/
@Override
public final String getName() {
return name;
}
/**
* This method clears list of lift elements
*/
public final void clearLifts() {
this.liftElements.clear();
}
/**
* This method clears all injections, pointing to this site except one.
* @param incomingInjection excepted injection
*/
public final void clearIncomingInjections(Injection incomingInjection) {
for (LiftElement liftElement : this.liftElements) {
Injection injection = liftElement.getInjection();
if (injection != incomingInjection) {
for (Site site : injection.getSiteList()) {
if (this != site) {
site.removeInjectionFromLift(injection);
}
}
liftElement.getConnectedComponent().removeInjection(injection);
}
}
}
/**
* This method finds and removes injection from injections of lift elements
* @param injection injection to remove
*/
public final void removeInjectionFromLift(Injection injection) {
for (LiftElement liftElement : this.liftElements) {
if (injection == liftElement.getInjection()) {
this.liftElements.remove(liftElement);
return;
}
}
}
@Override
public final Site clone(){
Site site = new Site(name, null);
site.setInternalState((new InternalState(this.internalState.getName())));
site.linkState.setStatusLink(this.linkState.getStatusLink());
site.setLinkIndex(this.getLinkIndex());
return site;
}
@Override
public final String toString() {
return parentAgent.getName() + "(" + getName() + ")";
}
@Override
protected String getDefaultName() {
return DEFAULT_NAME;
}
}