package org.owasp.webscarab.plugin.identity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.model.FrameworkListener;
import org.owasp.webscarab.model.FrameworkModel;
import org.owasp.webscarab.plugin.AbstractPluginModel;
import org.owasp.webscarab.util.NullComparator;
public class IdentityModel extends AbstractPluginModel {
private FrameworkModel model;
private Map<String, Map<String, SortedMap<ConversationID, Transition>>> transitions = new HashMap<String, Map<String, SortedMap<ConversationID, Transition>>>();
private Map<ConversationID, List<String>> cache = new HashMap<ConversationID, List<String>>();
private SortedSet<String> identities = new TreeSet<String>(new NullComparator());
private Map<String, Map<String, List<ConversationID>>> conversations;
public IdentityModel(FrameworkModel model) {
this.model = model;
}
public void setStore(IdentityStore store) {
}
public void removeTransitions() {
transitions.clear();
cache.clear();
identities.clear();
conversations.clear();
}
public void addTransition(Transition transition) {
Map<String, SortedMap<ConversationID, Transition>> values = transitions
.get(transition.getTokenName());
if (values == null) {
values = new HashMap<String, SortedMap<ConversationID, Transition>>();
transitions.put(transition.getTokenName(), values);
}
SortedMap<ConversationID, Transition> events = values.get(transition.getTokenValue());
if (events == null) {
events = new TreeMap<ConversationID, Transition>();
values.put(transition.getTokenValue(), events);
}
events.put(transition.getConversation(), transition);
identities.add(transition.getIdentity());
}
public SortedMap<ConversationID, Transition> getTransitions(String tokenName, String tokenValue) {
Map<String, SortedMap<ConversationID, Transition>> values = transitions
.get(tokenName);
if (values == null)
return null;
SortedMap<ConversationID, Transition> events = values.get(tokenValue);
if (events == null)
return null;
return new TreeMap<ConversationID, Transition>(events);
}
public Transition getIdentity(ConversationID id, String tokenName, String tokenValue) {
Map<String, SortedMap<ConversationID, Transition>> values = transitions
.get(tokenName);
if (values == null)
return null;
SortedMap<ConversationID, Transition> events = values.get(tokenValue);
if (events == null)
return null;
Iterator<Entry<ConversationID, Transition>> it = events.entrySet().iterator();
Transition transition = null;
while (it.hasNext()) {
Entry<ConversationID, Transition> e = it.next();
ConversationID cid = e.getKey();
if (cid.compareTo(id) <= 0) {
transition = e.getValue();
} else {
if (transition == null)
return null;
return transition;
}
}
return null;
}
public Map<String, List<ConversationID>> getConversationsWithToken(String name) {
return conversations.get(name);
}
public List<ConversationID> getConversationsWithTokenValue(String name, String value) {
Map<String, List<ConversationID>> tokenMap = getConversationsWithToken(name);
if (tokenMap == null)
return null;
return tokenMap.get(value);
}
public List<String> getTokens() {
return new ArrayList<String>(conversations.keySet());
}
public List<String> getTokenValues(String name) {
Map<String, List<ConversationID>> tokenMap = getConversationsWithToken(name);
if (tokenMap == null)
return null;
return new ArrayList<String>(tokenMap.keySet());
}
public List<String> getIdentities() {
return new ArrayList<String>(identities);
}
}