Skip to content

Commit 6a0418d

Browse files
kkorotkovr-brown
authored andcommitted
Introduce offline validation example
1 parent 4b2a40a commit 6a0418d

8 files changed

Lines changed: 124 additions & 39 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.labs64.netlicensing.demo;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import com.labs64.netlicensing.examples.CallEveryAPIMethod;
7+
import com.labs64.netlicensing.examples.NetLicensingExample;
8+
import com.labs64.netlicensing.examples.OfflineValidation;
9+
10+
public class AllExamples {
11+
12+
public static Map<String, Class<? extends NetLicensingExample>> list = new HashMap<>();
13+
14+
private static void addExample(final Class<? extends NetLicensingExample> exampleClass) {
15+
list.put(exampleClass.getSimpleName(), exampleClass);
16+
}
17+
18+
static
19+
{
20+
addExample(CallEveryAPIMethod.class);
21+
addExample(OfflineValidation.class);
22+
}
23+
}

NetLicensingClient-demo/src/main/java/com/labs64/netlicensing/demo/NetLicensingClientDemo.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,21 @@
1919
import org.apache.commons.cli.Options;
2020
import org.apache.commons.cli.ParseException;
2121

22-
import com.labs64.netlicensing.examples.AllExamples;
2322
import com.labs64.netlicensing.examples.NetLicensingExample;
2423

