Validating an XML file against a schema with Natural and Java

Although Natural provides (very basic) functionality to parse and load an XML file, I could not find a way to validate XML against a schema. So I wrote a small Java program that does the validation and can be called from Natural (on Linux) via a User Exit.

Here is the Natural code for subprogram XMLVALID. It validates an XML file against a given schema using User Exit USR1052N (call a shell command) redirecting the output to a temp file. If an error occurred it reads the temp file and returns the error message. It uses quite a few hard coded paths you may need to change on your system.

DEFINE DATA
*
PARAMETER USING XMLVALP
*
LOCAL USING XMLVALC
*
LOCAL
01 USR1052L
  02 OS-COMMAND (A253)
  02 RESPONSE   (I04)
*
01 #TEMPFILE (A) DYNAMIC
*
01 #WORK (A1000)
*
01 #DEFAULT-SCHEMA-PATH (A) DYNAMIC CONST <'/home/XML/'>
01 #INDEX (N4)
*
END-DEFINE
*
RESET XMLVALP-DEFAULT
*
EXAMINE FULL XML-SCHEMA FOR '/' GIVING POSITION IN #INDEX
IF #INDEX LE 0
  COMPRESS #DEFAULT-SCHEMA-PATH XML-SCHEMA INTO XML-SCHEMA LEAVING NO
END-IF
*
COMPRESS '/tmp/XML-Validation-' *DATN '-' *TIMN '.txt' INTO #TEMPFILE LEAVING NO
COMPRESS '/usr/bin/java -cp' #DEFAULT-SCHEMA-PATH 'XMLValidator' XML-FILE XML-SCHEMA '>' #TEMPFILE INTO OS-COMMAND
*
CALLNAT 'USR1052N' USR1052L
XMLVALP.XML-RESULT := RESPONSE
*
IF XMLVALP.XML-RESULT NE VALID-XML
  DEFINE WORK FILE 1 #TEMPFILE TYPE 'ASCII'
  READ WORK 1 #WORK
    COMPRESS XML-ERROR #WORK INTO XMLVALP.XML-ERROR
  END-WORK
  CLOSE WORK 1
END-IF
*
COMPRESS 'rm' #TEMPFILE INTO OS-COMMAND
CALLNAT 'USR1052N' USR1052L
*
END

The Java validator is pretty straightforward:

  1. package xml;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5.  
  6. import javax.xml.XMLConstants;
  7. import javax.xml.parsers.DocumentBuilder;
  8. import javax.xml.parsers.DocumentBuilderFactory;
  9. import javax.xml.transform.dom.DOMSource;
  10. import javax.xml.validation.Schema;
  11. import javax.xml.validation.SchemaFactory;
  12. import javax.xml.validation.Validator;
  13.  
  14. import org.w3c.dom.Document;
  15. import org.xml.sax.SAXParseException;
  16.  
  17. public class XMLValidator
  18. {
  19.     private final static int INVALID_PARAMETERS = 1;
  20.     private final static int INVALID_XML = 2;
  21.     private final static int INVALID_FILE = 3;
  22.     private final static int ANY_ERROR = 4;
  23.  
  24.     public static void main(String[] args)
  25.     {
  26.         if (args.length != 2)
  27.         {
  28.             System.out.println("Usage: XMLValidator PathToXMLFile PathToSchemaFile");
  29.             System.exit(INVALID_PARAMETERS);
  30.         }
  31.  
  32.         String xmlFile = args[0];
  33.         String xsdFile = args[1];
  34.  
  35.         try
  36.         {
  37.             validateXml(xmlFile, xsdFile);
  38.         }
  39.         catch (Exception e)
  40.         {
  41.             System.out.println("Error: " + e.getMessage());
  42.             System.exit(ANY_ERROR);
  43.         }
  44.     }
  45.  
  46.     private static void validateXml(String xmlFile, String xsdFile) throws Exception
  47.     {
  48.         // create a factory that understands namespaces and validates the XML input
  49.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  50.         factory.setNamespaceAware(true);
  51.  
  52.         try
  53.         {
  54.             // read the XML file
  55.             DocumentBuilder builder = factory.newDocumentBuilder();
  56.             Document mDoc = builder.parse(new File(xmlFile));
  57.  
  58.             // create a SchemaFactory capable of understanding schemas
  59.             SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  60.  
  61.             // load the schema
  62.             Schema schema = schemaFactory.newSchema(new File(xsdFile));
  63.  
  64.             // validate the XML file
  65.             Validator validator = schema.newValidator();
  66.             validator.validate(new DOMSource(mDoc));
  67.         }
  68.         catch (SAXParseException spe)
  69.         {
  70.             // error generated by the parser
  71.             System.out.println("Parser error: URI " + spe.getSystemId() + ", Line " + spe.getLineNumber() + ", Message: " + spe.getMessage());
  72.             System.exit(INVALID_XML);
  73.         }
  74.         catch (IOException ioe)
  75.         {
  76.             System.out.println("Error reading file ‘" + xmlFile + "’.");
  77.             System.exit(INVALID_FILE);
  78.         }
  79.     }
  80. }

