diff --git a/app/BrainpoolXmlParser/BrainpoolXmlParser.exe.config b/app/BrainpoolXmlParser/BrainpoolXmlParser.exe.config index c86869a..e9edec4 100644 --- a/app/BrainpoolXmlParser/BrainpoolXmlParser.exe.config +++ b/app/BrainpoolXmlParser/BrainpoolXmlParser.exe.config @@ -16,10 +16,15 @@ - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/app/BrainpoolXmlParser/BrainpoolXmlParser.vbproj b/app/BrainpoolXmlParser/BrainpoolXmlParser.vbproj index 3510e49..fff9dd9 100644 --- a/app/BrainpoolXmlParser/BrainpoolXmlParser.vbproj +++ b/app/BrainpoolXmlParser/BrainpoolXmlParser.vbproj @@ -108,6 +108,7 @@ True + True True diff --git a/app/BrainpoolXmlParser/Config.vb b/app/BrainpoolXmlParser/Config.vb index e51df3d..ccd53eb 100644 --- a/app/BrainpoolXmlParser/Config.vb +++ b/app/BrainpoolXmlParser/Config.vb @@ -10,11 +10,11 @@ Public Class AppConfig Dim appsettings As AppSettingsSection = appconfig.AppSettings Dim settings As KeyValueConfigurationCollection = appsettings.Settings - Dim username As String = settings.Item("username").Value - Dim password As String = settings.Item("password").Value - Dim query As String = settings.Item("query").Value - Dim connstring As String = settings.Item("connstring").Value - Dim database As String = settings.Item("database").Value + Dim username As String = settings.Item("dpma_username").Value + Dim password As String = settings.Item("dpma_password").Value + Dim query As String = settings.Item("dpma_query").Value + Dim connstring As String = settings.Item("sql_connstring").Value + Dim database As String = settings.Item("sql_database").Value Return New ConfigValues(username, password, query, connstring, database) End Function diff --git a/app/BrainpoolXmlParser/DB.vb b/app/BrainpoolXmlParser/DB.vb index 64d3aac..27d9ce8 100644 --- a/app/BrainpoolXmlParser/DB.vb +++ b/app/BrainpoolXmlParser/DB.vb @@ -1,15 +1,19 @@ Imports System.Data.SqlClient +Imports NLog Public Class DB Private _connstring Private _db + Private _logger As Logger Public FormId Public ControlId Public RecordId Public Username As String = "BrainpoolImporter" + Public Sub New(connectionString As String, dbname As String) + _logger = LogManager.GetLogger("DB") _connstring = connectionString _db = dbname End Sub @@ -30,6 +34,7 @@ Public Class DB End Function Public Function GetProperty(m As Mark, propertyName As String) As Object + _logger.Debug("Reading property: {0}, Mark? {1}", propertyName, IsNothing(m)) Dim value = CallByName(m, propertyName, CallType.Get) If (value = Nothing) Then value = DBNull.Value diff --git a/app/BrainpoolXmlParser/Main.vb b/app/BrainpoolXmlParser/Main.vb index a341fa6..e50cdce 100644 --- a/app/BrainpoolXmlParser/Main.vb +++ b/app/BrainpoolXmlParser/Main.vb @@ -19,6 +19,7 @@ Module Main Private dpma As DPMAConnect Private db As DB + Private query As String Private config As ConfigValues Private marks As New List(Of Mark) Private props = New List(Of String) From { @@ -44,6 +45,7 @@ Module Main Try logger = LogManager.GetLogger("Main") config = AppConfig.GetConfiguration() + db = New DB(config.connstring, "DD_ECM") logger.Info("{0} started", My.Application.Info.Title) @@ -55,12 +57,13 @@ Module Main Directory.CreateDirectory(LogDir) End If + query = Querybuilder.Build(config, db) ' Abfrage starten - logger.Info("Sending request with query: {0}", config.query) + logger.Info("Sending request with query: {0}", query) dpma = New DPMAConnect(config.username, config.password) - mainDoc = dpma.Search(config.query) + mainDoc = dpma.Search(query) mainDoc.Save(MainPath) ' Ergebnis auslesen und Marken-Klassen erstellen @@ -84,7 +87,6 @@ Module Main ' ========================================================================================= - db = New DB(config.connstring, "DD_ECM") Dim formId As Integer = db.GetFormId() Dim updatedMarks As Integer = 0 Dim addedMarks As Integer = 0 @@ -124,6 +126,7 @@ Module Main If value = "wort-bildmarke" Or value = "bildmarke" Then Dim imageControlId = db.GetControlId(formId, "MarkImage") Dim bimage() As Byte = Convert.FromBase64String(m.Image.BinaryImage) + logger.Debug("Image inserted, RecordId: {0}") db.InsertImage(bimage, imageControlId, recordId) End If End If @@ -178,6 +181,9 @@ Module Main logger.Debug("=================== IMPORT END ===================") Catch ex As Exception + logger.Error("==================================================") + logger.Error("=================== ERROR ========================") + logger.Error("==================================================") logger.Error("An Error occurred: {0}", GetExceptionInfo(ex)) Environment.Exit(1) End Try diff --git a/app/BrainpoolXmlParser/Mark.vb b/app/BrainpoolXmlParser/Mark.vb index fe18f04..cfa17f6 100644 --- a/app/BrainpoolXmlParser/Mark.vb +++ b/app/BrainpoolXmlParser/Mark.vb @@ -22,6 +22,25 @@ Public Class Mark Private _OppositionPeriodEndDate As Date 'Ablauf Widerspruchsfrist Private _Image As ImageDetail + Private Function ReplaceSingleQuote(value As String) + Return value.Replace("'", "''") + End Function + + Private Function ReplaceUmlauts(value As String) + Dim result = value.Replace("ae", "ä") + result = result.Replace("oe", "ö") + result = result.Replace("ue", "ü") + Return result + End Function + + Private Function DecodeHTML(value As String) + Return WebUtility.HtmlDecode(value) + End Function + + Private Function ParseShortDate(value As String) + Return DateTime.Parse(value).ToShortDateString() + End Function + #Region "SearchProperties" Public Property RegistrationOfficeCode As String Get @@ -37,7 +56,7 @@ Public Class Mark Return _RegistrationDate End Get Set(value As String) - _RegistrationDate = DateTime.Parse(value).ToShortDateString() + _RegistrationDate = ParseShortDate(value) End Set End Property @@ -55,9 +74,7 @@ Public Class Mark Return _MarkCurrentStatusCode End Get Set(value As String) - value = value.Replace("ae", "ä") - value = value.Replace("oe", "ö") - value = value.Replace("ue", "ü") + value = ReplaceUmlauts(value) _MarkCurrentStatusCode = value End Set @@ -68,7 +85,10 @@ Public Class Mark Return _MarkVerbalElementText End Get Set(value As String) - _MarkVerbalElementText = WebUtility.HtmlDecode(value) + value = DecodeHTML(value) + value = ReplaceSingleQuote(value) + + _MarkVerbalElementText = value End Set End Property @@ -86,7 +106,7 @@ Public Class Mark Return _ApplicationDate End Get Set(value As String) - _ApplicationDate = DateTime.Parse(value).ToShortDateString() + _ApplicationDate = ParseShortDate(value) End Set End Property @@ -104,7 +124,10 @@ Public Class Mark Return _Applicant End Get Set(value As String) - _Applicant = WebUtility.HtmlDecode(value) + value = DecodeHTML(value) + value = ReplaceSingleQuote(value) + + _Applicant = value End Set End Property @@ -113,7 +136,10 @@ Public Class Mark Return _Representative End Get Set(value As String) - _Representative = WebUtility.HtmlDecode(value) + value = DecodeHTML(value) + value = ReplaceSingleQuote(value) + + _Representative = value End Set End Property #End Region @@ -123,7 +149,7 @@ Public Class Mark Return _PublicationDate End Get Set(value As String) - _PublicationDate = DateTime.Parse(value).ToShortDateString() + _PublicationDate = ParseShortDate(value) End Set End Property @@ -132,7 +158,7 @@ Public Class Mark Return _ExpiryDate End Get Set(value As String) - _ExpiryDate = DateTime.Parse(value).ToShortDateString() + _ExpiryDate = ParseShortDate(value) End Set End Property @@ -141,7 +167,7 @@ Public Class Mark Return _TerminationDate End Get Set(value As String) - _TerminationDate = DateTime.Parse(value).ToShortDateString() + _TerminationDate = ParseShortDate(value) End Set End Property @@ -150,7 +176,7 @@ Public Class Mark Return _OppositionPeriodStartDate End Get Set(value As String) - _OppositionPeriodStartDate = DateTime.Parse(value).ToShortDateString() + _OppositionPeriodStartDate = ParseShortDate(value) End Set End Property @@ -159,7 +185,7 @@ Public Class Mark Return _OppositionPeriodEndDate End Get Set(value As String) - _OppositionPeriodEndDate = DateTime.Parse(value).ToShortDateString() + _OppositionPeriodEndDate = ParseShortDate(value) End Set End Property @@ -216,7 +242,7 @@ End Class Public Class ClassificationDetail Public ClassNumber As String - Public GoodsServicesDescription + Public GoodsServicesDescription As String Public Sub New() End Sub diff --git a/app/BrainpoolXmlParser/Querybuilder.vb b/app/BrainpoolXmlParser/Querybuilder.vb new file mode 100644 index 0000000..dd7efed --- /dev/null +++ b/app/BrainpoolXmlParser/Querybuilder.vb @@ -0,0 +1,56 @@ +Public Class Querybuilder + + Public Shared Function Build(config As ConfigValues, db As DB) + Dim suffixQuery As String = "AND (DB=DE OR DB=EM OR DB=IR)" + Dim mainQuery As String + Dim baseQuery As String + Dim companies As List(Of String) + + ' searchvalues ist entweder eine SQL Abfrage oder eine Kommagetrennte Liste + If config.query.ToUpper.StartsWith("SELECT") Then + companies = GetLiveQueryResult(config.query, db) + Else + companies = New List(Of String)(config.query.Split(",")) + End If + + mainQuery = BuildMainQuery(companies) + baseQuery = String.Format("({0}) {1}", mainQuery, suffixQuery) + + Return baseQuery + End Function + + Public Shared Function BuildMainQuery(companies As List(Of String)) As String + Dim query As String = "" + + For Each company As String In companies + Dim querypart As String = String.Format("(INH=""{0}"" OR ANM=""{0}"")", company.Trim()) + + query &= querypart + + ' Bei alles bis auf das letzte Unternehmen einen OR Operator einfügen + If (companies.IndexOf(company) + 1) < companies.Count Then + query &= " OR " + End If + Next + + Return query + End Function + + Public Shared Function GetLiveQueryResult(query As String, db As DB) As List(Of String) + Dim result As New List(Of String) + Dim SQL As String = query + Dim DT As DataTable = db.QueryTable(SQL) + + If DT.Rows.Count = 0 Then + Throw New Exception("SQL Abfrage lieferte ein leeres Ergebnis zurück: " & query) + End If + + For Each row As DataRow In DT.Rows + Dim item As String = CStr(row.Item(0)).Trim() + result.Add(row.Item(0)) + Next + + Return result + End Function + +End Class