private static string PrepareResponseXML(Forsendelse message, ByggesakType byggesak) { string[] bygningsNummer; if (byggesak.matrikkelopplysninger == null) { //We make up something to pretend we've added a new building Random rnd = new Random(); bygningsNummer = new string[] { rnd.Next(10000, 100000).ToString() }; } else { bygningsNummer = byggesak.matrikkelopplysninger.bygning.Select(bygning => bygning.bygningsnummer).ToArray(); if (bygningsNummer[0] == null) { //We make up something to pretend we've added a new building Random rnd = new Random(); bygningsNummer = new string[] { rnd.Next(10000, 100000).ToString() }; } } MatrikkelFoeringsResponsType responseMessage = new MatrikkelFoeringsResponsType() { bygningsnummer = bygningsNummer, saksnummer = new no.geointegrasjon.rep.matrikkelfoeringsrespons.SaksnummerType() { //Tostring because XSD.exe maps xml:integer to string because it's not bounded like int32 //TODO: Check assumption that ids may be larger than int32 saksaar = message.metadataForImport.saksaar.ToString(), //saksaar = byggesak.saksnummer.saksaar, //message.metadataFraAvleverendeSystem.saksaar.ToString(), sakssekvensnummer = message.metadataForImport.sakssekvensnummer.ToString() //sakssekvensnummer = byggesak.saksnummer.sakssekvensnummer //message.metadataFraAvleverendeSystem.sakssekvensnummer.ToString() } }; return(writeMatrikkelFoeringsResponsXML(responseMessage)); }
private static void SendMatrikkelFoeringsResponse(Forsendelse message, ByggesakType byggesak) { string responseXml = PrepareResponseXML(message, byggesak); List <dokument> dokumenter = new List <dokument>(); dokument matrikkelRespons = new dokument() { dokumentType = "ByggesakMatrikkelFøringsRespons", data = System.Text.Encoding.UTF8.GetBytes(responseXml), filnavn = "matrikkelrespons.xml", mimetype = "application/xml" }; dokumenter.Add(matrikkelRespons); string orgnrTilKommunen = ConfigurationManager.AppSettings["OrgNrReceiver"]; // LARS: saksaar & sakssekvensnummer from Byggesak string systemId = message.id; //byggesak.systemId; //TODO: Check SvarUtService.Send("matrikkelsystem", ForsendelsesTypeGeointegrasjonMatrikkelRespons, "Matrikkelføringsrespons for " + message.tittel, systemId, orgnrTilKommunen, "Matrikkelføringsrespons klient", dokumenter.ToArray(), byggesak.saksnummer.saksaar, byggesak.saksnummer.sakssekvensnummer); // SvarUtService.Send("matrikkelsystem", ForsendelsesTypeGeointegrasjonMatrikkelRespons, "Matrikkelføringsrespons for " + message.tittel, "12345", orgnrTilKommunen, "Matrikkelføringsrespons klient", dokumenter.ToArray(), // byggesak.saksnummer.saksaar, byggesak.saksnummer.sakssekvensnummer); }
private static async Task <ByggesakType> readByggeSakXml(Forsendelse message) { string byggesakXML = await ReadByggesakXMLFromZip(message); var serializer = new System.Xml.Serialization.XmlSerializer(typeof(ByggesakType)); using (var stringReader = new StringReader(byggesakXML)) { return((ByggesakType)serializer.Deserialize(stringReader)); } }
/// <summary> /// Kopierer en eksisterende melding med dokument, og sender den inn på ny. /// Dette for å kunne låse en sak i en matrikkelklient, og frigjøre den dersom bruker avbryter. /// </summary> /// <param name="message"></param> private static void CopyMessageAndSendInAsNew(Forsendelse message) { List <dokument> dokumenter = ReadDocumentsAsync(message).GetAwaiter().GetResult(); string orgnrTilKommunen = ConfigurationManager.AppSettings["OrgNrReceiver"]; var saksaar = message.metadataForImport.saksaar.ToString(); var sakssekvensnummer = message.metadataForImport.sakssekvensnummer.ToString(); //message. string systemId = null; systemId = message.id; string avgiverSystem = message.avsender.navn; //avgiverSystem = "matrikkelsystem"; avgiverSystem = "eByggesak system"; // 20191025-Leg: Manipulate title to get a unique one (according to Idar Borlaug (KS)). // Det må være mulig å kansellere en sak flere ganger. // For å unngå feilmelding: "Forsendelse med samme mottaker, tittel og avsender og filer er forsøkt sendt mer enn en gang. Forsendelse er derfor avvist." var tittel = MakeUniqueEndingToTitle(message.tittel); //var tittel = message.tittel; //// Check if message have been cancelled, tittel should end with "#number", e.g. #2. //if (Regex.Match(tittel, @".*#\d+$").Success) //{ // var ipos = tittel.LastIndexOf("#"); // var number = tittel.Substring(ipos + 1); // int newNumber = ((int)Convert.ToInt32(number)) + 1; // string newTitle = tittel.Substring(0, ipos + 1) + newNumber.ToString(); // tittel = newTitle; //} //else //{ // string newTitle = tittel + "_#2"; // tittel = newTitle; //} SvarUtService.Send(avgiverSystem, ForsendelsesTypeGeointegrasjonMatrikkel, tittel, systemId, orgnrTilKommunen, "Matrikkelføring klient", dokumenter.ToArray(), saksaar, sakssekvensnummer); //SvarUtService.Send(avgiverSystem, ForsendelsesTypeGeointegrasjonMatrikkel, message.tittel, systemId, // orgnrTilKommunen, "Matrikkelføring klient", dokumenter.ToArray(), // saksaar, sakssekvensnummer); }
private static async Task ProcessWaitingMessage(HttpClient client, Forsendelse message) { Console.WriteLine("--------------------------------"); Console.WriteLine("Tittel: " + message.tittel); Console.WriteLine("Forsendelses-ID: " + message.id); //Check if it's the right type (making sure FIKS is not misconfigured) if (message.forsendelseType != ForsendelsesTypeGeointegrasjonMatrikkel) { //If not, deny handling the message by sending a negative receipt Console.WriteLine("Kan ikke håndtere denne meldingen, sender negativ håndteringsrespons"); await DenyHandlingMessage(client, message.id); return; } Console.WriteLine("Melding er av riktig forsendelsestype."); //If OK, download files (Always a zip in our example, can be a single PDF in other cases) await DownloadAndDecryptMessageFile(client, message.id, message.downloadUrl); ByggesakType byggesak = await readByggeSakXml(message); Console.WriteLine("Melding er lastet ned, dekryptert og innlest."); //Send receipt that message was handled await client.PostAsync(string.Format(UrlMottakVelykket, message.id), new StringContent("")); Console.WriteLine("Mottak av melding bekreftet til SvarInn"); //Pretend we do something interesting with the data, then possibly send a response Console.WriteLine("Trykk y og enter for å sende returbeskjed med SvarUt om at matrikkelen har (liksom) blitt oppdatert, eller bare enter for å ikke gjøre det."); bool sendProcessedResponse = (Console.ReadLine() == "y"); if (sendProcessedResponse) { //Send a return message that the data has been acted on SendMatrikkelFoeringsResponse(message, byggesak); Console.WriteLine("Returbeskjed sendt, går videre til neste melding."); } else { Console.WriteLine("Går videre til neste melding uten å sende returbeskjed."); } }
private static async Task <string> ReadByggesakXMLFromZip(Forsendelse message) { //Get the filename from metadata //Read the file to extract the XML using (FileStream zipToOpen = new FileStream("forsendelse_" + message.id + ".zip", FileMode.Open)) { using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)) { //TODO: byggesak.xml from dkument type!!!! ZipArchiveEntry entry = archive.GetEntry("byggesak.xml"); using (StreamReader reader = new StreamReader(entry.Open())) { return(await reader.ReadToEndAsync()); } } } }
/// <summary> /// Leser inn alle dokumenter i en sak /// </summary> /// <param name="message"></param> /// <returns>En liste med dokumenter</returns> private static async Task <List <dokument> > ReadDocumentsAsync(Forsendelse message) { if (message.filmetadata.Count > 0) { List <dokument> dokumenter = new List <dokument>(); //Read the file to extract the XML using (FileStream zipToOpen = new FileStream("forsendelse_" + message.id + ".zip", FileMode.Open)) { using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)) { foreach (var fil in message.filmetadata) { dokument doc = new dokument(); doc.dokumentType = fil.dokumentType; doc.mimetype = fil.mimetype; doc.filnavn = fil.filnavn; ZipArchiveEntry entry = archive.GetEntry(fil.filnavn); using (StreamReader reader = new StreamReader(entry.Open())) { var response = await reader.ReadToEndAsync(); doc.data = System.Text.Encoding.UTF8.GetBytes(response); } dokumenter.Add(doc); } } } return(dokumenter); } else { return(null); } }
private static async Task <bool> ProcessWaitingMessage(HttpClient client, Forsendelse message) { Console.WriteLine("--------------------------------"); Console.WriteLine("Tittel: " + message.tittel); Console.WriteLine("Forsendelses-ID: " + message.id); //Check if it's the right type (making sure FIKS is not misconfigured) if (message.forsendelseType != ForsendelsesTypeGeointegrasjonMatrikkel) { //If not, deny handling the message by sending a negative receipt Console.WriteLine("Kan ikke håndtere denne meldingen, sender negativ håndteringsrespons"); //await DenyHandlingMessage(client, message.id); // denne tar tid return(false); } Console.WriteLine("Melding er av riktig forsendelsestype. ID:" + message.id); if (false) { if (message.id != "1815c285-1226-4b2f-ad66-731bfff24578") { Console.WriteLine("Test på filter med ID. Kan ikke håndtere denne meldingen, sender negativ håndteringsrespons"); //await DenyHandlingMessage(client, message.id); // denne tar tid return(false); } } // The message.Date is of type Unixtime Console.WriteLine("Meldingsdato:" + UnixTimeToDateTime(message.date)); //dateTime dt = new DateTime(message.date); //If OK, download files (Always a zip in our example, can be a single PDF in other cases) await DownloadAndDecryptMessageFile(client, message.id, message.downloadUrl); ByggesakType byggesak = await readByggeSakXml(message); Console.WriteLine("Melding er lastet ned, dekryptert og innlest."); // Ikke send mottat melding her if (false) { //Send receipt that message was handled await client.PostAsync(string.Format(UrlMottakVelykket, message.id), new StringContent("")); Console.WriteLine("Mottak av melding bekreftet til SvarInn"); } //Pretend we do something interesting with the data, then possibly send a response Console.WriteLine("Trykk y og enter for å sende returbeskjed med SvarUt om at matrikkelen har (liksom) blitt oppdatert, c for å avbryte, eller bare enter for å ikke gjøre det."); string responseConsole = Console.ReadLine(); bool sendProcessedResponse = (responseConsole == "y"); bool cancelProcessResponse = (responseConsole == "c"); if (sendProcessedResponse) { if (true) { //Send receipt that message was handled await client.PostAsync(string.Format(UrlMottakVelykket, message.id), new StringContent("")); Console.WriteLine("Mottak av melding bekreftet til SvarInn"); //await Task.Delay(100).ConfigureAwait(false); // TEST } //Send a return message that the data has been acted on SendMatrikkelFoeringsResponse(message, byggesak); Console.WriteLine("Returbeskjed sendt, går videre til neste melding."); } else if (cancelProcessResponse) { // Simulerer at en sak er lastet ned, men bruker ønsker å avbryte. // En kopi av saken sendes da inn på nytt i mangel av metode for å gjøre dette mot SvarUt/SvarInn, if (true) { //Send receipt that message was handled await client.PostAsync(string.Format(UrlMottakVelykket, message.id), new StringContent("")); Console.WriteLine("Mottak av melding bekreftet til SvarInn"); //await Task.Delay(100).ConfigureAwait(false); // TEST } //Send a return message that the data has cancelled CopyMessageAndSendInAsNew(message); Console.WriteLine("Returbeskjed sendt, går videre til neste melding."); } else { Console.WriteLine("Går videre til neste melding uten å sende returbeskjed."); //await DenyHandlingMessage(client, message.id); // denne tar tid } return(true); }