Download

Changing the path to the key files in GnuPG for Windows

GnuPG for Windows 7 stores all its key files in %USERPROFILE%\AppData\Roaming\gnupg, but I wanted to change this path, say to D:\Profile\GPG, so that the files can easily be backed up.

It turns out, there are quite a few different methods to change the path: changing the default keyring location in windows.

I chose to change the config file %USERPROFILE%\AppData\Roaming\gnupg\gpg.conf and added these lines:

no-default-keyring
primary-keyring D:\Profile\GPG\pubring.gpg
secret-keyring  D:\Profile\GPG\secring.gpg
trustdb-name    D:\Profile\GPG\trustdb.gpg
keyring         D:\Profile\GPG\pubring.gpg

Then I moved all the key files to the new location, leaving only gpg.conf in the original path.

Edit: After reconsidering my backup, I set the environment variable GNUPGHOME to D:\Profile\GPG instead of changing gpg.conf. This way, all files related to GPG including the configuration are stored in one location.

How to verify the integrity of a PuTTY executable

I am used to verify downloaded programs with GnuPG simply by entering the following command:

gpg2 –verify program.exe.sig

Usually, GnuPG finds out which file to hash (in this case program.exe) on its own. But in case of PuTTY, all I got was this:

gpg2 –verify .\putty.exe.DSA
gpg: keine signierten Daten
gpg: can’t hash datafile: Keine Daten

However, it is fairly easy to verify the executable, simply by adding the filename to the command line like this:

gpg2 –verify .\putty.exe.DSA .\putty.exe
gpg: Signatur vom 07/12/11 21:13:15 Mitteleuropäische Sommerzeit mittels DSA-Schlüssel ID 08B0A90B
gpg: Signatur kann nicht geprüft werden: Kein öffentlicher Schlüssel

Windows-Installation ohne Anlegen eines lokalen Benutzerkontos

Wenn man verhindern möchte, dass Windows bei der Installation ein lokales Benutzerkonto anlegt (sinnvoll z.B. wenn der PC nur von Domänenbenutzern bedient werden soll), kann man dem obligatorischen Benutzerkonto den Namen “Benutzer” geben. Da Windows (in der deutschen Version) automatisch eine Benutzergruppe mit dem Namen Benutzer anlegt, kann das Benutzerkonto nicht erzeugt werden (Namen müssen eindeutig sein). Windows nimmt dieses Problem stillschweigend hin und erzeugt einfach kein Benutzerkonto.

Das führt bei der Installation von Windows 7 allerdings dazu, dass man sich nach der Installation gar nicht mehr anmelden kann, da das Benutzerkonto Administrator standardmäßig deaktiviert ist. In diesem Fall hilft nur ein Start im abgesicherten Modus, in dem man dann ein lokales Benutzerkonto anlegen kann.

In der englischen Version heißt die Benutzergruppe “Users”, weshalb ein Konto “User” dort zulässig wäre.

