Commit #8: New version of extractor with running the preferences method make things...
[smartthings-infrastructure.git] / Extractor / extractorFile.groovy
index 612e6acb9a63da01e314025098b090a3ae2272ff..38d948a1076ecc2b0f2d8a4d35f4ee16c5c52935 100644 (file)
+////////////////////@Field App
+App = "App2"
 ////////////////////////////////////////
+//import libraries
 import groovy.transform.Field
-@Field File outGlobal = new File("Extractor/outGlobal.groovy")
+
+
+//import classes
+//Importing Classes
+import ContactSensor.ContactSensor
+import ContactSensor.ContactSensors
+import DoorControl.DoorControl
+import DoorControl.DoorControls
+import Lock.Lock
+import Lock.Locks
+import Thermostat.Thermostat
+import Thermostat.Thermostats
+import Switch.Switch
+import Switch.Switches
+import PresenceSensor.PresenceSensor
+import PresenceSensor.PresenceSensors
+import Logger.Logger
+import Location.LocationVar
+import Location.Phrase
+import appTouch.Touched
+import NfcTouch.NfcTouch
+import Timer.SimulatedTimer
+
+
+@Field App //Default
+
+
+//Global variables for files
 @Field File extractedObjectsApp1 = new File("Extractor/App1/extractedObjectsApp1.groovy")
 @Field File extractedObjectsApp2 = new File("Extractor/App2/extractedObjectsApp2.groovy")
 @Field File extractedObjectsConstructorApp1 = new File("Extractor/App1/extractedObjectsConstructorApp1.groovy")
 @Field File extractedObjectsConstructorApp2 = new File("Extractor/App2/extractedObjectsConstructorApp2.groovy")
 
+
 //Empty the files
-outGlobal.write("")
-extractedObjectsApp1.write("")
-extractedObjectsApp2.write("")
-extractedObjectsConstructorApp1.write("")
-extractedObjectsConstructorApp2.write("")
+if (App == "App1") {
+       extractedObjectsApp1.write("")
+       extractedObjectsConstructorApp1.write("")
+} else if (App == "App2") {
+       extractedObjectsApp2.write("")
+       extractedObjectsConstructorApp2.write("")
+}
+
+
+
+
+
+//Global objects
+//Global Object for class Touch Sensor!
+@Field def touchSensorObject
+//Global Object for class switch!
+@Field def switchObject
+//Global Object for class lock!
+@Field def lockObject
+//Global Object for class door control!
+@Field def doorControlObject
+//Global Object for class contact sensor!
+@Field def contactObject
+//Global Object for class presence sensor!
+@Field def presenceSensorObject
+//Global Object for class thermostat!
+@Field def thermostatObject
+
 
+//Global variables
+//For mode
+@Field modeVariables = 0
+@Field mode0
+@Field mode1
+@Field mode2
+@Field mode3
+@Field mode4
+@Field mode5
+//For number
+@Field numberVariables = 0
+@Field number0
+@Field number1
+@Field number2
+@Field number3
+@Field number4
+@Field number5
+//For time
+@Field timeVariables = 0
+@Field time0
+@Field time1
+@Field time2
+@Field time3
+@Field time4
+@Field time5
+//For enum
+@Field enumVariables = 0
+@Field enum0
+@Field enum1
+@Field enum2
+@Field enum3
+@Field enum4
+@Field enum5
+//For phone
+@Field phoneVariables = 0
+@Field phone0
+@Field phone1
+@Field phone2
+@Field phone3
+@Field phone4
+@Field phone5
+//For contact
+@Field contactVariables = 0
+@Field contact0
+@Field contact1
+@Field contact2
+@Field contact3
+@Field contact4
+@Field contact5
 
-@Field lockIsSet = 0
-@Field contactIsSet = 0
-@Field switchIsSet = 0
 
+
+/////Input Methods/////
 //input "",""
