From 2c457f9c05ccbdf384abac90077fe7d6e609d762 Mon Sep 17 00:00:00 2001
From: Peter Hertkorn <peter.hertkorn@reutlingen-university.de>
Date: Sat, 10 Oct 2020 15:20:19 +0200
Subject: [PATCH] Add dynamic loading of pizza classes (NY style)

---
 src/pizzeria/NYPizzaStore.java  | 29 +++++++++++++++++++----------
 src/pizzeria/nypizza.properties |  5 +++++
 2 files changed, 24 insertions(+), 10 deletions(-)
 create mode 100644 src/pizzeria/nypizza.properties

diff --git a/src/pizzeria/NYPizzaStore.java b/src/pizzeria/NYPizzaStore.java
index 9c940c8..f3480ec 100644
--- a/src/pizzeria/NYPizzaStore.java
+++ b/src/pizzeria/NYPizzaStore.java
@@ -1,17 +1,26 @@
 package pizzeria;
 
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Properties;
+
 public class NYPizzaStore extends PizzaStore {
 
 	Pizza createPizza(String item) {
-		if (item.equals("cheese")) {
-			return new NYStyleCheesePizza();
-		} else if (item.equals("veggie")) {
-			return new NYStyleVeggiePizza();
-		} else if (item.equals("clam")) {
-			return new NYStyleClamPizza();
-		} else if (item.equals("pepperoni")) {
-			return new NYStylePepperoniPizza();
-		} else return null;
+		Pizza pizza = null;
+
+		Properties properties = new Properties();
+		try {
+			properties.load(this.getClass().getResourceAsStream("nypizza.properties"));
+			String pizzaName = properties.getProperty(item);
+			Class<?> classOfPizza = Class.forName(pizzaName);
+			Constructor<Pizza> constructor = (Constructor<Pizza>) classOfPizza.getConstructor(new Class[]{});
+			pizza = constructor.newInstance();
+		} catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException |
+				NoSuchMethodException | InvocationTargetException e) {
+			e.printStackTrace();
+		}
+		return pizza;
 	}
-	
 }
diff --git a/src/pizzeria/nypizza.properties b/src/pizzeria/nypizza.properties
new file mode 100644
index 0000000..ff37049
--- /dev/null
+++ b/src/pizzeria/nypizza.properties
@@ -0,0 +1,5 @@
+cheese=pizzeria.NYStyleCheesePizza
+clam=pizzeria.NYStyleClamPizza
+pepperoni=pizzeria.NYStylePepperoniPizza
+veggie=pizzeria.NYStyleVeggiePizza
+salami=pizzeria.NYStyleSalamiPizza
-- 
GitLab