001 package com.croftsoft.apps.agoracast.c2p;
002
003 import java.awt.Color;
004 import java.io.*;
005 import java.util.*;
006
007 import com.croftsoft.core.gui.IdentifierDialog;
008 import com.croftsoft.core.lang.NullArgumentException;
009 import com.croftsoft.core.lang.StringLib;
010 import com.croftsoft.core.lang.Pair;
011 import com.croftsoft.core.text.sml.*;
012 import com.croftsoft.core.util.ArrayLib;
013
014 /*********************************************************************
015 *
016 * <p />
017 *
018 * @version
019 * 2001-11-09
020 * @since
021 * 2001-07-25
022 * @author
023 * <a href="http://croftsoft.com/">David Wallace Croft</a>
024 *********************************************************************/
025
026 public final class AgoracastConfig
027 implements AgoracastConstants, AgoracastModel
028 //////////////////////////////////////////////////////////////////////
029 //////////////////////////////////////////////////////////////////////
030 {
031
032 private static final String SML_NODE_NAME = "agoracast-config";
033
034 //
035
036 private String email;
037
038 private String server;
039
040 private String username;
041
042 private String newsgroup;
043
044 private SortedMap nameToFieldMap;
045
046 //
047
048 private String password;
049
050 private boolean isDirty;
051
052 //
053
054 private IdentifierDialog identifierDialog;
055
056 private Color panelBackgroundColor;
057
058 private Color textFieldBackgroundColor;
059
060 //////////////////////////////////////////////////////////////////////
061 //////////////////////////////////////////////////////////////////////
062
063 public static AgoracastConfig load ( String filename )
064 throws IOException
065 //////////////////////////////////////////////////////////////////////
066 {
067 return fromSmlNode ( SmlNodeLib.load ( filename, false ) );
068 }
069
070 public static AgoracastConfig fromSmlNode ( SmlNode smlNode )
071 //////////////////////////////////////////////////////////////////////
072 {
073 if ( !SML_NODE_NAME.equals ( smlNode.getName ( ) ) )
074 {
075 throw new IllegalArgumentException ( smlNode.getName ( ) );
076 }
077
078 String email = smlNode.getString ( "email" );
079
080 String server = smlNode.getString ( "server" );
081
082 String username = smlNode.getString ( "username" );
083
084 String newsgroup = smlNode.getString ( "newsgroup" );
085
086 List defaultPairList = new ArrayList ( );
087
088 AgoracastField [ ] agoracastFields = null;
089
090 SmlNode [ ] fieldNodes
091 = smlNode.getChildNodes ( AgoracastField.SML_NODE_NAME );
092
093 if ( fieldNodes != null
094 && fieldNodes.length > 0 )
095 {
096 List fieldList = new ArrayList ( fieldNodes.length );
097
098 for ( int i = 0; i < fieldNodes.length; i++ )
099 {
100 SmlNode fieldNode = fieldNodes [ i ];
101
102 fieldList.add ( AgoracastField.fromSmlNode ( fieldNodes [ i ] ) );
103 }
104
105 agoracastFields = ( AgoracastField [ ] )
106 fieldList.toArray ( new AgoracastField [ ] { } );
107 }
108
109 return new AgoracastConfig (
110 email, server, username, newsgroup, agoracastFields, null, null );
111 }
112
113 //////////////////////////////////////////////////////////////////////
114 //////////////////////////////////////////////////////////////////////
115
116 public AgoracastConfig (
117 String email,
118 String server,
119 String username,
120 String newsgroup,
121 AgoracastField [ ] agoracastFields,
122 Color panelBackgroundColor,
123 Color textFieldBackgroundColor )
124 //////////////////////////////////////////////////////////////////////
125 {
126 this.email = email;
127
128 this.server = server;
129
130 this.username = username;
131
132 this.newsgroup = newsgroup;
133
134 setAgoracastFields ( agoracastFields );
135
136 this.panelBackgroundColor = panelBackgroundColor;
137
138 this.textFieldBackgroundColor = textFieldBackgroundColor;
139
140 if ( panelBackgroundColor == null )
141 {
142 this.panelBackgroundColor
143 = AgoracastConstants.DEFAULT_PANEL_BACKGROUND_COLOR;
144 }
145
146 if ( textFieldBackgroundColor == null )
147 {
148 this.textFieldBackgroundColor
149 = AgoracastConstants.DEFAULT_TEXTFIELD_BACKGROUND_COLOR;
150 }
151
152 isDirty = false;
153 }
154
155 public AgoracastConfig ( )
156 //////////////////////////////////////////////////////////////////////
157 {
158 this ( null, null, null, null, null, null, null );
159 }
160
161 //////////////////////////////////////////////////////////////////////
162 //////////////////////////////////////////////////////////////////////
163
164 public String getEmail ( ) { return email; }
165
166 public String getServer ( ) { return server; }
167
168 public String getUsername ( ) { return username; }
169
170 public String getNewsgroup ( ) { return newsgroup; }
171
172 public String getPassword ( ) { return password; }
173
174 public AgoracastField getAgoracastField ( String name )
175 //////////////////////////////////////////////////////////////////////
176 {
177 return ( AgoracastField ) nameToFieldMap.get ( name );
178 }
179
180 public AgoracastField [ ] getAgoracastFields ( )
181 //////////////////////////////////////////////////////////////////////
182 {
183 return ( AgoracastField [ ] )
184 nameToFieldMap.values ( ).toArray ( new AgoracastField [ ] { } );
185 }
186
187 public String [ ] getAgoracastFieldNames ( )
188 //////////////////////////////////////////////////////////////////////
189 {
190 return ( String [ ] )
191 nameToFieldMap.keySet ( ).toArray ( new String [ ] { } );
192 }
193
194 public String getDefaultDescription ( )
195 //////////////////////////////////////////////////////////////////////
196 {
197 return null;
198 }
199
200 public Color getPanelBackgroundColor ( )
201 //////////////////////////////////////////////////////////////////////
202 {
203 return panelBackgroundColor;
204 }
205
206 public Color getTextFieldBackgroundColor ( )
207 //////////////////////////////////////////////////////////////////////
208 {
209 return textFieldBackgroundColor;
210 }
211
212 //////////////////////////////////////////////////////////////////////
213 //////////////////////////////////////////////////////////////////////
214
215 public synchronized void add ( AgoracastField agoracastField )
216 //////////////////////////////////////////////////////////////////////
217 {
218 isDirty = true;
219
220 nameToFieldMap.put ( agoracastField.getName ( ), agoracastField );
221 }
222
223 public synchronized void setAgoracastFields (
224 AgoracastField [ ] agoracastFields )
225 //////////////////////////////////////////////////////////////////////
226 {
227 isDirty = true;
228
229 nameToFieldMap = new TreeMap ( );
230
231 for ( int i = 0;
232 i < AgoracastConstants.DEFAULT_FIELDS.length; i++ )
233 {
234 AgoracastField field = AgoracastConstants.DEFAULT_FIELDS [ i ];
235
236 nameToFieldMap.put ( field.getName ( ), field );
237 }
238
239 if ( agoracastFields != null )
240 {
241 for ( int i = 0; i < agoracastFields.length; i++ )
242 {
243 AgoracastField agoracastField = agoracastFields [ i ];
244
245 String name = agoracastField.getName ( );
246
247 AgoracastField defaultAgoracastField
248 = ( AgoracastField ) nameToFieldMap.get ( name );
249
250 if ( defaultAgoracastField != null )
251 {
252 String [ ] choices = ( String [ ] ) ArrayLib.union (
253 agoracastField.getChoices ( ),
254 defaultAgoracastField.getChoices ( ) );
255
256 agoracastField = new AgoracastField (
257 agoracastField.getName ( ),
258 agoracastField.getValue ( ),
259 agoracastField.getType ( ),
260 agoracastField.isReverse ( ),
261 choices,
262 agoracastField.getSemantic ( ) );
263 }
264
265 nameToFieldMap.put ( name, agoracastField );
266 }
267 }
268 }
269
270 public synchronized void setEmail ( String email )
271 //////////////////////////////////////////////////////////////////////
272 {
273 isDirty = true;
274
275 this.email = StringLib.trimToNull ( email );
276 }
277
278 public synchronized void setServer ( String server )
279 //////////////////////////////////////////////////////////////////////
280 {
281 isDirty = true;
282
283 this.server = StringLib.trimToNull ( server );
284 }
285
286 public synchronized void setUsername ( String username )
287 //////////////////////////////////////////////////////////////////////
288 {
289 isDirty = true;
290
291 this.username = StringLib.trimToNull ( username );
292 }
293
294 public synchronized void setNewsgroup ( String newsgroup )
295 //////////////////////////////////////////////////////////////////////
296 {
297 isDirty = true;
298
299 this.newsgroup = StringLib.trimToNull ( newsgroup );
300 }
301
302 public synchronized void setPassword ( String password )
303 //////////////////////////////////////////////////////////////////////
304 {
305 isDirty = true;
306
307 this.password = StringLib.trimToNull ( password );
308 }
309
310 //////////////////////////////////////////////////////////////////////
311 //////////////////////////////////////////////////////////////////////
312
313 public synchronized boolean saveIfDirty ( String filename )
314 throws IOException
315 //////////////////////////////////////////////////////////////////////
316 {
317 if ( isDirty )
318 {
319 SmlNodeLib.save ( filename, toSmlNode ( ) );
320
321 isDirty = false;
322
323 return true;
324 }
325
326 return false;
327 }
328
329 public synchronized SmlNode toSmlNode ( )
330 //////////////////////////////////////////////////////////////////////
331 {
332 SmlNode rootSmlNode = new SmlNode ( SML_NODE_NAME );
333
334 if ( email != null )
335 {
336 rootSmlNode.add ( new SmlNode ( "email", email ) );
337 }
338
339 if ( server != null )
340 {
341 rootSmlNode.add ( new SmlNode ( "server", server ) );
342 }
343
344 if ( username != null )
345 {
346 rootSmlNode.add ( new SmlNode ( "username", username ) );
347 }
348
349 if ( newsgroup != null )
350 {
351 rootSmlNode.add ( new SmlNode ( "newsgroup", newsgroup ) );
352 }
353
354 AgoracastField [ ] agoracastFields = getAgoracastFields ( );
355
356 if ( agoracastFields != null )
357 {
358 for ( int i = 0; i < agoracastFields.length; i++ )
359 {
360 rootSmlNode.add ( agoracastFields [ i ].toSmlNode ( ) );
361 }
362 }
363
364 return rootSmlNode;
365 }
366
367 //////////////////////////////////////////////////////////////////////
368 //////////////////////////////////////////////////////////////////////
369 }