2524
public class NetLicensingClientDemo {
2625

27-
public static void main(String[] args) {
28-
Options options = new Options();
26+
public static void main(final String[] args) {
27+
final Options options = new Options();
2928
options.addOption("l", false, "list available examples");
3029
options.addOption("r", true, "run specified example");
3130

32-
CommandLineParser parser = new DefaultParser();
31+
final CommandLineParser parser = new DefaultParser();
3332
CommandLine cmd;
3433
try {
3534
cmd = parser.parse(options, args);
36-
} catch (ParseException e) {
37-
HelpFormatter formatter = new HelpFormatter();
35+
} catch (final ParseException e) {
36+
final HelpFormatter formatter = new HelpFormatter();
3837
formatter.printHelp("java -jar netlicensing-client-demo.jar <option>", options);
3938
return;
4039
}
@@ -57,7 +56,7 @@ public static void main(String[] args) {
5756
ex = AllExamples.list.get(exampleToRun).newInstance();
5857
ex.execute();
5958
return;
60-
} catch (Exception e) {
59+
} catch (final Exception e) {
6160
System.out.println("Error executing example '" + exampleToRun + "'");
6261
e.printStackTrace();
6362
}

NetLicensingClient-demo/src/main/java/com/labs64/netlicensing/examples/AllExamples.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

NetLicensingClient-demo/src/main/java/com/labs64/netlicensing/examples/CallEveryAPIMethod.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,10 @@
1212
*/
1313
package com.labs64.netlicensing.examples;
1414

15-
import java.io.IOException;
16-
import java.io.InputStream;
1715
import java.math.BigDecimal;
18-
import java.nio.charset.StandardCharsets;
1916
import java.util.List;
2017
import java.util.UUID;
2118

22-
import org.apache.commons.io.IOUtils;
2319
import org.apache.commons.lang3.RandomStringUtils;
2420
import org.apache.commons.lang3.StringUtils;
2521
import org.slf4j.bridge.SLF4JBridgeHandler;
@@ -61,6 +57,7 @@
6157
import com.labs64.netlicensing.service.UtilityService;
6258
import com.labs64.netlicensing.util.ServiceHelper;
6359
import com.labs64.netlicensing.utils.ConsoleWriter;
60+
import com.labs64.netlicensing.utils.TestHelpers;
6461

6562
public class CallEveryAPIMethod implements NetLicensingExample {
6663

@@ -298,9 +295,9 @@ public void execute() {
298295
// region ********* Token
299296

300297
// load private/public test keys
301-
final String privateKey = loadFileContent("rsa_private.pem");
302-
final String publicKey = loadFileContent("rsa_public.pem");
303-
final String publicKey_wrong = loadFileContent("rsa_public_wrong.pem");
298+
final String privateKey = TestHelpers.loadFileContent("rsa_private.pem");
299+
final String publicKey = TestHelpers.loadFileContent("rsa_public.pem");
300+
final String publicKey_wrong = TestHelpers.loadFileContent("rsa_public_wrong.pem");
304301
out.writeObject("loaded privateKey:", privateKey);
305302
out.writeObject("loaded publicKey:", publicKey);
306303
out.writeObject("loaded publicKey_wrong:", publicKey_wrong);
@@ -460,10 +457,4 @@ public void execute() {
460457
private static String numberWithPrefix(final String prefix, final String number) {
461458
return String.format("%s%s%s", DEMO_NUMBER_PREFIX, prefix, number);
462459
}
463-
464-
private static String loadFileContent(final String fileName) throws IOException {
465-
final ClassLoader classloader = Thread.currentThread().getContextClassLoader();
466-
final InputStream inputStream = classloader.getResourceAsStream(fileName);
467-
return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
468-
}
469460
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.labs64.netlicensing.examples;
2+
3+
import java.io.IOException;
4+
import java.io.StringReader;
5+
6+
import javax.xml.bind.JAXBContext;
7+
import javax.xml.bind.JAXBException;
8+
import javax.xml.bind.Unmarshaller;
9+
10+
import com.labs64.netlicensing.domain.vo.Context;
11+
import com.labs64.netlicensing.domain.vo.MetaInfo;
12+
import com.labs64.netlicensing.domain.vo.ValidationResult;
13+
import com.labs64.netlicensing.exception.NetLicensingException;
14+
import com.labs64.netlicensing.schema.context.Netlicensing;
15+
import com.labs64.netlicensing.service.ValidationService;
16+
import com.labs64.netlicensing.utils.ConsoleWriter;
17+
import com.labs64.netlicensing.utils.TestHelpers;
18+
19+
/**
20+
* Demonstrates how to work with offline validation file.
21+
* <p>
22+
* This example uses pre-generated validation file and key. In a real-world application you'll need to do the following
23+
* steps in order to obtain your own files:
24+
* </p>
25+
* <ul>
26+
* <li>Create NetLicensing configuration for your product and add the customer</li>
27+
* <li>Generate key pair</li>
28+
* <li>Create NetLicensing API key with private key</li>
29+
* <li>Download offline validation file using UI or API</li>
30+
* <li>Use your public key and the validation file from above with this code</li>
31+
* </ul>
32+
* <p>
33+
* Your application should take care of storing the public key securely, loading it from the file here is merely for
34+
* demonstration purposes.
35+
* </p>
36+
*/
37+
public class OfflineValidation implements NetLicensingExample {
38+
39+
@Override
40+
public void execute() {
41+
final ConsoleWriter out = new ConsoleWriter();
42+
try {
43+
// 1. Create context, for offline validation you only need to provide the public key.
44+
final String publicKey = TestHelpers.loadFileContent("rsa_public.pem");
45+
final Context context = new Context();
46+
context.setPublicKey(publicKey);
47+
48+
// 2. Read the validation file as 'Netlicensing' object.
49+
final String offlineValidation = TestHelpers.loadFileContent("Isb-DEMO.xml");
50+
final JAXBContext jaxbContext = JAXBContext.newInstance(Netlicensing.class);
51+
final Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
52+
final StringReader reader = new StringReader(offlineValidation);
53+
final Netlicensing validationFile = (Netlicensing) jaxbUnmarshaller.unmarshal(reader);
54+
55+
// 3. Validate. ValidationResult is same as if validation would be executed against the
56+
// NetLicensing service online.
57+
final MetaInfo meta = new MetaInfo();
58+
final ValidationResult validationResult = ValidationService.validateOffline(context, validationFile, meta);
59+
60+
out.writeObject("Validation result (Offline / signed):", validationResult);
61+
62+
} catch (final JAXBException | NetLicensingException | IOException e) {
63+
out.writeException("Failure:", e);
64+
}
65+
}
66+
67+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.labs64.netlicensing.utils;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.nio.charset.StandardCharsets;
6+
7+
import org.apache.commons.io.IOUtils;
8+
9+
public class TestHelpers {
10+
11+
public static String loadFileContent(final String fileName) throws IOException {
12+
final ClassLoader classloader = Thread.currentThread().getContextClassLoader();
13+
final InputStream inputStream = classloader.getResourceAsStream(fileName);
14+
return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
15+
}
16+
17+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><ns2:netlicensing xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:ns2="http://netlicensing.labs64.com/schema/context" ttl="2020-12-28T22:53:06.681Z"><Signature><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>ICC1F7ZKeQoayrzn1iGtw7Zt96s=</DigestValue></Reference></SignedInfo><SignatureValue>jYb0aGBPR9Rn4HVRJhBsIRafzW1k3D/GF7GZ62nT8dwvJszGB0kEXdFrXTj7FhUeiBcBlqxcsEUUKA5XbE7LGbNm+V+f5xZu/+n/d/miufKPAIk6CN5xoZQLDRGRSruW0LiKJsnkbzHvIF4u6G/HUyQpUfrxwiqXb+tYFpiaMgcSHL5xGzRq5Mqusw21Cdq81MhUb9oUoujgisIZWqNyebOqWuzOjNJOy0y2uml4I5U5tBAL1OlrQKjfPUiy369HwMl37A7dR9oVcahb6/YPI039xeLTn+WzyFPIV7f41o6Ytq4Iefl6swj/elNKTHi9bYzcnjmM7ebOd+hinm8feA==</SignatureValue></Signature><ns2:infos/><ns2:items><ns2:item type="ProductModuleValidation"><ns2:property name="productModuleNumber">Msb-DEMO</ns2:property><ns2:property name="valid">true</ns2:property><ns2:property name="expires">2021-04-21T20:15:45.694Z</ns2:property><ns2:property name="productModuleName">Module using "Subscription" licensing model</ns2:property><ns2:property name="licensingModel">Subscription</ns2:property></ns2:item></ns2:items></ns2:netlicensing>

NetLicensingClient-demo/src/test/java/com/labs64/netlicensing/examples/RunExamples.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@
55
public class RunExamples {
66

77
@Test
8-
public void testExampleCallForEveryMethod() {
8+
public void testCallEveryAPIMethod() {
99
new CallEveryAPIMethod().execute();
1010
}
1111

12+
@Test
13+
public void testOfflineValidation() {
14+
new OfflineValidation().execute();
15+
}
16+
1217
}

0 commit comments

Comments
 (0)