Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 45.49 KB | None | 0 0
  1. using DependencyDemo.Classes.Database;
  2. using DependencyDemo.Classes.Observers;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Data.SqlClient;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Net;
  10. using System.Runtime.Serialization.Json;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. using System.Xml;
  15. using System.Xml.Linq;
  16. using DependencyDemo.Classes.Configuration;
  17.  
  18. namespace DependencyDemo.Classes.Controllers
  19. {
  20.     public class MainController
  21.     {
  22.         private List<Observer> observerList = new List<Observer>();
  23.  
  24.         private string Token { get; set; }
  25.         private MFLogin mFLogin { get; set; }
  26.         private DBLogin dBLogin { get; set; }
  27.         private FolderwatcherConfig folderConfig { get; set; }
  28.  
  29.         private Vault SelectedVault { get; set; }
  30.         public string VaultToken { get; private set; }
  31.  
  32.         private WatchController watchController;
  33.         private FolderController folderController;
  34.  
  35.         public PropertyDef[] AllProperties { get; private set; }
  36.         public ObjectClass[] AllClasses { get; private set; }
  37.         public ObjType[] AllObjectTypes { get; private set; }
  38.  
  39.         private PropertyDef[] ArchivekeyProperties { get; set; }
  40.         private PropertyDef[] RelationProperties { get;  set; }
  41.         private PropertyDef[] ContpersProperties { get; set; }
  42.  
  43.         private System.Timers.Timer authTimer;
  44.  
  45.         public MainController()
  46.         {
  47.             InitLogin();
  48.         }
  49.  
  50.         public void InitLogin()
  51.         {
  52.             mFLogin = new MFLogin();
  53.             mFLogin.Server = "";
  54.             mFLogin.Username = "";
  55.             mFLogin.Password = "";
  56.             mFLogin.Vault = "";
  57.  
  58.             dBLogin = new DBLogin();
  59.             dBLogin.Server = "";
  60.             dBLogin.Database = "";
  61.             dBLogin.Username = "";
  62.             dBLogin.Password = "";
  63.         }
  64.  
  65.         public bool IsMFLoggedIn()
  66.         {
  67.             return mFLogin.LoggedIn;
  68.         }
  69.  
  70.         public bool IsDBLoggedIn()
  71.         {
  72.             return dBLogin.LoggedIn;
  73.         }
  74.  
  75.         public MFLogin GetMFLogin()
  76.         {
  77.             return mFLogin;
  78.         }
  79.  
  80.         public DBLogin GetDBLogin()
  81.         {
  82.             return dBLogin;
  83.         }
  84.  
  85.         public void SetLoginFromConfig()
  86.         {
  87.             try
  88.             {
  89.                 if (File.Exists(@".\Config.xml"))
  90.                 {
  91.                     XDocument doc = XDocument.Load(@".\Config.xml");
  92.                     IEnumerable<XElement> elementMFiles = doc.Root.Elements("Login").Where(e => e.Attribute("program").Value.Equals("MFILES"));
  93.                     IEnumerable<XElement> elementDbFact = doc.Root.Elements("Login").Where(e => e.Attribute("program").Value.Equals("SQL"));
  94.                     IEnumerable<XElement> elementFolderWatcher = doc.Root.Elements("FolderWatcher");
  95.  
  96.                     if (elementDbFact.Count() != 0)
  97.                     {
  98.                         dBLogin.Server = elementDbFact.Select(e => e.Element("DBSERVER")).Single().Value;
  99.                         dBLogin.Database = elementDbFact.Select(e => e.Element("DBDATABASE")).Single().Value;
  100.                         dBLogin.Username = elementDbFact.Select(e => e.Element("DBUSERNAME")).Single().Value;
  101.                         dBLogin.Password = new PasswordEncryptor().DecryptString(elementDbFact.Select(e => e.Element("DBPASSWORD")).Single().Value);
  102.                     }
  103.                     if (elementMFiles.Count() != 0)
  104.                     {
  105.                         mFLogin.Server = elementMFiles.Select(e => e.Element("MFSERVER")).Single().Value;
  106.                         mFLogin.Username = elementMFiles.Select(e => e.Element("MFUSERNAME")).Single().Value;
  107.                         mFLogin.Password = new PasswordEncryptor().DecryptString(elementMFiles.Select(e => e.Element("MFPASSWORD")).Single().Value);
  108.                         mFLogin.Vault = elementMFiles.Select(e => e.Element("MFVAULT")).Single().Value;
  109.                     }
  110.  
  111.                     if (elementFolderWatcher.Count() != 0)
  112.                     {
  113.                         folderConfig = new FolderwatcherConfig();
  114.                         folderConfig.Watchfolder = elementFolderWatcher.Select(e => e.Element("WatchFolder")).SingleOrDefault().Value;
  115.                         folderConfig.Dropfolder = elementFolderWatcher.Select(e => e.Element("DropFolder")).Single().Value;
  116.                         int folderSeconds = -1;
  117.                         int.TryParse(elementFolderWatcher.Select(e => e.Element("WatchSeconds")).Single().Value, out folderSeconds);
  118.                         folderConfig.FolderSeconds = folderSeconds;
  119.                     }
  120.  
  121.                     TestDBLogin();
  122.                     GetTokens();
  123.                     InitObjects();
  124.                     ResetTimer();
  125.                     if (folderController != null)
  126.                     {
  127.                         folderController.SetWatchFolderPath(folderConfig.Watchfolder);
  128.                         folderController.SetDropFolderPath(folderConfig.Dropfolder);
  129.  
  130.                         if (folderController.IsWatching())
  131.                             folderController.RestartFolderWatcher();
  132.                     }
  133.                 }
  134.             }
  135.             catch (Exception ex)
  136.             {
  137.                 if (ex is InvalidOperationException || ex is XmlException)
  138.                 {
  139.                     NotifyObservers("", "Unable to read config file, check .\\Config.xml", "XML-error");
  140.                 }
  141.             }
  142.         }
  143.  
  144.         private void ResetTimer()
  145.         {
  146.             if (authTimer == null)
  147.                 authTimer = new System.Timers.Timer();
  148.  
  149.             if (authTimer.Enabled)
  150.             {
  151.                 authTimer.Enabled = false;
  152.                 authTimer.Stop();
  153.             }
  154.  
  155.             authTimer = new System.Timers.Timer();
  156.             authTimer.Interval = 36000000;
  157.             authTimer.Elapsed += AuthTimer_Tick;
  158.  
  159.             authTimer.Enabled = true;
  160.         }
  161.  
  162.         private void AuthTimer_Tick(object sender, System.Timers.ElapsedEventArgs e)
  163.         {
  164.             SetLoginFromConfig();
  165.         }
  166.  
  167.         public void SetMFLogin(string username, string password, string vault, string server)
  168.         {
  169.             mFLogin.Server = server;
  170.             mFLogin.Vault = vault;
  171.             mFLogin.Username = username;
  172.             mFLogin.Password = password;
  173.             GetTokens();
  174.             InitObjects();
  175.         }
  176.  
  177.         public void SetDBLogin(string server, string database, string username, string password)
  178.         {
  179.             dBLogin.Server = server;
  180.             dBLogin.Database = database;
  181.             dBLogin.Username = username;
  182.             dBLogin.Password = password;
  183.             TestDBLogin();
  184.         }
  185.  
  186.         private void GetTokens()
  187.         {
  188.             try
  189.             {
  190.                 Token = "";
  191.                 VaultToken = "";
  192.                 GetAuthToken();
  193.                 SelectNewVault();
  194.                 mFLogin.LoggedIn = true;
  195.             }
  196.             catch (WebException)
  197.             {
  198.                 mFLogin.LoggedIn = false;
  199.             }
  200.         }
  201.  
  202.         public void TestDBLogin()
  203.         {
  204.             try
  205.             {
  206.                 SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder()
  207.                 {
  208.                     UserID = dBLogin.Username,
  209.                     Password = dBLogin.Password,
  210.                     DataSource = dBLogin.Server,
  211.                     InitialCatalog = dBLogin.Database
  212.                 };
  213.                 using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
  214.                 {
  215.                     connection.Open();
  216.  
  217.                     if (connection.State == ConnectionState.Open)
  218.                     {
  219.                         dBLogin.LoggedIn = true;
  220.  
  221.                     }
  222.                     else
  223.                     {
  224.                         dBLogin.LoggedIn = false;
  225.                         NotifyObservers(dBLogin.Database, "Cannot login to database, check credentials and try again", "SQL error");
  226.                     }
  227.                 }
  228.             }
  229.             catch (SqlException)
  230.             {
  231.                 dBLogin.LoggedIn = false;
  232.                 NotifyObservers(dBLogin.Database, "Cannot login to database, check credentials and try again", "SQL error");
  233.             }
  234.         }
  235.  
  236.         public void RestartListening()
  237.         {
  238.             watchController.RestartListening();
  239.         }
  240.  
  241.         public void StartListening()
  242.         {
  243.             Task connectToService = Task.Factory.StartNew(() =>
  244.             {
  245.                 try
  246.                 {
  247.                     if (watchController == null)
  248.                         watchController = new WatchController(this, new DbQueries(dBLogin));
  249.                     watchController.StartListening();
  250.                     if (folderController == null)
  251.                         folderController = new FolderController(this, new DbQueries(dBLogin));
  252.                     folderController.SetDropFolderPath(folderConfig.Dropfolder);
  253.                     folderController.SetWatchFolderPath(folderConfig.Watchfolder);
  254.                     folderController.StartWatching();
  255.                 }
  256.                 catch (Exception)
  257.                 {
  258.                     if (File.Exists(@".\Config.xml"))
  259.                         NotifyObservers("", "Unable to check for changes -- try again later", "Unknown error");
  260.                     else
  261.                         NotifyObservers("", "No configuration found, please enter the settings first", "Settings");
  262.                 }
  263.             });
  264.         }
  265.  
  266.         public void StopListening()
  267.         {
  268.             watchController.StopListening();
  269.         }
  270.  
  271.         public void RestartService()
  272.         {
  273.             Task restartTask = Task.Factory.StartNew(() =>
  274.             {
  275.                 watchController.StopListening();
  276.                 watchController.RestartListening();
  277.             });
  278.         }
  279.  
  280.         #region M-FILES
  281.         public void GetAuthToken()
  282.         {
  283.             try
  284.             {
  285.                 Authentication auth = new Authentication() { Username = mFLogin.Username, Password = mFLogin.Password, WindowsUser = false };
  286.  
  287.                 string url = String.Format("http://{0}/REST/server/authenticationtokens", mFLogin.Server);
  288.                 WebRequest request = WebRequest.Create(url);
  289.                 request.Method = "POST";
  290.  
  291.                 var serializer = new DataContractJsonSerializer(typeof(Authentication));
  292.                 serializer.WriteObject(request.GetRequestStream(), auth);
  293.                 WebResponse response = request.GetResponse();
  294.  
  295.                 var deserializer = new DataContractJsonSerializer(typeof(PrimitiveType<string>));
  296.                 PrimitiveType<string> token = (PrimitiveType<string>)deserializer.ReadObject(response.GetResponseStream());
  297.                 Token = token.Value;
  298.             }
  299.             catch (WebException)
  300.             {
  301.                 NotifyObservers("", "-- Cannot login to M-Files, check login credentials and try again", "Webservice Error");
  302.             }
  303.         }
  304.  
  305.         private List<Vault> GetAvailableVaults()
  306.         {
  307.             List<Vault> vaults = new List<Vault>();
  308.             try
  309.             {
  310.                 string url = String.Format("http://{0}/REST/server/vaults", mFLogin.Server);
  311.                 WebRequest request = WebRequest.Create(url);
  312.                 request.Headers["X-Authentication"] = Token;
  313.  
  314.                 // Get the response.
  315.                 WebResponse response = request.GetResponse();
  316.  
  317.                 // Deserialize the view.
  318.                 var deserializer = new DataContractJsonSerializer(typeof(Vault[]));
  319.                 var result = (Vault[])deserializer.ReadObject(response.GetResponseStream());
  320.  
  321.                 foreach (Vault vault in result)
  322.                 {
  323.                     vaults.Add(vault);
  324.                 }
  325.  
  326.                 return vaults;
  327.             }
  328.             catch (WebException)
  329.             {
  330.                 throw;
  331.             }
  332.         }
  333.  
  334.         private void InitObjects()
  335.         {
  336.             AllObjectTypes = GetObjectTypes();
  337.             AllProperties = GetAllProperties();
  338.             AllClasses = GetAllClasses();
  339.         }
  340.  
  341.         public void SelectNewVault()
  342.         {
  343.             if (!String.IsNullOrEmpty(Token))
  344.             {
  345.                 try
  346.                 {
  347.                     SelectedVault = GetAvailableVaults().Where(prop => prop.Name == mFLogin.Vault).FirstOrDefault();
  348.                     VaultToken = SelectedVault.Authentication;
  349.                 }
  350.                 catch (Exception)
  351.                 {
  352.                     NotifyObservers(mFLogin.Vault, "Cannot login to vault, check credentials and try again", "Cannot login to vault");
  353.                 }
  354.             }
  355.  
  356.         }
  357.  
  358.         public WebResponse GetResponse(string url)
  359.         {
  360.             try
  361.             {
  362.                 WebRequest request = WebRequest.Create(url);
  363.                 request.Headers["X-Authentication"] = VaultToken;
  364.                 WebResponse response = request.GetResponse();
  365.                 return response;
  366.             }
  367.             catch (WebException)
  368.             {
  369.                 throw;
  370.             }
  371.         }
  372.  
  373.         public T GetResults<T>(string url)
  374.         {
  375.             try
  376.             {
  377.                 var deserializer = new DataContractJsonSerializer(typeof(T));
  378.                 var response = GetResponse(url);
  379.                 if (response != null)
  380.                 {
  381.                     var result = (T)deserializer.ReadObject(response.GetResponseStream());
  382.                     return result;
  383.                 }
  384.                 else
  385.                     return default(T);
  386.             }
  387.             catch (WebException)
  388.             {
  389.                 NotifyObservers("", "Unable to communicate with the webservices, please try again later", "Webservice error");
  390.                 return default(T);
  391.             }
  392.         }
  393.  
  394.         public T GetPostResult<T>(WebResponse response)
  395.         {
  396.             var deserializer = new DataContractJsonSerializer(typeof(T));
  397.             var createdObject = (T)deserializer.ReadObject(response.GetResponseStream());
  398.             return createdObject;
  399.         }
  400.  
  401.         public WebResponse PostObject<T>(string url, Object postObject)
  402.         {
  403.             try
  404.             {
  405.                 var request = WebRequest.Create(url);
  406.                 request.Headers["X-Authentication"] = VaultToken;
  407.                 request.Method = "POST";
  408.                 var serializer = new DataContractJsonSerializer(typeof(T));
  409.                 serializer.WriteObject(request.GetRequestStream(), postObject);
  410.                 return request.GetResponse();
  411.             }
  412.             catch (WebException)
  413.             {
  414.                 throw;
  415.             }
  416.  
  417.         }
  418.  
  419.         public int GetObjectClassID(string objectClass)
  420.         {
  421.             int objectID = -1;
  422.             objectID = AllClasses.Where(n => n.Name == objectClass).Select(n => n.ID).FirstOrDefault();
  423.             return objectID;
  424.         }
  425.  
  426.         public int GetDocumentTypeID(string documentType)
  427.         {
  428.             int docTypeID = -1;
  429.             int docTypeObjectID = GetObjectTypeID("Document Type");
  430.             int shortnamePropertyId = AllProperties.Where(propName => propName.Name == "Doctype Shortname").Select(val => val.ID).FirstOrDefault();
  431.  
  432.             string url = String.Format("http://{0}/REST/objects/{1}?p{2}={3}", mFLogin.Server, docTypeObjectID, shortnamePropertyId, documentType);
  433.             var result = GetResults<Results<ObjectVersion>>(url);
  434.             docTypeID = result.Items.FirstOrDefault().ObjVer.ID;
  435.  
  436.             return docTypeID;
  437.         }
  438.  
  439.         private ObjType[] GetObjectTypes()
  440.         {
  441.             string url = String.Format("http://{0}/REST/structure/objecttypes", mFLogin.Server);
  442.             var result = GetResults<ObjType[]>(url);
  443.  
  444.             return result;
  445.         }
  446.  
  447.         public int GetObjectTypeID(string objectType)
  448.         {
  449.             int objectID = -1;
  450.  
  451.             if (AllObjectTypes != null)
  452.             {
  453.                 objectID = AllObjectTypes.Where(n => n.Name == objectType).Select(n => n.ID).FirstOrDefault();
  454.                 return objectID;
  455.             }
  456.             else
  457.                 return 0;
  458.         }
  459.  
  460.         private PropertyDef[] GetAllProperties()
  461.         {
  462.             string url = String.Format("http://{0}/REST/structure/properties", mFLogin.Server);
  463.             var result = GetResults<PropertyDef[]>(url);
  464.             return result;
  465.         }
  466.  
  467.         private ObjectClass[] GetAllClasses()
  468.         {
  469.  
  470.             string url = String.Format("http://{0}/REST/structure/classes", mFLogin.Server);
  471.             return GetResults<ObjectClass[]>(url);
  472.  
  473.         }
  474.  
  475.         public void CheckOutItem(int type, ObjectVersion ov)
  476.         {
  477.             try
  478.             {
  479.                 var url = string.Format("http://{0}/REST/objects/{1}/{2}/checkedout?_method=PUT", mFLogin.Server, type, ov.ObjVer.ID);
  480.                 var status = new PrimitiveType<MFCheckOutStatus> { Value = MFCheckOutStatus.CheckedOutToMe };
  481.                 var response = PostObject<PrimitiveType<MFCheckOutStatus>>(url, status);
  482.             }
  483.             catch(WebException)
  484.             {
  485.                 NotifyObservers(ov.Title, "Unable to checkout document, check if document is checked out by someone else", "Webservice error");
  486.             }
  487.  
  488.         }
  489.  
  490.         public ObjectVersion CheckInItem(int type, ObjectVersion ov)
  491.         {
  492.             try
  493.             {
  494.                 var url = string.Format("http://{0}/REST/objects/{1}/{2}/checkedout?_method=PUT", mFLogin.Server, type, ov.ObjVer.ID);
  495.                 var status = new PrimitiveType<MFCheckOutStatus> { Value = MFCheckOutStatus.CheckedIn };
  496.                 var response = PostObject<PrimitiveType<MFCheckOutStatus>>(url, status);
  497.                 if (response != null)
  498.                     return GetPostResult<ObjectVersion>(response);
  499.                 else
  500.                     return CheckInItem(type, ov);
  501.             }
  502.             catch (WebException)
  503.             {
  504.                 NotifyObservers(ov.Title, "Unable to checkout document, check if document is checked out by someone else", "Webservice error");
  505.                 return default(ObjectVersion);
  506.             }
  507.  
  508.         }
  509.  
  510.         private PropertyDef[] GetClassProperties(ExtendedObjectClass classObject)
  511.         {
  512.             List<PropertyDef> properties = new List<PropertyDef>();
  513.  
  514.             foreach (AssociatedPropertyDef associatedProperty in classObject.AssociatedPropertyDefs)
  515.             {
  516.                 PropertyDef property = AllProperties.Where(prop => prop.ID == associatedProperty.PropertyDef).Select(val => val).FirstOrDefault();
  517.                 properties.Add(property);
  518.             }
  519.  
  520.             return properties.ToArray();
  521.         }
  522.  
  523.         private void GetArchivekeyProperties()
  524.         {
  525.             int archivekeyObjectID = GetObjectClassID("Archiefkey");
  526.             string url = String.Format("http://{0}/REST/structure/classes/{1}", mFLogin.Server, archivekeyObjectID);
  527.             ExtendedObjectClass archivekeyClass = GetResults<ExtendedObjectClass>(url);
  528.  
  529.             ArchivekeyProperties = GetClassProperties(archivekeyClass);
  530.         }
  531.  
  532.         public int GetArchiveKeyPropertyID(string propertyName)
  533.         {
  534.             if (ArchivekeyProperties == null)
  535.                 GetArchivekeyProperties();
  536.             return ArchivekeyProperties.Where(n => n.Name == propertyName).Select(n => n.ID).FirstOrDefault();
  537.         }
  538.  
  539.         private void GetRelationProperties()
  540.         {
  541.             int relationObjectID = GetObjectClassID("Relatie");
  542.             string url = String.Format("http://{0}/REST/structure/classes/{1}", mFLogin.Server, relationObjectID);
  543.             ExtendedObjectClass relationClass = GetResults<ExtendedObjectClass>(url);
  544.  
  545.             RelationProperties = GetClassProperties(relationClass);
  546.         }
  547.  
  548.         public int GetRelationPropertyID(string propertyName)
  549.         {
  550.             if (RelationProperties == null)
  551.                 GetRelationProperties();
  552.             return RelationProperties.Where(n => n.Name == propertyName).Select(n => n.ID).FirstOrDefault();
  553.         }
  554.  
  555.         private void GetContpersProperties()
  556.         {
  557.             int contpersObjectID = GetObjectClassID("Contactpersoon");
  558.             string url = String.Format("http://{0}/REST/structure/classes/{1}", mFLogin.Server, contpersObjectID);
  559.             ExtendedObjectClass contpersClass = GetResults<ExtendedObjectClass>(url);
  560.  
  561.             ContpersProperties = GetClassProperties(contpersClass);
  562.         }
  563.  
  564.         public int GetContpersPropertyID(string propertyName)
  565.         {
  566.             if (ContpersProperties == null)
  567.                 GetContpersProperties();
  568.             return ContpersProperties.Where(n => n.Name == propertyName).Select(n => n.ID).FirstOrDefault();
  569.         }
  570.  
  571.         public int GetPropertyId(string objectType)
  572.         {
  573.             switch (objectType)
  574.             {
  575.                 case "Archiefkey":
  576.                     return GetArchiveKeyPropertyID("Archief Barcode");
  577.                 case "Relatie":
  578.                     return GetRelationPropertyID("Relatie ID");
  579.                 case "Contactpersoon":
  580.                     return GetContpersPropertyID("Contact ID");
  581.                 default:
  582.                     return -1;
  583.             }
  584.         }
  585.  
  586.         public int GetRelnumID(int relnum)
  587.         {
  588.             try
  589.             {
  590.                 int relnumID = 0;
  591.                 int relObjectID = GetObjectTypeID("Relatie");
  592.                 int relPropertyID = GetPropertyId("Relatie");
  593.  
  594.                 string url = String.Format("http://{0}/REST/objects/{1}?p{2}={3}", mFLogin.Server, relObjectID, relPropertyID, relnum);
  595.                 var result = GetResults<Results<ObjectVersion>>(url);
  596.                 relnumID = result.Items.FirstOrDefault().ObjVer.ID;
  597.  
  598.                 return relnumID;
  599.             }
  600.             catch (NullReferenceException)
  601.             {
  602.                 return 0;
  603.             }
  604.         }
  605.  
  606.         public ObjectVersion GetObjectWithProperty(string objectType, int propertyId, string identifier)
  607.         {
  608.             //int objectTypeID = GetObjectTypeID(objectType);
  609.             string url = String.Format("http://{0}/REST/objects/{1}?p{2}={3}", mFLogin.Server, objectType, propertyId, identifier);
  610.             var result = GetResults<Results<ObjectVersion>>(url);
  611.  
  612.             if (result == null)
  613.                 return default(ObjectVersion);
  614.  
  615.             ObjectVersion objectV = result.Items.FirstOrDefault();
  616.  
  617.             return objectV;
  618.         }
  619.  
  620.         public PropertyValue[] GetPropertiesOfObject(ObjectVersion objectV, string objectType)
  621.         {
  622.             int objectTypeID = GetObjectTypeID(objectType);
  623.             string url = String.Format("http://{0}/REST/objects/{1}/{2}/properties", mFLogin.Server, objectTypeID, objectV.ObjVer.ID);
  624.             var result = GetResults<PropertyValue[]>(url); ;
  625.  
  626.             return result;
  627.         }
  628.  
  629.         public void PostNewArchiveKey(Archive archive)
  630.         {
  631.             int archiveObjectID = GetObjectTypeID("Archiefkey");
  632.             ObjectCreationInfo creationInfo = CreateNewArchiveKey(archive);
  633.             string url = String.Format("http://{0}/REST/objects/{1}", mFLogin.Server, archiveObjectID);
  634.             PostNewObject(url, creationInfo);
  635.         }
  636.  
  637.         public void PostNewRelation(Relation relation)
  638.         {
  639.             int relationObjectID = GetObjectTypeID("Relatie");
  640.             ObjectCreationInfo creationInfo = CreateNewRelation(relation);
  641.             string url = String.Format("http://{0}/REST/objects/{1}", mFLogin.Server, relationObjectID);
  642.             PostNewObject(url, creationInfo);
  643.         }
  644.  
  645.         public void PostNewContpers(Contpers contpers)
  646.         {
  647.             int ContpersObjectID = GetObjectTypeID("Contactpersoon");
  648.             ObjectCreationInfo creationInfo = CreateNewContpers(contpers);
  649.             string url = String.Format("http://{0}/REST/objects/{1}", mFLogin.Server, ContpersObjectID);
  650.             PostNewObject(url, creationInfo);
  651.         }
  652.  
  653.         public ObjectVersion DeleteObject(ObjectVersion deletedObject, string objectTypeId)
  654.         {
  655.             try
  656.             {
  657.                 int objectId = -1;
  658.                 int.TryParse(objectTypeId, out objectId);
  659.                 CheckOutItem(objectId, deletedObject);
  660.                 string url = String.Format("http://{0}/REST/objects/{1}/{2}/?allVersions&_method=DELETE", mFLogin.Server, objectTypeId, deletedObject.ObjVer.ID);
  661.                 var response = PostObject<ObjectVersion>(url, deletedObject);
  662.                 if (response != null)
  663.                 {
  664.                     var createdObject = GetPostResult<ObjectVersion>(response);
  665.                     if (createdObject.Class == GetObjectClassID("Archiefkey"))
  666.                         NotifyObservers("Archiefkey", createdObject.Title, "DELETE", "MFILES");
  667.                     else if (createdObject.Class == GetObjectClassID("Relatie"))
  668.                         NotifyObservers("Relatie", createdObject.Title, "DELETE", "MFILES");
  669.                     else if (createdObject.Class == GetObjectClassID("Contactpersoon"))
  670.                         NotifyObservers("Contactpersoon", createdObject.Title, "DELETE", "MFILES");
  671.                     return createdObject;
  672.                 }
  673.                 return default(ObjectVersion);
  674.             }
  675.             catch (WebException)
  676.             {
  677.                 NotifyObservers(deletedObject.Title, "Unable to delete item, please try again later", "Webservice error");
  678.                 return default(ObjectVersion);
  679.             }
  680.         }
  681.  
  682.         public ObjectVersion PostNewObject(string url, ObjectCreationInfo creationInfo)
  683.         {
  684.             var response = PostObject<ObjectCreationInfo>(url, creationInfo);
  685.             if (response != null)
  686.             {
  687.                 var createdObject = GetPostResult<ObjectVersion>(response);
  688.                 if (createdObject.Class == GetObjectClassID("Archiefkey"))
  689.                     NotifyObservers("Archiefkey", createdObject.Title, "INSERT", "MFILES");
  690.                 else if (createdObject.Class == GetObjectClassID("Relatie"))
  691.                     NotifyObservers("Relatie", createdObject.Title, "INSERT", "MFILES");
  692.                 else if (createdObject.Class == GetObjectClassID("Contactpersoon"))
  693.                     NotifyObservers("Contactpersoon", createdObject.Title, "INSERT", "MFILES");
  694.                 return createdObject;
  695.             }
  696.             else
  697.                 return PostNewObject(url, creationInfo);
  698.  
  699.         }
  700.  
  701.         public ObjectCreationInfo CreateNewArchiveKey(Archive archive)
  702.         {
  703.             int docTypeID = GetDocumentTypeID(archive.DocType);
  704.             int relnumID = GetRelnumID(archive.RelNum);
  705.  
  706.             ObjectCreationInfo creationInfo = new ObjectCreationInfo
  707.             {
  708.                 PropertyValues = new[]
  709.                 {
  710.                     new PropertyValue
  711.                     {
  712.                         PropertyDef = 100,
  713.                         TypedValue = new TypedValue { DataType = MFDataType.Lookup,  Lookup = new Lookup { Item = GetObjectClassID("Archiefkey"), Version=-1 } }
  714.                     },
  715.                     new PropertyValue
  716.                     {
  717.                         PropertyDef =  GetArchiveKeyPropertyID("Archief Barcode"),
  718.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = archive.ArchKey }
  719.                     },
  720.                     new PropertyValue
  721.                     {
  722.                         PropertyDef =  GetArchiveKeyPropertyID("Document Journaal"),
  723.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = archive.DocJrnl }
  724.                     },
  725.                     new PropertyValue
  726.                     {
  727.                         PropertyDef =  GetArchiveKeyPropertyID("Document Nummer"),
  728.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = archive.DocNum }
  729.                     },
  730.                     new PropertyValue
  731.                     {
  732.                         PropertyDef =  GetArchiveKeyPropertyID("Document Datum"),
  733.                         TypedValue = new TypedValue { DataType = MFDataType.Date, Value = archive.Docdat.AddDays(1) }
  734.                     },
  735.                     new PropertyValue
  736.                     {
  737.                         PropertyDef =  GetArchiveKeyPropertyID("Document Opmerking"),
  738.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = archive.DocOpm }
  739.                     },
  740.                     new PropertyValue
  741.                     {
  742.                         PropertyDef =  GetArchiveKeyPropertyID("Relatie"),
  743.                         TypedValue = new TypedValue { DataType = MFDataType.MultiSelectLookup, Lookups = new Lookup[] {
  744.                             new Lookup {
  745.                                 Item = relnumID, Version = -1
  746.                             } }
  747.                         }
  748.                     },
  749.                     new PropertyValue
  750.                     {
  751.                         PropertyDef =  GetArchiveKeyPropertyID("Relnaam (info)"),
  752.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = archive.RelNaam }
  753.                     },
  754.                     new PropertyValue
  755.                     {
  756.                         PropertyDef = GetArchiveKeyPropertyID("Boekjaar"),
  757.                         TypedValue = new TypedValue { DataType = MFDataType.Integer, Value = archive.BoekJaar }
  758.                     }
  759.                 }
  760.             };
  761.  
  762.             if (docTypeID != -1)
  763.             {
  764.                 List<PropertyValue> propertyList = creationInfo.PropertyValues.ToList();
  765.                 propertyList.Add(new PropertyValue
  766.                 {
  767.                     PropertyDef = GetArchiveKeyPropertyID("Document Type"),
  768.                     TypedValue = new TypedValue
  769.                     {
  770.                         DataType = MFDataType.MultiSelectLookup,
  771.                         Lookups = new Lookup[] {
  772.                             new Lookup {
  773.                                 Item = docTypeID, Version = -1
  774.                             }
  775.                         }
  776.                     }
  777.                 });
  778.                 creationInfo.PropertyValues = propertyList.ToArray();
  779.             }
  780.  
  781.             if (relnumID == 0 || docTypeID == 0)
  782.             {
  783.                 List<PropertyValue> propertyList = creationInfo.PropertyValues.ToList();
  784.                 if (relnumID == 0)
  785.                     propertyList.RemoveAll(v => v.PropertyDef == GetArchiveKeyPropertyID("Relatie"));
  786.                 if (docTypeID == 0)
  787.                     propertyList.RemoveAll(v => v.PropertyDef == GetArchiveKeyPropertyID("Document Type"));
  788.                 creationInfo.PropertyValues = propertyList.ToArray();
  789.             }
  790.  
  791.             return creationInfo;
  792.         }
  793.  
  794.         public ObjectCreationInfo CreateNewRelation(Relation relation)
  795.         {
  796.  
  797.             ObjectCreationInfo creationInfo = new ObjectCreationInfo
  798.             {
  799.                 PropertyValues = new[]
  800.                 {
  801.                     new PropertyValue
  802.                     {
  803.                         PropertyDef = 100,
  804.                         TypedValue = new TypedValue { DataType = MFDataType.Lookup,  Lookup = new Lookup { Item = GetObjectClassID("Relatie"), Version=-1 } }
  805.                     },
  806.                     new PropertyValue
  807.                     {
  808.                         PropertyDef = GetRelationPropertyID("Relatie Naam"),
  809.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = relation.Name }
  810.                     },
  811.                     new PropertyValue
  812.                     {
  813.                         PropertyDef =  GetRelationPropertyID("Straat"),
  814.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = relation.Address}
  815.                     },
  816.                     new PropertyValue
  817.                     {
  818.                         PropertyDef =  GetRelationPropertyID("Postcode"),
  819.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.ZipCode }
  820.                     },
  821.                     new PropertyValue
  822.                     {
  823.                         PropertyDef =  GetRelationPropertyID("Plaats"),
  824.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.Place }
  825.                     },
  826.                     new PropertyValue
  827.                     {
  828.                         PropertyDef =  GetRelationPropertyID("Landcode"),
  829.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.Isoland }
  830.                     },
  831.                     new PropertyValue
  832.                     {
  833.                         PropertyDef =  GetRelationPropertyID("Relatiecode"),
  834.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.Relcode }
  835.                     },
  836.                     new PropertyValue
  837.                     {
  838.                         PropertyDef =  GetRelationPropertyID("Relatiestatus"),
  839.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.RelStatus}
  840.                     },
  841.                     new PropertyValue
  842.                     {
  843.                         PropertyDef =  GetRelationPropertyID("Relatie Email"),
  844.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.Email }
  845.                     },
  846.                     new PropertyValue
  847.                     {
  848.                         PropertyDef =  GetRelationPropertyID("Relatie ID"),
  849.                         TypedValue = new TypedValue {DataType = MFDataType.Integer, Value = relation.Relnum }
  850.                     },
  851.                     new PropertyValue
  852.                     {
  853.                         PropertyDef =  GetRelationPropertyID( "Relatie Alternatief nummer"),
  854.                         TypedValue = new TypedValue { DataType = MFDataType.Text, Value = relation.BNum }
  855.                     }
  856.                 }
  857.             };
  858.  
  859.             return creationInfo;
  860.         }
  861.  
  862.         public ObjectCreationInfo CreateNewContpers(Contpers contpers)
  863.         {
  864.             int relNum = GetRelnumID(contpers.RelNum);
  865.  
  866.             ObjectCreationInfo creationInfo = new ObjectCreationInfo
  867.             {
  868.                 PropertyValues = new[]
  869.                 {
  870.                     new PropertyValue
  871.                     {
  872.                         PropertyDef = 100,
  873.                         TypedValue = new TypedValue { DataType = MFDataType.Lookup,  Lookup = new Lookup { Item = GetObjectClassID("Contactpersoon"), Version=-1 } }
  874.                     },
  875.                     new PropertyValue
  876.                     {
  877.                         PropertyDef =  GetContpersPropertyID("Contact naam"),
  878.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = contpers.LastName }
  879.                     },
  880.                     new PropertyValue
  881.                     {
  882.                         PropertyDef =  GetContpersPropertyID("Contact voornaam"),
  883.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = contpers.FirstName }
  884.                     },
  885.                     new PropertyValue
  886.                     {
  887.                         PropertyDef = GetContpersPropertyID("Contact email"),
  888.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = contpers.Email }
  889.                     },
  890.                     new PropertyValue
  891.                     {
  892.                         PropertyDef =  AllProperties.Where(val => val.Name == "Eigenaar (Relatie)").Select(val => val.ID).FirstOrDefault(),
  893.                         TypedValue = new TypedValue{ DataType = MFDataType.Lookup, Lookup = new Lookup
  894.                             {
  895.                                 Item = relNum, Version = -1
  896.                             }
  897.                         }
  898.                     },
  899.                     new PropertyValue
  900.                     {
  901.                         PropertyDef =  GetContpersPropertyID("Contactpersoon Status"),
  902.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = contpers.Status }
  903.                     },
  904.                     new PropertyValue
  905.                     {
  906.                         PropertyDef =  GetContpersPropertyID("Contact ID"),
  907.                         TypedValue = new TypedValue{ DataType = MFDataType.Text, Value = contpers.ID }
  908.                     }
  909.                 }
  910.             };
  911.  
  912.             if (relNum == 0)
  913.             {
  914.                 creationInfo.PropertyValues.ToList().RemoveAll(v => v.PropertyDef == GetArchiveKeyPropertyID("Relatie"));
  915.             }
  916.             return creationInfo;
  917.         }
  918.  
  919.         public HashSet<PropertyValue> CompareArchiveKey(Archive updatedArchive, ObjectVersion oldArchive)
  920.         {
  921.             ObjectCreationInfo creationInfo = CreateNewArchiveKey(updatedArchive);
  922.             PropertyValue[] propertiesOldArchive = GetPropertiesOfObject(oldArchive, "Archiefkey");
  923.  
  924.             return CompareObject(propertiesOldArchive, creationInfo);
  925.         }
  926.  
  927.         public HashSet<PropertyValue> CompareRelation(Relation updatedRelation, ObjectVersion oldRelation)
  928.         {
  929.             ObjectCreationInfo creationInfo = CreateNewRelation(updatedRelation);
  930.             PropertyValue[] propertiesOldRelation = GetPropertiesOfObject(oldRelation, "Relatie");
  931.  
  932.             return CompareObject(propertiesOldRelation, creationInfo);
  933.         }
  934.  
  935.         public HashSet<PropertyValue> CompareContpers(Contpers updatedContpers, ObjectVersion oldContpers)
  936.         {
  937.             ObjectCreationInfo creationInfo = CreateNewContpers(updatedContpers);
  938.             PropertyValue[] propertiesOldContpers = GetPropertiesOfObject(oldContpers, "Contactpersoon");
  939.  
  940.             return CompareObject(propertiesOldContpers, creationInfo);
  941.         }
  942.  
  943.         private HashSet<PropertyValue> CompareObject(PropertyValue[] oldProperties, ObjectCreationInfo newProperties)
  944.         {
  945.             bool changeDetected = false;
  946.             HashSet<PropertyValue> changedProperties = new HashSet<PropertyValue>();
  947.  
  948.             foreach (PropertyValue property in oldProperties)
  949.             {
  950.                 PropertyValue value = newProperties.PropertyValues.Where(prop => prop.PropertyDef == property.PropertyDef).FirstOrDefault(); //PropertyDef = 100 is number for the objectClass
  951.  
  952.                 if (value != null)
  953.                 {
  954.                     changeDetected = false;
  955.  
  956.                     if (value.TypedValue.DataType != MFDataType.Lookup && value.TypedValue.DataType != MFDataType.MultiSelectLookup && value.TypedValue.DataType != MFDataType.Date)
  957.                     {
  958.                         changeDetected = !value.TypedValue.Value.Equals(property.TypedValue.Value);
  959.                         if (value.TypedValue.Value.ToString() == "" && property.TypedValue.Value == null)
  960.                             changeDetected = false;
  961.                     }
  962.                     else if (value.TypedValue.DataType == MFDataType.Lookup)
  963.                         changeDetected = value.TypedValue.Lookup.Item != property.TypedValue.Lookup.Item;
  964.                     else if (value.TypedValue.DataType == MFDataType.MultiSelectLookup)
  965.                     {
  966.                         if (property.TypedValue.Lookups != null && value.TypedValue.Lookups != null)
  967.                         {
  968.                             for (int i = 0; i < value.TypedValue.Lookups.Length; i++)
  969.                             {
  970.                                 changeDetected = true;
  971.                                 for (int j = 0; j < property.TypedValue.Lookups.Length; j++)
  972.                                 {
  973.                                     if (value.TypedValue.Lookups[i].Item == property.TypedValue.Lookups[j].Item)
  974.                                     {
  975.                                         changeDetected = false;
  976.                                         break;
  977.                                     }
  978.                                 }
  979.                             }
  980.                         }
  981.                     }
  982.                     else if (value.TypedValue.DataType == MFDataType.Date)
  983.                     {
  984.                         changeDetected = !value.TypedValue.Value.ToString().Contains(property.TypedValue.DisplayValue.ToString());
  985.                     }
  986.  
  987.                     if (changeDetected)
  988.                     {
  989.                         changedProperties.Add(value);
  990.                     }
  991.                 }
  992.             }
  993.  
  994.             changedProperties.Remove(changedProperties.Where(prop => prop.TypedValue.DataType == MFDataType.Lookup).Where(propval => propval.TypedValue.Lookup == null || propval.TypedValue.Lookup.Item == 0).FirstOrDefault());
  995.             changedProperties.Remove(changedProperties.Where(prop => prop.TypedValue.DataType == MFDataType.MultiSelectLookup).Where(propval => propval.TypedValue.Lookups == null || propval.TypedValue.Lookups.Where(val => val.Item == 0).Count() != 0).FirstOrDefault());
  996.  
  997.             return changedProperties;
  998.         }
  999.  
  1000.         public ObjectVersion PostUpdatedProperties(string objectType, ObjectVersion oldObject, HashSet<PropertyValue> changedProperties)
  1001.         {
  1002.             int objectTypeID = GetObjectTypeID(objectType);
  1003.             int objectID = oldObject.ObjVer.ID;
  1004.  
  1005.             if (changedProperties.Count != 0)
  1006.             {
  1007.                 CheckOutItem(objectTypeID, oldObject);
  1008.  
  1009.                 WebResponse response = null;
  1010.  
  1011.                 foreach (PropertyValue property in changedProperties)
  1012.                 {
  1013.                     string url = String.Format("http://{0}/REST/objects/{1}/{2}/properties/{3}?_method=PUT", mFLogin.Server, objectTypeID, objectID, property.PropertyDef);
  1014.                     response = PostObject<PropertyValue>(url, property);
  1015.                 }
  1016.  
  1017.                 if (response != null)
  1018.                 {
  1019.                     var createdObject = GetPostResult<ObjectVersion>(response);
  1020.  
  1021.                     CheckInItem(objectTypeID, createdObject);
  1022.                     NotifyObservers(objectType, createdObject.Title, "UPDATE", "MFILES");
  1023.  
  1024.                     return createdObject;
  1025.                 }
  1026.                 else
  1027.                     return PostUpdatedProperties(objectType, oldObject, changedProperties);
  1028.             }
  1029.  
  1030.             return default(ObjectVersion);
  1031.         }
  1032.  
  1033.         #endregion M-FILES
  1034.  
  1035.         #region Observer
  1036.         public void RegisterObserver(Observer observer)
  1037.         {
  1038.             if (!observerList.Contains(observer))
  1039.                 observerList.Add(observer);
  1040.         }
  1041.  
  1042.         public void RemoveObserver(Observer observer)
  1043.         {
  1044.             if(observerList.Contains(observer))
  1045.                 observerList.Remove(observer);
  1046.         }
  1047.  
  1048.         public void NotifyObservers(ServiceStatus serviceStatus)
  1049.         {
  1050.             foreach (Observer o in observerList)
  1051.                 o.Update(serviceStatus);
  1052.         }
  1053.  
  1054.         public void NotifyObservers(string table, string newObject, string changeType, string program)
  1055.         {
  1056.             foreach (Observer o in observerList)
  1057.                 o.Update(table, newObject, changeType, program);
  1058.         }
  1059.  
  1060.         public void NotifyObservers(string documentTitle, string errorMessage, string error)
  1061.         {
  1062.             WriteError(DateTime.Now, documentTitle, errorMessage, error);
  1063.             foreach (Observer oc in observerList)
  1064.             {
  1065.                 oc.UpdateError(DateTime.Now, documentTitle, errorMessage, error);
  1066.             }
  1067.         }
  1068.  
  1069.  
  1070.         public void WriteError(DateTime occuredAt, string documentTitle, string errorMessage, string error)
  1071.         {
  1072.             string directoryPath = @".\Log";
  1073.             string filePath = @".\Log\Error.txt";
  1074.  
  1075.             Directory.CreateDirectory(directoryPath);
  1076.  
  1077.             using (StreamWriter writer = new StreamWriter(filePath, true))
  1078.             {
  1079.                 writer.WriteLine("Document: " + documentTitle + Environment.NewLine
  1080.                     + "Error: " + error + Environment.NewLine
  1081.                     + "Error description: " + errorMessage +
  1082.                    "" + Environment.NewLine + "Date: " + occuredAt.ToString());
  1083.                 writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
  1084.             }
  1085.         }
  1086.  
  1087.         public void WriteToLog(DateTime occuredAt, string program, string table, string documentTitle, string type)
  1088.         {
  1089.             string directoryPath = @".\Log";
  1090.             string filePath = @".\Log\Log.txt";
  1091.  
  1092.             Directory.CreateDirectory(directoryPath);
  1093.  
  1094.             using (StreamWriter writer = new StreamWriter(filePath, true))
  1095.             {
  1096.                 writer.WriteLine("Document: " + documentTitle + Environment.NewLine
  1097.                     + "SQL/M-Files: " + program + Environment.NewLine
  1098.                     + "Type: " + type + Environment.NewLine
  1099.                     + "Table/ObjectType: " + table +
  1100.                    "" + Environment.NewLine + "Date: " + occuredAt.ToString());
  1101.                 writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
  1102.             }
  1103.         }
  1104.         #endregion Observer
  1105.     }
  1106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement