286 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			286 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| // ========================================================================
 | |
| // Copyright 2006 - Volian Enterprises, Inc. All rights reserved.          
 | |
| // Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | |
| // ------------------------------------------------------------------------
 | |
| // $Workfile: $     $Revision: $                                           
 | |
| // $Author: $   $Date: $                                                   
 | |
| //                                                                         
 | |
| // $History: $                                                             
 | |
| // ========================================================================
 | |
| using System;
 | |
| using System.Drawing;
 | |
| using System.Collections;
 | |
| using System.ComponentModel;
 | |
| using System.Windows.Forms;
 | |
| using System.Data;
 | |
| using System.Data.OleDb;
 | |
| using System.Collections.Specialized;
 | |
| using System.Collections.Generic;
 | |
| using System.Xml;
 | |
| using System.IO;
 | |
| using System.Text;
 | |
| using VEPROMS.CSLA.Library;
 | |
| using vlnObjectLibrary;
 | |
| using vlnServerLibrary;
 | |
| using Org.Mentalis.Files;
 | |
| using Config;
 | |
| using Utils;
 | |
| 
 | |
| namespace DataLoader
 | |
| {
 | |
| 	public partial class Loader
 | |
| 	{
 | |
| 		private List<Folder> vlnDataPathFolders()  // was vlnDataPath
 | |
| 		{
 | |
| 			List<Folder> dpf = new List<Folder>();
 | |
| 			// Get path to config file
 | |
| 			string sCfg = Environment.GetEnvironmentVariable("veconfig");
 | |
| 			IniReader cfg = new IniReader(sCfg);
 | |
| 			// Get DataPath
 | |
| 			string sDP = cfg.ReadString("menu", "DataPath");
 | |
| 			// Split DataPath into directories
 | |
| 
 | |
| 			// Get the current list of folders so that if it already exists, just get the 'Folder', otherwise
 | |
| 			// make it.  It was done this way because there was no way to get the Folder given a name/Title.
 | |
| 			FolderInfoList fil = FolderInfoList.Get();
 | |
| 
 | |
| 			foreach (string s1 in sDP.Split(";".ToCharArray()))
 | |
| 			{
 | |
| 				if (s1.Length > 0)
 | |
| 				{
 | |
| 					string[] s2 = s1.Split(",".ToCharArray());
 | |
| 					Folder fld = GetFolderFromName(s2[1], s2[0], fil);
 | |
| 					if (fld == null)
 | |
| 						fld = Folder.MakeFolder(sysFolder, dbConn, s2[1], s2[0], FolderName(s2[0]), null, null, DateTime.Now, "Migration");
 | |
|                     dpf.Add(fld);
 | |
| 				}
 | |
| 			}
 | |
| 			return dpf;
 | |
| 		}
 | |
| 		private Folder GetFolderFromName(string name, string title, FolderInfoList fil)
 | |
| 		{
 | |
| 			Folder fld = null;
 | |
| 			foreach (FolderInfo fi in fil)
 | |
| 			{
 | |
| 				if (fi.Name.ToUpper() == name.ToUpper() && fi.Title.ToUpper() == title.ToUpper())
 | |
| 				{
 | |
| 					fld = Folder.Get(fi.FolderID);
 | |
| 					return fld;
 | |
| 				}
 | |
| 			}
 | |
| 			return null;
 | |
| 		}
 | |
| 		private string FolderName(string Path)
 | |
| 		{
 | |
| 			int ind = Path.LastIndexOf("\\");
 | |
| 			if (ind == Path.Length-1 || ind < 0) return Path;
 | |
| 			return Path.Substring(ind + 1);
 | |
| 		}
 | |
| 		private DocVersion GetDocVersionFromName(Folder fld, string f)
 | |
| 		{
 | |
| 			DocVersion dv = null;
 | |
| 			DocVersionInfoList dvil = DocVersionInfoList.GetByFolderID(fld.FolderID);
 | |
| 			foreach (DocVersionInfo dvi in dvil)
 | |
| 			{
 | |
| 				if (dvi.Name.ToUpper() == f.ToUpper())
 | |
| 				{
 | |
| 					dv = DocVersion.Get(dvi.VersionID);
 | |
| 					return dv;
 | |
| 				}
 | |
| 			}
 | |
| 			return null;
 | |
| 		}
 | |
|         private object cslaObject(vlnObject vb, Connection dbConn, Object parfld, TreeNode tn)
 | |
|         {
 | |
|             switch (vb.Type)
 | |
|             {
 | |
|                 case "plant":
 | |
|                 case "set":
 | |
| 					// if folder exists... get the Folder object, otherwise create it.
 | |
| 					FolderInfoList fil = FolderInfoList.Get();
 | |
| 					Folder fld = GetFolderFromName(vb.Title, vb.Path, fil);
 | |
| 					if (fld==null)  fld = Folder.MakeFolder((Folder)parfld, dbConn, vb.Title, vb.Path, FolderName(vb.Path), null, null, DateTime.Now, "Migration");
 | |
|                     tn.Tag = fld;
 | |
|                     return (object) fld;
 | |
|                 case "version":
 | |
| 					// see if version exists for the input folder, parfld.
 | |
| 					DocVersion v = GetDocVersionFromName((Folder)parfld, vb.Title);
 | |
| 					if (v == null)
 | |
| 					{
 | |
|                     ConfigFile cfg = new ConfigFile();
 | |
|                     
 | |
|                     XmlDocument d = cfg.IniToXml(vb.Path + "\\proc.ini");
 | |
| 										AddSlaveUnits(d, vb.Path);
 | |
| 					//DocVersionConfig fld_cfg = new DocVersionConfig(d == null ? "" : d.InnerXml);                   
 | |
| 					FolderConfig fld_cfg = (d==null)?null:new FolderConfig(d.InnerXml);
 | |
|                     // translate curset.dat into xml & add to d (somehow).
 | |
|                     string csfile = string.Format("{0}\\curset.dat",vb.Path);
 | |
|                     string defPlantFmt = null;
 | |
|                     if (File.Exists(csfile))
 | |
|                     {
 | |
|                         CurSet cs = new CurSet(csfile);
 | |
|                         try
 | |
|                         {
 | |
| 							if (fld_cfg == null) fld_cfg = new FolderConfig();
 | |
|                             fld_cfg = cs.Convert(fld_cfg);
 | |
|                             defPlantFmt = cs.GetDefFmt();
 | |
|                         }
 | |
|                         catch (Exception ex)
 | |
|                         {
 | |
|                             log.ErrorFormat("error in convert curset.dat, ex = {0}", ex.Message);
 | |
| 														frmMain.AddError(ex, "error in convert curset.dat");
 | |
|                         }
 | |
|                     }
 | |
| 										// *** RHM 20120613 - Fix
 | |
| 										// *** This was naming the DocVersion to the folder name
 | |
|                     //string titlepath = vb.Path + "\\" + "Title";
 | |
|                     //FileInfo fi = new FileInfo(titlepath);
 | |
|                     //string thetitle = vb.Title;
 | |
| 										//if (File.Exists(titlepath))
 | |
| 										//{
 | |
| 										//    StreamReader myReader = new StreamReader(titlepath);
 | |
| 										//    thetitle = myReader.ReadLine();
 | |
| 										//    myReader.Close();
 | |
| 										//}
 | |
|                     Folder tmpfld = (Folder)parfld;
 | |
|                     FormatInfo format = null;
 | |
|                     if (defPlantFmt != null && defPlantFmt != "") 
 | |
| 					{
 | |
| 						format = GetFormat(defPlantFmt);
 | |
| 					}
 | |
| 					else
 | |
| 						format = FormatInfo.Get(1);
 | |
| 
 | |
| 								using(Format fmt = format.Get())
 | |
| 									v = DocVersion.MakeDocVersion(tmpfld, (int)DocVersionType(vb.Path.ToLower()), vb.Title, vb.Path.ToLower(), null, fmt, fld_cfg == null ? null : fld_cfg.ToString(), DateTime.Now, "Migration");
 | |
| 					}
 | |
|                     tn.Tag = v;
 | |
| 					MigrateDocVersion(v, false);
 | |
| 					return (object)v;
 | |
|             }
 | |
|             return 0;
 | |
|         }
 | |
| 
 | |
| 		private void AddSlaveUnits(XmlDocument d, string path)
 | |
| 		{
 | |
| 			string masterDir = GetMasterDir(d);
 | |
| 			if (masterDir == null) return;
 | |
| 			DirectoryInfo master = new DirectoryInfo(path);
 | |
| 			if (master.Name.ToUpper() != masterDir.ToUpper()) return;
 | |
| 			List<string> names = GetUnitNames(d);
 | |
| 			DirectoryInfo[] slaves = master.Parent.GetDirectories(masterDir.ToUpper().Replace(".PRC",".SL*"));
 | |
| 			XmlDocument units = new XmlDocument();
 | |
| 			units.LoadXml("<Slaves/>");
 | |
| 			int idx = 0;
 | |
| 			foreach (DirectoryInfo slave in slaves)
 | |
| 			{
 | |
| 				FileInfo[] inis = slave.GetFiles("proc.ini");
 | |
| 				if (inis.Length > 0)
 | |
| 				{
 | |
| 					FileInfo ini = inis[0];
 | |
| 					ConfigFile cfg = new ConfigFile();
 | |
| 					XmlDocument xSlave = cfg.IniToXml(ini.FullName);
 | |
| 					xSlave.LoadXml(xSlave.OuterXml.Replace("<Unit", "<Slave"));
 | |
| 					string slaveDir = GetMasterDir(xSlave);
 | |
| 					if (slaveDir.ToUpper() == masterDir.ToUpper())
 | |
| 					{
 | |
| 						XmlNode unit = xSlave.SelectSingleNode("Config/Slave");
 | |
| 						XmlAttribute oldindex = xSlave.CreateAttribute("oldindex");
 | |
| 						oldindex.InnerText = slave.Extension.Replace(".SL", "");
 | |
| 						unit.Attributes.SetNamedItem(oldindex);
 | |
| 						XmlAttribute index = xSlave.CreateAttribute("index");
 | |
| 						idx++;
 | |
| 						index.InnerText = idx.ToString();
 | |
| 						unit.Attributes.SetNamedItem(index);
 | |
| 						if (names.Count == slaves.Length)
 | |
| 							oldindex.InnerText = index.InnerText;
 | |
| 						if (xSlave.SelectSingleNode("Config/ProcedureSet") != null)
 | |
| 						{
 | |
| 							XmlAttribute setName = xSlave.CreateAttribute("SetName");
 | |
| 							setName.InnerText = xSlave.SelectSingleNode("Config/ProcedureSet/@Name").InnerText;
 | |
| 							unit.Attributes.SetNamedItem(setName);
 | |
| 							XmlAttribute setID = xSlave.CreateAttribute("SetID");
 | |
| 							setID.InnerText = xSlave.SelectSingleNode("Config/ProcedureSet/@ID").InnerText;
 | |
| 							unit.Attributes.SetNamedItem(setID);
 | |
| 						}
 | |
| 						units.DocumentElement.AppendChild(units.ImportNode(unit, true));
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			d.DocumentElement.AppendChild(d.ImportNode(units.DocumentElement, true));
 | |
| 			//d.DocumentElement.RemoveChild(d.SelectSingleNode("Config/Unit"));
 | |
| 			Console.WriteLine(d.OuterXml);		
 | |
| 		}
 | |
| 
 | |
| 		private List<string> GetUnitNames(XmlDocument d)
 | |
| 		{
 | |
| 			XmlNode zapp = d.SelectSingleNode("//Unit");
 | |
| 			if (zapp == null) return null;
 | |
| 			XmlNode zmstr = zapp.Attributes.GetNamedItem("Name");
 | |
| 			if (zmstr == null) return null;
 | |
| 			string[] names = zmstr.InnerText.Split(",".ToCharArray());
 | |
| 			return new List<string>(names);
 | |
| 		}
 | |
| 
 | |
| 		private static string GetMasterDir(XmlDocument d)
 | |
| 		{
 | |
| 			XmlNode zapp = d.SelectSingleNode("//Applicability");
 | |
| 			if (zapp == null) return null;
 | |
| 			XmlNode zmstr = zapp.Attributes.GetNamedItem("MasterDir");
 | |
| 			if (zmstr == null) return null;
 | |
| 			return zmstr.InnerText;
 | |
| 		}
 | |
| 				private string _OnlyThisFolder;
 | |
| 				public string OnlyThisFolder
 | |
| 				{
 | |
| 					get 
 | |
| 					{
 | |
| 						if (_OnlyThisFolder == null)
 | |
| 						{
 | |
| 							if (frmMain.MySettings.OnlyThisSet)
 | |
| 							{
 | |
| 								DirectoryInfo dir = new DirectoryInfo(frmMain.MySettings.ProcedureSetPath);
 | |
| 								_OnlyThisFolder = dir.Parent.FullName.ToUpper();
 | |
| 							}
 | |
| 							else if ((frmMain.MySettings.ProcessOnlyInLocation ?? "") != "")
 | |
| 								_OnlyThisFolder = frmMain.MySettings.ProcessOnlyInLocation.ToUpper();
 | |
| 							else
 | |
| 								_OnlyThisFolder = "";
 | |
| 						}
 | |
| 						return _OnlyThisFolder; 
 | |
| 					}
 | |
| 				}
 | |
| 		private bool IsInSelectedPlantData(Object parent)
 | |
| 		{
 | |
| 			if (OnlyThisFolder == "")
 | |
| 				return true;
 | |
| 			Folder fld = parent as Folder;
 | |
| 			if (fld == null)
 | |
| 				return true;
 | |
| 			if (fld.MyParent.MyParent != null)
 | |
| 				return true;
 | |
| 			if (fld.Title.ToUpper() == OnlyThisFolder)
 | |
| 				return true;
 | |
| 			return false;
 | |
| 		}
 | |
|         private void MigrateChildren(vlnObject vb, vlnServer vs, Connection dbConn, Object parent, TreeNode tn)
 | |
|         {
 | |
|             if (vb.Type != "version")
 | |
|             {
 | |
| 								vb.LoadChildren(vs.GetChildren(vb.ToString()));
 | |
|                 List<vlnObject> lv = vb.Children;
 | |
|                 foreach (vlnObject vbc in lv)
 | |
|                 {
 | |
| 									if (vbc.Path.ToUpper().StartsWith(OnlyThisFolder) || OnlyThisFolder.StartsWith(vbc.Path.ToUpper()))
 | |
| 									{
 | |
| 										TreeNode tnc = tn.Nodes.Add(vbc.Title);
 | |
| 										object idc = cslaObject(vbc, dbConn, parent, tnc);
 | |
| 										frmMain.Status = "Loading " + vbc.Title;
 | |
| 										MigrateChildren(vbc, vs, dbConn, idc, tnc);
 | |
| 									}
 | |
|                 }
 | |
|             }
 | |
| 			frmMain.Status = " ";
 | |
|         }
 | |
| 	}
 | |
| } | 
