Added subscribers handling to generate the right events.
[smartthings-infrastructure.git] / Extractor / ExtractorScript.py
1 import os
2 readyToReturn = 0
3 ToReturn = ""
4 eventMap = []
5
6 def GetToken(f):
7         global readyToReturn
8         global ToReturn
9         Skip = ['\n', '\t', ' ']
10         Special = ["(", "\"", ":", ",", "{", "}", ")", "/", "*"]
11         S = ""
12         if (readyToReturn):
13                 readyToReturn = 0
14                 return ToReturn
15         ToReturn = ""
16         c = f.read(1)
17         while(True):
18                 if (c in Special):
19                         if (S != ""):
20                                 readyToReturn = 1
21                                 ToReturn = c
22                                 return S
23                         else:
24                                 return c
25                 elif (c in Skip):
26                         if (S != ""):
27                                 return S        
28                         else:
29                                 c = f.read(1)
30                                 continue
31                 S += c
32                 c = f.read(1)
33                 if not c:
34                         return "EOF"
35
36 def ExtractFunctions(F, appName):
37         global eventMap
38         Temp = GetToken(F)
39         while (Temp != "EOF"):
40                 if (Temp == "def" or Temp == "private"):
41                         Temp = GetToken(F)
42                         NameofFunc = Temp
43                         if (GetToken(F) != "="): #We have a function to create object for
44                                 if (appName == "App1"):
45                                         extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")    
46                                         extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
47                                         extractedFunctionsApp1.write("%s\n" % NameofFunc)
48                                 else:
49                                         extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")    
50                                         extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
51                                         extractedFunctionsApp2.write("%s\n" % NameofFunc)
52
53                 if (Temp == "subscribe"):
54                         counter = 0
55                         while (counter < 5 and Temp != "\""):
56                                 Temp = GetToken(F)
57                                 counter = counter + 1
58                         Temp = GetToken(F)
59                         #If counter >= 5 that means it is not found, so it must be appTouch
60                         if (counter >= 5):
61                                 Temp = "appTouch"
62                         eventMap.append(Temp)
63                 Temp = GetToken(F)
64                 
65 def ExtractEvents(extractedEvents):
66         global eventMap
67         extractedEvents.write("Random random = new Random(42)\n")
68         extractedEvents.write("counter = 1000\n")
69         extractedEvents.write("while(counter > 0) {\n")
70         extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1))
71         extractedEvents.write("\tswitch(eventNumber) {\n")
72         for i in range(len(eventMap)):
73                 extractedEvents.write("\t\tcase %d:\n" % i)
74                 if eventMap[i] == "lock":
75                         event = open("eventSimulator/eventLocked.groovy", "r")
76                         for line in event:
77                                 extractedEvents.write(line)
78                         event.close()
79                 elif eventMap[i] == "unlock":
80                         event = open("eventSimulator/eventUnlocked.groovy", "r")
81                         for line in event:
82                                 extractedEvents.write(line)
83                         event.close()
84                 elif eventMap[i] == "contact.open":
85                         event = open("eventSimulator/eventContactOpen.groovy", "r")
86                         for line in event:
87                                 extractedEvents.write(line)
88                         event.close()
89                 elif eventMap[i] == "contact.closed":
90                         event = open("eventSimulator/eventContactClosed.groovy", "r")
91                         for line in event:
92                                 extractedEvents.write(line)
93                         event.close()
94                 elif eventMap[i] == "nfcTouch":
95                         event = open("eventSimulator/eventNfcTouch.groovy", "r")
96                         for line in event:
97                                 extractedEvents.write(line)
98                         event.close()
99                 elif eventMap[i] == "appTouch":
100                         event = open("eventSimulator/eventAppTouch.groovy", "r")
101                         for line in event:
102                                 extractedEvents.write(line)
103                         event.close()
104                 ###TODO: Add more events later
105                 extractedEvents.write("\n\t\t\tbreak\n")
106         extractedEvents.write("\t}\n")
107         extractedEvents.write("\tcounter--\n")
108         extractedEvents.write("}\n")
109                 
110 #Extract objects to call functions from App1
111 F1 = open("Extractor/App1/App1.groovy", "r")
112 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
113 ExtractFunctions(F1, "App1")
114 F1.close()
115
116 #Extract objects to call functions from App2
117 F2 = open("Extractor/App2/App2.groovy", "r")
118 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
119 ExtractFunctions(F2, "App2")
120 F2.close()
121
122 #Prepare eventSimulator file while parsing the App1 and App2 files
123 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
124 ExtractEvents(extractedEvents)
125 extractedEvents.close()
126
127 #Save the extracted methods and app1 in a same file to extract information
128 extractorFile = open("Extractor/extractorFile.groovy", "w+")
129 Extractor = open("Extractor/Extractor.groovy", "r")
130 F1 = open("Extractor/App1/App1.groovy", "r")
131
132 extractorFile.write("////////////////////\n")
133 extractorFile.write("@Field App\n")
134 extractorFile.write("App = \"App1\"")
135 extractorFile.write("\n")
136 for line in Extractor:
137         extractorFile.write(line)
138 extractorFile.write("\n\n")
139 for line in F1:
140         extractorFile.write(line)
141 extractorFile.close()
142 Extractor.close()
143 F1.close()
144 #Run the file to extract the objects
145 os.system("groovy Extractor/extractorFile.groovy")
146
147
148 #Save the extracted methods and app2 in a same file to extract information
149 extractorFile = open("Extractor/extractorFile.groovy", "w+")
150 Extractor = open("Extractor/Extractor.groovy", "r")
151 F2 = open("Extractor/App2/App2.groovy", "r")
152
153 extractorFile.write("////////////////////\n")
154 extractorFile.write("@Field App\n")
155 extractorFile.write("App = \"App2\"")
156 extractorFile.write("\n")
157 for line in Extractor:
158         extractorFile.write(line)
159 extractorFile.write("\n\n")
160 for line in F2:
161         extractorFile.write(line)
162 #Run the file to extract the objects
163 extractorFile.close()
164 Extractor.close()
165 F2.close()
166 os.system("groovy Extractor/extractorFile.groovy")
167
168
169
170