2015-11-02 13:54:12 +01:00

205 lines
8.3 KiB
VB.net

Imports System.Console
Imports System.IO
Imports System.Xml
Imports NLog
Module Main
Private logger As Logger
Private mainDoc As XmlDocument
Private markDoc As XmlDocument
Private DataDir As String = "Data"
Private LogDir As String = "Log"
Private MainFile As String = "Importer-SearchData.xml"
Private MainPath As String = Path.Combine(DataDir, MainFile)
Private p As New Parser()
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 {
"RegistrationOfficeCode",
"RegistrationDate",
"RegistrationNumber",
"MarkCurrentStatusCode",
"MarkVerbalElementText",
"MarkFeature",
"ApplicationDate",
"Applicant",
"Representative",
"PublicationDate",
"ExpiryDate",
"TerminationDate",
"OppositionPeriodStartDate",
"OppositionPeriodEndDate",
"Classification",
"ClassificationLong"
}
Sub Main()
Try
logger = LogManager.GetLogger("Main")
config = AppConfig.GetConfiguration()
db = New DB(config.connstring, "DD_ECM")
logger.Info("{0} started", My.Application.Info.Title)
If Not Directory.Exists(DataDir) Then
Directory.CreateDirectory(DataDir)
End If
If Not Directory.Exists(LogDir) Then
Directory.CreateDirectory(LogDir)
End If
query = Querybuilder.Build(config, db)
' Abfrage starten
logger.Info("Sending request with query: {0}", query)
dpma = New DPMAConnect(config.username, config.password)
mainDoc = dpma.Search(query)
mainDoc.Save(MainPath)
' Ergebnis auslesen und Marken-Klassen erstellen
marks = p.ReadMarkXMLFile(MainPath)
logger.Info("Importing Marks..")
For Each mark As Mark In marks
Dim akz As String = mark.ApplicationNumber
Dim file As String = Path.Combine(DataDir, String.Format("Importer-RegisterData-{0}.xml", akz))
logger.Debug("Getting Register Info for {0}", akz)
markDoc = dpma.GetRegisterInfo(akz)
markDoc.Save(file)
p.ReadMarkRegisterInfoXMLFile(file, mark)
Next
logger.Info("{0} Marks imported", marks.Count)
' =========================================================================================
Dim formId As Integer = db.GetFormId()
Dim updatedMarks As Integer = 0
Dim addedMarks As Integer = 0
For Each m As Mark In marks
Dim mainControlId As Integer
' Das eindeutige Control suchen
mainControlId = db.GetControlId(formId)
' Über mainControlId überprüfen, ob marke vorhanden
Dim markExists As Integer = db.GetRecordId(mainControlId, m.ApplicationNumber)
logger.Debug("Mark {0} exists: {1}", markExists, CBool(markExists))
' Wenn noch nicht vorhanden
If (markExists = 0) Then
' Einen Record erstellen
Dim recordId = db.InsertRecord(formId)
logger.Info("New record created with GUID: " & recordId)
' Den Leit-Wert einfügen für mainControlId
Dim valueId = db.InsertValue(mainControlId, recordId, m.ApplicationNumber)
addedMarks = addedMarks + 1
logger.Debug("Value inserted - Property: {0}, Value: {1}, ControlId: {2}", "ApplicationNumber", m.ApplicationNumber, mainControlId)
' alle anderen properties zu dieser marke einfügen einfügen
For Each prop As String In props
' ControlID für die aktuelle property holen
Dim controlId = db.GetControlId(formId, prop)
' Wert für die aktuelle property holen
Dim value = db.GetProperty(m, prop)
' Wert einfügen
db.InsertValue(controlId, recordId, value)
' Wenn Bildmarke oder Wort- und Bildmarke, Bild einfügen
If prop = "MarkFeature" Then
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
logger.Debug("Value inserted - Property: {0}, Value: {1}, ControlId: {2}", prop, value, controlId)
Next
addedMarks += 1
Else
' Marke aktualisieren
Dim recordId As Integer = markExists
Dim propsChanged = False
logger.Info("Existing Record updated with GUID: {0}", recordId)
For Each prop As String In props
' ControlID für die aktuelle property holen
Dim controlId = db.GetControlId(formId, prop)
' Wert für die aktuelle property holen
Dim value = db.GetProperty(m, prop)
' Wert aktualisieren
db.UpdateValue(controlId, recordId, value)
' Wenn Bildmarke oder Wort- und Bildmarke, Bild aktualisieren
If prop = "MarkFeature" Then
If value = "wort-bildmarke" Or value = "bildmarke" Then
Dim imageControlId = db.GetControlId(formId, "MarkImage")
Dim bimage() As Byte = Convert.FromBase64String(m.Image.BinaryImage)
db.UpdateImage(bimage, imageControlId, recordId)
End If
End If
logger.Debug("Value updated - Property: {0}, ControlId: {1}", prop, controlId)
'Dim hasChanged As Boolean = Not db.IsEqual(controlId, recordId, value)
'logger.Debug("Value for {0} has changed", recordId)
'If hasChanged Then
' propsChanged = True
' ' Wert aktualisieren
' db.UpdateValue(controlId, recordId, value)
' logger.Debug("Value updated - Property: {0}, ControlId: {1}", prop, controlId)
'End If
Next
updatedMarks += 1
End If
Next
logger.Info("{0} Marks added, {1} updated", addedMarks, updatedMarks)
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
End Sub
Public Function GetExceptionInfo(ex As Exception) As String
Dim Result As String
Dim hr As Integer = Runtime.InteropServices.Marshal.GetHRForException(ex)
Result = ex.GetType.ToString & "(0x" & hr.ToString("X8") & "): " & ex.Message & Environment.NewLine & ex.StackTrace & Environment.NewLine
Dim st As StackTrace = New StackTrace(ex, True)
For Each sf As StackFrame In st.GetFrames
If sf.GetFileLineNumber() > 0 Then
Result &= "Line:" & sf.GetFileLineNumber() & " Filename: " & IO.Path.GetFileName(sf.GetFileName) & Environment.NewLine
End If
Next
Return Result
End Function
End Module