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 }