View Javadoc

1   package cz.cuni.amis.pogamut.ut2004.bot.impl;
2   
3   import java.util.ArrayList;
4   import java.util.Collections;
5   import java.util.HashMap;
6   import java.util.List;
7   import java.util.Map;
8   
9   import cz.cuni.amis.pogamut.ut2004.communication.messages.gbcommands.Configuration;
10  import cz.cuni.amis.utils.SafeEquals;
11  
12  /**
13   * Provides abstraction over the {@link UT2004Bot} name in the game allowing to append "extra infos" to it.
14   * @author Jimmy
15   */
16  public class UT2004BotName {
17  
18  	private UT2004Bot bot;
19  	
20  	private String base;
21  
22  	private Map<String, String> infos = new HashMap<String, String>();
23  	
24  	private String nullKeyValue = null;
25  	
26  	public UT2004BotName(UT2004Bot bot, String base) {
27  		this.bot = bot;
28  		this.base = base;
29  	}
30  	
31  	public void setNameBase(String base) {
32  		this.base = base;
33  		updateName();
34  	}
35  	
36  	/**
37  	 * Assings 'null' key.
38  	 * @param tag
39  	 */
40  	public void setTag(String tag) {
41  		if (tag == null) deleteTag();
42  		else setInfo(null, tag);
43  	}
44  	
45  	/**
46  	 * Removes 'null' key.
47  	 */
48  	public void deleteTag() {
49  		deleteInfo(null);
50  	}
51  	
52  	/**
53  	 * Alias for {@link #setInfo(String, String)}(null, value), i.e., assigning 'value' to 'NULL KEY'.
54  	 * @param value
55  	 */
56  	public void setInfo(String value) {
57  		setInfo(null, value);
58  	}
59  	
60  	/**
61  	 * @param key CAN BE NULL 
62  	 * @param value CAN BE NULL (null == delete the key)
63  	 */
64  	public void setInfo(String key, String value) {
65  		if (value == null) {
66  			deleteInfo(key);
67  			return;
68  		}
69  		if (key == null) {
70  			if (SafeEquals.equals(value, nullKeyValue)) return;
71  			nullKeyValue = value;
72  		} else {
73  			String oldValue = infos.get(key);
74  			if (SafeEquals.equals(oldValue, value)) return;
75  			infos.put(key, value);
76  		}
77  		updateName();
78  	}
79  	
80  	/**
81  	 * @param key CAN BE NULL
82  	 */
83  	public void deleteInfo(String key) {
84  		if (key == null) {
85  			if (nullKeyValue == null) return;
86  			nullKeyValue = null;
87  			updateName();
88  		} else {
89  			if (infos.remove(key) != null) {
90  				updateName();
91  			}
92  		}
93  	}
94  	
95  	public void updateName() {
96  		List<String> keys = new ArrayList<String>(infos.keySet());
97  		Collections.sort(keys);
98  		StringBuffer name = new StringBuffer();
99  		name.append(base);
100 		if (nullKeyValue != null) { 
101 			name.append(" [");
102 			name.append(nullKeyValue);			
103 			name.append("]");
104 		}
105 		for (String key : keys) {
106 			String value = infos.get(key);
107 			name.append(" [");
108 			name.append(key);
109 			if (value != null) {
110 				name.append(": ");
111 				name.append(value);
112 			}
113 			name.append("]");
114 		}
115 		bot.getAct().act(new Configuration().setName(name.toString()));
116 	}
117 	
118 }