package com.plectix.simulator.staticanalysis.subviews.base; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.plectix.simulator.staticanalysis.LinkStatus; import com.plectix.simulator.staticanalysis.abstracting.AbstractAgent; import com.plectix.simulator.staticanalysis.abstracting.AbstractLinkState; import com.plectix.simulator.staticanalysis.abstracting.AbstractSite; import com.plectix.simulator.staticanalysis.subviews.storage.SubViewsInterface; import com.plectix.simulator.util.NameDictionary; public final class AbstractAction { private final AbstractAgent leftHandSideAgent; private final AbstractAgent rightHandSideAgent; private List<AbstractSite> testedSites; private List<AbstractSite> modificatedSites; private final List<SubViewsInterface> subViewsList; private List<AbstractSite> sitesSideEffect; private List<String> sideEffect; private AbstractActionType actionType; private boolean applicable = false; public AbstractAction(AbstractAgent leftHandSideAgent, AbstractAgent rightAbstractAgent) { subViewsList = new LinkedList<SubViewsInterface>(); this.leftHandSideAgent = leftHandSideAgent; this.rightHandSideAgent = rightAbstractAgent; init(); } private final void init() { if (leftHandSideAgent == null) { actionType = AbstractActionType.ADD; return; } testedSites = new LinkedList<AbstractSite>(); if (rightHandSideAgent == null) { actionType = AbstractActionType.DELETE; testedSites.addAll(leftHandSideAgent.getSitesMap().values()); return; } modificatedSites = new LinkedList<AbstractSite>(); actionType = AbstractActionType.TEST_ONLY; for (AbstractSite leftSite : leftHandSideAgent.getSitesMap().values()) { AbstractSite rightSite = rightHandSideAgent.getSiteByName(leftSite .getName()); testlinkStates(leftSite, rightSite); if (!leftSite.getInternalState().equalz( rightSite.getInternalState())) { modificatedSites.add(leftSite); actionType = AbstractActionType.TEST_AND_MODIFICATION; continue; } if (!leftSite.getLinkState().equalz(rightSite.getLinkState())) { modificatedSites.add(leftSite); actionType = AbstractActionType.TEST_AND_MODIFICATION; continue; } testedSites.add(leftSite); } } private final void testlinkStates(AbstractSite leftSite, AbstractSite rightSite) { AbstractLinkState leftLinkState = leftSite.getLinkState(); AbstractLinkState rightLinkState = rightSite.getLinkState(); if (leftLinkState.equalz(rightLinkState)) return; if (leftLinkState.getStatusLink() != LinkStatus.FREE && NameDictionary.isDefaultSiteName(leftLinkState.getConnectedSiteName())) { if (sideEffect == null) sideEffect = new LinkedList<String>(); sideEffect.add(leftSite.getName()); } } public final void clearSitesSideEffect() { if (sitesSideEffect != null) sitesSideEffect.clear(); } public final void addSiteSideEffect(AbstractSite breakingSite) { if (sitesSideEffect == null) sitesSideEffect = new LinkedList<AbstractSite>(); sitesSideEffect.add(breakingSite); } final void addSubViews(SubViewsInterface subViews) { subViewsList.add(subViews); } public final List<SubViewsInterface> getSubViews() { return subViewsList; } public final List<AbstractSite> getTestedSites() { return testedSites; } public final List<AbstractSite> getModificatedSites() { return modificatedSites; } public final AbstractAgent getLeftHandSideAgent() { return leftHandSideAgent; } public final AbstractAgent getRightHandSideAgent() { return rightHandSideAgent; } public final List<AbstractSite> getSitesSideEffect() { return sitesSideEffect; } public final AbstractActionType getActionType() { return actionType; } public final List<String> getSideEffect() { return sideEffect; } public final boolean canApply() { return applicable; } public final void setApplicable() { applicable = true; } public final void initSubViews(Map<String, List<SubViewsInterface>> subViewsMap) { AbstractAgent agent = leftHandSideAgent; if (leftHandSideAgent == null) agent = rightHandSideAgent; List<SubViewsInterface> subViewsList = subViewsMap.get(agent .getName()); for (SubViewsInterface subViews : subViewsList) { if (actionType != AbstractActionType.TEST_ONLY && actionType != AbstractActionType.DELETE && actionType != AbstractActionType.ADD) { if (subViews.isAgentFit(agent)) addSubViews(subViews); } else { if (agent.getSitesMap().isEmpty() || actionType == AbstractActionType.DELETE) addSubViews(subViews); else { for (AbstractSite site : agent.getSitesMap().values()) { if (subViews.getSubViewClass().hasSite( site.getName())) { addSubViews(subViews); break; } } } } } } }