diff --git a/dotnet-source/ks.fiks.io.arkivintegrasjon.common/ks.fiks.io.arkivintegrasjon.common.csproj b/dotnet-source/ks.fiks.io.arkivintegrasjon.common/ks.fiks.io.arkivintegrasjon.common.csproj index 5f41115..92a97dd 100644 --- a/dotnet-source/ks.fiks.io.arkivintegrasjon.common/ks.fiks.io.arkivintegrasjon.common.csproj +++ b/dotnet-source/ks.fiks.io.arkivintegrasjon.common/ks.fiks.io.arkivintegrasjon.common.csproj @@ -6,7 +6,7 @@ - + diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/ArkivSimulator.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/ArkivSimulator.cs index 00da6c4..0cdbd5a 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/ArkivSimulator.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/ArkivSimulator.cs @@ -14,7 +14,6 @@ using ks.fiks.io.arkivsystem.sample.Generators; using ks.fiks.io.arkivsystem.sample.Handlers; using ks.fiks.io.arkivsystem.sample.Models; -using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client; using KS.Fiks.IO.Client.Models; using Microsoft.Extensions.Hosting; @@ -30,26 +29,24 @@ public class ArkivSimulator : BackgroundService private FiksIOClient client; private readonly AppSettings appSettings; private static readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); - public static SizedDictionary _arkivmeldingCache; - public static Dictionary _arkivmeldingProtokollValidatorStorage; - private JournalpostHentHandler _journalpostHentHandler; - private MappeHentHandler _mappeHentHandler; - private SokHandler _sokHandler; - private ArkivmeldingHandler _arkivmeldingHandler; - private ArkivmeldingOppdaterHandler _arkivmeldingOppdaterHandler; + public static Dictionary ArkivmeldingProtokollValidatorStorage; + private readonly JournalpostHentHandler _journalpostHentHandler; + private readonly MappeHentHandler _mappeHentHandler; + private readonly SokHandler _sokHandler; + private readonly ArkivmeldingHandler _arkivmeldingHandler; + private readonly ArkivmeldingOppdaterHandler _arkivmeldingOppdaterHandler; - public ArkivSimulator(AppSettings appSettings) + public ArkivSimulator(AppSettings appSettings, JournalpostHentHandler journalpostHentHandler, MappeHentHandler mappeHentHandler, SokHandler sokHandler, ArkivmeldingHandler arkivmeldingHandler, ArkivmeldingOppdaterHandler arkivmeldingOppdaterHandler) { this.appSettings = appSettings; Log.Information("Setter opp FIKS integrasjon for arkivsystem"); client = FiksIOClientBuilder.CreateFiksIoClient(appSettings); - _arkivmeldingCache = new SizedDictionary(100); - _arkivmeldingProtokollValidatorStorage = new Dictionary(); - _journalpostHentHandler = new JournalpostHentHandler(); - _mappeHentHandler = new MappeHentHandler(); - _sokHandler = new SokHandler(); - _arkivmeldingHandler = new ArkivmeldingHandler(); - _arkivmeldingOppdaterHandler = new ArkivmeldingOppdaterHandler(); + ArkivmeldingProtokollValidatorStorage = new Dictionary(); + _journalpostHentHandler = journalpostHentHandler; + _mappeHentHandler = mappeHentHandler; + _sokHandler = sokHandler; + _arkivmeldingHandler = arkivmeldingHandler; + _arkivmeldingOppdaterHandler = arkivmeldingOppdaterHandler; InitArkivmeldingStorage(); } @@ -67,7 +64,7 @@ private void InitArkivmeldingStorage() using TextReader reader = new StringReader(xml); var arkivmelding = (Arkivmelding)serializer.Deserialize(reader); var key = directoryName.Split(Path.DirectorySeparatorChar)[1]; - _arkivmeldingProtokollValidatorStorage.Add(key, arkivmelding); // Innkommende meldingId er key + ArkivmeldingProtokollValidatorStorage.Add(key, arkivmelding); // Innkommende meldingId er key } } @@ -108,11 +105,11 @@ private void OnReceivedMelding(object sender, MottattMeldingArgs mottatt) private void HandleInnsynMelding(MottattMeldingArgs mottatt) { var payloads = new List(); - Melding melding; + var meldinger = new List(); try { - melding = mottatt.Melding.MeldingType switch + meldinger = mottatt.Melding.MeldingType switch { FiksArkivMeldingtype.Sok => _sokHandler.HandleMelding(mottatt), FiksArkivMeldingtype.JournalpostHent => _journalpostHentHandler.HandleMelding(mottatt), @@ -122,25 +119,33 @@ private void HandleInnsynMelding(MottattMeldingArgs mottatt) } catch (Exception e) { - melding = new Melding + meldinger.Add(new Melding { ResultatMelding = FeilmeldingGenerator.CreateUgyldigforespoerselMelding( $"Klarte ikke håndtere innkommende melding. Feilmelding: {e.Message}"), FileName = "feilmelding.xml", MeldingsType = FiksArkivMeldingtype.Ugyldigforespørsel, - }; + }); } - - payloads.Add(new StringPayload(ArkivmeldingSerializeHelper.Serialize(melding.ResultatMelding), - melding.FileName)); - mottatt.SvarSender.Ack(); // Ack message to remove it from the queue + foreach (var melding in meldinger) + { + if (melding.ResultatMelding != null) + { + payloads.Add(new StringPayload(ArkivmeldingSerializeHelper.Serialize(melding.ResultatMelding), + melding.FileName)); + } + + mottatt.SvarSender.Ack(); // Ack message to remove it from the queue - var sendtMelding = mottatt.SvarSender.Svar(melding.MeldingsType, payloads).Result; - Log.Information("Svarmelding meldingId {MeldingId}, meldingType {MeldingType} sendt", sendtMelding.MeldingId, - sendtMelding.MeldingType); - Log.Information("Melding er ferdig håndtert i arkiv"); + var sendtMelding = mottatt.SvarSender.Svar(melding.MeldingsType, payloads).Result; + Log.Information("Svarmelding meldingId {MeldingId}, meldingType {MeldingType} sendt", + sendtMelding.MeldingId, + sendtMelding.MeldingType); + } + + Log.Information($"Innkommende arkivmelding med id {mottatt.Melding.MeldingId} er ferdig håndtert i arkiv"); } private void HandleArkiveringMelding(MottattMeldingArgs mottatt) diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokGenerator.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokGenerator.cs index d5ace65..0eb238d 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokGenerator.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokGenerator.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; +using KS.Fiks.Arkiv.Models.V1.Arkivering.Arkivmelding; using KS.Fiks.Arkiv.Models.V1.Arkivstruktur; using KS.Fiks.Arkiv.Models.V1.Innsyn.Sok; using KS.Fiks.Arkiv.Models.V1.Meldingstyper; @@ -8,38 +10,55 @@ namespace ks.fiks.io.arkivsystem.sample.Generators { public class SokGenerator { - public static Melding CreateSokResponseMelding(Sok sok) => - sok.ResponsType switch + + private SokeresultatGenerator _sokeresultatGenerator; + public SokGenerator(SokeresultatGenerator sokeresultatGenerator) + { + _sokeresultatGenerator = sokeresultatGenerator; + } + + public List CreateSokResponseMelding(Sok sok, List lagretArkivmeldinger) + { + var meldinger = new List(); + + switch (sok.ResponsType) { - ResponsType.Minimum => - new Melding + case ResponsType.Minimum: + meldinger.Add(new Melding { FileName = "resultat.xml", MeldingsType = FiksArkivMeldingtype.SokResultatMinimum, - ResultatMelding = SokeresultatGenerator.CreateSokeResultatMinimum(sok.Respons) - }, - ResponsType.Noekler => - new Melding + ResultatMelding = _sokeresultatGenerator.CreateSokeResultatMinimum(sok) + }); + break; + case ResponsType.Noekler: + ; + meldinger.Add(new Melding { FileName = "resultat.xml", MeldingsType = FiksArkivMeldingtype.SokResultatNoekler, - ResultatMelding = SokeresultatGenerator.CreateSokeResultatNoekler(), - }, - ResponsType.Utvidet => - new Melding + ResultatMelding = _sokeresultatGenerator.CreateSokeResultatNoekler(), + }); + break; + case ResponsType.Utvidet: + meldinger.Add(new Melding { FileName = "resultat.xml", MeldingsType = FiksArkivMeldingtype.SokResultatUtvidet, - ResultatMelding = SokeresultatGenerator.CreateSokeResultatUtvidet(sok.Respons) - }, - _ => - new Melding + ResultatMelding = _sokeresultatGenerator.CreateSokeResultatUtvidet(sok, lagretArkivmeldinger) + }); + break; + default: + meldinger.Add(new Melding { FileName = "resultat.xml", MeldingsType = FiksArkivMeldingtype.SokResultatMinimum, - ResultatMelding = SokeresultatGenerator.CreateSokeResultatMinimum(sok.Respons), - } - }; + ResultatMelding = _sokeresultatGenerator.CreateSokeResultatMinimum(sok), + }); + break; + } + return meldinger; + } } } \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokeresultatGenerator.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokeresultatGenerator.cs index 7b5c8c1..16416f1 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokeresultatGenerator.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Generators/SokeresultatGenerator.cs @@ -1,16 +1,22 @@ using System; +using System.Collections; +using System.Collections.Generic; +using KS.Fiks.Arkiv.Models.V1.Arkivering.Arkivmelding; using KS.Fiks.Arkiv.Models.V1.Arkivstruktur; using KS.Fiks.Arkiv.Models.V1.Arkivstruktur.Minimum; using KS.Fiks.Arkiv.Models.V1.Arkivstruktur.Noekler; using KS.Fiks.Arkiv.Models.V1.Innsyn.Sok; using KS.Fiks.Arkiv.Models.V1.Metadatakatalog; using EksternNoekkel = KS.Fiks.Arkiv.Models.V1.Arkivstruktur.EksternNoekkel; +using Journalpost = KS.Fiks.Arkiv.Models.V1.Arkivstruktur.Journalpost; +using Mappe = KS.Fiks.Arkiv.Models.V1.Arkivstruktur.Mappe; +using Saksmappe = KS.Fiks.Arkiv.Models.V1.Arkivstruktur.Saksmappe; namespace ks.fiks.io.arkivsystem.sample.Helpers { public class SokeresultatGenerator { - public static SokeresultatMinimum CreateSokeResultatMinimum(Respons sokRespons) + public SokeresultatMinimum CreateSokeResultatMinimum(Sok sok) { var sokeResultatMinimum = new SokeresultatMinimum() { @@ -23,7 +29,7 @@ public static SokeresultatMinimum CreateSokeResultatMinimum(Respons sokRespons) }; - switch (sokRespons) + switch (sok.Respons) { case Respons.Mappe: AddMappeResultatMinimum(sokeResultatMinimum); @@ -35,7 +41,7 @@ public static SokeresultatMinimum CreateSokeResultatMinimum(Respons sokRespons) return sokeResultatMinimum; } - private static void AddSaksmappeResultatMinimum(SokeresultatMinimum sokeresultatMinimum) + private void AddSaksmappeResultatMinimum(SokeresultatMinimum sokeresultatMinimum) { sokeresultatMinimum.ResultatListe.Add( new ResultatMinimum() @@ -77,7 +83,7 @@ private static void AddSaksmappeResultatMinimum(SokeresultatMinimum sokeresultat }); } - private static void AddMappeResultatMinimum(SokeresultatMinimum sokeresultatMinimum) + private void AddMappeResultatMinimum(SokeresultatMinimum sokeresultatMinimum) { sokeresultatMinimum.ResultatListe.Add( new ResultatMinimum() @@ -101,7 +107,7 @@ private static void AddMappeResultatMinimum(SokeresultatMinimum sokeresultatMini }); } - public static Sokeresultat CreateSokeResultatUtvidet(Respons sokRespons) + public Sokeresultat CreateSokeResultatUtvidet(Sok sok, List lagretArkivmeldinger) { var sokeResultatUtvidet = new Sokeresultat() { @@ -113,19 +119,82 @@ public static Sokeresultat CreateSokeResultatUtvidet(Respons sokRespons) Tidspunkt = DateTime.Now }; - switch (sokRespons) + switch (sok.Respons) { case Respons.Mappe: - AddMappeResultatUtvidet(sokeResultatUtvidet); + AddMappeResultatUtvidet(sokeResultatUtvidet, lagretArkivmeldinger); break; case Respons.Saksmappe: - AddSaksmappeResultatUtvidet(sokeResultatUtvidet); + AddSaksmappeResultatUtvidet(sokeResultatUtvidet, lagretArkivmeldinger); + break; + case Respons.Journalpost: + AddJournalpostResultatUtvidet(sok, sokeResultatUtvidet, lagretArkivmeldinger); break; } return sokeResultatUtvidet; } - private static void AddSaksmappeResultatUtvidet(Sokeresultat sokeResultatUtvidet) + private void AddJournalpostResultatUtvidet(Sok sok, Sokeresultat sokeResultatUtvidet, + List lagretArkivmeldinger) + { + var count = 0; + if (lagretArkivmeldinger != null && lagretArkivmeldinger.Count > 0) + { + foreach (var parameter in sok.Parameter) + { + if (parameter.Felt == SokFelt.RegistreringTittel) + { + foreach (var lagretArkivmelding in lagretArkivmeldinger) + { + foreach (var registrering in lagretArkivmelding.Registrering) + { + if (parameter.Operator == OperatorType.Equal) + { + if (registrering.Tittel.ToLower().Contains(parameter.Parameterverdier.Stringvalues[0].ToLower().Replace("*", string.Empty))) + { + // Funnet! + Console.Out.WriteLineAsync("FUNNET!!!!!!!!!!!!!!!!!!!!"); + count++; + var jp = (KS.Fiks.Arkiv.Models.V1.Arkivering.Arkivmelding.Journalpost) registrering; + sokeResultatUtvidet.ResultatListe.Add(new Resultat() + { + Journalpost = new Journalpost() + { + Arkivdel = jp.Arkivdel, + Tittel = jp.Tittel, + OpprettetDato = jp.OpprettetDato, + OpprettetAv = jp.OpprettetAv, + SystemID = jp.SystemID, + ArkivertAv = jp.ArkivertAv, + ArkivertDato = jp.ArkivertDato, + AntallVedlegg = jp.AntallVedlegg, + Journalstatus = new Journalstatus() { Beskrivelse = "", KodeProperty = ""}, + Journalposttype = new Journalposttype() {Beskrivelse = "", KodeProperty = ""}, + Journalpostnummer = jp.Journalpostnummer ?? "1", + Journalaar = jp.Journalaar ?? DateTime.Now.Year.ToString(), + Journalsekvensnummer = jp.Journalsekvensnummer ?? "1", + Journaldato = jp.Journaldato, + ReferanseEksternNoekkel = new EksternNoekkel() + { + Fagsystem = jp.ReferanseEksternNoekkel.Fagsystem, + Noekkel = jp.ReferanseEksternNoekkel.Noekkel + } + } + }); + } + } + } + } + } + } + } + + sokeResultatUtvidet.Count = count; + } + + + private void AddSaksmappeResultatUtvidet(Sokeresultat sokeResultatUtvidet, + List lagretArkivmeldinger) { sokeResultatUtvidet.ResultatListe.Add( new Resultat() @@ -176,7 +245,7 @@ private static void AddSaksmappeResultatUtvidet(Sokeresultat sokeResultatUtvidet }); } - private static void AddMappeResultatUtvidet(Sokeresultat sokeResultatUtvidet) + private void AddMappeResultatUtvidet(Sokeresultat sokeResultatUtvidet, List lagretArkivmeldinger) { sokeResultatUtvidet.ResultatListe.Add( new Resultat() @@ -209,7 +278,7 @@ private static void AddMappeResultatUtvidet(Sokeresultat sokeResultatUtvidet) }); } - public static SokeresultatNoekler CreateSokeResultatNoekler() + public SokeresultatNoekler CreateSokeResultatNoekler() { var sokeResultatNoekler = new SokeresultatNoekler() { diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingHandler.cs index dbe7c4d..33aef54 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingHandler.cs @@ -7,14 +7,19 @@ using KS.Fiks.Arkiv.Models.V1.Meldingstyper; using ks.fiks.io.arkivsystem.sample.Generators; using ks.fiks.io.arkivsystem.sample.Models; +using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client.Models; using Serilog; namespace ks.fiks.io.arkivsystem.sample.Handlers { - public class ArkivmeldingHandler : BaseHandler + public class ArkivmeldingHandler : BaseHandler, IMeldingHandler { private static readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); + + public ArkivmeldingHandler(IArkivmeldingCache arkivmeldingCache) : base(arkivmeldingCache) + { + } private Arkivmelding GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlSchemaSet, out bool xmlValidationErrorOccured, out List> validationResult) @@ -78,37 +83,52 @@ public List HandleMelding(MottattMeldingArgs mottatt) // Lagre arkivmelding i "cache" hvis det er en testSessionId i headere if (mottatt.Melding.Headere.TryGetValue(ArkivSimulator.TestSessionIdHeader, out var testSessionId)) { - if (ArkivSimulator._arkivmeldingCache.ContainsKey(testSessionId)) + if (_arkivmeldingCache.HasArkivmeldinger(testSessionId)) { - Arkivmelding lagretArkvivmelding; - ArkivSimulator._arkivmeldingCache.TryGetValue(testSessionId, out lagretArkvivmelding); - - // Registrering som skal lagres? - if (arkivmelding.Registrering.Count >= 0) + var found = false; + var lagretArkvivmeldinger = _arkivmeldingCache.GetAll(testSessionId); + foreach (var lagretArkivmelding in lagretArkvivmeldinger) { - foreach (var registrering in arkivmelding.Registrering) + // Registrering som skal lagres? + if (arkivmelding.Registrering.Count >= 0) { - if (registrering.ReferanseForelderMappe != null) + foreach (var registrering in arkivmelding.Registrering) { - foreach (var lagretMappe in lagretArkvivmelding.Mappe) + if (registrering.ReferanseForelderMappe != null) { - // - if(registrering.ReferanseForelderMappe.SystemID != null && lagretMappe.SystemID.Value == registrering.ReferanseForelderMappe.SystemID.Value) - { - lagretMappe.Registrering.Add(registrering); - } - else if(registrering.ReferanseForelderMappe.ReferanseEksternNoekkel != null && registrering.ReferanseForelderMappe.ReferanseEksternNoekkel.Fagsystem == lagretMappe.ReferanseEksternNoekkel.Fagsystem && registrering.ReferanseForelderMappe.ReferanseEksternNoekkel.Noekkel == lagretMappe.ReferanseEksternNoekkel.Noekkel) + foreach (var lagretMappe in lagretArkivmelding.Mappe) { - lagretMappe.Registrering.Add(registrering); + // + if (registrering.ReferanseForelderMappe.SystemID != null && + lagretMappe.SystemID.Value == + registrering.ReferanseForelderMappe.SystemID.Value) + { + lagretMappe.Registrering.Add(registrering); + found = true; + } + else if (registrering.ReferanseForelderMappe.ReferanseEksternNoekkel != null && + registrering.ReferanseForelderMappe.ReferanseEksternNoekkel + .Fagsystem == lagretMappe.ReferanseEksternNoekkel.Fagsystem && + registrering.ReferanseForelderMappe.ReferanseEksternNoekkel.Noekkel == + lagretMappe.ReferanseEksternNoekkel.Noekkel) + { + lagretMappe.Registrering.Add(registrering); + found = true; + } } } } } } + + if (!found) + { + _arkivmeldingCache.Add(testSessionId, arkivmelding); + } } else { - ArkivSimulator._arkivmeldingCache.Add(testSessionId, arkivmelding); + _arkivmeldingCache.Add(testSessionId, arkivmelding); } } diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingOppdaterHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingOppdaterHandler.cs index fc53486..276caeb 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingOppdaterHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/ArkivmeldingOppdaterHandler.cs @@ -9,15 +9,20 @@ using KS.Fiks.Arkiv.Models.V1.Meldingstyper; using ks.fiks.io.arkivsystem.sample.Generators; using ks.fiks.io.arkivsystem.sample.Models; +using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client.Models; using Serilog; namespace ks.fiks.io.arkivsystem.sample.Handlers { - public class ArkivmeldingOppdaterHandler : BaseHandler + public class ArkivmeldingOppdaterHandler : BaseHandler, IMeldingHandler { private static readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); + public ArkivmeldingOppdaterHandler(IArkivmeldingCache arkivmeldingCache) : base(arkivmeldingCache) + { + } + public List HandleMelding(MottattMeldingArgs mottatt) { var meldinger = new List(); @@ -56,32 +61,35 @@ public List HandleMelding(MottattMeldingArgs mottatt) MeldingsType = FiksArkivMeldingtype.ArkivmeldingOppdaterMottatt, }); - var lagretArkivmelding = TryGetLagretArkivmelding(mottatt); + var lagretArkivmeldinger = TryGetLagretArkivmeldinger(mottatt); - if(lagretArkivmelding != null) { - try + if(lagretArkivmeldinger != null) { + foreach (var lagretArkivmelding in lagretArkivmeldinger) { - if (arkivmeldingOppdatering.RegistreringOppdateringer.Count > 0) + try { - meldinger.AddRange(OppdaterRegistreringer(arkivmeldingOppdatering, lagretArkivmelding)); + if (arkivmeldingOppdatering.RegistreringOppdateringer.Count > 0) + { + meldinger.AddRange(OppdaterRegistreringer(arkivmeldingOppdatering, lagretArkivmelding)); + } + else if (arkivmeldingOppdatering.MappeOppdateringer.Count > 0) // Mappe oppdatering + { + meldinger.AddRange(OppdaterMapper(arkivmeldingOppdatering, lagretArkivmelding)); + } } - else if (arkivmeldingOppdatering.MappeOppdateringer.Count > 0) // Mappe oppdatering + catch (Exception e) { - meldinger.AddRange(OppdaterMapper(arkivmeldingOppdatering, lagretArkivmelding)); + meldinger.Add(new Melding + { + ResultatMelding = + FeilmeldingGenerator.CreateServerFeilMelding( + $"Noe gikk galt: {e.Message}"), + FileName = "feilmelding.xml", + MeldingsType = FiksArkivMeldingtype.Serverfeil, + }); + return meldinger; } } - catch (Exception e) - { - meldinger.Add(new Melding - { - ResultatMelding = - FeilmeldingGenerator.CreateServerFeilMelding( - $"Noe gikk galt: {e.Message}"), - FileName = "feilmelding.xml", - MeldingsType = FiksArkivMeldingtype.Serverfeil, - }); - return meldinger; - } } else { diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/BaseHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/BaseHandler.cs index e9f74aa..73eaea2 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/BaseHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/BaseHandler.cs @@ -9,6 +9,7 @@ using KS.Fiks.Arkiv.Models.V1.Innsyn.Hent.Mappe; using KS.Fiks.Arkiv.Models.V1.Metadatakatalog; using KS.Fiks.ASiC_E; +using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client.Models; using Serilog; using EksternNoekkel = KS.Fiks.Arkiv.Models.V1.Arkivstruktur.EksternNoekkel; @@ -19,9 +20,11 @@ public class BaseHandler { private readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); protected readonly XmlSchemaSet XmlSchemaSet; + protected IArkivmeldingCache _arkivmeldingCache; - protected BaseHandler() + protected BaseHandler(IArkivmeldingCache arkivmeldingCache) { + _arkivmeldingCache = arkivmeldingCache; XmlSchemaSet = new XmlSchemaSet(); var arkivModelsAssembly = Assembly.Load("KS.Fiks.Arkiv.Models.V1"); @@ -137,19 +140,23 @@ protected string GetPayloadAsString(MottattMeldingArgs mottatt, XmlSchemaSet xml return string.Empty; } - protected Arkivmelding TryGetLagretArkivmelding(MottattMeldingArgs mottatt) + protected List TryGetLagretArkivmeldinger(MottattMeldingArgs mottatt) { - // Er det en testSession fra integrasjonstester? if (mottatt.Melding.Headere.TryGetValue(ArkivSimulator.TestSessionIdHeader, out var testSessionId)) { - return ArkivSimulator._arkivmeldingCache.ContainsKey(testSessionId) ? ArkivSimulator._arkivmeldingCache[testSessionId] : null; + return _arkivmeldingCache.HasArkivmeldinger(testSessionId) ? _arkivmeldingCache.GetAll(testSessionId) : null; } // Er det test fra protokoll-validator? if (mottatt.Melding.Headere.TryGetValue(ArkivSimulator.ValidatorTestNameHeader, out var testName)) { - return ArkivSimulator._arkivmeldingProtokollValidatorStorage.ContainsKey(testName) ? ArkivSimulator._arkivmeldingProtokollValidatorStorage[testName] : null; + if (ArkivSimulator.ArkivmeldingProtokollValidatorStorage.ContainsKey(testName)) + { + var liste = new List(); + liste.Add(ArkivSimulator.ArkivmeldingProtokollValidatorStorage[testName]); + return liste; + } } return null; @@ -161,13 +168,13 @@ protected Arkivmelding AreEqual(MottattMeldingArgs mottatt) // Er det en testSession fra integrasjonstester? if (mottatt.Melding.Headere.TryGetValue(ArkivSimulator.TestSessionIdHeader, out var testSessionId)) { - return ArkivSimulator._arkivmeldingCache.ContainsKey(testSessionId) ? ArkivSimulator._arkivmeldingCache[testSessionId] : null; + return _arkivmeldingCache.HasArkivmeldinger(testSessionId) ? _arkivmeldingCache.GetFirst(testSessionId) : null; } // Er det test fra protokoll-validator? if (mottatt.Melding.Headere.TryGetValue(ArkivSimulator.ValidatorTestNameHeader, out var testName)) { - return ArkivSimulator._arkivmeldingProtokollValidatorStorage.ContainsKey(testName) ? ArkivSimulator._arkivmeldingProtokollValidatorStorage[testName] : null; + return ArkivSimulator.ArkivmeldingProtokollValidatorStorage.ContainsKey(testName) ? ArkivSimulator.ArkivmeldingProtokollValidatorStorage[testName] : null; } return null; diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/IMeldingHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/IMeldingHandler.cs index f31fb0c..a99a578 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/IMeldingHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/IMeldingHandler.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using ks.fiks.io.arkivsystem.sample.Models; using KS.Fiks.IO.Client.Models; @@ -5,6 +6,6 @@ namespace ks.fiks.io.arkivsystem.sample.Handlers { public interface IMeldingHandler { - public Melding HandleMelding(MottattMeldingArgs mottattMeldingArgs); + public List HandleMelding(MottattMeldingArgs mottattMeldingArgs); } } \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/JournalpostHentHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/JournalpostHentHandler.cs index 92e36dc..947d5b2 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/JournalpostHentHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/JournalpostHentHandler.cs @@ -9,14 +9,19 @@ using KS.Fiks.Arkiv.Models.V1.Meldingstyper; using ks.fiks.io.arkivsystem.sample.Generators; using ks.fiks.io.arkivsystem.sample.Models; +using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client.Models; using Serilog; namespace ks.fiks.io.arkivsystem.sample.Handlers { - public class JournalpostHentHandler : BaseHandler + public class JournalpostHentHandler : BaseHandler, IMeldingHandler { private static readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); + + public JournalpostHentHandler(IArkivmeldingCache arkivmeldingCache) : base(arkivmeldingCache) + { + } private JournalpostHent GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlSchemaSet, out bool xmlValidationErrorOccured, out List> validationResult) @@ -40,26 +45,37 @@ private JournalpostHent GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlS return null; } - private bool HarJournalpost(Arkivmelding lagretArkivmelding, JournalpostHent journalpostHent) + private Arkivmelding GetArkivmeldingMedJournalpost(List lagretArkivmeldinger, JournalpostHent journalpostHent) { - if (lagretArkivmelding == null) + if (lagretArkivmeldinger == null) { - return false; + return null; } - if (lagretArkivmelding.Mappe.Count >= 0) + + foreach (var lagretArkivmelding in lagretArkivmeldinger) { - foreach (var mappe in lagretArkivmelding.Mappe) + if (lagretArkivmelding.Mappe.Count >= 0) { - foreach (var registrering in mappe.Registrering) + foreach (var mappe in lagretArkivmelding.Mappe) { - if (AreEqual(registrering, journalpostHent.ReferanseEksternNoekkel, journalpostHent.SystemID)) + foreach (var registrering in mappe.Registrering) { - return true; + if (AreEqual(registrering, journalpostHent.ReferanseEksternNoekkel, + journalpostHent.SystemID)) + { + return lagretArkivmelding; + } } } } + + if(lagretArkivmelding.Registrering.OfType().Any(registrering => + AreEqual(registrering, journalpostHent.ReferanseEksternNoekkel, journalpostHent.SystemID))) + { + return lagretArkivmelding; + } } - return lagretArkivmelding.Registrering.OfType().Any(registrering => AreEqual(registrering, journalpostHent.ReferanseEksternNoekkel, journalpostHent.SystemID)); + return null; } private Journalpost GetJournalpost(Arkivmelding lagretArkivmelding, JournalpostHent journalpostHent) @@ -90,42 +106,49 @@ private Journalpost GetJournalpost(Arkivmelding lagretArkivmelding, JournalpostH return null; } - public Melding HandleMelding(MottattMeldingArgs mottatt) + public List HandleMelding(MottattMeldingArgs mottatt) { + var meldinger = new List(); + var hentMelding = GetPayload(mottatt, XmlSchemaSet, out var xmlValidationErrorOccured, out var validationResult); if (xmlValidationErrorOccured) { - return new Melding + meldinger.Add(new Melding { ResultatMelding = FeilmeldingGenerator.CreateUgyldigforespoerselMelding(validationResult), FileName = "feilmelding.xml", MeldingsType = FiksArkivMeldingtype.Ugyldigforespørsel, - }; + }); + return meldinger; } // Forsøk å hente arkivmelding fra lokal lagring - var lagretArkivmelding = TryGetLagretArkivmelding(mottatt); + var lagretArkivmeldinger = TryGetLagretArkivmeldinger(mottatt); + var lagretArkivmelding = GetArkivmeldingMedJournalpost(lagretArkivmeldinger, hentMelding); - if (!HarJournalpost(lagretArkivmelding, hentMelding)) + if (lagretArkivmelding == null) { - return new Melding + meldinger.Add(new Melding { ResultatMelding = FeilmeldingGenerator.CreateIkkefunnetMelding("Kunne ikke finne noen journalpost som tilsvarer det som er etterspurt i hentmelding"), FileName = "feilmelding.xml", MeldingsType = FiksArkivMeldingtype.Ikkefunnet, - }; + }); + return meldinger; } - return new Melding + meldinger.Add(new Melding { ResultatMelding = lagretArkivmelding == null ? JournalpostHentResultatGenerator.Create(hentMelding) : JournalpostHentResultatGenerator.Create(hentMelding, JournalpostHentResultatGenerator.CreateHentJournalpostFraArkivmeldingJournalpost(GetJournalpost(lagretArkivmelding, hentMelding))), FileName = "resultat.xml", MeldingsType = FiksArkivMeldingtype.JournalpostHentResultat - }; + }); + + return meldinger; } } } \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/MappeHentHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/MappeHentHandler.cs index 1a7246b..f505c5a 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/MappeHentHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/MappeHentHandler.cs @@ -8,15 +8,20 @@ using KS.Fiks.Arkiv.Models.V1.Meldingstyper; using ks.fiks.io.arkivsystem.sample.Generators; using ks.fiks.io.arkivsystem.sample.Models; +using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client.Models; using Serilog; namespace ks.fiks.io.arkivsystem.sample.Handlers { - public class MappeHentHandler : BaseHandler + public class MappeHentHandler : BaseHandler, IMeldingHandler { private static readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); + public MappeHentHandler(IArkivmeldingCache arkivmeldingCache) : base(arkivmeldingCache) + { + } + private MappeHent GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlSchemaSet, out bool xmlValidationErrorOccured, out List> validationResult) { @@ -39,62 +44,73 @@ private MappeHent GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlSchemaS return null; } - public Melding HandleMelding(MottattMeldingArgs mottatt) + public List HandleMelding(MottattMeldingArgs mottatt) { + var meldinger = new List(); + var hentMelding = GetPayload(mottatt, XmlSchemaSet, out var xmlValidationErrorOccured, out var validationResult); if (xmlValidationErrorOccured) { - return new Melding + meldinger.Add(new Melding { ResultatMelding = FeilmeldingGenerator.CreateUgyldigforespoerselMelding(validationResult), FileName = "feilmelding.xml", MeldingsType = FiksArkivMeldingtype.Ugyldigforespørsel, - }; + }); + return meldinger; } // Forsøk å hente arkivmelding fra lokal lagring - var lagretArkivmelding = TryGetLagretArkivmelding(mottatt); + var lagretArkivmeldinger = TryGetLagretArkivmeldinger(mottatt); + var lagretArkivmelding = GetArkivmeldingMedMappe(lagretArkivmeldinger, hentMelding); - if (!HarMappe(lagretArkivmelding, hentMelding)) + if (lagretArkivmelding == null) { - return new Melding + meldinger.Add(new Melding { ResultatMelding = FeilmeldingGenerator.CreateIkkefunnetMelding("Kunne ikke finne noen mappe som tilsvarer det som er etterspurt i hentmelding"), FileName = "feilmelding.xml", MeldingsType = FiksArkivMeldingtype.Ikkefunnet, - }; + }); + return meldinger; } - return new Melding + meldinger.Add(new Melding { ResultatMelding = lagretArkivmelding == null ? MappeHentResultatGenerator.Create(hentMelding) : MappeHentResultatGenerator.CreateFromCache(hentMelding, lagretArkivmelding), FileName = "resultat.xml", MeldingsType = FiksArkivMeldingtype.MappeHentResultat - }; + }); + return meldinger; } - private bool HarMappe(Arkivmelding lagretArkivmelding, MappeHent mappeHent) + private Arkivmelding GetArkivmeldingMedMappe(List lagretArkivmeldinger, MappeHent mappeHent) { - if (lagretArkivmelding == null) + if (lagretArkivmeldinger == null) { - return false; + return null; } - if (lagretArkivmelding.Mappe.Count >= 0) + + foreach (var lagretArkivmelding in lagretArkivmeldinger) { - foreach (var mappe in lagretArkivmelding.Mappe) + if (lagretArkivmelding.Mappe.Count >= 0) { - if (AreEqual(mappe, mappeHent)) + foreach (var mappe in lagretArkivmelding.Mappe) { - return true; + if (AreEqual(mappe, mappeHent)) + { + return lagretArkivmelding; + } + } - } } - return false; + + return null; } } } \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/SokHandler.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/SokHandler.cs index 08b4b2a..84837c2 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/SokHandler.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Handlers/SokHandler.cs @@ -7,17 +7,21 @@ using KS.Fiks.Arkiv.Models.V1.Meldingstyper; using ks.fiks.io.arkivsystem.sample.Generators; using ks.fiks.io.arkivsystem.sample.Models; +using ks.fiks.io.arkivsystem.sample.Storage; using KS.Fiks.IO.Client.Models; using Serilog; namespace ks.fiks.io.arkivsystem.sample.Handlers { - public class SokHandler : BaseHandler + public class SokHandler : BaseHandler, IMeldingHandler { private static readonly ILogger Log = Serilog.Log.ForContext(MethodBase.GetCurrentMethod()?.DeclaringType); + + private SokGenerator _sokGenerator; - public SokHandler() + public SokHandler(IArkivmeldingCache arkivmeldingCache, SokGenerator sokGenerator) : base(arkivmeldingCache) { + this._sokGenerator = sokGenerator; } private Sok GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlSchemaSet, @@ -42,22 +46,27 @@ private Sok GetPayload(MottattMeldingArgs mottatt, XmlSchemaSet xmlSchemaSet, return null; } - public Melding HandleMelding(MottattMeldingArgs mottatt) + public List HandleMelding(MottattMeldingArgs mottatt) { + var meldinger = new List(); + var sok = GetPayload(mottatt, XmlSchemaSet, out var xmlValidationErrorOccured, out var validationResult); - + if (xmlValidationErrorOccured) { - return new Melding + meldinger.Add(new Melding { ResultatMelding = FeilmeldingGenerator.CreateUgyldigforespoerselMelding(validationResult), FileName = "feilmelding.xml", MeldingsType = FiksArkivMeldingtype.Ugyldigforespørsel, - }; + }); + return meldinger; } + + var lagretArkivmeldinger = TryGetLagretArkivmeldinger(mottatt); - return SokGenerator.CreateSokResponseMelding(sok); + return _sokGenerator.CreateSokResponseMelding(sok, lagretArkivmeldinger); } } } \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Program.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Program.cs index 5e93628..c2d57f4 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/Program.cs +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Program.cs @@ -1,7 +1,12 @@ using System; using System.IO; using System.Threading.Tasks; +using KS.Fiks.Arkiv.Models.V1.Innsyn.Sok; using ks.fiks.io.arkivintegrasjon.common.AppSettings; +using ks.fiks.io.arkivsystem.sample.Generators; +using ks.fiks.io.arkivsystem.sample.Handlers; +using ks.fiks.io.arkivsystem.sample.Helpers; +using ks.fiks.io.arkivsystem.sample.Storage; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -30,7 +35,15 @@ static async Task Main(string[] args) .ConfigureServices((hostContext, services) => { services.AddSingleton(AppSettingsBuilder.CreateAppSettings(hostContext.Configuration)); - services.AddHostedService(); + services.AddHostedService() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped() + .AddScoped(); }) .RunConsoleAsync(); } diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Storage/ArkivmeldingCache.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Storage/ArkivmeldingCache.cs new file mode 100644 index 0000000..8eb2db3 --- /dev/null +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Storage/ArkivmeldingCache.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using KS.Fiks.Arkiv.Models.V1.Arkivering.Arkivmelding; + +namespace ks.fiks.io.arkivsystem.sample.Storage; + +public class ArkivmeldingCache : IArkivmeldingCache +{ + private static SizedDictionary> Cache; + + public ArkivmeldingCache() + { + Cache = new SizedDictionary>(100); + } + + public void Add(string key, Arkivmelding arkivmelding) + { + if (!Cache.ContainsKey(key)) + { + Cache.Add(key, new List()); + } + + Cache[key].Add(arkivmelding); + } + + public Arkivmelding GetFirst(string key) + { + return Cache[key].First(); + } + + public List GetAll(string key) + { + return Cache[key]; + } + + public bool HasArkivmeldinger(string key) + { + return Cache.ContainsKey(key); + } +} \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/Storage/IArkivmeldingCache.cs b/dotnet-source/ks.fiks.io.arkivsystem.sample/Storage/IArkivmeldingCache.cs new file mode 100644 index 0000000..c03cb53 --- /dev/null +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/Storage/IArkivmeldingCache.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using KS.Fiks.Arkiv.Models.V1.Arkivering.Arkivmelding; + +namespace ks.fiks.io.arkivsystem.sample.Storage; + +public interface IArkivmeldingCache +{ + void Add(string key, Arkivmelding arkivmelding); + Arkivmelding GetFirst(string key); + List GetAll(string key); + bool HasArkivmeldinger(string key); + //bool TryGetValue(string key, out Arkivmelding lagretArkvivmelding); +} \ No newline at end of file diff --git a/dotnet-source/ks.fiks.io.arkivsystem.sample/ks.fiks.io.arkivsystem.sample.csproj b/dotnet-source/ks.fiks.io.arkivsystem.sample/ks.fiks.io.arkivsystem.sample.csproj index befe3f8..5c34bd3 100644 --- a/dotnet-source/ks.fiks.io.arkivsystem.sample/ks.fiks.io.arkivsystem.sample.csproj +++ b/dotnet-source/ks.fiks.io.arkivsystem.sample/ks.fiks.io.arkivsystem.sample.csproj @@ -23,7 +23,7 @@ - + diff --git a/dotnet-source/ks.fiks.io.fagsystem.arkiv.sample/ks.fiks.io.fagsystem.arkiv.sample.csproj b/dotnet-source/ks.fiks.io.fagsystem.arkiv.sample/ks.fiks.io.fagsystem.arkiv.sample.csproj index 344819b..31f13b9 100644 --- a/dotnet-source/ks.fiks.io.fagsystem.arkiv.sample/ks.fiks.io.fagsystem.arkiv.sample.csproj +++ b/dotnet-source/ks.fiks.io.fagsystem.arkiv.sample/ks.fiks.io.fagsystem.arkiv.sample.csproj @@ -26,7 +26,7 @@ - +