//-----------------------------------------------------------------------
// This file is developed by Alex Feigin on November,2006 in framework of
// Ecozvit(© Soft fund ltd. 2005-2007) application development. //
// Implements data import supplementary class from the predefined data
// source to the XmlDocument
//
// Revisions history :
// may, 2007 added support of auto recalculation of emission
// concentrations with reduction to normal conditions
//-----------------------------------------------------------------------
using System;
using System.Collections;
using System.Data;
using System.Xml;
using System.Globalization;
using Sure.SharedObjects;
using Sure.DataPipe;
using Sure.BaseObjects;
namespace Sure
{
namespace SureControl
{
/// <summary>
/// Implementation of data source topics reader.
/// Implements mostly common features.
/// </summary>
public class CDataTopic
{
protected string topicName;
protected string topicPath;
protected XmlQualifiedName typeName=null;
protected XmlQualifiedName nodeName=null;
public delegate void OnTopicChanged(XmlNode target);
public event OnTopicChanged TopicChanged=null;
public delegate bool OnNewData(ref string fldName, ref object fldVal);
public event OnNewData NewData=null;
protected XmlNode baseNode=null;
protected XmlNode refNode=null;
protected bool insertBefore=false;
/// <summary>
// Constructor input parameters (for topics to create and fill):
// aTopicName - the name of the topic in the input data source
// aTopicPath - the target XML file path to write topic data
// aTypeName - the type of the Xml element - recipient of the topic data
// aNodeName - the name of the Xml element - recipient of the topic data
/// <summary>
public CDataTopic(string aTopicName,string aTopicPath,
XmlQualifiedName aTypeName,XmlQualifiedName aNodeName)
{
topicName=aTopicName;
topicPath=aTopicPath;
typeName=aTypeName;
nodeName=aNodeName;
}
/// <summary>
// Simplified constructor (for topics to create only):
// aTopicName - the name of the topic in the input data source
// aTopicPath - the target XML file path to write topic data
/// <summary>
public CDataTopic(string aTopicName,string aTopicPath)
{
topicName=aTopicName;
topicPath=aTopicPath;
}
/// <summary>
// Method to flush imported data to the target Xml file
// sDoc - target XmlDocument
// pipe - source data slices list
/// <summary>
public virtual void Flush(SureDoc sDoc,IDataPipe pipe)
{
string fldName;
object fldValue;
XmlNamespaceManager ns=SureTools.NameSpaceManager(sDoc);
bool found=pipe.GetFirstDataSliceByTopic(topicName,out fldName,out fldValue);
XmlNode target=null;
if(baseNode==null)
{
if(topicPath!=String.Empty)
{
baseNode=sDoc.SelectSingleNode(topicPath);
if(baseNode==null)
{
throw new Sure.DataError(String.Format("Не знайдено {0}",topicPath));
}
}
}
if(typeName!=null && nodeName!=null)
target=sDoc.PrepareNode(typeName,nodeName);
Hashtable row=new Hashtable();
while(found)
{
if(row[fldName]!=null)
{
if(target!=null)
{
// Topic change event
if(TopicChanged!=null)
TopicChanged(target);
if(baseNode!=null)
{
if(refNode!=null)
{
if(insertBefore)
refNode=baseNode.InsertBefore(target,refNode);
else
refNode=baseNode.InsertAfter(target,refNode);
}
else
baseNode.AppendChild(target);
}
}
if(typeName!=null && nodeName!=null)
target=sDoc.PrepareNode(typeName,nodeName);
row.Clear();
}
string fldOrigin=Sure.DataPipe.DataSlice.GetFldOrigin(fldName);
if(target!=null && NewData!=null )
{
// New data element initialization event
bool ret=NewData(ref fldOrigin,ref fldValue);
if(ret==false)
target=null;
}
if(target!=null)
{
string fldPath=Sure.DataPipe.DataSlice.GetFldPath(fldOrigin);
row.Add(fldName,fldValue);
if(fldPath!=String.Empty)
{
SureTools.SetNode(target,fldPath,fldValue.ToString(),ns);
}
}
found=pipe.GetNextDataSlice(out fldName,out fldValue);
}
if(row.Count>0 && target!=null)
{
// Topic change event
if(TopicChanged!=null)
TopicChanged(target);
if(baseNode!=null)
{
if(baseNode.Name.ToString()==target.Name.ToString())
{
XmlNode parent=baseNode.ParentNode;
XmlNode refnode=baseNode.PreviousSibling;
parent.RemoveChild(baseNode);
parent.InsertAfter(target,refnode);
}
else
{
if(refNode!=null)
refNode=baseNode.InsertAfter(target,refNode);
else
{
baseNode.AppendChild(target);
}
}
}
}
}
/// <summary>
// Method to cast floating point values in fixed point format
/// <summary>
protected System.Decimal ValueCast(object fldVal)
{
string fldValue=fldVal.ToString();
int i=fldValue.IndexOf("E");
if(i>=0)
{
string dec=fldValue.Substring(0,i);
string power=fldValue.Substring(i+1,fldValue.Length-i-1);
System.Decimal val=System.Decimal.Parse(dec);
for(int j=0;j<Int32.Parse(power);j++)
val=System.Decimal.Divide(val,10);
return val;
}
else
if(fldVal==null)
return 0;
else
return Convert.ToDecimal(fldVal);
}
public XmlNode BaseNode
{
get
{
return baseNode;
}
}
}
/// <summary>
// Implementation of the terrain data topic specific features
/// <summary>
public class CTerraTopic:CDataTopic
{
public CTerraTopic(string aTopicName,string aTopicPath, XmlQualifiedName aTypeName,XmlQualifiedName aNodeName):
base(aTopicName,aTopicPath,aTypeName,aNodeName)
{
}
public override void Flush(SureDoc sDoc,IDataPipe pipe)
{
XmlNamespaceManager ns=SureTools.NameSpaceManager(sDoc);
XmlNode baseNode=sDoc.SelectSingleNode(topicPath,ns);
if(baseNode==null)
{
XmlNode newNode=sDoc.PrepareNode( new XmlQualifiedName("CCalcConcentration","ovnsdisp"),
new XmlQualifiedName("CalcConcentration","ovnsdisp"));
XmlNode parentNode=sDoc.SelectSingleNode("//bases:estimateConcentration",ns);
if(parentNode!=null)
parentNode.PrependChild(newNode);
}
base.Flush(sDoc,pipe);
}
}
/// <summary>
// Implementation of the meteo data topic specific features
/// <summary>
public class CMeteoDataTopic:CDataTopic
{
COrgEmissionSourceTopic OrgEmissionTopic;
CUnorgEmissionSourceTopic UnOrgEmissionTopic;
CIndAreaTopic IndAreaTopic;
XmlNamespaceManager ns;
public CMeteoDataTopic(string aTopicName,string aTopicPath, XmlQualifiedName aTypeName,XmlQualifiedName aNodeName,
SureDoc aCurrentDocument,COrgEmissionSourceTopic orgEmissionTopic, CUnorgEmissionSourceTopic unOrgEmissionTopic,CIndAreaTopic indAreaTopic):
base(aTopicName,aTopicPath,aTypeName,aNodeName)
{
OrgEmissionTopic=orgEmissionTopic;
UnOrgEmissionTopic=unOrgEmissionTopic;
IndAreaTopic=indAreaTopic;
ns=SureTools.NameSpaceManager(aCurrentDocument);
TopicChanged+=new OnTopicChanged(DoTopicChanged);
NewData+=new OnNewData(DoNewData);
}
public bool DoNewData(ref string fldName, ref object fldVal)
{
if(fldName=="gor")
{
IndAreaTopic.SetObjectPlace(fldVal,ns);
}
return true;
}
public void DoTopicChanged(XmlNode target)
{
System.Decimal relief=System.Decimal.Round( System.Decimal.Divide(OrgEmissionTopic.Relief+UnOrgEmissionTopic.Relief,2),2);
if(relief>=1)
{
SureTools.SetNode(target,"disp:Relief",relief.ToString(),ns);
}
}
} |