Jobmesse Oldenburger Münsterland 2011 in Cloppenburg

1. November 2011 um 10:28:33 - Beitrag Nr. 1116
Schlagwörter: ,

Am 18. und 19.11.2011 findet die erste “Jobmesse Oldenburger Münsterland” in der Münsterlandhalle in Cloppenburg statt. Auch die ALTE OLDENBURGER ist dort auf dem Stand der AOK Niedersachsen vertreten.

Jobmesse Oldenburger Münsterland 2011 in Cloppenburg

Einige aktuelle und ehemalige Auszubildende der ALTE OLDENBURGER in den Berufen Fachinformatiker Anwendungsentwicklung und Kaufmann/-frau für Versicherungen und Finanzen stehen an beiden Tagen für Fragen rund um die Ausbildung bei der ALTE OLDENBURGER zur Verfügung. Unter anderem werden auch meine aktuellen Studenten teilnehmen. Ich hoffe, dass sie nur Gutes zu berichten haben ;-)

Übrigens suchen wir auch für 2012 wieder Auszubildende: Ausbildungsplatz zum Fachinformatiker Anwendungsentwicklung 2012 in Vechta.

Ausbildungsplatz zum Fachinformatiker Anwendungsentwicklung 2012 in Vechta

1. November 2011 um 9:42:12 - Beitrag Nr. 1111
Schlagwörter: ,

Wie in den letzten Jahren, bietet die ALTE OLDENBURGER Krankenversicherung AG auch im kommenden Jahr wieder einen Ausbildungsplatz im EDV-Bereich an. Zum 01.08.2012 suchen wir eine/n Auszubildendene/n zum Fachinformatiker Anwendungsentwicklung.

Hier die komplette Stellenanzeige mit Anschrift:

Stellenanzeige zum Fachinformatiker Anwendungsentwicklung ab 2012 bei der Alte Oldenburger in Vechta

In Textform gibt es das Ganze auf unserer Website im Bereich Stellenangebote. Weitere Informationen zum Ausbildungsberuf Fachinformatiker Anwendungsentwicklung gibt es auf der Website der ALTE OLDENBURGER sowie bei der IHK Oldenburg und der BBS Haarentor.

Ich freue mich auf alle Bewerbungen und vielleicht arbeiten wir bald zusammen :-)

Running PowerShell scripts from a UNC path without security warnings

Today I tried running a PowerShell script from a UNC path on a Windows 2003 server machine. Although I set the execution policy to “Unrestricted”, a security warning came up asking me whether I really wanted to execute the script:

Running a PowerShell script from a UNC path shows a security warning

I found the solution to this problem here: Running Scripts Downloaded from the Internet in comment 2466436. All I had to do is add the server to which the UNC path points to the “Local Intranet” zone:

Adding a server to the local intranet zone to be able to run PowerShell scripts without security warnings

Display JavaDoc tooltips in Eclipse

Sometimes after installing the JDK and Eclipse, JavaDoc tooltips do not show the Java documentation:

Eclipse not showing JavaDoc in its tooltips

I have experienced this problem quite often, especially with programming students who installed the JDK additionally to an already present JRE. The simple solution is to switch the JRE Eclipse uses in the preferences (you may have to “Add” the JRE included in your JDK first):

Eclipse preferences for changing the current JRE

Now Eclipse should display JavaDoc in the tooltips:

Eclipse showing JavaDoc in its tooltips

Verweis auf mein PowerShell-Script in der aktuellen Ausgabe der hakin9

10. August 2011 um 10:12:01 - Beitrag Nr. 1095
Schlagwörter:

In der aktuellen Ausgabe der hakin9 verweist Hannes Schurig im Rahmen seines Artikels “Manuelle und automatisierte Administration einer Active Directory Domäne und Grundlagen der Gruppenrichtlinien” auf mein kleines PowerShell-Script zum Auslesen von Computern aus einem Active Directory. Danke für die Referenz! :-)

