Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migratie van HR dataservice v2.5 naar v3.0 #481

Merged
merged 4 commits into from
Aug 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public class BrmoFramework {

public static final String XSL_BRK = "/xsl/brk-snapshot-to-rsgb-xml.xsl";
public static final String XSL_BAG = "/xsl/bag-mutatie-to-rsgb-xml.xsl";
public static final String XSL_NHR = "/xsl/nhr-to-rsgb-xml-2.5.xsl";
public static final String XSL_NHR = "/xsl/nhr-to-rsgb-xml-3.0.xsl";
public static final String XSL_BRP = "/xsl/brp-to-rsgb-xml.xsl";
public static final String XSL_GBAV = "/xsl/gbav-to-rsgb-xml.xsl";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public class NhrBericht extends Bericht {
@XmlAnyElement
private Element node;

private boolean hasAddedBSNHashes = false;

public NhrBericht() {
super(null);
}
Expand Down
67 changes: 63 additions & 4 deletions brmo-loader/src/main/java/nl/b3p/brmo/loader/xml/NhrXMLReader.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
package nl.b3p.brmo.loader.xml;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
Expand All @@ -22,14 +29,18 @@
import nl.b3p.brmo.loader.util.BrmoLeegBestandException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
*
* @author Matthijs Laan
*/
public class NhrXMLReader extends BrmoXMLReader {

private static final Log log = LogFactory.getLog(NhrXMLReader.class);
private static final Log LOG = LogFactory.getLog(NhrXMLReader.class);

private static Templates splitTemplates;

Expand All @@ -38,6 +49,8 @@ public class NhrXMLReader extends BrmoXMLReader {
Iterator<NhrBericht> iterator;
int volgorde = 0;

public static final String PREFIX = "nhr.bsn.natPers.";

public NhrXMLReader(InputStream in) throws Exception {
initTemplates();

Expand Down Expand Up @@ -65,8 +78,8 @@ public NhrXMLReader(InputStream in) throws Exception {

private synchronized void initTemplates() throws Exception {
if(splitTemplates == null) {
log.info("Initializing NHR split XSL templates...");
Source xsl = new StreamSource(this.getClass().getResourceAsStream("/xsl/nhr-split-2.5.xsl"));
LOG.info("Initializing NHR split XSL templates...");
Source xsl = new StreamSource(this.getClass().getResourceAsStream("/xsl/nhr-split-3.0.xsl"));
TransformerFactory tf = TransformerFactory.newInstance();
tf.setURIResolver(new URIResolver() {
@Override
Expand Down Expand Up @@ -96,9 +109,55 @@ public NhrBericht next() throws Exception {

StringWriter sw = new StringWriter();
t.transform(new DOMSource(b.getNode().getFirstChild()), new StreamResult(sw));
b.setBrXml(sw.toString());
// opzoeklijst van bsn en hash toevoegen
StringBuilder xml = new StringBuilder(sw.toString());
String bsns = getXML(extractBSN(xml.toString()));
// insert bsnhashes voor de laatste node
xml.insert(xml.lastIndexOf("</"), bsns);

b.setBrXml(xml.toString());
b.setVolgordeNummer(volgorde++);
return b;
}

/**
* maakt een map met bsn,bsnhash.
*
* @param brXml string
* @return hashmap met bsn,bsnhash
*
*/
public Map<String, String> extractBSN(String brXml) {
Map<String, String> bsnHashes = new HashMap<>();
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(brXml)));
NodeList nodeList = doc.getElementsByTagName("cat:bsn");
int length = nodeList.getLength();
for (int i = 0; i < length; i++) {
LOG.debug(nodeList.item(i).getTextContent());
bsnHashes.put(nodeList.item(i).getTextContent(), getHash(nodeList.item(i).getTextContent()));
}
} catch (ParserConfigurationException | SAXException | IOException e) {
LOG.error("Fout tijdens toevoegen bsn hashes", e);
}
return bsnHashes;
}

public String getXML(Map<String, String> map) throws ParserConfigurationException {
StringBuilder root = new StringBuilder();
if (!map.isEmpty()) {
root.append("<cat:bsnhashes>");
for (Map.Entry<String, String> entry : map.entrySet()) {
if (!entry.getKey().isEmpty() && !entry.getValue().isEmpty()) {
root.append("<cat:").append(PREFIX).append(entry.getKey()).append(">")
.append(entry.getValue())
.append("</cat:").append(PREFIX).append(entry.getKey()).append(">");
}
}
root.append("</cat:bsnhashes>");
}
return root.toString();
}
}
83 changes: 83 additions & 0 deletions brmo-loader/src/main/resources/xsl/nhr-object-ref-3.0.xsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cat="http://schemas.kvk.nl/schemas/hrip/catalogus/2015/02">

<!-- zoek hash op in mapping tabel -->
<xsl:template name="getHash">
<xsl:param name="bsn" />
<xsl:variable name="bsnwithprefix">
<xsl:text>cat:nhr.bsn.natPers.</xsl:text>
<xsl:value-of select="$bsn" />
</xsl:variable>
<xsl:variable name="hashedbsn">
<xsl:value-of select="//cat:bsnhashes/*[name()=$bsnwithprefix]" />
</xsl:variable>
<xsl:value-of select="$hashedbsn" />
</xsl:template>

<xsl:template name="get-name-abbr">
<xsl:variable name="n" select="local-name(.)"/>
<xsl:choose>
<!-- slecht idee, zie hieronder: <xsl:when test="$n ='naamPersoon'">naamPers</xsl:when>-->
<xsl:when test="$n ='natuurlijkPersoon'">natPers</xsl:when>
<xsl:when test="$n ='buitenlandseVennootschap'">buitenlVenn</xsl:when>
<xsl:when test="$n ='eenmanszaakMetMeerdereEigenaren'">eenmZMeerEig</xsl:when>
<xsl:when test="$n ='rechtspersoon'">rechtspersoon</xsl:when>
<xsl:when test="$n ='rechtspersoonInOprichting'">rechtspersOpr</xsl:when>
<xsl:when test="$n ='samenwerkingsverband'">samenwvb</xsl:when>
<xsl:when test="$n ='maatschappelijkeActiviteit'">maatschAct</xsl:when>
<xsl:when test="$n ='onderneming'">onderneming</xsl:when>
<xsl:when test="$n ='commercieleVestiging'">comVestg</xsl:when>
<xsl:when test="$n ='nietCommercieleVestiging'">nietComVestg</xsl:when>
<!--<xsl:when test="$n ='binnenlandsAdres'">bnnldsAdres</xsl:when>-->
<!--<xsl:when test="$n ='deponeringen'">deponering</xsl:when>-->
<xsl:otherwise><xsl:value-of select="$n"/></xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="*[cat:kvkNummer]" mode="object_ref">
<xsl:text>nhr.</xsl:text><xsl:call-template name="get-name-abbr"/><xsl:text>.kvk.</xsl:text>
<xsl:value-of select="cat:kvkNummer"/>
</xsl:template>

<xsl:template match="*[cat:vestigingsnummer]" mode="object_ref">
<xsl:text>nhr.</xsl:text><xsl:call-template name="get-name-abbr"/><xsl:text>.</xsl:text>
<xsl:value-of select="cat:vestigingsnummer"/></xsl:template>

<xsl:template match="*[cat:bsn or cat:rsin]" mode="object_ref">
<xsl:text>nhr.</xsl:text><xsl:call-template name="get-name-abbr"/><xsl:text>.</xsl:text>
<xsl:if test="cat:bsn">
<xsl:text>bsn.</xsl:text>
<xsl:call-template name="getHash">
<xsl:with-param name="bsn" select="cat:bsn" />
</xsl:call-template>
</xsl:if>
<xsl:if test="cat:rsin">
<xsl:text>rsin.</xsl:text><xsl:value-of select="cat:rsin"/>
</xsl:if>
</xsl:template>

<!--
slecht idee, we will geen eigennaam gebruiken als sleutel, zie bijvoorbeeld testbestand
<xsl:template match="*[cat:naamPersoon]" mode="object_ref">
<xsl:text>nhr.</xsl:text><xsl:call-template name="get-name-abbr"/><xsl:text>.</xsl:text>
<xsl:text>naam.</xsl:text><xsl:value-of select="cat:naamPersoon"/>
</xsl:template>
-->

<!--<xsl:template match="*[cat:rechtspersoon/cat:bsn or cat:rechtspersoon/cat:rsin]" mode="object_ref">-->
<!--<xsl:text>nhr.</xsl:text><xsl:call-template name="get-name-abbr"/><xsl:text>.</xsl:text>-->
<!--<xsl:if test="cat:rechtspersoon/cat:bsn">-->
<!--<xsl:text>bsn.</xsl:text><xsl:value-of select="cat:rechtspersoon/cat:bsn"/>-->
<!--</xsl:if>-->
<!--<xsl:if test="cat:rechtspersoon/cat:rsin">-->
<!--<xsl:text>rsin.</xsl:text><xsl:value-of select="cat:rechtspersoon/cat:rsin"/>-->
<!--</xsl:if>-->
<!--</xsl:template>-->



<!-- lege template voor gevallen zonder kvkNummer, vestigingsnummer, bsn of rsin bij heeftAlsEigenaar -->
<xsl:template match="*" mode="object_ref" />
</xsl:stylesheet>
115 changes: 115 additions & 0 deletions brmo-loader/src/main/resources/xsl/nhr-split-3.0.xsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cat="http://schemas.kvk.nl/schemas/hrip/catalogus/2015/02"
xmlns:tns="http://schemas.kvk.nl/schemas/hrip/dataservice/2015/02"
xmlns:brmo="http://www.b3partners.nl/brmo/bericht"
xmlns:fn="http://www.w3.org/2005/xpath-functions">

<xsl:import href="nhr-object-ref-3.0.xsl"/>

<!-- Dit stylesheet splitst een NHR Dataservice respons in meerdere berichten over
authentieke gegevens van de basisregistratie.
-->
<xsl:template match="/">
<brmo:berichten>
<!-- Bij het parsen wordt bij berichten de volgorde van de bericht elementen aangehouden in
de volgordenummer kolom -->
<xsl:apply-templates select="//tns:product"/>
</brmo:berichten>
</xsl:template>

<xsl:template match="cat:maatschappelijkeActiviteit">
<xsl:variable name="datum">
<brmo:datum><xsl:value-of select="../../@peilmoment"/></brmo:datum>
</xsl:variable>

<xsl:for-each select="cat:heeftAlsEigenaar/*[cat:bsn or cat:rsin]">
<!-- TODO: afsplitsen door/voor Persoon -->
<brmo:bericht>
<brmo:object_ref><xsl:apply-templates select="." mode="object_ref"/></brmo:object_ref>
<xsl:copy-of select="$datum"/>
<brmo:br_xml>
<xsl:copy>
<xsl:attribute name="peilmoment"><xsl:value-of select="$datum"/></xsl:attribute>
<xsl:copy-of select="node()"/>
<cat:isEigenaarVan>
<xsl:for-each select="../..">
<xsl:copy>
<xsl:copy-of select="cat:kvkNummer"/>
</xsl:copy>
</xsl:for-each>
</cat:isEigenaarVan>
</xsl:copy>
</brmo:br_xml>
</brmo:bericht>
</xsl:for-each>

<brmo:bericht>
<brmo:object_ref><xsl:apply-templates select="." mode="object_ref"/></brmo:object_ref>
<xsl:copy-of select="$datum"/>
<brmo:br_xml>
<xsl:copy>
<xsl:attribute name="peilmoment"><xsl:value-of select="$datum"/></xsl:attribute>
<xsl:copy-of select="node()"/>
</xsl:copy>
</brmo:br_xml>
</brmo:bericht>

<!-- Completere vestiging in wordtGeleidVanuit dan wordtUitgeoefendIn -->
<xsl:variable name="leidendeVestiging" select="cat:wordtGeleidVanuit/cat:vestigingsnummer"/>
<xsl:for-each select="cat:wordtGeleidVanuit/*">
<brmo:bericht>
<brmo:object_ref><xsl:apply-templates select="." mode="object_ref"/></brmo:object_ref>
<xsl:copy-of select="$datum"/>
<brmo:br_xml>
<!-- Voeg element wordtUitgeoefendDoor toe. Deze is niet aanwezig bij opvragen van
maatschappelijkeActiviteit, maar in RSGB een foreign key dus deze informatie bij
splitsen wel overbrengen via toevoegen van dit element -->
<xsl:copy>
<xsl:attribute name="peilmoment"><xsl:value-of select="$datum"/></xsl:attribute>
<xsl:copy-of select="node()"/>

<cat:wordtUitgeoefendDoor>
<!-- Voor een commercieleVestiging komt hier een onderneming, met alleen het kvkNummer -->
<xsl:if test="local-name(.) = 'commercieleVestiging'">
<xsl:variable name="vestigingsnr" select="cat:vestigingsnummer"/>
<xsl:for-each select="//cat:onderneming[cat:wordtUitgeoefendIn/cat:commercieleVestiging/cat:vestigingsnummer = $vestigingsnr]">
<xsl:copy>
<xsl:copy-of select="cat:kvkNummer"/>
</xsl:copy>
</xsl:for-each>
</xsl:if>

<!-- Voor een nietCommercieleVestiging komt hier een maatschappelijkeActiviteit -->
<xsl:if test="local-name(.) = 'nietCommercieleVestiging'">
<xsl:copy>
<xsl:copy-of select="//cat:kvkNummer"/>
</xsl:copy>
</xsl:if>
</cat:wordtUitgeoefendDoor>
</xsl:copy>
</brmo:br_xml>
</brmo:bericht>
</xsl:for-each>

<!-- Incompletere commerciele vestigingen waaruit de maatschappelijkeActiviteit niet wordt geleid, maar toch worden
meegeleverd (testcases nodig!) -->
<xsl:for-each select="//cat:commercieleVestiging[cat:vestigingsnummer != $leidendeVestiging]">
<!-- child van onderneming, manifesteertZichAls en maatschappelijkeActiviteit -->
<brmo:message fatal="true">
Onbekende case: commercieleVestiging van maatschappelijkeActiviteit waaruit deze niet wordt geleid, aub testcase aanmelden bij ontwikkelaars!
</brmo:message>
</xsl:for-each>

<!-- Incompletere niet commerciele vestigingen waaruit de maatschappelijkeActiviteit niet wordt geleid, maar toch worden
meegeleverd (testcases nodig) -->
<xsl:for-each select="//cat:nietCommercieleVestiging[cat:vestigingsnummer != $leidendeVestiging]">
<!-- child van wordtUitgeoefendIn en maatschappelijkeActiviteit -->
<brmo:message fatal="true">
Onbekende case: nietCommercieleVestiging van maatschappelijkeActiviteit waaruit deze niet wordt geleid, aub testcase aanmelden bij ontwikkelaars!
</brmo:message>
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>
Loading