JavaCAD
CSGDatabase.java
Go to the documentation of this file.
1 package eu.mihosoft.vrl.v3d.parametrics;
2 
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.OutputStream;
7 import java.lang.reflect.Type;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 
11 import org.apache.commons.io.FileUtils;
12 import org.apache.commons.io.IOUtils;
13 import com.google.gson.Gson;
14 import com.google.gson.GsonBuilder;
15 import com.google.gson.reflect.TypeToken;
16 
17 public class CSGDatabase {
18 
19  private static HashMap<String,Parameter> database=null;
20  private static File dbFile=new File("CSGdatabase.json");
21  private static final Type TT_mapStringString = new TypeToken<HashMap<String,Parameter>>(){}.getType();
22  private static final Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
23  private static final HashMap<String,ArrayList<IParameterChanged>> parameterListeners=new HashMap<>();
24  public static void set(String key, Parameter value){
25  getDatabase();
26  //synchronized(database){
27  getDatabase().put(key, value);
28  //}
29  }
30  public static Parameter get(String key){
31  Parameter ret =null;
32  getDatabase();// load database before synchronization
33  //synchronized(database){
34  ret=getDatabase().get(key);
35  //}
36  return ret;
37  }
38 
39  public static void clear(){
40 
41  getDatabase();
42  //synchronized(database){
43  database.clear();
44  //}
45  parameterListeners.clear();
46  saveDatabase();
47  }
48  public static void addParameterListener(String key, IParameterChanged l){
49  ArrayList<IParameterChanged> list = getParamListeners(key);
50  if(!list.contains(l)){
51  list.add(l);
52  }
53  }
54  public static void removeParameterListener(String key, IParameterChanged l){
55  if(parameterListeners.get(key)==null){
56  return;
57  }
58  ArrayList<IParameterChanged> list = parameterListeners.get(key);
59  if(list.contains(l)){
60  list.remove(l);
61  }
62  }
63 
64  public static ArrayList<IParameterChanged> getParamListeners(String key){
65  if(parameterListeners.get(key)==null){
66  parameterListeners.put(key, new ArrayList<>());
67  }
68  return parameterListeners.get(key);
69  }
70 
71 
72  public static void delete(String key){
73  //synchronized(database){
74  getDatabase().remove(key);
75  //}
76  }
77  private static HashMap<String,Parameter> getDatabase() {
78  if(database==null){
79  new Thread(){
80  public void run(){
81  String jsonString;
82  try {
83 
84  if(!getDbFile().exists()){
85  setDatabase(new HashMap<String,Parameter>());
86  }
87  else{
88  InputStream in = null;
89  try {
90  in = FileUtils.openInputStream(getDbFile());
91  jsonString= IOUtils.toString(in);
92  } finally {
93  IOUtils.closeQuietly(in);
94  }
95  HashMap<String,Parameter> tm=gson.fromJson(jsonString, TT_mapStringString);
96 
97 
98  if(tm!=null){
99 // System.out.println("Hash Map loaded from "+jsonString);
100 // for(String k:tm.keySet()){
101 // System.out.println("Key: "+k+" vlaue= "+tm.get(k));
102 // }
103  setDatabase(tm);
104  }
105  }
106  } catch (Exception e) {
107  e.printStackTrace();
108  System.err.println(dbFile.getAbsolutePath());
109  setDatabase(new HashMap<String,Parameter>());
110  }
111  Runtime.getRuntime().addShutdownHook(new Thread() {
112  @Override
113  public void run() {
114  saveDatabase();
115  }
116  });
117  }
118  }.start();
119  long start = System.currentTimeMillis();
120  while(database==null){
121  try {
122  Thread.sleep(10);
123  } catch (InterruptedException e) {
124  // TODO Auto-generated catch block
125  e.printStackTrace();
126  }
127  if((System.currentTimeMillis()-start)>500){
128  setDatabase(new HashMap<String,Parameter>());
129  }
130  }
131  }
132  return database;
133  }
134 
135  public static void loadDatabaseFromFile(File f){
136  InputStream in = null;
137  String jsonString;
138  try {
139  try {
140  in = FileUtils.openInputStream(f);
141  jsonString= IOUtils.toString(in);
142  HashMap<String,Parameter> tm=gson.fromJson(jsonString, TT_mapStringString);
143  if(tm !=null)
144  for(String k:tm.keySet()){
145  set(k,tm.get(k));
146  }
147  saveDatabase();
148  } catch (Exception e) {
149  System.err.println(f.getAbsolutePath());
150  e.printStackTrace();
151  }
152 
153  } finally {
154  IOUtils.closeQuietly(in);
155  }
156  }
157 
158  public static String getDataBaseString(){
159  String writeOut=null;
160  getDatabase();
161  //synchronized(database){
162  writeOut =gson.toJson(database, TT_mapStringString);
163  //}
164  return writeOut;
165  }
166 
167  public static void saveDatabase(){
168  String writeOut=getDataBaseString();
169  try {
170  if(!getDbFile().exists()){
171  getDbFile().createNewFile();
172  }
173  OutputStream out = null;
174  try {
175  out = FileUtils.openOutputStream(getDbFile(), false);
176  IOUtils.write(writeOut, out);
177  out.flush();
178  out.close(); // don't swallow close Exception if copy completes normally
179  } finally {
180  IOUtils.closeQuietly(out);
181  }
182  } catch (IOException e) {
183  // TODO Auto-generated catch block
184  e.printStackTrace();
185  }
186  }
187  private static void setDatabase(HashMap<String,Parameter> database) {
188  if(CSGDatabase.database!=null){
189  return;
190  }
192  }
193  public static File getDbFile() {
194  return dbFile;
195  }
196  public static void setDbFile(File dbFile) {
197  if(!dbFile.exists())
198  try {
199  dbFile.createNewFile();
200  } catch (IOException e) {
201  // TODO Auto-generated catch block
202  e.printStackTrace();
203  }
206  }
207 
208 }
static void setDatabase(HashMap< String, Parameter > database)
static final HashMap< String, ArrayList< IParameterChanged > > parameterListeners
static HashMap< String, Parameter > getDatabase()
static ArrayList< IParameterChanged > getParamListeners(String key)
static void addParameterListener(String key, IParameterChanged l)
static void removeParameterListener(String key, IParameterChanged l)
static HashMap< String, Parameter > database