Hvordan vælger jeg dokumentprofilen? Valget af OIOUBL profil i en konkret dokumentudveksling vil bl.a. afhænge af, hvilke OIOUBL profiler den anden part i udvekslingen understøtter. Et konkret eksempel er valget af profil ved forsendelse af en faktura hvis kunden kun understøtter NES5 profilen, vil denne profil blive valgt, men hvis kunden understøtter en mere avanceret profil som BilSim, vil man som leverandør vælge at anvende denne profil. På det tidspunkt et OIOUBL dokument produceres, kan det derfor være relevant at undersøge modpartens understøttelse af profiler, for at kunne afgøre, hvilken profil dokumentet skal have. I det følgende vises nogle kodeeksempler for opslag i NemHandelseregisteret, der kan anvendes til at undersøge en konkret NemHandel brugers understøttelse af profiler. Hvis koden afvikles mod NemHandel integrationstestmiljøet vil koden finde et antal understøttede profiler. I det konkrete scenarie slås der op for en bestemt modtager, identificeret ved EAN nummer 5798009811578, som afsenderen ønsker at sende en faktura til - en OIOUBL Invoice identificeres ved UDDI Id et uddi:2e0b402a-7a5e-476b-8686-b33f54fd1f47, se http://digitaliser.dk/resource/560785. I eksemplet er man desuden kun interesseret i at sende til et http endepunkt og modtageren skal agere i rollen som Buyer Party. Koden til at lave dette opslag vises både i en Java og i en C# udgave.
Java kodeeksempel I Java kodeeksemplet antages det, at man har de relevante jar-filer fra RASP biblioteket, og at RASP er konfigureret via RASP Configuration filen de relevante konfigurationsdele sættes op på samme måde som ved normal forsendelse af dokumenter. package test.uddi.lookup; import java.util.arraylist; import java.util.hashset; import java.util.hashtable; import java.util.list; import java.util.map; import java.util.set; import dk.gov.oiosi.addressing.identifier; import dk.gov.oiosi.addressing.identifierean; import dk.gov.oiosi.uddi.endpointaddresstypecode; import dk.gov.oiosi.uddi.iuddilookupclient; import dk.gov.oiosi.uddi.lookupparameters; import dk.gov.oiosi.uddi.processdefinition; import dk.gov.oiosi.uddi.processroledefinition; import dk.gov.oiosi.uddi.registrylookupclientfactory; import dk.gov.oiosi.uddi.uddiid; import dk.gov.oiosi.uddi.uddilookupresponse; import dk.gov.oiosi.uddi.uddistringid; public class LookupClient /** * @param args */ public static void main(string[] args) try // EAN/GLN number of receiver Identifier identifier = new IdentifierEan("5798009811578"); // Invoice service type id UddiId servicetypeid = new UddiStringId( "uddi:2e0b402a-7a5e-476b-8686-b33f54fd1f47", true); // OIOUBL role name String rolename = "BuyerParty"; // alt. SellerParty String roletype = "http://oio.dk/profiles/owsa/modelt/1.0/uddi/identifiers/ubl2.0processrole/"; // The receiving service must be an http endpoint List<EndpointAddressTypeCode> acceptedtransports = new ArrayList<EndpointAddressTypeCode>(); acceptedtransports.add(endpointaddresstypecode.http); // Build the parameters for the lookup LookupParameters parameters = new LookupParameters(identifier, servicetypeid, acceptedtransports); IUddiLookupClient lookupclient = RegistryLookupClientFactory.getRegistryLookupClient();
// Do the UDDI Lookup List<UddiLookupResponse> uddiresponses = lookupclient.lookup(parameters); Map<String, ProcessRoleDefinition> processroles = new Hashtable<String, ProcessRoleDefinition>(); Set<UddiId> processes = new HashSet<UddiId>(); if (uddiresponses == null) // Handles if the responses is null, should not be possible throw new Exception("The uddi responses was null."); for (UddiLookupResponse response : uddiresponses) if (response.getprocessroles() == null) // Handles if the processroles is null, should not be // possible throw new Exception("The process roles was null."); for (ProcessRoleDefinition role : response.getprocessroles()) if (processroles.containskey(role.getname())) // Handles if the process role is present in // another registration (you can put more info here) throw new Exception("Process role '" + role.getname() + " is registrered multiple times."); processroles.put(role.getname(), role); // Only adding those profileroles with the correct role for further // process for (Map.Entry<String, ProcessRoleDefinition> processroleentry : processroles.entryset()) if (!rolename.equalsignorecase(processroleentry.getvalue().getrole())) continue; if (!roletype.equalsignorecase(processroleentry.getvalue().getroletype())) continue; processes.add(processroleentry.getvalue().getprocessdefinitionid()); // Example on how to get the process definitions that are supported // from the UDDI. List<ProcessDefinition> processdefinitions = lookupclient.getprocessdefinitions(new ArrayList<UddiId>(processes)); // This example prints the supported processes/profiles // make your own code to find the best profile if any System.out.println("Supported processses"); for (ProcessDefinition processdefinition : processdefinitions)
System.out.println("Process: " + processdefinition.getname()); catch (Exception ex) System.err.println(ex.getMessage()); System.err.println(ex.getStackTrace()); System.out.println("Press enter to close program"); try System.in.read(); catch (Exception e)
C# kodeksempel I.NET kodeeksemplet antages det, at man har de relevante dll-filer fra RASP biblioteket, og at RASP er konfigureret via RASP Configuration filen de relevante konfigurationsdele sættes op på samme måde som ved forsendelse af dokumenter. using System; using System.Collections.Generic; using System.Linq; using System.Text; using dk.gov.oiosi.uddi; using dk.gov.oiosi.addressing; using dk.gov.oiosi.communication.configuration; using dk.gov.oiosi.configuration; using System.IO; namespace TestUddiLookup class Program static void Main(string[] args) try // EAN/GLN number of receiver var identifier = new IdentifierEan("5798009811578"); // Invoice service type id var servicetypeid = new UddiStringId("uddi:2e0b402a-7a5e-476b-8686-b33f54fd1f47", true); // OIOUBL role name var rolename = "BuyerParty"; //alt. SellerParty var roletype = "http://oio.dk/profiles/owsa/modelt/1.0/uddi/identifiers/ubl2.0processrole/"; // The receiving service must be an http endpoint var acceptedtransports = new List<EndpointAddressTypeCode>(); acceptedtransports.add(endpointaddresstypecode.http); //Build the parameters for the lookup var parameters = new LookupParameters(identifier, servicetypeid, acceptedtransports); var factory = new RegistryLookupClientFactory(); var lookupclient = factory.createuddilookupclient(); //Do the UDDI Lookup var uddiresponses = lookupclient.lookup(parameters); var processroles = new Dictionary<string, ProcessRoleDefinition>(); var processes = new HashSet<UddiId>(); if (uddiresponses == null)
//Handles if the responses is null, should not be possible throw new Exception("The uddi responses was null."); foreach (var response in uddiresponses) if (response.processroles == null) //Handles if the processroles is null, should not be possible throw new Exception("The process roles was null."); foreach (var role in response.processroles) if (processroles.containskey(role.name)) // Handles if the process role is present in // another registration (you can put more info here) throw new Exception("Process role '" + role.name + " is registrered multiple times."); processroles.add(role.name, role); // Only adding those profileroles with the correct role for further // process foreach (var roleentry in processroles) if (!rolename.equals(roleentry.value.role, StringComparison.CurrentCultureIgnoreCase)) continue; if (!roletype.equals(roleentry.value.roletype, StringComparison.CurrentCultureIgnoreCase)) continue; processes.add(roleentry.value.processdefinitionid); //Example on how to get the process definitions that are supported from the UDDI. var processdefinitions = lookupclient.getprocessdefinitions(new List<UddiId>(processes)); //This example prints the supported processes/profiles //make your own code to find the best profile if any Console.Out.WriteLine("Supported processses"); foreach (var processdefinition in processdefinitions) Console.Out.WriteLine("Process: " + processdefinition.name); catch (Exception ex) Console.Error.WriteLine(ex.Message); Console.Error.WriteLine(ex.StackTrace); Console.Out.WriteLine("Press enter to close program");
Console.ReadLine();