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         }