// Path: scene-core/src/main/java/br/ufes/inf/lprm/scene/model/events/Activation.java
// public class Activation extends SituationEvent {
// 
// 	private static final long serialVersionUID = -8574595668587040347L;
// 
// 	public Activation(long timestamp) {
// 		super(timestamp);
// 	}
// 
//     public String toString() {
//         DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy MM dd HH:mm:ss");
//         DateTime activation = new DateTime(this.getTimestamp());
//         StringBuilder str = new StringBuilder();
//         str.append("\tActivation timestamp: ");
//         str.append(activation.toString(fmt));
//         str.append(".");
//         return str.toString();
//     }
// 
// }
// 
// Path: scene-core/src/main/java/br/ufes/inf/lprm/scene/util/SituationCast.java
// @SuppressWarnings("serial")
// public class SituationCast extends HashMap<String, Object> {
// 	
// 	private int hash = 17;
// 
// 	public SituationCast(Activation activation, SituationType type) throws Exception {
// 		
// 		int 	counter;
// 		String 	roleLabel;
// 		Object 	obj;
// 		RuleImpl rule = activation.getRule();
// 		//List<Part> parts = type.getParts();
// 		
// 		for(Part p: type.getParts()) {
// 			put(p.getLabel(), activation.getDeclarationValue(p.getLabel()), p.isKey());
// 		}
// 
// 		for(Snapshot s: type.getSnapshots()) {
// 			put(s.getLabel(), activation.getDeclarationValue(s.getLabel()), false);
// 
// 		}
// 	}	
// 
// 
// 	/*public SituationCast(Situation sit) {
// 		List<Field> fields = SituationUtils.getSituationRoleFields(sit.getClass());
// 		for(Field field: fields) {
// 			try {
// 				this.put(field.getName(), field.get(sit));
// 			} catch (IllegalArgumentException e) {
// 				e.printStackTrace();
// 			} catch (IllegalAccessException e) {
// 				e.printStackTrace();
// 			}
// 		}
// 	}*/
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (obj == null) {
// 			return false;
// 		}
// 		else {
// 			if ( !(obj instanceof SituationCast) ) {
// 				return false;
// 			}
// 			else {
// 				return this.hashCode() == obj.hashCode();
// 
// 			}
// 		}
// 	}
// 
// 	public Object put(String key, Object value, boolean hash) {
// 
// 		if (hash) {
// 			this.hash = this.hash + (key.hashCode() + value.getClass().hashCode() + value.hashCode());
// 			this.hash = 31*this.hash + key.hashCode();
// 			this.hash = 31*this.hash + value.getClass().hashCode();
// 			this.hash = 31*this.hash + value.hashCode();
// 		}
// 		return super.put(key, value);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return hash;
// 	}
// 
// }
// 
// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/bindings/Part.java
// public interface Part extends Bind {
//     public boolean isKey();
// }
// 
// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/bindings/Snapshot.java
// public interface Snapshot extends Bind {
// 
//     public SnapshotPolicy getPolicy();
// 
// }


import br.ufes.inf.lprm.scene.model.events.Activation;
import br.ufes.inf.lprm.scene.util.SituationCast;
import br.ufes.inf.lprm.situation.model.bindings.Part;
import br.ufes.inf.lprm.situation.model.bindings.Snapshot;
import java.lang.reflect.Field;
import java.util.*;
        this.snapshots = snapshots;
        mappedParts = new HashMap<String, Part>();
        for (Part part: this.parts) {
            mappedParts.put(part.getLabel(), part);
        }
        mappedSnapshots = new HashMap<String, Snapshot>();
        for (Snapshot snapshot: this.snapshots) {
            mappedSnapshots.put(snapshot.getLabel(), snapshot);
        }
    }

    @Override
    public String getName() {
        return clazz.getName();
    }

    public Class getTypeClass() {
        return clazz;
    }

    @Override
    public List<Part> getParts() {
        return parts;
    }

    @Override
    public List<Snapshot> getSnapshots() {
        return snapshots;
    }

