diff --git a/build-and-run.sh b/build-and-run.sh
new file mode 100755
index 0000000..da104d4
--- /dev/null
+++ b/build-and-run.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+mvn package exec:java
\ No newline at end of file
diff --git a/input/data.json b/input/data.json
new file mode 100644
index 0000000..7c671a5
--- /dev/null
+++ b/input/data.json
@@ -0,0 +1,69 @@
+[
+ {
+ "name": "alpha",
+ "ports": [
+ {
+ "name": "ge-1/1/0",
+ "vlans": [
+ {
+ "vlanId": 10,
+ "customer": 1
+ },
+ {
+ "vlanId": 20,
+ "customer": 2
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "beta",
+ "ports": [
+ {
+ "name": "ge-2/1/0",
+ "vlans": [
+ {
+ "vlanId": 50,
+ "customer": 3
+ },
+ {
+ "vlanId": 201,
+ "customer": 3
+ }
+ ]
+ },
+ {
+ "name": "ge-3/1/0",
+ "vlans": [
+ {
+ "vlanId": 102,
+ "customer": 3
+ },
+ {
+ "vlanId": 105,
+ "customer": 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "gamma",
+ "ports": [
+ {
+ "name": "ge-2/1/0",
+ "vlans": [
+ {
+ "vlanId": 1331,
+ "customer": 1
+ },
+ {
+ "vlanId": 401,
+ "customer": 2
+ }
+ ]
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/input/garbage.json b/input/garbage.json
new file mode 100644
index 0000000..9b4a83e
--- /dev/null
+++ b/input/garbage.json
@@ -0,0 +1 @@
+I'm not even a json file at all.
\ No newline at end of file
diff --git a/input/noncompliant.json b/input/noncompliant.json
new file mode 100644
index 0000000..70d625a
--- /dev/null
+++ b/input/noncompliant.json
@@ -0,0 +1,3 @@
+{
+ "does this file deserialize to a Router[]?": false
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4d8da2d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,97 @@
+
+
+ 4.0.0
+
+
+ net.es
+ java-code-assessment
+ 1.0-SNAPSHOT
+
+ 21
+ 21
+ UTF-8
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.14.0
+
+
+
+ ch.qos.logback
+ logback-classic
+ 1.5.2
+
+
+
+ ch.qos.logback
+ logback-core
+ 1.5.2
+
+
+ org.projectlombok
+ lombok
+ 1.18.32
+ provided
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.18.0
+
+
+
+ org.slf4j
+ slf4j-api
+ 2.0.12
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.7.0
+ test
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.5.0
+
+
+
+
+ java
+
+
+
+
+
+ Main
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.32
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/EthernetPort.java b/src/main/java/EthernetPort.java
new file mode 100644
index 0000000..da93472
--- /dev/null
+++ b/src/main/java/EthernetPort.java
@@ -0,0 +1,21 @@
+import lombok.*;
+import java.util.*;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+/*
+ * Holds data about a particular Ethernet Port and all the Vlans that exist on it
+ */
+public class EthernetPort {
+ String name;
+ List vlans;
+
+ /*
+ * the @Data annotation provides compile-time generation of
+ * getters, setters, equals and hashCode (among others)
+ */
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/IntRange.java b/src/main/java/IntRange.java
new file mode 100644
index 0000000..9d9b7f7
--- /dev/null
+++ b/src/main/java/IntRange.java
@@ -0,0 +1,20 @@
+import lombok.*;
+
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Data
+public class IntRange {
+ private int floor;
+ private int ceiling;
+
+
+ /*
+ * the @Data annotation provides compile-time generation of
+ * getters, setters, equals and hashCode (among others)
+ */
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/Main.java b/src/main/java/Main.java
new file mode 100644
index 0000000..3993d44
--- /dev/null
+++ b/src/main/java/Main.java
@@ -0,0 +1,77 @@
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+public class Main {
+
+ public void run() {
+ try {
+ InputStream is = new FileInputStream("input/data.json");
+
+ Router[] routers = new ObjectMapper().readValue(is, Router[].class);
+ for (Router r : routers) {
+ System.out.println(r.getName());
+ }
+ } catch (Exception ex) {
+ System.out.println("An exception!" + ex.getMessage());
+ }
+
+ /*
+ ====================================================================
+ Task 1
+ ====================================================================
+ Instead of printing a list of router names, print out a report by
+ customers, including all the router / port / vlan ids they are associated with:
+
+ customer 1:
+ - alpha : ge-1/1/0 : 10
+ - beta : ge-2/1/0 : 103
+ - beta : ge-2/1/0 : 105
+
+ customer 2:
+ ...
+ ====================================================================
+ */
+
+
+
+
+ /*
+ ====================================================================
+ Task 2
+ ====================================================================
+ Print out a report of all unused VLAN ids by router and port in this format:
+ alpha:
+ - ge-1/1/0: 0 to 9, 11 to 19, 21 to 4095
+ etc
+
+ ====================================================================
+ */
+
+
+
+ /*
+ ====================================================================
+ Task 3
+ ====================================================================
+ Generalize this program to use ALL .json files in a directory
+ as input (instead of just specifically input/data.json).
+
+ You may skip any files that cannot be deserialized to Router[],
+ generating a warning message to the console.
+ ====================================================================
+ */
+
+ }
+
+
+
+ public static void main(String[] args) {
+ Main main = new Main();
+ main.run();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/Router.java b/src/main/java/Router.java
new file mode 100644
index 0000000..704aeb1
--- /dev/null
+++ b/src/main/java/Router.java
@@ -0,0 +1,21 @@
+import lombok.*;
+import java.util.*;
+
+/*
+ * holds data about a particular Router device all the EthernetPorts that exist on it
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class Router {
+ String name;
+ List ports;
+
+ /*
+ * the @Data annotation provides compile-time generation of
+ * getters, setters, equals and hashCode (among others)
+ */
+
+}
\ No newline at end of file
diff --git a/src/main/java/Utility.java b/src/main/java/Utility.java
new file mode 100644
index 0000000..9153f7e
--- /dev/null
+++ b/src/main/java/Utility.java
@@ -0,0 +1,30 @@
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+
+public class Utility {
+
+ /*
+ * this takes a collection of IntRange objects and returns a customizable
+ * human-readable representation. Candidate may modify it, but that should
+ * not be necessary.
+ *
+ * sample retvalue (separator = " to ", rangeseparator = ", ")
+ * "-2 to 30, 43 to 500, 121 to 122"
+ */
+ public static String asString(Collection ranges, String separator, String rangeSeparator) {
+ List listOfRanges = new ArrayList<>(ranges);
+ listOfRanges.sort(Comparator.comparing(IntRange::getFloor));
+
+ List parts = new ArrayList<>();
+ listOfRanges.forEach(r -> {
+ if (r.getCeiling() == r.getFloor()) {
+ parts.add(r.getCeiling() + "");
+ } else {
+ parts.add(r.getFloor() + separator + r.getCeiling());
+ }
+ });
+ return String.join(rangeSeparator, parts);
+ }
+}
diff --git a/src/main/java/Vlan.java b/src/main/java/Vlan.java
new file mode 100644
index 0000000..7f13fdb
--- /dev/null
+++ b/src/main/java/Vlan.java
@@ -0,0 +1,23 @@
+import lombok.*;
+
+
+/*
+ holds data about a particular Vlan, specifically the vlan-id (0-4095) and the customer id
+ associated with it. The customer id is an opaque int, guaranteed to be the same everywehre
+ for a particular customer.
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class Vlan {
+ int vlanId;
+ int customer;
+
+ /*
+ * the @Data annotation provides compile-time generation of
+ * getters, setters, equals and hashCode (among others)
+ */
+
+}
\ No newline at end of file