sysperfana/heapanalyser/UI/UIs/Console/Inputs/HACmdLineInputParameters.cs
changeset 8 15296fd0af4a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/heapanalyser/UI/UIs/Console/Inputs/HACmdLineInputParameters.cs	Tue Jun 15 12:47:20 2010 +0300
@@ -0,0 +1,304 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistributions of source code must retain the above copyright notice,
+*   this list of conditions and the following disclaimer.
+* - Redistributions in binary form must reproduce the above copyright notice,
+*   this list of conditions and the following disclaimer in the documentation
+*   and/or other materials provided with the distribution.
+* - Neither the name of Nokia Corporation nor the names of its contributors
+*   may be used to endorse or promote products derived from this software
+*   without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+* 
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+using System;
+using System.Text;
+using System.IO;
+using System.Collections.Generic;
+using SymbianUtils.Tracer;
+using SymbianUtils.FileSystem.Utilities;
+using SymbianXmlInputLib.Parser;
+using SymbianXmlInputLib.Parser.Nodes;
+using SymbianXmlInputLib.Elements;
+using SymbianXmlInputLib.Elements.Types.Category;
+using SymbianXmlInputLib.Elements.Types.Extension;
+using SymbianXmlInputLib.Elements.Types.FileSystem;
+using SymbianXmlInputLib.Elements.Types.Command;
+using HeapAnalyser.UIs.Console.Files;
+using HeapAnalyser.Exceptions;
+using HeapAnalyser.Engine;
+
+namespace HeapAnalyser.UIs.Console.Inputs
+{
+	internal class HACmdLineInputParameters
+    {
+        #region Constructors & destructor
+        public HACmdLineInputParameters( ITracer aTracer, HeapWizardEngine aEngine )
+		{
+            iEngine = aEngine;
+            iTracer = aTracer;
+		}
+		#endregion
+
+		#region API
+        public void Read( string aFileName )
+        {
+            Trace( "[CmdInput] Read() - aFileName: " + aFileName );
+            try
+            {
+                // First create the tree
+                SXILDocument doc = CreateDocumentTree( aFileName );
+
+                // Then convert it to the list of elements that we care about
+                ExtractData( doc );
+            }
+            catch ( HAUIException cmdLineException )
+            {
+                Trace( "[CmdInput] Read() - HAUIException: " + cmdLineException.Message + " " + cmdLineException.StackTrace );
+                throw cmdLineException;
+            }
+            catch ( Exception generalException )
+            {
+                Trace( "[CmdInput] Read() - generalException: " + generalException.Message + " " + generalException.StackTrace );
+                throw new HAUIException( "Error reading input xml file", generalException, HAUIException.KErrCommandLineArgumentsFileInvalid );
+            }
+            Trace( "[CmdInput] Read() - read OK: " + aFileName );
+        }
+        #endregion
+
+		#region Properties
+        public string ThreadName
+        {
+            get { return iThreadName; }
+        }
+
+        public HACmdLineFSEntity OutputFile
+        {
+            get { return iOutputFile; }
+        }
+
+        public HACmdLineFSEntityList<HACmdLineFileSource> SourceFiles
+        {
+            get { return iSources; }
+        }
+
+        public HACmdLineFSEntityList<HACmdLineFSEntity> MetaDataFiles
+        {
+            get { return iMetaData; }
+        }
+        #endregion
+
+        #region Internal constants
+        private const string KInputFileDocumentRootNode = "heap_analysis";
+        private const string KInputFileCategorySource = "source";
+        private const string KInputFileCategoryDebugMetaData = "debug_meta_data";
+        private const string KInputFileCategoryParameters = "parameters";
+        private const string KInputFileCategoryOutput = "output";
+        private const string KInputFileCommandThread = "thread";
+        private const string KInputFileCommandNameAnalysis = "analysis_type";
+        private const string KInputFileCommandNameAnalysisViewer = "VIEWER";
+        private const string KInputFileCommandNameAnalysisCompareTwoHeaps = "COMPARETWOHEAPS";
+        #endregion
+
+        #region Internal methods
+        private SXILDocument CreateDocumentTree( string aFileName )
+        {
+            SXILDocument doc = new SXILDocument();
+
+            // Read input file into document
+            using ( SXILParser parser = new SXILParser( aFileName, KInputFileDocumentRootNode, doc ) )
+            {
+                parser.CategoryAdd( KInputFileCategorySource, new SXILParserNodeFileSystem() );
+                parser.CategoryAdd( KInputFileCategoryDebugMetaData, new SXILParserNodeFileSystem() );
+                parser.CategoryAdd( KInputFileCategoryParameters,
+                    new SXILParserNodeCommand( KInputFileCommandNameAnalysis ),
+                    new SXILParserNodeCommand( KInputFileCommandThread )
+                    );
+                parser.CategoryAdd( KInputFileCategoryOutput, new SXILParserNodeFileSystem() );
+                parser.Parse();
+            }
+
+            return doc;
+        }
+
+        private void ExtractData( SXILDocument aDocument )
+        {
+            foreach ( SXILElement element in aDocument )
+            {
+                if ( element is SXILElementCategory )
+                {
+                    SXILElementCategory category = (SXILElementCategory) element;
+                    string name = category.Name.ToLower();
+                    //
+                    switch ( name )
+                    {
+                    case KInputFileCategorySource:
+                        ExtractFileList<HACmdLineFileSource>( iSources, category, true );
+                        break;
+                    case KInputFileCategoryDebugMetaData:
+                        ExtractFileList<HACmdLineFSEntity>( iMetaData, category, false );
+                        break;
+                    case KInputFileCategoryParameters:
+                        ExtractParameters( category );
+                        break;
+                    case KInputFileCategoryOutput:
+                        ExtractOutput( category );
+                        break;
+                    }
+                }
+            }
+
+            // We don't require debug meta data if performing a summary operation. Otherwise, we do.
+            if ( iMetaData.Count == 0 )
+            {
+                Trace( "[CmdInput] ExtractData() - no debug meta data supplied!" );
+                throw new HAUIException( "Debug meta-data not present", HAUIException.KErrCommandLineDebugMetaDataMissing );
+            }
+        
+        }
+
+        private void ExtractFileList<T>( HACmdLineFSEntityList<T> aList, SXILElementCategory aCategory, bool aExpandDirectoriesToUnderlyingFiles ) where T : HACmdLineFSEntity, new()
+        {
+            foreach ( SXILElement element in aCategory )
+            {
+                if ( element is SXILElementFile )
+                {
+                    SXILElementFile file = (SXILElementFile) element;
+                    Trace( "[CmdInput] ExtractFileList() - file: " + file );
+                    if ( !file.Exists )
+                    {
+                        throw new FileNotFoundException( "File not found", file.Name );
+                    }
+                    //
+                    aList.Add( file );
+                }
+                else if ( element is SXILElementDirectory )
+                {
+                    SXILElementDirectory dir = (SXILElementDirectory) element;
+                    Trace( "[CmdInput] ExtractFileList() - dir:  " + dir );
+                    if ( !dir.Exists )
+                    {
+                        throw new DirectoryNotFoundException( "Directory not found: " + dir.Name );
+                    }
+                    //
+                    if ( aExpandDirectoriesToUnderlyingFiles )
+                    {
+                        aList.AddRange( dir.Files );
+                    }
+                    else
+                    {
+                        aList.Add( dir.Directory );
+                    }
+                }
+            }
+        }
+
+        private void ExtractParameters( SXILElementCategory aCategory )
+        {
+            foreach ( SXILElement element in aCategory )
+            {
+                if ( element is SXILElementCommand )
+                {
+                    SXILElementCommand entry = (SXILElementCommand) element;
+                    //
+                    string type = entry.Details.Trim();
+                    if ( entry.Name == KInputFileCommandNameAnalysis )
+                    {
+                        Trace( "[CmdInput] ExtractFileList() - command: " + type );
+                        switch ( type.ToUpper() )
+                        {
+                        case KInputFileCommandNameAnalysisViewer:
+                            iEngine.OperationType = HeapWizardEngine.TOperationType.EOperationTypeAnalyseAndView;
+                            break;
+                        case KInputFileCommandNameAnalysisCompareTwoHeaps:
+                            iEngine.OperationType = HeapWizardEngine.TOperationType.EOperationTypeCompareHeapDumps;
+                            break;
+                        default:
+                            throw new HAUIException( "Unsupported analysis type", HAUIException.KErrCommandLineAnalysisTypeNotSupported );
+                        }
+                    }
+                    else if ( entry.Name == KInputFileCommandThread )
+                    {
+                        iThreadName = type;
+                    }
+                    else
+                    {
+                        throw new HAUIException( "Unsupported command: " + entry.Name, HAUIException.KErrCommandLineInvalidCommand );
+                    }
+                }
+            }
+        }
+
+        private void ExtractOutput( SXILElementCategory aCategory )
+        {
+            // We either output to file or directory - if both are present then bail out
+            iOutputFile = null;
+            //
+            foreach ( SXILElement element in aCategory )
+            {
+                if ( element is SXILElementFile )
+                {
+                    if ( iOutputFile != null )
+                    {
+                        throw new HAUIException( "Output specified twice", HAUIException.KErrCommandLineAnalysisOutputInvalid );
+                    }
+                    else
+                    {
+                        SXILElementFile file = (SXILElementFile) element;
+                        iOutputFile = new HACmdLineFSEntity();
+                        iOutputFile.File = new FileInfo( file.Name );
+                    }
+                }
+                else if ( element is SXILElementDirectory )
+                {
+                    throw new HAUIException( "Cannot output directory", HAUIException.KErrCommandLineAnalysisOutputInvalid );
+                }
+            }
+        }
+
+        public void Trace( string aMessage )
+        {
+            iTracer.Trace( aMessage );
+        }
+
+        public void Trace( string aFormat, params object[] aParams )
+        {
+            string text = string.Format( aFormat, aParams );
+            Trace( text );
+        }
+        #endregion
+
+        #region Data members
+        private readonly ITracer iTracer;
+        private readonly HeapWizardEngine iEngine;
+        private string iThreadName = string.Empty;
+        private HACmdLineFSEntity iOutputFile = null;
+        private HACmdLineFSEntityList<HACmdLineFSEntity> iMetaData = new HACmdLineFSEntityList<HACmdLineFSEntity>();
+        private HACmdLineFSEntityList<HACmdLineFileSource> iSources = new HACmdLineFSEntityList<HACmdLineFileSource>();
+        #endregion
+	}
+}