01: /*
02: * The contents of this file are subject to the terms of the Common Development
03: * and Distribution License (the License). You may not use this file except in
04: * compliance with the License.
05: *
06: * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
07: * or http://www.netbeans.org/cddl.txt.
08: *
09: * When distributing Covered Code, include this CDDL Header Notice in each file
10: * and include the License file at http://www.netbeans.org/cddl.txt.
11: * If applicable, add the following below the CDDL Header, with the fields
12: * enclosed by brackets [] replaced by your own identifying information:
13: * "Portions Copyrighted [year] [name of copyright owner]"
14: *
15: * The Original Software is NetBeans. The Initial Developer of the Original
16: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17: * Microsystems, Inc. All Rights Reserved.
18: */
19:
20: /**
21: *
22: */package org.netbeans.modules.bpel.model.xam.spi;
23:
24: import org.netbeans.modules.bpel.model.api.events.ChangeEvent;
25: import org.netbeans.modules.bpel.model.api.events.VetoException;
26:
27: /**
28: * This interface could be implemented by various inner services for model. F.e.
29: * it could be used for setting UIDs for entities after creation, copying, cut.
30: * May be used for saving information from one entity ( with children ) for
31: * setting it to another entity ( after cut f.e. ). Any such service should
32: * implement this interface and put as service in META-INF. It will be loaded
33: * and each OM modification will be handled by those services.
34: *
35: * Please note that each class that implements this interface will be one
36: * for IDE, not one for each BPEL model. So you should care about race conditions
37: * in implementation. Because any model when it call methods of this interface
38: * will be locked exclusively. But this lock is per model. Not global lock.
39: * So there is possibility to change something from other thread from other model
40: * impl in the same instance of impl.
41: * This means that you should care about saving "context" information
42: * when method is called. You need either not hold any context at all or
43: * hold this context in ThreadLocal variables.
44: *
45: * @author ads
46: */
47: public interface InnerEventDispatcher {
48:
49: /**
50: * This method called for checking either we need to call this visitor for
51: * <code>event</code>.
52: *
53: * @param event
54: * Fired event.
55: * @return Is applicable this visitor for <code>event</code>.
56: */
57: boolean isApplicable(ChangeEvent event);
58:
59: /**
60: * This method will be called before action on model will be performed. This
61: * method could throw VetoException. It should not throw any exception on
62: * events about accessing to children ( setting/adding/removing child in
63: * parent ). This is because OM doesn't have methods that could be
64: * incorrectly used. Only setting incorrect attribute value could throw such
65: * exception.
66: *
67: * @param event
68: * Event that will be fired after OM will be changed. It is not
69: * yet happened.
70: * @throws VetoException {@link VetoException}
71: * Could be thrown if event is rejected by visitor.
72: */
73: void preDispatch(ChangeEvent event) throws VetoException;
74:
75: /**
76: * This method will be called after action on model was performed. It could
77: * perform additional changes in OM based on event information. F.e. it
78: * could change name of attribute that reference to some entity by name and
79: * this name was changed.
80: *
81: *
82: * @param event
83: * Event that fired by OM after change was performed.
84: */
85: void postDispatch(ChangeEvent event);
86:
87: /**
88: * This method is called when some exception is detected in
89: * one of dispatchers. Then all dispatchers that collect
90: * some information on preDispatch stage can clear this information.
91: *
92: * Suggested use - when one of inner dispatchers throws VetoException
93: * then all diaspatchers need to clean internal state, because
94: * postDispatch will never be called.
95: * @param event Event that fired by OM after change was performed.
96: */
97: void reset(ChangeEvent event);
98: }
|