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.text.sml.*;
009    //   import com.croftsoft.core.util.event.EventBroadcaster;
010    //   import com.croftsoft.core.util.event.Event;
011    //   import com.croftsoft.core.util.event.EventListener;
012         import com.croftsoft.core.util.SoftHashMap;
013    
014         /*********************************************************************
015         *
016         * <p />
017         *
018         * @version
019         *   2001-08-09
020         * @since
021         *   2001-08-06
022         * @author
023         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
024         *********************************************************************/
025    
026         public final class  AgoracastMemory
027           implements AgoracastDatabase
028         //////////////////////////////////////////////////////////////////////
029         //////////////////////////////////////////////////////////////////////
030         {
031    
032         public static final String  SML_NODE_NAME = "database";
033    
034    //   private final EventBroadcaster  eventBroadcaster;
035    
036         //
037    
038         private boolean  isDirty;
039    
040         private Map      idToDataMap;
041    
042         //////////////////////////////////////////////////////////////////////
043         //////////////////////////////////////////////////////////////////////
044    
045         public static AgoracastMemory  load ( String  filename )
046           throws IOException
047         //////////////////////////////////////////////////////////////////////
048         {
049           return fromSmlNode ( SmlNodeLib.load ( filename, false ) );
050         }
051    
052         public static AgoracastMemory  fromSmlNode ( SmlNode  smlNode )
053         //////////////////////////////////////////////////////////////////////
054         {
055           if ( !SML_NODE_NAME.equals ( smlNode.getName ( ) ) )
056           {
057             throw new IllegalArgumentException ( smlNode.getName ( ) );
058           }
059    
060           Map  idToDataMap = new SoftHashMap ( );
061    
062           SmlNode [ ]  dataNodes
063             = smlNode.getChildNodes ( AgoracastData.SML_NODE_NAME );
064    
065           if ( dataNodes != null )
066           {
067             for ( int  i = 0; i < dataNodes.length; i++ )
068             {
069               AgoracastData  agoracastData
070                 = AgoracastData.fromSmlNode ( dataNodes [ i ] );
071    
072               idToDataMap.put (
073                 agoracastData.getArticleId ( ), agoracastData );
074             }
075           }
076    
077           return new AgoracastMemory ( idToDataMap );
078         }
079    
080         //////////////////////////////////////////////////////////////////////
081         //////////////////////////////////////////////////////////////////////
082    
083         public  AgoracastMemory ( Map  idToDataMap )
084         //////////////////////////////////////////////////////////////////////
085         {
086           NullArgumentException.check ( this.idToDataMap = idToDataMap );
087    
088    //     eventBroadcaster = new EventBroadcaster ( );
089         }
090    
091         public  AgoracastMemory ( )
092         //////////////////////////////////////////////////////////////////////
093         {
094           this ( new SoftHashMap ( ) );
095         }
096    
097         //////////////////////////////////////////////////////////////////////
098         //////////////////////////////////////////////////////////////////////
099    
100    /*
101         public boolean  addEventListener ( EventListener  eventListener )
102         //////////////////////////////////////////////////////////////////////
103         {
104           return eventBroadcaster.addEventListener ( eventListener );
105         }
106    */
107    
108         //////////////////////////////////////////////////////////////////////
109         //////////////////////////////////////////////////////////////////////
110    
111         public synchronized boolean  add ( AgoracastData  agoracastData )
112         //////////////////////////////////////////////////////////////////////
113         {
114           String  articleId = agoracastData.getArticleId ( );
115    
116           idToDataMap.put ( articleId, agoracastData );
117    
118           isDirty = true;
119    
120    //     eventBroadcaster.broadcast (
121    //       new AgoracastEvent ( AgoracastEvent.TYPE_ADD, articleId ) );
122    
123           return true;
124         }
125    
126         public AgoracastData  getAgoracastData ( String  articleId )
127         //////////////////////////////////////////////////////////////////////
128         {
129           return ( AgoracastData ) idToDataMap.get ( articleId );
130         }
131    
132         public synchronized AgoracastData [ ]  getAgoracastDatas ( )
133         //////////////////////////////////////////////////////////////////////
134         {
135           return ( AgoracastData [ ] )
136             idToDataMap.values ( ).toArray ( new AgoracastData [ ] { } );
137         }
138    
139         public synchronized AgoracastData [ ]  
140           getAgoracastDatasForCategory ( String  category )
141         //////////////////////////////////////////////////////////////////////
142         {
143           Iterator  iterator = idToDataMap.values ( ).iterator ( );
144    
145           List  agoracastDataList = new ArrayList ( );
146    
147           while ( iterator.hasNext ( ) )
148           {
149             AgoracastData  agoracastData
150               = ( AgoracastData ) iterator.next ( );
151    
152             if ( category.equals ( agoracastData.getValue (
153               AgoracastConstants.FIELD_NAME_CATEGORY ) ) )
154             {
155               agoracastDataList.add ( agoracastData );
156             }
157           }
158    
159           return ( AgoracastData [ ] )
160             agoracastDataList.toArray ( new AgoracastData [ ] { } );
161         }
162    
163         //////////////////////////////////////////////////////////////////////
164         //////////////////////////////////////////////////////////////////////
165    
166         public synchronized boolean  saveIfDirty ( String  filename )
167           throws IOException
168         //////////////////////////////////////////////////////////////////////
169         {
170           if ( isDirty )
171           {
172             SmlNodeLib.save ( filename, toSmlNode ( ) );
173    
174             isDirty = false;
175    
176             return true;
177           }
178    
179           return false;
180         }
181    
182         public synchronized SmlNode  toSmlNode ( )
183         //////////////////////////////////////////////////////////////////////
184         {
185           SmlNode  rootSmlNode = new SmlNode ( SML_NODE_NAME );
186    
187           if ( idToDataMap != null )
188           {
189             Iterator  iterator = idToDataMap.values ( ).iterator ( );
190    
191             while ( iterator.hasNext ( ) )
192             {
193               AgoracastData  agoracastData
194                 = ( AgoracastData ) iterator.next ( );
195    
196               rootSmlNode.add ( agoracastData.toSmlNode ( ) );
197             }
198           }
199    
200           return rootSmlNode;
201         }
202    
203         //////////////////////////////////////////////////////////////////////
204         //////////////////////////////////////////////////////////////////////
205         }