using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.IO; namespace SCJMapper_V2 { /// /// Maintains an actionmap - something like: /// /// /// /// /// /// /// /// /// /// class ActionMapCls : List { private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType ); public String name { get; set; } /// /// Copy return the complete ActionMap while reassigning the JsN Tag /// /// The JsN reassign list /// The ActionMap copy with reassigned input public ActionMapCls ReassignJsN( Dictionary newJsList ) { ActionMapCls newMap = new ActionMapCls( ); // full copy from 'this' newMap.name = this.name; foreach ( ActionCls ac in this ) { newMap.Add( ac.ReassignJsN( newJsList ) ); } return newMap; } /// /// Merge the given Map with this Map /// new ones are ignored - we don't learn from XML input for the time beeing /// /// public void Merge( ActionMapCls newAcm ) { // do we find all actions in the new list that are like the new ones in our list ? foreach ( ActionCls newAc in newAcm ) { ActionCls AC = this.Find( delegate( ActionCls ac ) { return ac.key == newAc.key; } ); if ( AC == null ) { ; // this.Add( newAc ); // no, add it } else { AC.Merge( newAc ); // yes, merge it } } } /// /// Dump the actionmap as partial XML nicely formatted /// /// the action as XML fragment public String toXML( ) { String acs = ""; foreach ( ActionCls ac in this ) { String x = ac.toXML( ); if ( !String.IsNullOrEmpty( x ) ) acs += String.Format( "\t{0}", x ); } if ( !String.IsNullOrWhiteSpace( acs ) ) { String r = String.Format( "\t\n", name ); r += acs; r += String.Format( "\t\n" ); return r; } // nothing to dump return ""; } /// /// Read an actionmap from XML - do some sanity check /// /// the XML action fragment /// True if an action was decoded public Boolean fromXML( String xml ) { XmlReaderSettings settings = new XmlReaderSettings( ); settings.ConformanceLevel = ConformanceLevel.Fragment; settings.IgnoreWhitespace = true; settings.IgnoreComments = true; XmlReader reader = XmlReader.Create( new StringReader( xml ), settings ); reader.Read( ); if ( reader.Name == "actionmap" ) { if ( reader.HasAttributes ) { name = reader["name"]; } else { return false; } } reader.Read( ); // move to next element String x = reader.ReadOuterXml( ); while ( !String.IsNullOrEmpty( x ) ) { ActionCls ac = new ActionCls( ); if ( ac.fromXML( x ) ) { this.Add( ac ); // add to list } x = reader.ReadOuterXml( ); } return true; } } }