package com.plectix.simulator.staticanalysis.stories;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.plectix.simulator.simulator.SimulationData;
import com.plectix.simulator.simulator.SimulationArguments.StoryCompressionMode;
import com.plectix.simulator.staticanalysis.stories.compressions.Compressor;
import com.plectix.simulator.staticanalysis.stories.storage.AbstractStorage;
import com.plectix.simulator.staticanalysis.stories.storage.Event;
import com.plectix.simulator.staticanalysis.stories.storage.StoriesAgentTypesStorage;
import com.plectix.simulator.staticanalysis.stories.storage.StoryStorageException;
import com.plectix.simulator.staticanalysis.stories.storage.WireStorageInterface;
public final class Stories {
private final List<Integer> observablesRulesIds;
private final Map<Integer, WireStorageInterface> eventsMapForCurrentStory;
private StoriesAgentTypesStorage storiesAgentTypesStorage;
// may be non-compression, weak compression, strong compression
private StoryCompressionMode storifyMode;
public Stories(SimulationData simData) {
this.observablesRulesIds = new ArrayList<Integer>();
this.eventsMapForCurrentStory = new LinkedHashMap<Integer, WireStorageInterface>();
storiesAgentTypesStorage = new StoriesAgentTypesStorage();
storifyMode = simData.getSimulationArguments()
.getStorifyMode();
for (int i = 0; i < simData.getSimulationArguments().getIterations(); i++) {
this.eventsMapForCurrentStory.put(new Integer(i),
new AbstractStorage(i, storiesAgentTypesStorage));
}
}
public final int getRuleIdAtStories(int index) {
if (index >= observablesRulesIds.size() || index < 0)
return -1;
return observablesRulesIds.get(index);
}
/**
* param index ; root of cleaning
*/
public final void cleaningStory(int index) throws StoryStorageException {
if (eventsMapForCurrentStory.get(index).isImportantStory()) {
compress(eventsMapForCurrentStory.get(index));
} else {
// delete this story
eventsMapForCurrentStory.get(index).clearList();
storiesAgentTypesStorage
.resetTypesOfAgents(eventsMapForCurrentStory.get(index)
.getIteration());
}
}
private void compress(WireStorageInterface wireStorageInterface) throws StoryStorageException {
if (wireStorageInterface.observableEvent() != null && wireStorageInterface.initialEvent() != null) {
Compressor compressor = new Compressor(wireStorageInterface);
compressor.execute(storifyMode);
}
}
public final void addToStories(List<Integer> ruleIDs) {
observablesRulesIds.addAll(ruleIDs);
}
public final void addEventToStory(int index, Event eventContainer)
throws StoryStorageException {
eventsMapForCurrentStory.get(index).addEventContainer(
eventContainer);
}
public final void addLastEventToStoryStorifyRule(int index,
Event eventContainer, double currentTime)
throws StoryStorageException {
this.eventsMapForCurrentStory.get(Integer.valueOf(index))
.addLastEventContainer(eventContainer, currentTime);
}
public final boolean checkRule(int ruleToBeChecked, int index) {
return observablesRulesIds.contains(ruleToBeChecked);
}
public final Map<Integer, WireStorageInterface> getEventsMapForCurrentStory() {
return eventsMapForCurrentStory;
}
public final StoriesAgentTypesStorage getStoriesAgentTypesStorage() {
return storiesAgentTypesStorage;
}
}