// Path: scene-core/src/main/java/br/ufes/inf/lprm/scene/model/events/Activation.java
// public class Activation extends SituationEvent {
// 
// 	private static final long serialVersionUID = -8574595668587040347L;
// 
// 	public Activation(long timestamp) {
// 		super(timestamp);
// 	}
// 
//     public String toString() {
//         DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy MM dd HH:mm:ss");
//         DateTime activation = new DateTime(this.getTimestamp());
//         StringBuilder str = new StringBuilder();
//         str.append("\tActivation timestamp: ");
//         str.append(activation.toString(fmt));
//         str.append(".");
//         return str.toString();
//     }
// 
// }
// 
// Path: scene-core/src/main/java/br/ufes/inf/lprm/scene/util/SituationCast.java
// @SuppressWarnings("serial")
// public class SituationCast extends HashMap<String, Object> {
// 	
// 	private int hash = 17;
// 
// 	public SituationCast(Activation activation, SituationType type) throws Exception {
// 		
// 		int 	counter;
// 		String 	roleLabel;
// 		Object 	obj;
// 		RuleImpl rule = activation.getRule();
// 		//List<Part> parts = type.getParts();
// 		
// 		for(Part p: type.getParts()) {
// 			put(p.getLabel(), activation.getDeclarationValue(p.getLabel()), p.isKey());
// 		}
// 
// 		for(Snapshot s: type.getSnapshots()) {
// 			put(s.getLabel(), activation.getDeclarationValue(s.getLabel()), false);
// 
// 		}
// 	}	
// 
// 
// 	/*public SituationCast(Situation sit) {
// 		List<Field> fields = SituationUtils.getSituationRoleFields(sit.getClass());
// 		for(Field field: fields) {
// 			try {
// 				this.put(field.getName(), field.get(sit));
// 			} catch (IllegalArgumentException e) {
// 				e.printStackTrace();
// 			} catch (IllegalAccessException e) {
// 				e.printStackTrace();
// 			}
// 		}
// 	}*/
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (obj == null) {
// 			return false;
// 		}
// 		else {
// 			if ( !(obj instanceof SituationCast) ) {
// 				return false;
// 			}
// 			else {
// 				return this.hashCode() == obj.hashCode();
// 
// 			}
// 		}
// 	}
// 
// 	public Object put(String key, Object value, boolean hash) {
// 
// 		if (hash) {
// 			this.hash = this.hash + (key.hashCode() + value.getClass().hashCode() + value.hashCode());
// 			this.hash = 31*this.hash + key.hashCode();
// 			this.hash = 31*this.hash + value.getClass().hashCode();
// 			this.hash = 31*this.hash + value.hashCode();
// 		}
// 		return super.put(key, value);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return hash;
// 	}
// 
// }
// 
// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/bindings/Part.java
// public interface Part extends Bind {
//     public boolean isKey();
// }
// 
// Path: situation-model/src/main/java/br/ufes/inf/lprm/situation/model/bindings/Snapshot.java
// public interface Snapshot extends Bind {
// 
//     public SnapshotPolicy getPolicy();
// 
// }


// Path: scene-core/src/main/java/br/ufes/inf/lprm/scene/model/SituationType.java
import br.ufes.inf.lprm.scene.model.events.Activation;
import br.ufes.inf.lprm.scene.util.SituationCast;
import br.ufes.inf.lprm.situation.model.bindings.Part;
import br.ufes.inf.lprm.situation.model.bindings.Snapshot;
import java.lang.reflect.Field;
import java.util.*;

        this.snapshots = snapshots;
        mappedParts = new HashMap<String, Part>();
        for (Part part: this.parts) {
            mappedParts.put(part.getLabel(), part);
        }
        mappedSnapshots = new HashMap<String, Snapshot>();
        for (Snapshot snapshot: this.snapshots) {
            mappedSnapshots.put(snapshot.getLabel(), snapshot);
        }
    }

    @Override
    public String getName() {
        return clazz.getName();
    }

    public Class getTypeClass() {
        return clazz;
    }

    @Override
    public List<Part> getParts() {
        return parts;
    }

    @Override
    public List<Snapshot> getSnapshots() {
        return snapshots;
    }

    public Part getPart(String label) {