001: /*
002: * The contents of this file are subject to the terms of the Common Development
003: * and Distribution License (the License). You may not use this file except in
004: * compliance with the License.
005: *
006: * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
007: * or http://www.netbeans.org/cddl.txt.
008: *
009: * When distributing Covered Code, include this CDDL Header Notice in each file
010: * and include the License file at http://www.netbeans.org/cddl.txt.
011: * If applicable, add the following below the CDDL Header, with the fields
012: * enclosed by brackets [] replaced by your own identifying information:
013: * "Portions Copyrighted [year] [name of copyright owner]"
014: *
015: * The Original Software is NetBeans. The Initial Developer of the Original
016: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
017: * Microsystems, Inc. All Rights Reserved.
018: */
019: package org.netbeans.modules.bpel.mapper.multiview;
020:
021: import java.util.ArrayList;
022: import java.util.EventObject;
023: import java.util.List;
024: import javax.swing.SwingUtilities;
025: import org.netbeans.modules.bpel.model.api.BpelModel;
026: import org.netbeans.modules.bpel.model.api.events.ArrayUpdateEvent;
027: import org.netbeans.modules.bpel.model.api.events.ChangeEvent;
028: import org.netbeans.modules.bpel.model.api.events.ChangeEventListener;
029: import org.netbeans.modules.bpel.model.api.events.EntityInsertEvent;
030: import org.netbeans.modules.bpel.model.api.events.EntityRemoveEvent;
031: import org.netbeans.modules.bpel.model.api.events.EntityUpdateEvent;
032: import org.netbeans.modules.bpel.model.api.events.PropertyRemoveEvent;
033: import org.netbeans.modules.bpel.model.api.events.PropertyUpdateEvent;
034: import org.netbeans.modules.xml.schema.model.SchemaComponent;
035: import org.netbeans.modules.xml.schema.model.SchemaModel;
036: import org.netbeans.modules.xml.wsdl.model.Message;
037: import org.netbeans.modules.xml.wsdl.model.Part;
038: import org.netbeans.modules.xml.wsdl.model.WSDLModel;
039: import org.netbeans.modules.xml.xam.ComponentEvent;
040: import org.netbeans.modules.xml.xam.ComponentListener;
041:
042: /**
043: * Listen to the changes in the BPEL model and synchronize the mapper view.
044: * Now it actually only initialize full reload of the mapper.
045: *
046: * @author nk160297
047: */
048: public class BpelModelSynchListener implements Runnable,
049: ChangeEventListener, ComponentListener {
050: private BpelModel bpelModel;
051: private List<WSDLModel> wsdlModels;
052: private List<SchemaModel> schemaModels;
053: private DesignContextController mController;
054:
055: private EventObject scheduledEvent = null;
056:
057: /** Creates a new instance of DesignContextSynchronizationListener */
058: public BpelModelSynchListener(DesignContextController controller) {
059: assert controller != null;
060: mController = controller;
061: }
062:
063: public void processDataObject(Object dataObject) {
064: if (dataObject instanceof SchemaComponent) {
065: register(((SchemaComponent) dataObject).getModel());
066: } else if (dataObject instanceof Part) {
067: register(((Part) dataObject).getModel());
068: } else if (dataObject instanceof Message) {
069: register(((Message) dataObject).getModel());
070: }
071: }
072:
073: public void register(BpelModel bpelModel) {
074: if (this .bpelModel != bpelModel) {
075: if (this .bpelModel != null) {
076: this .bpelModel.removeEntityChangeListener(this );
077: }
078:
079: if (bpelModel != null) {
080: bpelModel.addEntityChangeListener(this );
081: }
082:
083: this .bpelModel = bpelModel;
084: }
085: }
086:
087: public void register(WSDLModel wsdlModel) {
088: if (wsdlModel == null) {
089: return;
090: }
091:
092: if (wsdlModels == null) {
093: wsdlModels = new ArrayList<WSDLModel>();
094: }
095:
096: if (!wsdlModels.contains(wsdlModel)) {
097: wsdlModels.add(wsdlModel);
098: wsdlModel.addComponentListener(this );
099: }
100: }
101:
102: public void register(SchemaModel schemaModel) {
103: if (schemaModel == null) {
104: return;
105: }
106:
107: if (schemaModels == null) {
108: schemaModels = new ArrayList<SchemaModel>();
109: }
110:
111: if (!schemaModels.contains(schemaModel)) {
112: schemaModels.add(schemaModel);
113: schemaModel.addComponentListener(this );
114: }
115: }
116:
117: public void unregisterAll() {
118: if (bpelModel != null) {
119: bpelModel.removeEntityChangeListener(this );
120: bpelModel = null;
121: }
122:
123: if (wsdlModels != null) {
124: for (WSDLModel model : wsdlModels) {
125: model.removeComponentListener(this );
126: }
127: wsdlModels.clear();
128: wsdlModels = null;
129: }
130:
131: if (schemaModels != null) {
132: for (SchemaModel model : schemaModels) {
133: model.removeComponentListener(this );
134: }
135: schemaModels.clear();
136: schemaModels = null;
137: }
138: }
139:
140: public void valueChanged(ComponentEvent event) {
141: reloadMapper(event);
142: }
143:
144: public void childrenAdded(ComponentEvent event) {
145: reloadMapper(event);
146: }
147:
148: public void childrenDeleted(ComponentEvent event) {
149: reloadMapper(event);
150: }
151:
152: public void notifyPropertyUpdated(PropertyUpdateEvent event) {
153: reloadMapper(event);
154: }
155:
156: public void notifyArrayUpdated(ArrayUpdateEvent event) {
157: }
158:
159: public void notifyEntityInserted(EntityInsertEvent event) {
160: reloadMapper(event);
161: }
162:
163: public void notifyEntityRemoved(EntityRemoveEvent event) {
164: reloadMapper(event);
165: }
166:
167: public void notifyEntityUpdated(EntityUpdateEvent event) {
168: reloadMapper(event);
169: }
170:
171: public void notifyPropertyRemoved(PropertyRemoveEvent event) {
172: reloadMapper(event);
173: }
174:
175: /**
176: * Reloads mapper on event from bpel model
177: */
178: private void reloadMapper(final ChangeEvent event) {
179: if (!event.isLastInAtomic())
180: return;
181:
182: if (SwingUtilities.isEventDispatchThread()) {
183: if (bpelModel != null) {
184: mController.reloadMapper(event);
185: }
186: } else {
187: SwingUtilities.invokeLater(new Runnable() {
188: public void run() {
189: if (bpelModel != null) {
190: mController.reloadMapper(event);
191: }
192: }
193: });
194: }
195: }
196:
197: /**
198: * Reloads mapper on event from WSDL or schema model
199: */
200: private void reloadMapper(ComponentEvent event) {
201: synchronized (this ) {
202: if (scheduledEvent == null) {
203: scheduledEvent = event;
204: SwingUtilities.invokeLater(this );
205: }
206: }
207: }
208:
209: public void run() {
210: EventObject event;
211:
212: synchronized (this) {
213: event = scheduledEvent;
214: scheduledEvent = null;
215: }
216:
217: if (event != null && bpelModel != null) {
218: mController.reloadMapper(event);
219: }
220: }
221: }
|