The final version for lede-gui (the phone app for device registration)
[iot2.git] / others / lede-gui / src / main / java / com / example / lede2 / ConfigFileIO.java
1 package com.example.lede2;\r
2 \r
3 import android.content.Context;\r
4 import android.provider.ContactsContract;\r
5 import android.util.Log;\r
6 import android.util.Pair;\r
7 \r
8 import java.io.BufferedWriter;\r
9 import java.io.File;\r
10 import java.io.FileInputStream;\r
11 import java.io.FileNotFoundException;\r
12 import java.io.IOException;\r
13 import java.io.OutputStreamWriter;\r
14 import java.util.ArrayList;\r
15 import java.util.List;\r
16 import java.util.Properties;\r
17 import java.util.Scanner;\r
18 import java.util.Set;\r
19 \r
20 /**\r
21  * Created by Brian on 2/28/2018.\r
22  */\r
23 \r
24 public class ConfigFileIO {\r
25 \r
26     //appends information to the bottom of file\r
27     public static void writeToFile(String filename, String data, Context context) {\r
28         try {\r
29             OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.\r
30                     openFileOutput(filename,\r
31                             Context.MODE_APPEND | Context.MODE_PRIVATE));\r
32             BufferedWriter writer = new BufferedWriter(outputStreamWriter);\r
33             writer.write(data);\r
34             writer.newLine();\r
35             writer.close();\r
36         } catch (IOException e) {\r
37             Log.e("Exception", "File write failed: " + e.toString());\r
38         }\r
39     }\r
40 \r
41     //returns contents of file\r
42     public static String readFromFile(String filename, Context context) {\r
43 \r
44         String strscan = "";\r
45 \r
46         try {\r
47             File scanfile = context.getFileStreamPath(filename);\r
48             Scanner scanner = new Scanner(scanfile);\r
49             while (scanner.hasNextLine()) {\r
50                 strscan += scanner.nextLine() + "\n";\r
51             }\r
52 \r
53         } catch (FileNotFoundException e) {\r
54             Log.e("login activity", "File not found: " + e.toString());\r
55         }\r
56 \r
57         return strscan;\r
58     }\r
59 \r
60 \r
61 \r
62     //creates the local copy of the sql database object\r
63     public static DatabaseObject createDatabaseObject(Context context, String idInformation){\r
64         Properties prop = new Properties();\r
65         String filename = context.getString(R.string.device_param_config_filename);\r
66         File file = new File(context.getFilesDir() , filename);\r
67         FileInputStream fis = null;\r
68         try{\r
69             fis = new FileInputStream(file);\r
70             prop.load(fis);\r
71             fis.close();\r
72         }\r
73         catch (IOException ex){\r
74             System.out.println("Error when reading SpeakerController Config file ");\r
75             ex.printStackTrace();\r
76         }\r
77 \r
78         int numTypes = Integer.parseInt(prop.getProperty("NUM_OF_TYPES"));\r
79         System.out.println("numtypes: " + numTypes);\r
80         DatabaseObject databaseObject = new DatabaseObject();\r
81         //add all types into databaseObject\r
82         for(int i = 0; i < numTypes; i++){\r
83             String type = prop.getProperty("TYPE_" + i);\r
84             String tag = prop.getProperty("TAG_" + i);\r
85             //generates a type object, fill it with subtype objects\r
86             DatabaseTypeObject databaseTypeObject = new DatabaseTypeObject(type, tag);\r
87             int numSubtypes = Integer.parseInt(prop.getProperty("SUBTYPE_" + i));\r
88 \r
89             //for each subtype, create the appropriate fields\r
90             for(int j = 0; j < numSubtypes; j++){\r
91                 String currentSubtype = "TYPE_" + i + "_" + j;\r
92                 String subtypeName = prop.getProperty(currentSubtype);\r
93                 int numAddresses = Integer.parseInt(prop.getProperty(currentSubtype + "_NUM_OF_ADDRESSES"));\r
94                 int numZigbeeAddresses = Integer.parseInt(prop.getProperty(currentSubtype + "_NUM_OF_ZBADDRESSES"));\r
95 \r
96                 DatabaseSubtypeObject databaseSubtypeObject = new DatabaseSubtypeObject(subtypeName, tag, numAddresses, numZigbeeAddresses);\r
97 \r
98                 if(numAddresses > 0) {\r
99                     String temp = prop.getProperty("TYPE_" + i + "_" + j + "_ADDRESS_FIELDS");\r
100                     Scanner scanner = new Scanner(temp);\r
101                     ArrayList<String> addressFieldNames = new ArrayList<>();\r
102                     while (scanner.hasNext()) {\r
103                         addressFieldNames.add(scanner.next());\r
104                     }\r
105                     //fill in the address fields for each subtype. May have to do multiple times for some subtypes\r
106                     System.out.println("num addresses" + numAddresses);\r
107                     for (int k = 0; k < numAddresses; k++) {\r
108                         ArrayList<Pair<String, String>> addressParamList = new ArrayList<>();\r
109                         for (int l = 0; l < addressFieldNames.size(); l++) {\r
110                             System.out.println(prop.getProperty(addressFieldNames.get(l) + "_" + i + "_" + j + "_ADD_" + k));\r
111                             String fieldValue = prop.getProperty(addressFieldNames.get(l) + "_" + i + "_" + j + "_ADD_" + k);\r
112                             Pair<String, String> fieldPair = new Pair<>(addressFieldNames.get(l), fieldValue);\r
113                             addressParamList.add(fieldPair);\r
114                         }\r
115                         databaseSubtypeObject.getAddressParams().add(addressParamList);\r
116                         databaseSubtypeObject.setNumAddressParams(addressFieldNames.size());\r
117                     }\r
118                 }\r
119 \r
120                 if(numZigbeeAddresses > 0) {\r
121                     String temp = prop.getProperty("TYPE_" + i + "_" + j + "_ZBADDRESS_FIELDS");\r
122                     Scanner scanner = new Scanner(temp);\r
123                     ArrayList<String> zigbeeAddressFieldNames = new ArrayList<>();\r
124                     while (scanner.hasNext()) {\r
125                         zigbeeAddressFieldNames.add(scanner.next());\r
126                     }\r
127                     //fill in the address fields for each subtype. May have to do multiple times for some subtypes\r
128                     System.out.println("num addresses" + numZigbeeAddresses);\r
129                     for (int k = 0; k < numZigbeeAddresses; k++) {\r
130                         ArrayList<Pair<String, String>> zigbeeAddressParamList = new ArrayList<>();\r
131                         for (int l = 0; l < zigbeeAddressFieldNames.size(); l++) {\r
132                            // System.out.println(prop.getProperty(zigbeeAddressFieldNames.get(l) + "_" + i + "_" + j + "_ADD_" + k));\r
133                             String fieldValue = prop.getProperty(zigbeeAddressFieldNames.get(l) + "_" + i + "_" + j + "_ADD_" + k);\r
134                             //System.out.println("prop command:  " + " FIELD VALUE " + fieldValue);\r
135                             Pair<String, String> fieldPair = new Pair<>(zigbeeAddressFieldNames.get(l), fieldValue);\r
136                             zigbeeAddressParamList.add(fieldPair);\r
137                         }\r
138                         databaseSubtypeObject.getZigbeeAddressParams().add(zigbeeAddressParamList);\r
139                         databaseSubtypeObject.setNumZigbeeParams(zigbeeAddressFieldNames.size());\r
140                     }\r
141                 }\r
142 \r
143 \r
144 \r
145 \r
146 \r
147 \r
148 \r
149 \r
150 \r
151                 //fill in the device fields for each subtype. There should only be up to 1 set of device fields\r
152                 int numDevFields = Integer.parseInt(prop.getProperty("TYPE_" + i + "_" + j + "_NUM_OF_DEVICE_INFO"));\r
153                 if(numDevFields > 0) {\r
154                     String temp = prop.getProperty("TYPE_" + i + "_" + j + "_" + "DEVICE_FIELDS");\r
155                     Scanner scanner = new Scanner(temp);\r
156                     ArrayList<String> addressFieldNames = new ArrayList<>();\r
157                     while (scanner.hasNext()) {\r
158                         addressFieldNames.add(scanner.next());\r
159                     }\r
160                     for (int l = 0; l < addressFieldNames.size(); l++) {\r
161                         String fieldValue = prop.getProperty(addressFieldNames.get(l) + "_" + i + "_" + j);\r
162                         Pair<String, String> fieldPair = new Pair<>(addressFieldNames.get(l), fieldValue);\r
163                         databaseSubtypeObject.addParam(fieldPair);\r
164                     }\r
165                     databaseSubtypeObject.setNumParams(addressFieldNames.size());\r
166                 }\r
167                 databaseTypeObject.addSubtype(subtypeName, databaseSubtypeObject);\r
168             }\r
169             System.out.println();\r
170             databaseObject.addTypeObject( type, databaseTypeObject);\r
171         }\r
172         //Now add individual instances of each device\r
173 \r
174 \r
175         Scanner scanner = new Scanner(idInformation);\r
176         String temp = "";\r
177         while (scanner.hasNext()) {\r
178             temp = scanner.next();\r
179             Set<String> typeset = databaseObject.getKeySet();\r
180             for (String key : typeset) {\r
181                 DatabaseTypeObject typeObject = databaseObject.getTypeObject(key);\r
182                 Set<String> subtypeset = typeObject.getKeySet();\r
183                 if (subtypeset.contains(temp)) {\r
184                     DatabaseSubtypeObject subtypeObject = typeObject.getSubtypeObject(temp);\r
185                     subtypeObject.addDevice(scanner.next());\r
186                     break;\r
187                 }\r
188             }\r
189         }\r
190 \r
191 \r
192 \r
193 \r
194         return databaseObject;\r
195     }\r
196 \r
197 \r
198 \r
199     //starts a new file instead of appending it\r
200     public static void writeToNewFile(String filename, String data, Context context) {\r
201         try {\r
202             OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.\r
203                     openFileOutput(filename, Context.MODE_PRIVATE));\r
204             BufferedWriter writer = new BufferedWriter(outputStreamWriter);\r
205             writer.write(data);\r
206             writer.newLine();\r
207             writer.close();\r
208         } catch (IOException e) {\r
209             Log.e("Exception", "File write failed: " + e.toString());\r
210         }\r
211     }\r
212 \r
213     public static ArrayList<String> getMACAddressesDevDat(String filename, Context context) {\r
214         ArrayList<String> macAddresses = new ArrayList<>();\r
215         String devicedat = ConfigFileIO.readFromFile(filename, context);\r
216         System.out.println(devicedat);\r
217         Scanner scanner = new Scanner(devicedat);\r
218         if(scanner.hasNext()) {\r
219             do {\r
220                 scanner.next();\r
221                 macAddresses.add(scanner.next());\r
222                 scanner.next();\r
223             } while (scanner.hasNext());\r
224             System.out.println(devicedat);\r
225         }\r
226         return macAddresses;\r
227     }\r
228 \r
229     public static ArrayList<String> getMACAddressesDHCP(String filename, Context context) {\r
230         ArrayList<String> macAddresses = new ArrayList<>();\r
231         String dhcp = ConfigFileIO.readFromFile(filename, context);\r
232         Scanner scanner = new Scanner(dhcp);\r
233         do{\r
234         scanner.next();\r
235         macAddresses.add(scanner.next());\r
236         scanner.next();\r
237         scanner.next();\r
238         scanner.next();\r
239         }while(scanner.hasNext());\r
240         System.out.println(dhcp);\r
241         return macAddresses;\r
242     }\r
243 \r
244 \r
245 }\r