-def input(String name, String type, String App) {
+def input(String name, String type) {
        switch(type) {
                case "capability.lock":
-                       if (lockIsSet != 1) {
-                               lockIsSet = 1
-                               outGlobal.append("//Global Object for class lock!\n")
-                               outGlobal.append("@Field def lockObject = new Locking(sendEvent,1)\n")
-                       }
+                       lockObject = name
+                       this[lockObject] = new Locks({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class lock!\n")
                                extractedObjectsApp1.append("def "+name+"\n")
@@ -48,11 +147,8 @@ def input(String name, String type, String App) {
                case "capability.colorControl":
                        break
                case "capability.contactSensor":
-                       if (contactIsSet != 1) {
-                               contactIsSet = 1
-                               outGlobal.append("//Global Object for class contactSensor!\n")
-                               outGlobal.append("@Field def contactObject = new Contacting(sendEvent,1)\n")
-                       }
+                       contactObject = name
+                       this[contactObject] = new ContactSensors({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class contactSensor!\n")
                                extractedObjectsApp1.append("def "+name+"\n")
@@ -64,6 +160,17 @@ def input(String name, String type, String App) {
                        }
                        break
                case "capability.doorControl":
+                       doorControlObject = name
+                       this[doorControlObject] = new DoorControls({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class door control!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.doorControlObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class door control!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.doorControlObject\n")
+                       }
                        break
                case "capability.energyMeter":
                        break
@@ -78,6 +185,17 @@ def input(String name, String type, String App) {
                case "capability.powerMeter":
                        break
                case "capability.presenceSensor":
+                       presenceSensorObject = name
+                       this[presenceSensorObject] = new PresenceSensors({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class presence sensor!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.presenceSensorObject\n")            
+                       } else {
+                               extractedObjectsApp2.append("//Object for class presence sensor!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.presenceSensorObject\n")
+                       }
                        break
                case "capability.relativeHumidityMeasurement":
                        break
@@ -90,11 +208,8 @@ def input(String name, String type, String App) {
                case "capability.stepSensor":
                        break
                case "capability.switch":
-                       if (switchIsSet != 1) {
-                               switchIsSet = 1
-                               outGlobal.append("//Global Object for class switch!\n")
-                               outGlobal.append("@Field def switchObject = new Switching(sendEvent,1)\n")
-                       }
+                       switchObject = name
+                       this[switchObject] = new Switches({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class switch!\n")
                                extractedObjectsApp1.append("def "+name+"\n")
@@ -110,12 +225,34 @@ def input(String name, String type, String App) {
                case "capability.temperatureMeasurement":
                        break
                case "capability.thermostat":
+                       thermostatObject = name
+                       this[thermostatObject] = new Thermostats({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class thermostat!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.thermostatObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class thermostat!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.thermostatObject\n")
+                       }
                        break
                case "capability.valve":
                        break
                case "capability.waterSensor":
                        break
                case "capability.touchSensor":
+                       touchSensorObject = name
+                       this[touchSensorObject] = new NfcTouch({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.touchSensorObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.touchSensorObject\n")
+                       }
                        break
                case "capability.imageCapture":
                        break
@@ -125,6 +262,27 @@ def input(String name, String type, String App) {
                        break
                case "mode":
                        def userInput = System.console().readLine 'Enter the mode:'
+
+                       if (modeVariables == 0) {
+                               mode0 = name
+                               this[mode0] = userInput
+                       } else if (modeVariables == 1) {
+                               mode1 = name
+                               this[mode1] = userInput
+                       } else if (modeVariables == 2) {
+                               mode2 = name
+                               this[mode2] = userInput
+                       } else if (modeVariables == 3) {
+                               mode3 = name
+                               this[mode3] = userInput
+                       } else if (modeVariables == 4) {
+                               mode4 = name
+                               this[mode4] = userInput
+                       } else if (modeVariables == 5) {
+                               mode5 = name
+                               this[mode5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for mode!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -139,6 +297,27 @@ def input(String name, String type, String App) {
                        break
                case "number":
                        def userInput = System.console().readLine 'Enter the number:'
+                       
+                       if (numberVariables == 0) {
+                               number0 = name
+                               this[number0] = userInput
+                       } else if (numberVariables == 1) {
+                               number1 = name
+                               this[number1] = userInput
+                       } else if (numberVariables == 2) {
+                               number2 = name
+                               this[number2] = userInput
+                       } else if (numberVariables == 3) {
+                               number3 = name
+                               this[number3] = userInput
+                       } else if (numberVariables == 4) {
+                               number4 = name
+                               this[number4] = userInput
+                       } else if (numberVariables == 5) {
+                               number5 = name
+                               this[number5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for number!\n")
                                extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
@@ -149,6 +328,27 @@ def input(String name, String type, String App) {
                        break
                case "time":
                        def userInput = System.console().readLine 'Enter the time:'
+                       
+                       if (timeVariables == 0) {
+                               time0 = name
+                               this[time0] = userInput
+                       } else if (timeVariables == 1) {
+                               time1 = name
+                               this[time1] = userInput
+                       } else if (timeVariables == 2) {
+                               time2 = name
+                               this[time2] = userInput
+                       } else if (timeVariables == 3) {
+                               time3 = name
+                               this[time3] = userInput
+                       } else if (timeVariables == 4) {
+                               time4 = name
+                               this[time4] = userInput
+                       } else if (timeVariables == 5) {
+                               time5 = name
+                               this[time5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for time!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -159,6 +359,27 @@ def input(String name, String type, String App) {
                        break
                case "enum":
                        def userInput = System.console().readLine 'Enter the enum:'
+       
+                       if (enumVariables == 0) {
+                               enum0 = name
+                               this[enum0] = userInput
+                       } else if (enumVariables == 1) {
+                               enum1 = name
+                               this[enum1] = userInput
+                       } else if (enumVariables == 2) {
+                               enum2 = name
+                               this[enum2] = userInput
+                       } else if (enumVariables == 3) {
+                               enum3 = name
+                               this[enum3] = userInput
+                       } else if (enumVariables == 4) {
+                               enum4 = name
+                               this[enum4] = userInput
+                       } else if (enumVariables == 5) {
+                               enum5 = name
+                               this[enum5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for enum!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -171,6 +392,27 @@ def input(String name, String type, String App) {
                        break
                case "phone":
                        def userInput = System.console().readLine 'Enter the phone:'
+
+                       if (phoneVariables == 0) {
+                               phone0 = name
+                               this[phone0] = userInput
+                       } else if (phoneVariables == 1) {
+                               phone1 = name
+                               this[phone1] = userInput
+                       } else if (phoneVariables == 2) {
+                               phone2 = name
+                               this[phone2] = userInput
+                       } else if (phoneVariables == 3) {
+                               phone3 = name
+                               this[phone3] = userInput
+                       } else if (phoneVariables == 4) {
+                               phone4 = name
+                               this[phone4] = userInput
+                       } else if (phoneVariables == 5) {
+                               phone5 = name
+                               this[phone5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for phone!\n")
                                extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
@@ -181,6 +423,27 @@ def input(String name, String type, String App) {
                        break
                case "contact":
                        def userInput = System.console().readLine 'Enter the name of the contact:'
+       
+                       if (contactVariables == 0) {
+                               contact0 = name
+                               this[contact0] = userInput
+                       } else if (contactVariables == 1) {
+                               contact1 = name
+                               this[contact1] = userInput
+                       } else if (contactVariables == 2) {
+                               contact2 = name
+                               this[contact2] = userInput
+                       } else if (contactVariables == 3) {
+                               contact3 = name
+                               this[contact3] = userInput
+                       } else if (contactVariables == 4) {
+                               contact4 = name
+                               this[contact4] = userInput
+                       } else if (contactVariables == 5) {
+                               contact5 = name
+                               this[contact5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for contact!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -195,28 +458,17 @@ def input(String name, String type, String App) {
 }
 
 //input "","",linkedHashMap
-def input(LinkedHashMap metaData, String name, String type, String App) {
+def input(LinkedHashMap metaData, String name, String type) {
        switch(type) {
                case "capability.lock":
                        if (metaData.containsKey('title')) {
                                println metaData['title']
                        }
-                       if (metaData.containsKey('multiple')) {
-                               if (metaData['multiple'] == true) {
-                                       if (lockIsSet != 1) {
-                                               lockIsSet = 1
-                                               def count = System.console().readLine 'Enter the number of locks to control?(1,2, or 3)'
-                                               outGlobal.append("//Global Object for class lock!\n")
-                                               outGlobal.append("@Field def lockObject = new Locking(sendEvent, ")
-                                               outGlobal.append(count+")\n")
-                                       }       
-                               }
-                       }
-                       if (lockIsSet != 1) {
-                               lockIsSet = 1
-                               outGlobal.append("//Global Object for class lock!\n")
-                               outGlobal.append("@Field def lockObject = new Locking(sendEvent,1)\n")
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
                        }
+                       lockObject = name
+                       this[lockObject] = new Locks({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class lock!\n")
                                extractedObjectsApp1.append("def "+name+"\n")
@@ -241,22 +493,11 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('title')) {
                                println metaData['title']
                        }
-                       if (metaData.containsKey('multiple')) {
-                               if (metaData['multiple'] == true) {
-                                       if (contactIsSet != 1) {
-                                               contactIsSet = 1
-                                               def count = System.console().readLine 'Enter the number of contact sensors to control?(1,2, or 3)'
-                                               outGlobal.append("//Global Object for class contactSensor!\n")
-                                               outGlobal.append("@Field def contactObject = new Contacting(sendEvent, ")
-                                               outGlobal.append(count+")\n")
-                                       }       
-                               }
-                       }
-                       if (contactIsSet != 1) {
-                               contactIsSet = 1
-                               outGlobal.append("//Global Object for class contactSensor!\n")
-                               outGlobal.append("@Field def contactObject = new Contacting(sendEvent,1)\n")
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
                        }
+                       contactObject = name
+                       this[contactObject] = new ContactSensors({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class contactSensor!\n")
                                extractedObjectsApp1.append("def "+name+"\n")
@@ -268,6 +509,23 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        }
                        break
                case "capability.doorControl":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       doorControlObject = name
+                       this[doorControlObject] = new DoorControls({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class door control!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.doorControlObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class door control!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.doorControlObject\n")
+                       }
                        break
                case "capability.energyMeter":
                        break
@@ -282,6 +540,23 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                case "capability.powerMeter":
                        break
                case "capability.presenceSensor":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       presenceSensorObject = name
+                       this[presenceSensorObject] = new PresenceSensors({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class presence sensor!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.presenceSensorObject\n")            
+                       } else {
+                               extractedObjectsApp2.append("//Object for class presence sensor!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.presenceSensorObject\n")
+                       }
                        break
                case "capability.relativeHumidityMeasurement":
                        break
@@ -297,22 +572,11 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('title')) {
                                println metaData['title']
                        }
-                       if (metaData.containsKey('multiple')) {
-                               if (metaData['multiple'] == true) {
-                                       if (switchIsSet != 1) {
-                                               switchIsSet = 1
-                                               def count = System.console().readLine 'Enter the number of switches to control?(1,2, or 3)'
-                                               outGlobal.append("//Global Object for class switch!\n")
-                                               outGlobal.append("@Field def switchObject = new Switching(sendEvent, ")
-                                               outGlobal.append(count+")\n")
-                                       }       
-                               }
-                       }
-                       if (switchIsSet != 1) {
-                               switchIsSet = 1
-                               outGlobal.append("//Global Object for class switch!\n")
-                               outGlobal.append("@Field def switchObject = new Switching(sendEvent,1)\n")
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
                        }
+                       switchObject = name
+                       this[switchObject] = new Switches({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class switch!\n")
                                extractedObjectsApp1.append("def "+name+"\n")
@@ -328,12 +592,46 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                case "capability.temperatureMeasurement":
                        break
                case "capability.thermostat":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       thermostatObject = name
+                       this[thermostatObject] = new Thermostats({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class thermostat!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.thermostatObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class thermostat!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.thermostatObject\n")
+                       }
                        break
                case "capability.valve":
                        break
                case "capability.waterSensor":
                        break
                case "capability.touchSensor":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       touchSensorObject = name
+                       this[touchSensorObject] = new NfcTouch({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
+                               extractedObjectsApp1.append("def "+name+"\n")
+                               extractedObjectsConstructorApp1.append(name+" = obj.touchSensorObject\n")               
+                       } else {
+                               extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
+                               extractedObjectsApp2.append("def "+name+"\n")
+                               extractedObjectsConstructorApp2.append(name+" = obj.touchSensorObject\n")
+                       }
                        break
                case "capability.imageCapture":
                        break
@@ -349,6 +647,29 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                                println "Options: "+metaData['options']
                        }
                        def userInput = System.console().readLine 'Enter the mode:'
+
+                       if (modeVariables == 0) {
+                               mode0 = name
+                               this[mode0] = userInput
+                       } else if (modeVariables == 1) {
+                               mode1 = name
+                               this[mode1] = userInput
+                       } else if (modeVariables == 2) {
+                               mode2 = name
+                               this[mode2] = userInput
+                       } else if (modeVariables == 3) {
+                               mode3 = name
+                               this[mode3] = userInput
+                       } else if (modeVariables == 4) {
+                               mode4 = name
+                               this[mode4] = userInput
+                       } else if (modeVariables == 5) {
+                               mode5 = name
+                               this[mode5] = userInput
+                       }
+               
+                       modeVariables=modeVariables+1
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for mode!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -368,10 +689,30 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the number:'
+                       
+                       if (numberVariables == 0) {
+                               number0 = name
+                               this[number0] = userInput
+                       } else if (numberVariables == 1) {
+                               number1 = name
+                               this[number1] = userInput
+                       } else if (numberVariables == 2) {
+                               number2 = name
+                               this[number2] = userInput
+                       } else if (numberVariables == 3) {
+                               number3 = name
+                               this[number3] = userInput
+                       } else if (numberVariables == 4) {
+                               number4 = name
+                               this[number4] = userInput
+                       } else if (numberVariables == 5) {
+                               number5 = name
+                               this[number5] = userInput
+                       }
+
+                       numberVariables=numberVariables+1
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for number!\n")
                                extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
@@ -387,10 +728,30 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the time:'
+                       
+                       if (timeVariables == 0) {
+                               time0 = name
+                               this[time0] = userInput
+                       } else if (timeVariables == 1) {
+                               time1 = name
+                               this[time1] = userInput
+                       } else if (timeVariables == 2) {
+                               time2 = name
+                               this[time2] = userInput
+                       } else if (timeVariables == 3) {
+                               time3 = name
+                               this[time3] = userInput
+                       } else if (timeVariables == 4) {
+                               time4 = name
+                               this[time4] = userInput
+                       } else if (timeVariables == 5) {
+                               time5 = name
+                               this[time5] = userInput
+                       }
+
+                       timeVariables=timeVariables+1
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for time!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -406,10 +767,30 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the enum:'
+       
+                       if (enumVariables == 0) {
+                               enum0 = name
+                               this[enum0] = userInput
+                       } else if (enumVariables == 1) {
+                               enum1 = name
+                               this[enum1] = userInput
+                       } else if (enumVariables == 2) {
+                               enum2 = name
+                               this[enum2] = userInput
+                       } else if (enumVariables == 3) {
+                               enum3 = name
+                               this[enum3] = userInput
+                       } else if (enumVariables == 4) {
+                               enum4 = name
+                               this[enum4] = userInput
+                       } else if (enumVariables == 5) {
+                               enum5 = name
+                               this[enum5] = userInput
+                       }
+
+                       enumVariables=enumVariables+1
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for enum!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -427,10 +808,30 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the phone:'
+
+                       if (phoneVariables == 0) {
+                               phone0 = name
+                               this[phone0] = userInput
+                       } else if (phoneVariables == 1) {
+                               phone1 = name
+                               this[phone1] = userInput
+                       } else if (phoneVariables == 2) {
+                               phone2 = name
+                               this[phone2] = userInput
+                       } else if (phoneVariables == 3) {
+                               phone3 = name
+                               this[phone3] = userInput
+                       } else if (phoneVariables == 4) {
+                               phone4 = name
+                               this[phone4] = userInput
+                       } else if (phoneVariables == 5) {
+                               phone5 = name
+                               this[phone5] = userInput
+                       }
+
+                       phoneVariables=phoneVariables+1
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for phone!\n")
                                extractedObjectsApp1.append("def "+name+" = "+userInput+"\n")
@@ -446,10 +847,30 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the name of the contact:'
+       
+                       if (contactVariables == 0) {
+                               contact0 = name
+                               this[contact0] = userInput
+                       } else if (contactVariables == 1) {
+                               contact1 = name
+                               this[contact1] = userInput
+                       } else if (contactVariables == 2) {
+                               contact2 = name
+                               this[contact2] = userInput
+                       } else if (contactVariables == 3) {
+                               contact3 = name
+                               this[contact3] = userInput
+                       } else if (contactVariables == 4) {
+                               contact4 = name
+                               this[contact4] = userInput
+                       } else if (contactVariables == 5) {
+                               contact5 = name
+                               this[contact5] = userInput
+                       }
+
+                       contactVariables=contactVariables+1
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for contact!\n")
                                extractedObjectsApp1.append("def "+name+" = \""+userInput+"\"\n")
@@ -463,36 +884,25 @@ def input(LinkedHashMap metaData, String name, String type, String App) {
        }
 }
 //input linkedHashMap
-def input(LinkedHashMap metaData, String App) {
+def input(LinkedHashMap metaData) {
        switch(metaData['type']) {
                case "capability.lock":
                        if (metaData.containsKey('title')) {
                                println metaData['title']
                        }
-                       if (metaData.containsKey('multiple')) {
-                               if (metaData['multiple'] == true) {
-                                       if (lockIsSet != 1) {
-                                               lockIsSet = 1
-                                               def count = System.console().readLine 'Enter the number of locks to control?(1,2, or 3)'
-                                               outGlobal.append("//Global Object for class lock!\n")
-                                               outGlobal.append("@Field def lockObject = new Locking(sendEvent, ")
-                                               outGlobal.append(count+")\n")
-                                       }       
-                               }
-                       }
-                       if (lockIsSet != 1) {
-                               lockIsSet = 1
-                               outGlobal.append("//Global Object for class lock!\n")
-                               outGlobal.append("@Field def lockObject = new Locking(sendEvent,1)\n")
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
                        }
+                       lockObject = metaData['name']
+                       this[lockObject] = new Locks({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class lock!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+"\n")
-                               extractedObjectsConstructorApp1.append(metaData['input']+" = obj.lockObject\n")         
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.lockObject\n")          
                        } else {
                                extractedObjectsApp2.append("//Object for class lock!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+"\n")
-                               extractedObjectsConstructorApp2.append(metaData['input']+" = obj.lockObject\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.lockObject\n")
                        }
                        break
                case "capability.alarm":
@@ -509,33 +919,33 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('title')) {
                                println metaData['title']
                        }
-                       if (metaData.containsKey('multiple')) {
-                               if (metaData['multiple'] == true) {
-                                       if (contactIsSet != 1) {
-                                               contactIsSet = 1
-                                               def count = System.console().readLine 'Enter the number of contact sensors to control?(1,2, or 3)'
-                                               outGlobal.append("//Global Object for class contactSensor!\n")
-                                               outGlobal.append("@Field def contactObject = new Contacting(sendEvent, ")
-                                               outGlobal.append(count+")\n")
-                                       }       
-                               }
-                       }
-                       if (contactIsSet != 1) {
-                               contactIsSet = 1
-                               outGlobal.append("//Global Object for class contactSensor!\n")
-                               outGlobal.append("@Field def contactObject = new Contacting(sendEvent,1)\n")
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
                        }
+                       contactObject = metaData['name']
+                       this[contactObject] = new ContactSensors({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+"\n")
-                               extractedObjectsConstructorApp1.append(metaData['input']+" = obj.contactObject\n")              
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.contactObject\n")               
                        } else {
                                extractedObjectsApp2.append("//Object for class contactSensor!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+"\n")
-                               extractedObjectsConstructorApp2.append(metaData['input']+" = obj.contactObject\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.contactObject\n")
                        }
                        break
                case "capability.doorControl":
+                       doorControlObject = metaData['name']
+                       this[doorControlObject] = new DoorControls({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class door control!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.doorControlObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class door control!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.doorControlObject\n")
+                       }
                        break
                case "capability.energyMeter":
                        break
@@ -550,6 +960,23 @@ def input(LinkedHashMap metaData, String App) {
                case "capability.powerMeter":
                        break
                case "capability.presenceSensor":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       presenceSensorObject = metaData['name']
+                       this[presenceSensorObject] = new PresenceSensors({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class presence sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.presenceSensorObject\n")                
+                       } else {
+                               extractedObjectsApp2.append("//Object for class presence sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.presenceSensorObject\n")
+                       }
                        break
                case "capability.relativeHumidityMeasurement":
                        break
@@ -565,43 +992,66 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('title')) {
                                println metaData['title']
                        }
-                       if (metaData.containsKey('multiple')) {
-                               if (metaData['multiple'] == true) {
-                                       if (switchIsSet != 1) {
-                                               switchIsSet = 1
-                                               def count = System.console().readLine 'Enter the number of switches to control?(1,2, or 3)'
-                                               outGlobal.append("//Global Object for class switch!\n")
-                                               outGlobal.append("@Field def switchObject = new Switching(sendEvent, ")
-                                               outGlobal.append(count+")\n")
-                                       }       
-                               }
-                       }
-                       if (switchIsSet != 1) {
-                               switchIsSet = 1
-                               outGlobal.append("//Global Object for class switch!\n")
-                               outGlobal.append("@Field def switchObject = new Switching(sendEvent,1)\n")
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
                        }
+                       switchObject = metaData['name']
+                       this[switchObject] = new Switches({}, 1)
                        if (App == "App1") {
                                extractedObjectsApp1.append("//Object for class switch!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+"\n")
-                               extractedObjectsConstructorApp1.append(metaData['input']+" = obj.switchObject\n")               
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.switchObject\n")                
                        } else {
                                extractedObjectsApp2.append("//Object for class switch!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+"\n")
-                               extractedObjectsConstructorApp2.append(metaData['input']+" = obj.switchObject\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.switchObject\n")
                        }
                        break
                case "capability.switchLevel":
                        break
                case "capability.temperatureMeasurement":
-                       break   
+                       break
                case "capability.thermostat":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       thermostatObject = metaData['name']
+                       this[thermostatObject] = new Thermostats({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class thermostat!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.thermostatObject\n")            
+                       } else {
+                               extractedObjectsApp2.append("//Object for class thermostat!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.thermostatObject\n")
+                       }
                        break
                case "capability.valve":
                        break
                case "capability.waterSensor":
                        break
                case "capability.touchSensor":
+                       if (metaData.containsKey('title')) {
+                               println metaData['title']
+                       }
+                       if (metaData.containsKey('options')) {
+                               println "Options: "+metaData['options']
+                       }
+                       touchSensorObject = metaData['name']
+                       this[touchSensorObject] = new NfcTouch({}, 1)
+                       if (App == "App1") {
+                               extractedObjectsApp1.append("//Object for class Touch Sensor!\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp1.append(metaData['name']+" = obj.touchSensorObject\n")           
+                       } else {
+                               extractedObjectsApp2.append("//Object for class Touch Sensor!\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+"\n")
+                               extractedObjectsConstructorApp2.append(metaData['name']+" = obj.touchSensorObject\n")
+                       }
                        break
                case "capability.imageCapture":
                        break
@@ -616,16 +1066,34 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the mode:'
+
+                       if (modeVariables == 0) {
+                               mode0 = metaData['name']
+                               this[mode0] = userInput
+                       } else if (modeVariables == 1) {
+                               mode1 = metaData['name']
+                               this[mode1] = userInput
+                       } else if (modeVariables == 2) {
+                               mode2 = metaData['name']
+                               this[mode2] = userInput
+                       } else if (modeVariables == 3) {
+                               mode3 = metaData['name']
+                               this[mode3] = userInput
+                       } else if (modeVariables == 4) {
+                               mode4 = metaData['name']
+                               this[mode4] = userInput
+                       } else if (modeVariables == 5) {
+                               mode5 = metaData['name']
+                               this[mode5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for mode!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        } else {
                                extractedObjectsApp2.append("//Global variable for mode!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        }
                        break
                case "decimal":
@@ -639,16 +1107,34 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the number:'
+                       
+                       if (numberVariables == 0) {
+                               number0 = metaData['name']
+                               this[number0] = userInput
+                       } else if (numberVariables == 1) {
+                               number1 = metaData['name']
+                               this[number1] = userInput
+                       } else if (numberVariables == 2) {
+                               number2 = metaData['name']
+                               this[number2] = userInput
+                       } else if (numberVariables == 3) {
+                               number3 = metaData['name']
+                               this[number3] = userInput
+                       } else if (numberVariables == 4) {
+                               number4 = metaData['name']
+                               this[number4] = userInput
+                       } else if (numberVariables == 5) {
+                               number5 = metaData['name']
+                               this[number5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for number!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+" = "+userInput+"\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
                        } else {
                                extractedObjectsApp2.append("//Global variable for number!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+" = "+userInput+"\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
                        }
                        break
                case "time":
@@ -658,16 +1144,34 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the time:'
+                       
+                       if (timeVariables == 0) {
+                               time0 = metaData['name']
+                               this[time0] = userInput
+                       } else if (timeVariables == 1) {
+                               time1 = metaData['name']
+                               this[time1] = userInput
+                       } else if (timeVariables == 2) {
+                               time2 = metaData['name']
+                               this[time2] = userInput
+                       } else if (timeVariables == 3) {
+                               time3 = metaData['name']
+                               this[time3] = userInput
+                       } else if (timeVariables == 4) {
+                               time4 = metaData['name']
+                               this[time4] = userInput
+                       } else if (timeVariables == 5) {
+                               time5 = metaData['name']
+                               this[time5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for time!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        } else {
                                extractedObjectsApp2.append("//Global variable for time!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        }
                        break
                case "enum":
@@ -677,16 +1181,34 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the enum:'
+       
+                       if (enumVariables == 0) {
+                               enum0 = metaData['name']
+                               this[enum0] = userInput
+                       } else if (enumVariables == 1) {
+                               enum1 = metaData['name']
+                               this[enum1] = userInput
+                       } else if (enumVariables == 2) {
+                               enum2 = metaData['name']
+                               this[enum2] = userInput
+                       } else if (enumVariables == 3) {
+                               enum3 = metaData['name']
+                               this[enum3] = userInput
+                       } else if (enumVariables == 4) {
+                               enum4 = metaData['name']
+                               this[enum4] = userInput
+                       } else if (enumVariables == 5) {
+                               enum5 = metaData['name']
+                               this[enum5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for enum!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        } else {
                                extractedObjectsApp2.append("//Global variable for enum!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        }
                        break
                case "bool":
@@ -698,16 +1220,34 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
-                       }
                        def userInput = System.console().readLine 'Enter the phone:'
+
+                       if (phoneVariables == 0) {
+                               phone0 = metaData['name']
+                               this[phone0] = userInput
+                       } else if (phoneVariables == 1) {
+                               phone1 = metaData['name']
+                               this[phone1] = userInput
+                       } else if (phoneVariables == 2) {
+                               phone2 = metaData['name']
+                               this[phone2] = userInput
+                       } else if (phoneVariables == 3) {
+                               phone3 = metaData['name']
+                               this[phone3] = userInput
+                       } else if (phoneVariables == 4) {
+                               phone4 = metaData['name']
+                               this[phone4] = userInput
+                       } else if (phoneVariables == 5) {
+                               phone5 = metaData['name']
+                               this[phone5] = userInput
+                       }
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for phone!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+" = "+userInput+"\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = "+userInput+"\n")
                        } else {
                                extractedObjectsApp2.append("//Global variable for phone!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+" = "+userInput+"\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = "+userInput+"\n")
                        }
                        break
                case "contact":
@@ -717,32 +1257,172 @@ def input(LinkedHashMap metaData, String App) {
                        if (metaData.containsKey('options')) {
                                println "Options: "+metaData['options']
                        }
-                       if (metaData.containsKey('metadata')) {
-                               println "metaData: "+metaData['metadata']
+                       def userInput = System.console().readLine 'Enter the metaData['name'] of the contact:'
+       
+                       if (contactVariables == 0) {
+                               contact0 = metaData['name']
+                               this[contact0] = userInput
+                       } else if (contactVariables == 1) {
+                               contact1 = metaData['name']
+                               this[contact1] = userInput
+                       } else if (contactVariables == 2) {
+                               contact2 = metaData['name']
+                               this[contact2] = userInput
+                       } else if (contactVariables == 3) {
+                               contact3 = metaData['name']
+                               this[contact3] = userInput
+                       } else if (contactVariables == 4) {
+                               contact4 = metaData['name']
+                               this[contact4] = userInput
+                       } else if (contactVariables == 5) {
+                               contact5 = metaData['name']
+                               this[contact5] = userInput
                        }
-                       def userInput = System.console().readLine 'Enter the name of the contact:'
+
                        if (App == "App1") {                    
                                extractedObjectsApp1.append("//Global variable for contact!\n")
-                               extractedObjectsApp1.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp1.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        } else {
                                extractedObjectsApp2.append("//Global variable for contact!\n")
-                               extractedObjectsApp2.append("def "+metaData['input']+" = \""+userInput+"\"\n")
+                               extractedObjectsApp2.append("def "+metaData['name']+" = \""+userInput+"\"\n")
                        }
                        break
                default:
                        break
-       }       
+       }
 }
 
+def label(LinkedHashMap metaData) {
+       if (metaData.containsKey('title')) {
+               println metaData['title']
+       }
+       if (metaData.containsKey('options')) {
+               println "Options: "+metaData['options']
+       }
+
+       println("//IGNORE--ForMobileUse//")
+}
+
+def mode(LinkedHashMap metaData) {
+       if (metaData.containsKey('title')) {
+               println metaData['title']
+       }
+       if (metaData.containsKey('options')) {
+               println "Options: "+metaData['options']
+       }
+
+       println("//IGNORE--ForMobileUse//")
+}
+/////Input Methods/////
+
+
+/////MethodsForExtraction/////
+def definition(LinkedHashMap metaData) {
+       println("///Just some information///")
+}
+
+def preferences(Closure inputData) {
+       find(inputData) //Run the closure to extract pages/sections/inputMethods
+}
 
-input"lock1","capability.lock",required:true,"App1"
-input"contact","capability.contactSensor",required:true,"App1"
-input"minutesLater","number",title:"Delay(inminutes):",required:true,"App1"
-input"secondsLater","number",title:"Delay(inseconds):",required:true,"App1"
-input("recipients","contact",title:"Sendnotificationsto",required:false,"App1")
-input"phoneNumber","phone",title:"Warnwithtextmessage(optional)",description:"PhoneNumber",required:false,"App1"
-input"switchesoff","capability.switch",multiple:true,required:true,"App2"
-input"switcheson","capability.switch",multiple:true,required:false,"App2"
-input"lock1","capability.lock",multiple:true,"App2"
-input"newMode","mode",title:"Mode?","App2"
-input"waitfor","number",title:"Offafter(default120)",required:true,"App2"
+def page(LinkedHashMap metaData, Closure inputData) {
+       if (metaData.containsKey('name'))
+               println(metaData['name'])
+       if (metaData.containsKey('title'))
+               println(metaData['title'])
+
+       find(inputData) //Run the closure to extract sections/inputMethods
+}
+
+def page(LinkedHashMap metaData) {
+       def nameOfFunction = metaData['name']
+       "$nameOfFunction"() //Call the page     
+}
+
+def dynamicPage(LinkedHashMap metaData, Closure inputData) {
+       if (metaData.containsKey('name'))
+               println(metaData['name'])
+       if (metaData.containsKey('title'))
+               println(metaData['title'])
+
+       find(inputData) //Run the closure to extract sections/inputMethods
+}
+
+def section(String title, Closure inputData) {
+       println(title)
+       find(inputData) //Run the closure to extract inputMethods
+}
+
+def section(LinkedHashMap metaData, Closure inputData) {
+       find(inputData) //Run the closure to extract inputMethods
+}
+/////MethodsForExtraction/////
+
+
+
+/////
+definition(
+    name: "Good Night House",
+    namespace: "charette.joseph@gmail.com",
+    author: "Joseph Charette",
+    description: "Some on, some off with delay for bedtime, Lock The Doors",
+    category: "Convenience",
+    iconUrl: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience.png",
+    iconX2Url: "https://s3.amazonaws.com/smartapp-icons/Convenience/Cat-Convenience@2x.png"
+/**
+*  Borrowed code from
+*  Walk Gentle Into That Good Night
+*
+*  Author: oneaccttorulethehouse@gmail.com
+*  Date: 2014-02-01
+ */
+ )
+preferences {
+       section("When I touch the app turn these lights off…"){
+               input "switchesoff", "capability.switch", multiple: true, required:true
+       }
+    section("When I touch the app turn these lights on…"){
+               input "switcheson", "capability.switch", multiple: true, required:false
+       }
+    section("Lock theses locks...") {
+               input "lock1","capability.lock", multiple: true
+    }
+       section("And change to this mode...") {
+               input "newMode", "mode", title: "Mode?"
+       }
+   section("After so many seconds (optional)"){
+               input "waitfor", "number", title: "Off after (default 120)", required: true
+       }
+}
+
+
+def installed()
+{
+       log.debug "Installed with settings: ${settings}"
+       log.debug "Current mode = ${location.mode}"
+       subscribe(app, appTouch)
+}
+
+
+def updated()
+{
+       log.debug "Updated with settings: ${settings}"
+       log.debug "Current mode = ${location.mode}"
+       unsubscribe()
+       subscribe(app, appTouch)
+}
+
+def appTouch(evt) {
+       log.debug "changeMode, location.mode = $location.mode, newMode = $newMode, location.modes = $location.modes"
+    if (location.mode != newMode) {
+                       setLocationMode(newMode)
+                       log.debug "Changed the mode to '${newMode}'"
+    }  else {
+       log.debug "New mode is the same as the old mode, leaving it be"
+       }
+    log.debug "appTouch: $evt"
+    lock1.lock()
+    switcheson.on()
+    def delay = (waitfor != null && waitfor != "") ? waitfor * 1000 : 120000
+       switchesoff.off(delay: delay)
+}