package com.plectix.simulator.staticanalysis.stories.storage; import com.plectix.simulator.simulationclasses.action.ActionObserverInteface; import com.plectix.simulator.staticanalysis.Agent; import com.plectix.simulator.staticanalysis.InternalState; import com.plectix.simulator.staticanalysis.Link; import com.plectix.simulator.staticanalysis.LinkRank; import com.plectix.simulator.staticanalysis.Site; import com.plectix.simulator.staticanalysis.stories.ActionOfAEvent; import com.plectix.simulator.staticanalysis.stories.State; import com.plectix.simulator.staticanalysis.stories.TypeOfWire; public class EventBuilder implements ActionObserverInteface { private StoriesAgentTypesStorage typeById; private Event event; public EventBuilder() { } public void addAtomicEvent(WireHashKey key, Site site, ActionOfAEvent type, boolean isBefore) { switch (key.getTypeOfWire()) { case AGENT: addEventAgent(key, type, isBefore); break; case BOUND_FREE: addEventBoundFree(key, site.getLinkState(), type, isBefore); break; case INTERNAL_STATE: addEventInternalState(key, site.getInternalState(), type, isBefore); break; case LINK_STATE: addEventLinkState(key, site.getLinkState(), type, isBefore); break; } } @SuppressWarnings("unchecked") void addEventLinkState(WireHashKey key, Link linkState, ActionOfAEvent type, boolean isBefore) { AtomicEvent<StateOfLink> aEvent = (AtomicEvent<StateOfLink>) event .addAtomicEvent(key, type, TypeOfWire.LINK_STATE); Site connectedSite = linkState.getConnectedSite(); if (isBefore) if (linkState.getConnectedSite() == null) aEvent.getState().setBeforeState(new StateOfLink()); else aEvent.getState().setBeforeState( new StateOfLink(connectedSite.getParentAgent().getId(), connectedSite.getName())); else if (linkState.getConnectedSite() == null) aEvent.getState().setAfterState(new StateOfLink()); else aEvent.getState().setAfterState( new StateOfLink(connectedSite.getParentAgent().getId(), connectedSite.getName())); } @SuppressWarnings("unchecked") void addEventInternalState(WireHashKey key, InternalState internalState, ActionOfAEvent type, boolean isBefore) { if (internalState.hasDefaultName()) return; AtomicEvent<String> aEvent = (AtomicEvent<String>) event .addAtomicEvent(key, type, TypeOfWire.BOUND_FREE); if (isBefore) aEvent.getState().setBeforeState(internalState.getName()); else aEvent.getState().setAfterState(internalState.getName()); } @SuppressWarnings("unchecked") void addEventBoundFree(WireHashKey key, Link linkState, ActionOfAEvent type, boolean isBefore) { AtomicEvent<State> aEvent = (AtomicEvent<State>) event.addAtomicEvent( key, type, TypeOfWire.BOUND_FREE); if (isBefore) if (linkState.getConnectedSite() == null) aEvent.getState().setBeforeState(State.FREE_LINK_STATE); else aEvent.getState().setBeforeState(State.BOUND_LINK_STATE); else if (linkState.getConnectedSite() == null) aEvent.getState().setAfterState(State.FREE_LINK_STATE); else aEvent.getState().setAfterState(State.BOUND_LINK_STATE); } @SuppressWarnings("unchecked") void addEventAgent(WireHashKey key, ActionOfAEvent type, boolean existsBefore) { AtomicEvent<State> aEvent = (AtomicEvent<State>) event.addAtomicEvent( key, type, TypeOfWire.AGENT); if (existsBefore) aEvent.getState().setBeforeState(State.CHECK_AGENT); else { if (aEvent.getType() != ActionOfAEvent.TEST_AND_MODIFICATION) aEvent.getState().setAfterState(State.CHECK_AGENT); } } public void addToEvent(Agent agent, ActionOfAEvent type, Agent agentFrom) { // AGENT long id = agent.getId(); typeById.setTypeOfAgent(id, agent.getName()); addAtomicEvent(new WireHashKey(id), null, type, Event.BEFORE_STATE); for (Site agentFromSite : agentFrom.getSites()) { Site site = agent.getSiteByName(agentFromSite.getName()); LinkRank linkRank = agentFromSite.getLinkState() .getStatusLinkRank(); if (linkRank != LinkRank.BOUND_OR_FREE) { // FREE/BOUND addAtomicEvent(new WireHashKey(id, site.getName(), TypeOfWire.BOUND_FREE), site, type, Event.BEFORE_STATE); if (linkRank != LinkRank.SEMI_LINK) { addAtomicEvent(new WireHashKey(id, site.getName(), TypeOfWire.LINK_STATE), site, type, Event.BEFORE_STATE); } } if (!agentFromSite.getInternalState().hasDefaultName()) addAtomicEvent(new WireHashKey(id, site.getName(), TypeOfWire.INTERNAL_STATE), site, type, Event.BEFORE_STATE); } } public void addSiteToEvent(Site site) { long id = site.getParentAgent().getId(); long agentId = id; String siteName = site.getName(); String name = site.getParentAgent().getName(); typeById.setTypeOfAgent(id, name); addAtomicEvent( new WireHashKey(agentId, siteName, TypeOfWire.BOUND_FREE), site, ActionOfAEvent.MODIFICATION, Event.AFTER_STATE); addAtomicEvent(new WireHashKey(agentId, siteName, TypeOfWire.INTERNAL_STATE), site, ActionOfAEvent.MODIFICATION, Event.AFTER_STATE); addAtomicEvent( new WireHashKey(agentId, siteName, TypeOfWire.LINK_STATE), site, ActionOfAEvent.MODIFICATION, Event.AFTER_STATE); } public void boundAddToEventContainer(Site site, boolean stateFlag) { long id = site.getParentAgent().getId(); String name = site.getParentAgent().getName(); typeById.setTypeOfAgent(id, name); addAtomicEvent(new WireHashKey(id, site.getName(), TypeOfWire.LINK_STATE), site, ActionOfAEvent.MODIFICATION, stateFlag); addAtomicEvent(new WireHashKey(id, site.getName(), TypeOfWire.BOUND_FREE), site, ActionOfAEvent.MODIFICATION, stateFlag); } public void breakAddToEvent(Site site, boolean state) { if (site == null) { return; } long id = site.getParentAgent().getId(); typeById.setTypeOfAgent(id, site.getParentAgent().getName()); String name = site.getName(); addAtomicEvent(new WireHashKey(id, name, TypeOfWire.LINK_STATE), site, ActionOfAEvent.MODIFICATION, state); addAtomicEvent(new WireHashKey(id, name, TypeOfWire.BOUND_FREE), site, ActionOfAEvent.MODIFICATION, state); } public void deleteAddToEvent(Site siteFromSolution, boolean stateFlag) { long agentId = siteFromSolution.getParentAgent().getId(); String siteName = siteFromSolution.getName(); typeById.setTypeOfAgent(agentId, siteFromSolution.getParentAgent() .getName()); addAtomicEvent( new WireHashKey(agentId, siteName, TypeOfWire.BOUND_FREE), siteFromSolution, ActionOfAEvent.MODIFICATION, stateFlag); addAtomicEvent( new WireHashKey(agentId, siteName, TypeOfWire.LINK_STATE), siteFromSolution, ActionOfAEvent.MODIFICATION, stateFlag); } public void deleteAddNonFixedSites(Agent agent) throws StoryStorageException { long agentId = agent.getId(); typeById.setTypeOfAgent(agent.getId(), agent.getName()); for (Site siteFromSolution : agent.getSites()) { String siteName = siteFromSolution.getName(); WireHashKey key = new WireHashKey(agentId, siteName, TypeOfWire.BOUND_FREE); addAtomicEvent(key, siteFromSolution, ActionOfAEvent.MODIFICATION, Event.BEFORE_STATE); event.getAtomicEvent(key).getState().setAfterState(null); key = new WireHashKey(agentId, siteName, TypeOfWire.LINK_STATE); addAtomicEvent(key, siteFromSolution, ActionOfAEvent.MODIFICATION, Event.BEFORE_STATE); event.getAtomicEvent(key).getState().setAfterState(null); key = new WireHashKey(agentId, siteName, TypeOfWire.INTERNAL_STATE); if (!siteFromSolution.getInternalState().hasDefaultName()) { addAtomicEvent(key, siteFromSolution, ActionOfAEvent.MODIFICATION, Event.BEFORE_STATE); event.getAtomicEvent(key).getState().setAfterState(null); } } } public void modifyAddSite(Site site, boolean stateFlag) { long id = site.getParentAgent().getId(); typeById.setTypeOfAgent(id, site.getParentAgent().getName()); addAtomicEvent(new WireHashKey(id, site.getName(), TypeOfWire.INTERNAL_STATE), site, ActionOfAEvent.MODIFICATION, stateFlag); } public void registerAgent(Agent agent) { typeById.setTypeOfAgent(agent.getId(), agent.getName()); } public Event getEvent() { return event; } public void setNewEvent(long currentEventNumber, int ruleId) { event = new Event(currentEventNumber, ruleId); } public void setTypeById(StoriesAgentTypesStorage typeById) { this.typeById = typeById; } }