001 package com.croftsoft.apps.agoracast.c2p;
002
003 import java.io.*;
004 import java.util.*;
005
006 import com.croftsoft.core.io.SerializableLib;
007 import com.croftsoft.core.lang.NullArgumentException;
008 import com.croftsoft.core.lang.StringLib;
009 import com.croftsoft.core.net.news.UsenetMessage;
010 import com.croftsoft.core.text.sml.*;
011
012 /*********************************************************************
013 *
014 * <p />
015 *
016 * @version
017 * 2001-09-12
018 * @since
019 * 2001-07-31
020 * @author
021 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
022 *********************************************************************/
023
024 public final class AgoracastNewsrc
025 //////////////////////////////////////////////////////////////////////
026 //////////////////////////////////////////////////////////////////////
027 {
028
029 private final Map serverToGroupToLastMap;
030
031 //
032
033 private transient boolean isDirty;
034
035 //////////////////////////////////////////////////////////////////////
036 //////////////////////////////////////////////////////////////////////
037
038 public static AgoracastNewsrc load ( String filename )
039 throws IOException
040 //////////////////////////////////////////////////////////////////////
041 {
042 return fromSmlNode ( SmlNodeLib.load ( filename, false ) );
043 }
044
045 public static AgoracastNewsrc fromSmlNode ( SmlNode smlNode )
046 //////////////////////////////////////////////////////////////////////
047 {
048 if ( !"agoracast-newsrc".equals ( smlNode.getName ( ) ) )
049 {
050 throw new IllegalArgumentException ( "agoracast-newsrc" );
051 }
052
053 Map serverToGroupToLastMap = new HashMap ( );
054
055 SmlNode serversSmlNode = smlNode.getChildNode ( "servers" );
056
057 if ( serversSmlNode != null )
058 {
059 SmlNode [ ] serverNodes
060 = serversSmlNode.getChildNodes ( "server" );
061
062 for ( int i = 0; i < serverNodes.length; i++ )
063 {
064 SmlNode serverNode = serverNodes [ i ];
065
066 String serverName = StringLib.trimToNull (
067 serverNode.getString ( "name" ) );
068
069 if ( serverName == null )
070 {
071 continue;
072 }
073
074 SmlNode groupsSmlNode = serverNode.getChildNode ( "groups" );
075
076 if ( groupsSmlNode == null )
077 {
078 continue;
079 }
080
081 SmlNode [ ] groupNodes
082 = groupsSmlNode.getChildNodes ( "group" );
083
084 for ( int j = 0; j < groupNodes.length; j++ )
085 {
086 SmlNode groupNode = groupNodes [ j ];
087
088 String groupName = StringLib.trimToNull (
089 groupNode.getString ( "name" ) );
090
091 if ( groupName == null )
092 {
093 continue;
094 }
095
096 long last = groupNode.getLong ( "last", -1 );
097
098 if ( last > -1 )
099 {
100 Map groupToLastMap
101 = ( Map ) serverToGroupToLastMap.get ( serverName );
102
103 if ( groupToLastMap == null )
104 {
105 groupToLastMap = new HashMap ( );
106
107 serverToGroupToLastMap.put (
108 serverName, groupToLastMap );
109 }
110
111 groupToLastMap.put ( groupName, new Long ( last ) );
112 }
113 }
114 }
115 }
116
117 return new AgoracastNewsrc ( serverToGroupToLastMap );
118 }
119
120 //////////////////////////////////////////////////////////////////////
121 //////////////////////////////////////////////////////////////////////
122
123 public AgoracastNewsrc (
124 Map serverToGroupToLastMap )
125 //////////////////////////////////////////////////////////////////////
126 {
127 NullArgumentException.check (
128 this.serverToGroupToLastMap = serverToGroupToLastMap );
129 }
130
131 public AgoracastNewsrc ( )
132 //////////////////////////////////////////////////////////////////////
133 {
134 this ( new HashMap ( ) );
135 }
136
137 //////////////////////////////////////////////////////////////////////
138 //////////////////////////////////////////////////////////////////////
139
140 public synchronized long getLastArticleNumber (
141 String server,
142 String newsgroupName )
143 //////////////////////////////////////////////////////////////////////
144 {
145 Map nameToLastMap
146 = ( Map ) serverToGroupToLastMap.get ( server );
147
148 if ( nameToLastMap == null )
149 {
150 return -1;
151 }
152
153 Long last = ( Long ) nameToLastMap.get ( newsgroupName );
154
155 if ( last == null )
156 {
157 return -1;
158 }
159
160 return last.longValue ( );
161 }
162
163 public synchronized void setLastArticleNumber (
164 String server,
165 String group,
166 long lastArticleNumber )
167 //////////////////////////////////////////////////////////////////////
168 {
169 Long last = new Long ( lastArticleNumber );
170
171 Map nameToLastMap = ( Map ) serverToGroupToLastMap.get ( server );
172
173 if ( nameToLastMap == null )
174 {
175 nameToLastMap = new HashMap ( );
176
177 serverToGroupToLastMap.put ( server, nameToLastMap );
178 }
179
180 nameToLastMap.put ( group, last );
181
182 isDirty = true;
183 }
184
185 //////////////////////////////////////////////////////////////////////
186 //////////////////////////////////////////////////////////////////////
187
188 public synchronized boolean saveIfDirty ( String filename )
189 throws IOException
190 //////////////////////////////////////////////////////////////////////
191 {
192 if ( isDirty )
193 {
194 SmlNodeLib.save ( filename, toSmlNode ( ) );
195
196 isDirty = false;
197
198 return true;
199 }
200
201 return false;
202 }
203
204 public synchronized SmlNode toSmlNode ( )
205 //////////////////////////////////////////////////////////////////////
206 {
207 SmlNode rootSmlNode = new SmlNode ( "agoracast-newsrc" );
208
209 SmlNode serversSmlNode = new SmlNode ( "servers" );
210
211 rootSmlNode.add ( serversSmlNode );
212
213 Iterator iterator = serverToGroupToLastMap.keySet ( ).iterator ( );
214
215 while ( iterator.hasNext ( ) )
216 {
217 SmlNode serverSmlNode = new SmlNode ( "server" );
218
219 serversSmlNode.add ( serverSmlNode );
220
221 String serverName = ( String ) iterator.next ( );
222
223 serverSmlNode.add ( new SmlNode ( "name", serverName ) );
224
225 Map groupToLastMap
226 = ( Map ) serverToGroupToLastMap.get ( serverName );
227
228 if ( groupToLastMap == null )
229 {
230 continue;
231 }
232
233 SmlNode groupsSmlNode = new SmlNode ( "groups" );
234
235 serverSmlNode.add ( groupsSmlNode );
236
237 Iterator groupIterator = groupToLastMap.keySet ( ).iterator ( );
238
239 while ( groupIterator.hasNext ( ) )
240 {
241 SmlNode groupSmlNode = new SmlNode ( "group" );
242
243 groupsSmlNode.add ( groupSmlNode );
244
245 String groupName = ( String ) groupIterator.next ( );
246
247 groupSmlNode.add ( new SmlNode ( "name", groupName ) );
248
249 Long last = ( Long ) groupToLastMap.get ( groupName );
250
251 if ( last == null )
252 {
253 continue;
254 }
255
256 groupSmlNode.add ( new SmlNode ( "last", last.toString ( ) ) );
257 }
258 }
259
260 return rootSmlNode;
261 }
262
263 //////////////////////////////////////////////////////////////////////
264 //////////////////////////////////////////////////////////////////////
265 }