RmiServer  1.0
 Alle Klassen Namensbereiche Dateien Funktionen Variablen
ModelController.java
gehe zur Dokumentation dieser Datei
1 package controller;
2 
3 import java.util.ArrayList;
4 import java.util.HashSet;
5 import java.util.List;
6 import javax.persistence.EntityManager;
7 import javax.persistence.EntityManagerFactory;
8 import javax.persistence.EntityTransaction;
9 import javax.persistence.Persistence;
10 import javax.persistence.Query;
11 import javax.persistence.metamodel.Attribute;
12 import javax.persistence.metamodel.ManagedType;
13 import com.jamonapi.*;
14 
21 public class ModelController {
22  public static EntityManagerFactory emf = null;
23  public static EntityManager em = null;
24 
25  private static ArrayList<ManagedType<?>> tableList = null;
26 
30  private ModelController() {
31  }
32 
36  public static void connectDatabase() {
37  emf = Persistence.createEntityManagerFactory("JPA"); //$NON-NLS-1$
38  em = emf.createEntityManager();
39 
43  tableList = new ArrayList<ManagedType<?>>();
44  for (ManagedType<?> table : em.getMetamodel().getManagedTypes()) {
45  tableList.add(table);
46  }
47 
52  /*
53  * for (Field field : type.getClass().getDeclaredFields()) { for (Object
54  * table : tableList) { if (field.getType().equals( ((ManagedType<?>)
55  * table).getJavaType())) {
56  * System.out.println(field.getType().getName());
57  * selectDataFromClass(field.getType()); } } }
58  */
59  }
60 
64  public static void disconnectDatabase() {
65  /*
66  * Ressourcen schließen, Datenbankverbindung muss aber nicht explizit
67  * geschlossen werden weil "shutdown=true" im Connectionstring steht.
68  */
69  if (emf.isOpen()) {
70  emf.close();
71  }
72  if (em.isOpen()) {
73  em.close();
74  }
75  }
76 
83  public static void selectData(Class table) {
84  List<Object> results = getData(table);
85 
89  ObserverUpdater.update(table, results);
90  }
91 
101  public static List<Object> getData(Class tableName) {
105  Controller.performanceMonitor = MonitorFactory.start(Messages
106  .getString("ModelController.4") //$NON-NLS-1$
107  + tableName.getName());
108 
112  List<Object> results = null;
113  try {
114  Query query = em.createQuery("SELECT C FROM " + tableName.getName() //$NON-NLS-1$
115  + " C"); //$NON-NLS-1$
116  results = query.getResultList();
117  } catch (Exception e) {
118  System.out.println(""); //$NON-NLS-1$
120  .getString("ModelController.0") + e.getMessage()); //$NON-NLS-1$
121  }
122 
127 
132 
133  return results;
134  }
135 
142  public static List<Object> getDataWithClause(Class tableName,
143  String column, String clause) {
144  List<Object> results = null;
145  try {
146  Query query = em.createQuery("SELECT C FROM " + tableName.getName() //$NON-NLS-1$
147  + " C WHERE C." + column + "=:clause"); //$NON-NLS-1$ //$NON-NLS-2$
148  query.setParameter("clause", clause); //$NON-NLS-1$
149  results = query.getResultList();
150  } catch (Exception e) {
151  System.out.println(""); //$NON-NLS-1$
153  .getString("ModelController.0") + e.getMessage()); //$NON-NLS-1$
154  }
155 
156  return results;
157  }
158 
165  public static List<Object> getDataWithClause(Class tableName,
166  String column, Integer clause) {
167  List<Object> results = null;
168  try {
169  Query query = em.createQuery("SELECT C FROM " + tableName.getName() //$NON-NLS-1$
170  + " C WHERE C." + column + "=:clause"); //$NON-NLS-1$ //$NON-NLS-2$
171  query.setParameter("clause", clause); //$NON-NLS-1$
172  results = query.getResultList();
173  } catch (Exception e) {
174  System.out.println(""); //$NON-NLS-1$
176  .getString("ModelController.0") + e.getMessage()); //$NON-NLS-1$
177  }
178 
179  return results;
180  }
181 
189  public static boolean insertData(Object entity) {
190  boolean result = false;
191 
192  EntityTransaction transaction = null;
193  try {
194  transaction = em.getTransaction();
195  transaction.begin();
196 
197  // Datensatz schreiben
198  // http://www.developerfusion.com/article/84945/flush-and-clear-or-mapping-antipatterns/
199  em.persist(entity);
200 
201  // (nach schreibenden Zugriffen) alle Änderungen werden mit der DB
202  // synchronisiert
203  // und beim Commit der TX in die DB geschrieben
204  // siehe hier:
205  // http://www.prozesse-und-systeme.de/jpaEinleitung.html
206  em.flush();
207 
208  // Daten endgültig übermitteln, flush() muss in der Transaktion
209  // ablaufen
210  // beim commit wird die ID des Datensatzes ermittelt
211  transaction.commit();
212 
213  result = true;
214  } catch (Exception e) {
215  if (transaction != null && transaction.isActive()) {
216  transaction.rollback();
217  }
218 
219  System.out.println(""); //$NON-NLS-1$
221  .getString("ModelController.1") + e.getMessage()); //$NON-NLS-1$
222 
223  result = false;
224  } finally {
225  }
226 
230  if (result) {
231  refreshEntities(entity);
232  }
233 
234  return result;
235  }
236 
244  public static boolean changeData(Object entity) {
245  boolean result = false;
246 
247  // em.setFlushMode(FlushModeType.COMMIT);
248 
249  EntityTransaction transaction = null;
250  try {
251  transaction = em.getTransaction();
252  transaction.begin();
253 
254  // em.lock(entity, LockModeType.OPTIMISTIC);
255 
256  // Datensatz schreiben
257  // http://www.binaris-informatik.de/wp-content/uploads/2011/10/EntityManager_API_JPA_1_0.pdf
258  entity = em.merge(entity);
259 
260  // (nach schreibenden Zugriffen) alle Änderungen werden mit der DB
261  // synchronisiert
262  // und beim Commit der TX in die DB geschrieben
263  // siehe hier:
264  // http://www.prozesse-und-systeme.de/jpaEinleitung.html
265  em.flush();
266 
267  // Daten endgültig übermitteln, flush() muss in der Transaktion
268  // ablaufen
269  // beim commit wird die ID des Datensatzes ermittelt
270  transaction.commit();
271 
272  result = true;
273  } catch (Exception e) {
274  if (transaction != null && transaction.isActive()) {
275  transaction.rollback();
276  }
277 
278  System.out.println(""); //$NON-NLS-1$
280  .getString("ModelController.2") + e.getMessage()); //$NON-NLS-1$
281 
282  result = false;
283  } finally {
284  }
285 
289  if (result) {
290  refreshEntities(entity);
291  }
292 
293  return result;
294  }
295 
303  public static boolean deleteData(Object entity) {
304  boolean result = false;
305 
306  // em.setFlushMode(FlushModeType.COMMIT);
307 
308  EntityTransaction transaction = null;
309  // System.out.println(((Projekt) entity).getTitel());
310  try {
311  transaction = em.getTransaction();
312  transaction.begin();
313 
314  // em.lock(entity, LockModeType.OPTIMISTIC);
315 
316  entity = em.merge(entity);
317  em.remove(entity);
318 
319  // (nach schreibenden Zugriffen) alle Änderungen werden mit der DB
320  // synchronisiert
321  // und beim Commit der TX in die DB geschrieben
322  // siehe hier:
323  // http://www.prozesse-und-systeme.de/jpaEinleitung.html
324  em.flush();
325 
326  // Daten endgültig übermitteln, flush() muss in der Transaktion
327  // ablaufen
328  // beim commit wird die ID des Datensatzes ermittelt
329  transaction.commit();
330 
331  result = true;
332  } catch (Exception e) {
333  if (transaction != null && transaction.isActive()) {
334  transaction.rollback();
335  }
336 
337  System.out.println(""); //$NON-NLS-1$
339  .getString("ModelController.3") + e.getMessage()); //$NON-NLS-1$
340 
341  result = false;
342  } finally {
343  }
344 
348  if (result) {
349  refreshEntities(entity);
350  }
351 
352  return result;
353  }
354 
361  private static void refreshEntities(Object entity) {
367  emf.getCache().evictAll();
368 
372  HashSet<Class> tablesHashSet = new HashSet<Class>();
373  Class tempClass;
374 
378  selectData(entity.getClass());
379 
383  for (ManagedType<?> table : tableList) {
384  for (Attribute<?, ?> test : table.getAttributes()) {
385  if (test.getJavaType().isAssignableFrom(entity.getClass())) {
386  tempClass = table.getJavaType();
387  if (!tablesHashSet.contains(tempClass)) {
388  selectData(tempClass);
389  tablesHashSet.add(tempClass);
390  }
391  }
392  }
393  }
394  }
395 }