package com.plectix.simulator.simulationclasses.action; import com.plectix.simulator.interfaces.ConnectedComponentInterface; import com.plectix.simulator.simulationclasses.injections.Injection; import com.plectix.simulator.simulationclasses.solution.RuleApplicationPoolInterface; import com.plectix.simulator.simulator.SimulationData; import com.plectix.simulator.staticanalysis.Agent; import com.plectix.simulator.staticanalysis.Rule; import com.plectix.simulator.staticanalysis.Site; import com.plectix.simulator.staticanalysis.stories.storage.Event; /** * Class implements "MODIFY" action type. * @author avokhmin * @see ActionType */ public class ModifyAction extends Action { /** * Constructor of CModifyAction.<br> * <br> * Example:<br> * <code>A(x~q)->A(x~fi)</code>, creates <code>MODIFY</code> action.<br> * <code>siteFrom</code> - site "x" from agent "A" from left handSide.<br> * <code>siteTo</code> - site "x" from agent "A" from right handSide.<br> * <code>ccL</code> - connected component "A(x~q)" from left handSide.<br> * <code>ccR</code> - connected component "A(x~fi)" from right handSide.<br> * <code>rule</code> - rule "A(x~q)->A(x~fi)".<br> * * @param rule given rule * @param sourceSite given site from left handSide * @param targetSite given site from right handSide * @param leftHandSideComponent given connected component from left handSide * @param rightHandSideComponent given connected component from right handSide */ public ModifyAction(Rule rule, Site sourceSite, Site targetSite, ConnectedComponentInterface leftHandSideComponent, ConnectedComponentInterface rightHandSideComponent) { super(rule, null, null, leftHandSideComponent, rightHandSideComponent); setActionApplicationSites(sourceSite, targetSite); setType(ActionType.MODIFY); } @Override public final void doAction(RuleApplicationPoolInterface pool, Injection injection, ActionObserverInteface event, SimulationData simulationData) { /** * Done. */ int agentIdInCC = getAgentIdInCCBySideId(this.getTargetSite().getParentAgent()); Agent agentFromInSolution = injection.getAgentFromImageById(agentIdInCC); Site injectedSite = agentFromInSolution.getSiteByName(this.getTargetSite().getName()); //event.setTypeById(simulationData.getStoriesAgentTypesStorage()); event.modifyAddSite(injectedSite, Event.BEFORE_STATE); injectedSite.getInternalState().setName(this.getTargetSite().getInternalState().getName()); injection.addToChangedSites(injectedSite); event.modifyAddSite( injectedSite, Event.AFTER_STATE); } }