Aber unabhängig von der kleinen Referenz hat Hannes einen interessanten Einführungsartikel in die automatische Administration von AD-Infrastrukturen geschrieben. Von der Installation der Tools, über Vorschläge zur Benennung von Benutzergruppen, der Extraktion der Informationen mit CSVDE und der PowerShell und sogar einer kurzen Einführung in Gruppenrichtlinien sind einige zentrale Aufgabengebiete eines Windows-Administrators abgedeckt. Also durchaus ein lesenswerter Artikel!

Robert C. Martin – The Clean Coder

16. Juli 2011 um 23:04:43 - Beitrag Nr. 1089
Schlagwörter: ,

Uncle Bobs “Clean Code” steht auf meiner Empfehlungsliste sowohl für Programmiereinsteiger als auch für gestandene Softwareentwickler, die ihren Code optimieren wollen, seit dem Tag, an dem ich die ersten Kapitel gelesen habe. Sein Nachfolger, wenn man “The Clean Coder” so nennen will, gesellt sich nun direkt dazu.

Anders als in “Clean Code” geht Robert Martin in “The Clean Coder” nicht auf das Ergebnis der Programmierarbeit – den Code – ein, sondern widmet sich ausgiebig dem Prozess des Programmierens und dem professionellen Verhalten von Softwareentwicklern im betrieblichen Umfeld. Wer also Tipps zur Programmierung oder zur weiteren Optimierung seines Codes sucht, wird definitiv enttäuscht. Wer jedoch auf der Suche nach Lösungen oder Handlungsempfehlungen für häufige Probleme im zwischenmenschlichen Bereich der Softwareentwicklung (“Soft Skills”) ist, dem sei “The Clean Coder” wärmstens empfohlen. Zwar geht Martin in eigenen Kapiteln auch (oberflächlich) auf eher technische Themen wie TDD, Code Katas und Teststrategien ein und listet im Anhang noch ein paar wichtige von ihm verwendete Werkzeuge zur Programmierung auf, aber der Großteil des Buches behandelt die effektive Kommunikation mit Kollegen (insb. Managern) und die “Programmiererehre”.

Robert Martin vermittelt seine “Lessons Learned” insbesondere anhand praktischer Beispiele aus seiner eigenen Karriere. Diese teils mehrere Jahrzehnte zurückliegenden Erfahrungsberichte sind sehr unterhaltsam und zeigen, dass sich das Feld der Softwareentwicklung in den vielen Jahren doch weniger stark verändert hat, als man annehmen könnte. Vieles ist auch heute noch genauso gültig wie damals, etwa die häufigen Missverständnisse zwischen Managern und Entwicklern beim Schätzen von Projektdauern oder die Annahme, dass man mit ein paar Überstunden die Deadline schon irgendwie halten kann. Martin macht sich auf Basis der von ihm gemachten Fehler für ein professionelles Verhalten als Entwickler stark, z.B. für das Nein-Sagen zu unmöglichen Anforderungen oder die Verantwortung, sich ständig fortzubilden, und schließt daher das Buch auch mit seiner Definition des “Software Craftsmanship” ab, dessen Verfechter er ist.

Letztlich waren mir viele Forderungen in “The Clean Coder” bereits aus anderen Büchern bekannt oder könnten mit ein wenig gesundem Menschenverstand selbst aufgestellt werden, aber niemand bringt sie so gut und absolut unterhaltsam auf den Punkt wie Robert Martin. Da man die Kernaussagen des Buches auf wenigen Seiten zusammenfassen könnte und Martin an einigen Stellen sogar teilweise komplette Anekdoten wiederholt, um seine Aussagen noch einmal zu unterstreichen, gibt es von mir in der Bewertung einen Punkt Abzug. Aber durch die meiner Meinung nach gut geschriebenen Geschichten und den relativ geringen Umfang des Buches ist es insgesamt leicht und flüssig in ein paar Stunden gelesen und jedem Einsteiger in das Thema “Software Craftsmanship” daher absolut zu empfehlen: Punkte 4/5.