/itsumo/src/trafficAgents/dcop/dpop/frodo/src/OCOP/MessageContext.java

https://github.com/mbamarante/itsumo · Java · 333 lines · 176 code · 36 blank · 121 comment · 35 complexity · 45d29ad92e5f8ddd0f33d38524cf4aa1 MD5 · raw file

  1. /*
  2. * Created on Jun 6, 2004
  3. *
  4. * TODO To change the template for this generated file go to
  5. * Window - Preferences - Java - Code Style - Code Templates
  6. */
  7. package frodo.OCOP;
  8. import java.io.Serializable;
  9. import java.util.Iterator;
  10. import java.util.SortedMap;
  11. import java.util.TreeMap;
  12. import frodo.CSP.ContextElement;
  13. import frodo.CSP.VariableId;
  14. import frodo.OCOP.DPOP.Dimension;
  15. /**
  16. * @author apetcu
  17. *
  18. */
  19. public class MessageContext implements Serializable, Cloneable, Comparable {
  20. private static final long serialVersionUID = 1L;
  21. SortedMap elements;
  22. //I just update this when adding a new element to the set.
  23. //I use it only in getElements(int index);
  24. //-----------------------------------------------------------------------------------------------------------------//
  25. public MessageContext() {
  26. elements = new TreeMap();
  27. }
  28. //-----------------------------------------------------------------------------------------------------------------//
  29. //-----------------------------------------------------------------------------------------------------------------//
  30. public static MessageContext fromString(String str){
  31. MessageContext mc = new MessageContext();
  32. str = str.trim();
  33. if (str.startsWith("["))
  34. str = str.substring(1);
  35. if (str.endsWith("]"))
  36. str = str.substring(0, str.length() - 1);
  37. str = str.trim();
  38. //System.out.println("Gonna build context from:|" + str + "|");
  39. String[] parts = str.split(",");
  40. for (int i = 0; i < parts.length; i++) {
  41. ContextElement cel = ContextElement.buildFromString(parts[i]);
  42. mc.addElement(cel);
  43. }
  44. return mc;
  45. }
  46. //-----------------------------------------------------------------------------------------------------------------//
  47. public static MessageContext fromDimensions(Dimension[] dims){
  48. if (dims == null)
  49. return null;
  50. MessageContext mc = new MessageContext();
  51. for (int i = 0; i < dims.length; i++) {
  52. VariableId vid = new VariableId(dims[i].getId(), 0);
  53. ContextElement cel = new ContextElement(vid, new Integer(dims[i].getCurrentIndex()), dims[i].getSize());
  54. mc.addElement(cel);
  55. }
  56. return mc;
  57. }
  58. //-----------------------------------------------------------------------------------------------------------------//
  59. /**
  60. * @return Returns the elements.
  61. */
  62. public SortedMap getElements(){
  63. return elements;
  64. }
  65. /**
  66. * @param element
  67. * The element to add.
  68. */
  69. public void addElement(ContextElement cel){
  70. elements.put(cel.getVariableId(), cel);
  71. }
  72. public void addElementIfNotPresent(ContextElement cel){
  73. if (!containsVariable(cel.getVariableId()))
  74. addElement(cel);
  75. }
  76. // public ContextElement getElement(int i){
  77. // return (ContextElement) elements.elementAt(i);
  78. // }
  79. //-----------------------------------------------------------------------------------------------------------------//
  80. //-----------------------------------------------------------------------------------------------------------------//
  81. public boolean containsVariable(VariableId hay){
  82. return elements.containsKey(hay);
  83. }
  84. //-----------------------------------------------------------------------------------------------------------------//
  85. public String toString(){
  86. return elements.values().toString();
  87. // String rez = "[ ";
  88. //
  89. // for (Iterator iter = elements.iterator(); iter.hasNext();) {
  90. // rez += iter.next().toString() + " ";
  91. // }
  92. // rez += "]";
  93. // return rez;
  94. }
  95. //-----------------------------------------------------------------------------------------------------------------//
  96. public int size(){
  97. return elements.size();
  98. }
  99. public boolean isEmpty(){
  100. if (elements.size() == 0)
  101. return true;
  102. return false;
  103. }
  104. //-----------------------------------------------------------------------------------------------------------------//
  105. //-----------------------------------------------------------------------------------------------------------------//
  106. /**
  107. * This joins the current context with the "another" one.
  108. * They *must* be compatible
  109. * @param another
  110. */
  111. public void combine(MessageContext another){
  112. // System.out.print("Combining " + toString() + "<>" + another.toString());
  113. if (another != null)
  114. elements.putAll(another.elements);
  115. }
  116. //-----------------------------------------------------------------------------------------------------------------//
  117. //-----------------------------------------------------------------------------------------------------------------//
  118. public static MessageContext combine(MessageContext one, MessageContext two){
  119. MessageContext newmc = new MessageContext();
  120. newmc.elements.putAll(one.elements);
  121. newmc.elements.putAll(two.elements);
  122. ;
  123. return newmc;
  124. }
  125. //-----------------------------------------------------------------------------------------------------------------//
  126. //-----------------------------------------------------------------------------------------------------------------//
  127. //-----------------------------------------------------------------------------------------------------------------//
  128. //-----------------------------------------------------------------------------------------------------------------//
  129. /**
  130. * @param another context
  131. * @return the number of common context elements that have different value assignments
  132. */
  133. private int clashes(MessageContext another){
  134. int rez = 0;
  135. for (Iterator iter = elements.values().iterator(); iter.hasNext();) {
  136. ContextElement cel = (ContextElement) iter.next();
  137. ContextElement theOtherOne = another.getContextElement(cel.getVariableId());
  138. if (theOtherOne != null) {//I found my counterpart
  139. if (!cel.equals(theOtherOne))//it does not match my value
  140. rez++;
  141. }
  142. }
  143. return rez;
  144. }
  145. //-----------------------------------------------------------------------------------------------------------------//
  146. public static long possibleCombinations(MessageContext test){
  147. int rez = 1;
  148. for (Iterator iter = test.elements.values().iterator(); iter.hasNext();) {
  149. ContextElement cel = (ContextElement) iter.next();
  150. rez = rez * cel.getDomainSize();
  151. }
  152. return rez;
  153. }
  154. //-----------------------------------------------------------------------------------------------------------------//
  155. public boolean equals(Object other){
  156. MessageContext test = (MessageContext) other;
  157. if (elements.size() != test.size())
  158. return false;
  159. for (Iterator iter = elements.values().iterator(); iter.hasNext();) {
  160. ContextElement cel = (ContextElement) iter.next();
  161. ContextElement otherone = test.getContextElement(cel.getVariableId());
  162. if (!cel.equals(otherone))
  163. return false;
  164. }
  165. return true;
  166. // return hashCode() - test.hashCode() == 0;
  167. }
  168. //-----------------------------------------------------------------------------------------------------------------//
  169. //-----------------------------------------------------------------------------------------------------------------//
  170. //-----------------------------------------------------------------------------------------------------------------//
  171. public SortedMap commonElements(MessageContext other){
  172. SortedMap rez = new TreeMap();
  173. // int howm = 0;
  174. for (Iterator iter = elements.values().iterator(); iter.hasNext();) {
  175. ContextElement cel = (ContextElement) iter.next();
  176. if (other.containsVariable(cel.getVariableId()))
  177. rez.put(cel.getVariableId(), cel);
  178. }
  179. return rez;
  180. }
  181. //-----------------------------------------------------------------------------------------------------------------//
  182. /*
  183. private boolean disjoint(MessageContext other) {
  184. if (this.commonElements(other).size() == 0)
  185. return true;
  186. else
  187. return false;
  188. }
  189. */
  190. //-----------------------------------------------------------------------------------------------------------------//
  191. public boolean isCompatible(MessageContext other){
  192. for (Iterator iter = elements.values().iterator(); iter.hasNext();) {
  193. ContextElement cel = (ContextElement) iter.next();
  194. ContextElement theOtherOne = other.getContextElement(cel.getVariableId());
  195. if (theOtherOne != null && !cel.equals(theOtherOne))//it does not match my value
  196. return false;
  197. }
  198. return true;
  199. // if (clashes(other) > 0)
  200. // return false;
  201. // else
  202. // return true;
  203. }
  204. //-----------------------------------------------------------------------------------------------------------------//
  205. /*
  206. public ContextElement findContextElement(ContextElement cel){
  207. ContextElement test = (ContextElement) elements.get(cel.getVariableId());
  208. if (test.equals(cel))
  209. return test;
  210. return null;
  211. }
  212. */
  213. //-----------------------------------------------------------------------------------------------------------------//
  214. public ContextElement getContextElement(VariableId vid){
  215. return (ContextElement) elements.get(vid);
  216. }
  217. //-----------------------------------------------------------------------------------------------------------------//
  218. public ContextElement removeContextElement(VariableId vid){
  219. return (ContextElement) elements.remove(vid);
  220. }
  221. //-----------------------------------------------------------------------------------------------------------------//
  222. //-----------------------------------------------------------------------------------------------------------------//
  223. public Object clone(){
  224. MessageContext mc = new MessageContext();
  225. for (Iterator iter = elements.values().iterator(); iter.hasNext();) {
  226. ContextElement cel = (ContextElement) iter.next();
  227. ContextElement newCel = (ContextElement) cel.clone();
  228. mc.addElement(newCel);
  229. }
  230. return mc;
  231. }
  232. //-----------------------------------------------------------------------------------------------------------------//
  233. /**
  234. * @param newCEL - the new assignment that I have to copy over mine
  235. * @return true if target variable has been found, false otherwise
  236. */
  237. private boolean updateElement(ContextElement newCEL){
  238. ContextElement target = this.getContextElement(newCEL.getVariableId());
  239. if (target == null)
  240. return false;
  241. else
  242. target.setValue(newCEL.getValue());
  243. return true;
  244. }
  245. //-----------------------------------------------------------------------------------------------------------------//
  246. /**
  247. * This updates the assignments of my variables to the assignments of the variables that are contained in the new context
  248. * @param newCTX - the sample context
  249. * @return - true if all elements from newCTX were found in my context, false otherwise
  250. */
  251. public boolean update(MessageContext newCTX){
  252. boolean rez = true;
  253. for (Iterator iter = newCTX.getElements().values().iterator(); iter.hasNext();) {
  254. ContextElement cel = (ContextElement) iter.next();
  255. if (this.updateElement(cel) == false)
  256. rez = false;
  257. }
  258. return rez;
  259. }
  260. /**
  261. * Deletes all elements
  262. */
  263. public void clear(){
  264. elements.clear();
  265. }
  266. public int hashCode(){
  267. /*
  268. int code = 0;
  269. for (Iterator iterator = elements.values().iterator(); iterator.hasNext();) {
  270. ContextElement element = (ContextElement) iterator.next();
  271. code = code * ContextElement.MAX_VALUES_PER_VARIABLE + element.hashCode();
  272. System.out.println("Code=" + code);
  273. }
  274. return code;
  275. */
  276. return elements.hashCode();
  277. }
  278. /**
  279. *
  280. * @throws ClassCastException
  281. */
  282. public int compareTo(Object ref){
  283. MessageContext new_name = (MessageContext) ref;
  284. Iterator iter2 = new_name.elements.values().iterator();
  285. for (Iterator iter1 = elements.values().iterator(); iter1.hasNext();) {
  286. ContextElement element1 = (ContextElement) iter1.next();
  287. ContextElement element2 = (ContextElement) iter2.next();
  288. int tmpcmp = element1.compareTo(element2);
  289. if (tmpcmp != 0)
  290. return tmpcmp;
  291. }
  292. return 0;
  293. // return hashCode() - new_name.hashCode();
  294. }
  295. }
  296. //-----------------------------------------------------------------------------------------------------------------//
  297. //-----------------------------------------------------------------------------------------------------------------//