KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > datadictionarysystem > TriggerCharacteristics


1 package com.daffodilwoods.daffodildb.server.datadictionarysystem;
2
3 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator;
4
5 import java.util.*;
6 import com.daffodilwoods.database.resource.*;
7 import com.daffodilwoods.database.general.*;
8 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession;
9 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.TriggerDescriptor;
10 import com.daffodilwoods.daffodildb.server.sql99.common.SqlKeywords;
11 import com.daffodilwoods.daffodildb.server.sql99._Executer;
12 import com.daffodilwoods.daffodildb.server.sql99.ddl.descriptors.*;
13
14 import com.daffodilwoods.database.utility.P;
15 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference;
16 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*;
17 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._SelectQueryIterator;
18 public class TriggerCharacteristics implements _TriggerCharacteristics {
19
20    private PreparedStatementGetter preparedStatementGetter;
21    QualifiedIdentifier table_name;
22
23    ArrayList list_of_triggers_before_insert;
24    ArrayList list_of_triggers_after_insert;
25
26    ArrayList list_of_triggers_before_delete;
27    ArrayList list_of_triggers_after_delete;
28
29    ArrayList list_of_triggers_before_update;
30    ArrayList list_of_triggers_after_update;
31
32
33
34    private boolean rowLevel;
35    String JavaDoc orientation ;
36
37    TreeMap list_of_column_name_triggers;
38    TreeMap list_of_column_name_afterUpdate_triggers;
39    TreeMap list_of_column_name_beforeUpdate_triggers;
40    String JavaDoc[] columnNames ;
41    boolean isSystemTable;
42
43   public TriggerCharacteristics(QualifiedIdentifier table_Name,PreparedStatementGetter preparedStatementGetter0,boolean rowLevel,String JavaDoc[] columnNames) throws DException {
44       isSystemTable = SystemTables.isSystemTable(table_Name.getIdentifier());
45       if(! isSystemTable){
46          this.table_name = table_Name;
47         preparedStatementGetter = preparedStatementGetter0;
48         this.rowLevel = rowLevel;
49         orientation = rowLevel ? SqlKeywords.ROW : SqlKeywords.STATEMENT;
50         this.columnNames = columnNames;
51      }
52   }
53
54    public _Trigger[] getBeforeInsertTriggers() throws DException
55    {
56       if(isSystemTable)
57         return null;
58       if(list_of_triggers_before_insert == null){
59         Object JavaDoc[] parameters = getParametersForTriggerQuery(SqlKeywords.INSERT, SqlKeywords.BEFORE);
60         list_of_triggers_before_insert = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters));
61       }
62       return list_of_triggers_before_insert == null || list_of_triggers_before_insert.size() == 0 ? null
63                          : (TriggerDescriptor[]) list_of_triggers_before_insert.toArray(new TriggerDescriptor[0]);
64    }
65
66    public _Trigger[] getBeforeUpdateTriggers(int[] columns) throws DException
67    {
68
69
70       if(isSystemTable)
71             return null;
72           ArrayList triggersList = get_update_triggers(columns, SqlKeywords.BEFORE);
73       return triggersList == null || triggersList.size() == 0 ? null
74                          : (TriggerDescriptor[]) triggersList.toArray(new TriggerDescriptor[0]);
75    }
76
77    public _Trigger[] getBeforeDeleteTriggers() throws DException
78    {
79       if(isSystemTable)
80         return null;
81       if(list_of_triggers_before_delete == null){
82         Object JavaDoc[] parameters = getParametersForTriggerQuery(SqlKeywords.DELETE, SqlKeywords.BEFORE);
83         list_of_triggers_before_delete = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters));
84       }
85       return list_of_triggers_before_delete == null || list_of_triggers_before_delete.size() == 0 ? null
86                          : (TriggerDescriptor[]) list_of_triggers_before_delete.toArray(new TriggerDescriptor[0]);
87    }
88
89    public _Trigger[] getAfterInsertTriggers() throws DException
90    {
91       if(isSystemTable)
92         return null;
93       if(list_of_triggers_after_insert == null){
94         Object JavaDoc[] parameters = getParametersForTriggerQuery(SqlKeywords.INSERT, SqlKeywords.AFTER);
95         list_of_triggers_after_insert = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters));
96       }
97       return list_of_triggers_after_insert == null || list_of_triggers_after_insert.size() == 0 ? null
98                          : (TriggerDescriptor[]) list_of_triggers_after_insert.toArray(new TriggerDescriptor[0]);
99    }
100
101    public _Trigger[] getAfterUpdateTriggers(int[] columns) throws DException
102    {
103       if(isSystemTable)
104             return null;
105           ArrayList triggersList = get_update_triggers(columns, SqlKeywords.AFTER);
106       return triggersList == null || triggersList.size() == 0 ? null
107                          : (TriggerDescriptor[]) triggersList.toArray(new TriggerDescriptor[0]);
108    }
109
110    public _Trigger[] getAfterDeleteTriggers() throws DException
111    {
112       if(isSystemTable)
113         return null;
114       if(list_of_triggers_after_delete == null){
115        Object JavaDoc[] parameters = getParametersForTriggerQuery(SqlKeywords.DELETE, SqlKeywords.AFTER);
116        list_of_triggers_after_delete = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithEventCondition(),parameters));
117       }
118       return list_of_triggers_after_delete == null || list_of_triggers_after_delete.size() == 0 ? null
119                          : (TriggerDescriptor[]) list_of_triggers_after_delete.toArray(new TriggerDescriptor[0]);
120    }
121
122    private ArrayList get_corresponding_triggers(_SelectQueryIterator iterator) throws DException {
123       ArrayList list_of_triggers = new ArrayList(5);
124       if(iterator == null)
125         return list_of_triggers;
126       if(! iterator.first())
127         return list_of_triggers;
128       do{
129                 Object JavaDoc[] values = (Object JavaDoc[])iterator.getObject();
130          TriggerDescriptor trigger = new TriggerDescriptor();
131          trigger.load_record_from_Array(preparedStatementGetter, values);
132          list_of_triggers.add(trigger);
133       }while(iterator.next());
134       return list_of_triggers;
135    }
136
137     private ArrayList get_update_triggers(int[] columns, String JavaDoc timming) throws DException {
138      HashMap triggersToBeChecked = new HashMap();
139      if(list_of_column_name_triggers == null)
140          intializeUpdateColumnsTriggers();
141       String JavaDoc[] requiredColumns = columns == null ? columnNames : getColumnNames(columns);
142       for (int i = 0; i < requiredColumns.length; i++) {
143         if(list_of_column_name_triggers.containsKey(requiredColumns[i])){
144           ArrayList columns_triggers = get_Corresponding_Column_Triggers(requiredColumns[i],timming);
145           for (int j = 0,len2 = columns_triggers.size(); j < len2; j++) {
146               TriggerDescriptor td = (TriggerDescriptor)columns_triggers.get(j);
147               if(!triggersToBeChecked.containsKey(td.trigger_name))
148                   triggersToBeChecked.put(td.trigger_name,td);
149           }
150         }
151       }
152       ArrayList update_triggers_list = new ArrayList();
153       if( triggersToBeChecked.size() != 0 ){
154       update_triggers_list.addAll(triggersToBeChecked.values());
155     }
156       if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
157        if(list_of_triggers_after_update != null)
158     update_triggers_list.addAll(list_of_triggers_after_update);
159       }
160       else if(list_of_triggers_before_update != null)
161     update_triggers_list.addAll(list_of_triggers_before_update);
162       return update_triggers_list;
163    }
164
165    private ArrayList get_Corresponding_Column_Triggers(String JavaDoc columnName,String JavaDoc timming) throws DException{
166         ArrayList columns_triggers = (ArrayList) (timming.equalsIgnoreCase(SqlKeywords.AFTER)
167                                           ? list_of_column_name_afterUpdate_triggers.get(columnName)
168                                           : list_of_column_name_beforeUpdate_triggers.get(columnName) );
169         if(columns_triggers == null){
170             columns_triggers = new ArrayList();
171             ArrayList trigger_names_List = (ArrayList)list_of_column_name_triggers.get(columnName);
172             for (int i = 0,len1 = trigger_names_List.size(); i < len1; i++) {
173                Object JavaDoc[] trigger_name = (Object JavaDoc[])trigger_names_List.get(i);
174                Object JavaDoc[] parameters = new Object JavaDoc[]{trigger_name[0],trigger_name[1],trigger_name[2],SqlKeywords.UPDATE,orientation,timming};
175                ArrayList corresponding_triggers = get_corresponding_triggers(getIterator(preparedStatementGetter.getTrigersExecuterWithTriggerNameCondition(),parameters));
176                if(corresponding_triggers.size() != 0)
177                   columns_triggers.addAll(corresponding_triggers);
178             }
179             if(timming.equalsIgnoreCase(SqlKeywords.AFTER))
180               list_of_column_name_afterUpdate_triggers.put(columnName,columns_triggers);
181             else
182               list_of_column_name_beforeUpdate_triggers.put(columnName,columns_triggers);
183
184         }
185         return columns_triggers;
186    }
187
188    private void intializeUpdateColumnsTriggers()throws DException{
189       list_of_column_name_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
190       _SelectQueryIterator column_usage_triggers = getIterator(preparedStatementGetter.getTriggeredUpdatedExecuterForAllColumns(),
191                                      new Object JavaDoc[]{table_name.catalog,table_name.schema,table_name.name});
192       ArrayList triggerParamters = new ArrayList();
193       if( column_usage_triggers.first()){
194           list_of_column_name_afterUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
195           list_of_column_name_beforeUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
196           Object JavaDoc[] record = null;
197           do {
198             record= (Object JavaDoc[])column_usage_triggers.getObject();
199             String JavaDoc triggerName = (String JavaDoc)record[SystemTablesFields.triggerUpdateColumn_trigger_name];
200             Object JavaDoc[] parameters = new Object JavaDoc[]{ record[SystemTablesFields.triggerUpdateColumn_trigger_catalog],record[SystemTablesFields.triggerUpdateColumn_trigger_schema],
201                                                    triggerName};
202
203             String JavaDoc columnName = (String JavaDoc)record[SystemTablesFields.triggerUpdateColumn_event_object_column];
204             add_column_name_triggers(columnName, parameters);
205             triggerParamters.add(parameters);
206           }while(column_usage_triggers.next());
207
208       }
209       else
210           triggerParamters.add(new Object JavaDoc[]{null,null,null});
211       Object JavaDoc[][] inParameters = new Object JavaDoc[triggerParamters.size()][];
212       triggerParamters.toArray(inParameters);
213       get_Update_Triggers_From_Triggers(inParameters,SqlKeywords.BEFORE);
214       get_Update_Triggers_From_Triggers(inParameters,SqlKeywords.AFTER);
215    }
216
217    public ArrayList get_Update_Triggers_From_Triggers(Object JavaDoc parameters,String JavaDoc timing) throws DException {
218      if(timing.equalsIgnoreCase(SqlKeywords.BEFORE)){
219        if(list_of_triggers_before_update != null)
220          return list_of_triggers_before_update;
221      }
222      else{
223        if(list_of_triggers_after_update != null)
224          return list_of_triggers_after_update;
225      }
226      _SelectQueryIterator tableRetriever = getIterator(preparedStatementGetter.getTriggerExecuterForUpdateType(),new Object JavaDoc[]{table_name.catalog,table_name.schema,table_name.name,orientation,timing,table_name.catalog,table_name.schema,table_name.name});
227      ArrayList triggersList = get_corresponding_triggers(tableRetriever);
228      if(timing.equalsIgnoreCase(SqlKeywords.BEFORE))
229        list_of_triggers_before_update = triggersList;
230      else
231        list_of_triggers_after_update = triggersList;
232      return triggersList;
233    }
234
235    private void add_column_name_triggers(Object JavaDoc column_name, Object JavaDoc triggers) throws DException{
236       ArrayList list = (ArrayList) list_of_column_name_triggers.get(column_name);
237         if(list == null) {
238         list = new ArrayList();
239         list_of_column_name_triggers.put(column_name, list);
240         }
241       list.add(triggers);
242    }
243
244    private Object JavaDoc[] getParametersForTriggerQuery(String JavaDoc event, String JavaDoc timing) throws DException {
245       return new Object JavaDoc[]{table_name.catalog,table_name.schema,table_name.name,event,orientation,timing};
246    }
247
248     private String JavaDoc[] getColumnNames(int[] columnIndexes) throws DException {
249         String JavaDoc[] columns = null;
250         try {
251             int len = columnIndexes.length;
252             columns = new String JavaDoc[len];
253             for(int i = 0;i< columnIndexes.length;i++)
254                 columns[i] = columnNames[columnIndexes[i]];
255         }
256         catch (Exception JavaDoc ex) {
257         }
258         return columns;
259     }
260
261     public void addTrigger(_Trigger trigger) throws DException {
262       TriggerDescriptor triggerDescriptor = (TriggerDescriptor)trigger;
263       String JavaDoc eventManipulation = triggerDescriptor.event_manipulation;
264       String JavaDoc timming = triggerDescriptor.condition_timing;
265       if(eventManipulation.equalsIgnoreCase(SqlKeywords.INSERT)){
266          if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
267             if(list_of_triggers_after_insert != null){
268                if(!list_of_triggers_after_insert.contains(trigger))
269                  list_of_triggers_after_insert.add(trigger);
270             }
271          }
272          else if(list_of_triggers_before_insert != null){
273                if(!list_of_triggers_before_insert.contains(trigger))
274                  list_of_triggers_before_insert.add(trigger);
275           }
276       }
277       else if(eventManipulation.equalsIgnoreCase(SqlKeywords.DELETE)){
278          if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
279             if(list_of_triggers_after_delete != null)
280                if(!list_of_triggers_after_delete.contains(trigger))
281                list_of_triggers_after_delete.add(trigger);
282          }
283          else if(list_of_triggers_before_delete != null)
284                if(!list_of_triggers_before_delete.contains(trigger))
285                   list_of_triggers_before_delete.add(trigger);
286       }
287       else{
288         ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList;
289         if(triggerColumnsList == null || triggerColumnsList.size() == 0){
290             if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
291                 if(list_of_triggers_after_update != null)
292                    if(!list_of_triggers_after_update.contains(trigger))
293                       list_of_triggers_after_update.add(trigger);
294              }
295              else if(list_of_triggers_before_update != null)
296                    if(!list_of_triggers_before_update.contains(trigger))
297                       list_of_triggers_before_update.add(trigger);
298         }
299         else{
300        /** @todo to be implemented */
301               addUpateColumnsTriggers(triggerDescriptor);
302         }
303       }
304
305     }
306
307
308     private void addUpateColumnsTriggers(TriggerDescriptor triggerDescriptor)throws DException{
309       if(list_of_column_name_triggers == null)
310         return;
311       ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList;
312       String JavaDoc timming = triggerDescriptor.condition_timing;
313       int size = triggerColumnsList.size();
314       for(int i =0;i<size;i++){
315          String JavaDoc triggerColumn = (String JavaDoc)triggerColumnsList.get(i);
316          ArrayList triggersNamesList = null;
317          ArrayList triggersList = null;
318          Object JavaDoc[] triggerName = new Object JavaDoc[]{triggerDescriptor.trigger_catalog,triggerDescriptor.trigger_schema,triggerDescriptor.trigger_name};
319          if(list_of_column_name_triggers.containsKey(triggerColumn)){
320             triggersNamesList = (ArrayList)list_of_column_name_triggers.get(triggerColumn);
321             if(timming.equalsIgnoreCase(SqlKeywords.BEFORE))
322                triggersList = (ArrayList)list_of_column_name_beforeUpdate_triggers.get(triggerColumn);
323             else
324                triggersList = (ArrayList)list_of_column_name_afterUpdate_triggers.get(triggerColumn);
325          }
326          else{
327             triggersList = new ArrayList(5);
328             triggersNamesList = new ArrayList(5);
329             list_of_column_name_triggers.put(triggerColumn,triggersNamesList);
330             if(timming.equalsIgnoreCase(SqlKeywords.BEFORE)){
331                if(list_of_column_name_beforeUpdate_triggers == null){
332                       list_of_column_name_beforeUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
333                       list_of_column_name_afterUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
334                }
335                else
336                      list_of_column_name_beforeUpdate_triggers.put(triggerColumn,triggersList);
337             }
338             else{
339                if(list_of_column_name_afterUpdate_triggers == null){
340                     list_of_column_name_beforeUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
341                     list_of_column_name_afterUpdate_triggers = new TreeMap(String.CASE_INSENSITIVE_ORDER);
342                }
343                else
344                    list_of_column_name_afterUpdate_triggers.put(triggerColumn,triggersList);
345             }
346          }
347           if(!triggersList.contains(triggerDescriptor)){
348             triggersNamesList.add(triggerName);
349             triggersList.add(triggerDescriptor);
350           }
351       }
352     }
353
354     public void removeTrigger(_Trigger trigger) throws DException {
355       TriggerDescriptor triggerDescriptor = (TriggerDescriptor)trigger;
356       String JavaDoc eventManipulation = triggerDescriptor.event_manipulation;
357       String JavaDoc timming = triggerDescriptor.condition_timing;
358       if(eventManipulation.equalsIgnoreCase(SqlKeywords.INSERT)){
359          if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
360             if(list_of_triggers_after_insert != null)
361                list_of_triggers_after_insert.remove(trigger);
362          }
363          else if(list_of_triggers_before_insert != null)
364                list_of_triggers_before_insert.remove(trigger);
365       }
366       else if(eventManipulation.equalsIgnoreCase(SqlKeywords.DELETE)){
367          if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
368             if(list_of_triggers_after_delete != null)
369                list_of_triggers_after_delete.remove(trigger);
370          }
371          else if(list_of_triggers_before_delete != null)
372                list_of_triggers_before_delete.remove(trigger);
373       }
374       else{
375         ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList;
376         if(triggerColumnsList == null || triggerColumnsList.size() == 0){
377             if(timming.equalsIgnoreCase(SqlKeywords.AFTER)){
378                 if(list_of_triggers_after_update != null)
379                    list_of_triggers_after_update.remove(trigger);
380              }
381              else if(list_of_triggers_before_update != null)
382                    list_of_triggers_before_update.remove(trigger);
383         }
384         else{
385       /** @todo to be implemented */
386               removeUpateColumnsTriggers(triggerDescriptor);
387         }
388
389       }
390     }
391
392     private void removeUpateColumnsTriggers(TriggerDescriptor triggerDescriptor)throws DException{
393       if(list_of_column_name_triggers == null)
394         return;
395       ArrayList triggerColumnsList = triggerDescriptor.triggerColumnsList;
396       String JavaDoc timming = triggerDescriptor.condition_timing;
397       int size = triggerColumnsList.size();
398       for(int i =0;i<size;i++){
399          String JavaDoc triggerColumn = (String JavaDoc)triggerColumnsList.get(i);
400          ArrayList triggersList = null;
401          String JavaDoc[] triggerName = new String JavaDoc[]{triggerDescriptor.trigger_catalog,triggerDescriptor.trigger_schema,triggerDescriptor.trigger_name};
402          if(list_of_column_name_triggers.containsKey(triggerColumn)){
403             ArrayList triggersNamesList = (ArrayList)list_of_column_name_triggers.get(triggerColumn);
404             int noOfTriggers = triggersNamesList.size();
405             for(int j =0;j< noOfTriggers;j++){
406               Object JavaDoc[] currentTriggerName = (Object JavaDoc[])triggersNamesList.get(j);
407               if(triggerName[0].equalsIgnoreCase((String JavaDoc)currentTriggerName[0]) &&
408                 triggerName[1].equalsIgnoreCase((String JavaDoc)currentTriggerName[1]) &&
409                 triggerName[2].equalsIgnoreCase((String JavaDoc)currentTriggerName[2]) )
410               {
411                   triggersNamesList.remove(j) ;
412                   break;
413               }
414             }
415             if(timming.equalsIgnoreCase(SqlKeywords.BEFORE))
416                triggersList = (ArrayList)list_of_column_name_beforeUpdate_triggers.get(triggerColumn);
417             else
418                triggersList = (ArrayList)list_of_column_name_afterUpdate_triggers.get(triggerColumn);
419          }
420           triggersList.remove(triggerDescriptor);
421       }
422     }
423
424
425     private void initializeUpdateTriggers()throws DException{
426         _Iterator column_usage_retriever = getIterator(preparedStatementGetter.getTriggeredUpdatedExecuterForAllColumns(), new Object JavaDoc[]{table_name.catalog,table_name.schema,table_name.name});
427     }
428
429
430     private _SelectQueryIterator getIterator(_Executer executer,Object JavaDoc[] parameters) throws DException{
431        return (_SelectQueryIterator) executer.executeForFresh( parameters);
432     }
433 }
434
Popular Tags