Skip to main content
summaryrefslogtreecommitdiffstats
blob: 7720768184ebc6e3a3d20e7be4e2e14161314b40 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*******************************************************************************
 * Copyright (c) 2001, 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal.text;

import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.internal.impl.DefinitionImpl;
import org.eclipse.wst.wsdl.internal.impl.WSDLElementImpl;
import org.eclipse.wst.wsdl.internal.impl.XSDSchemaExtensibilityElementImpl;
import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
import org.eclipse.wst.wsdl.util.WSDLConstants;
import org.eclipse.wst.xsd.ui.internal.util.ModelReconcileAdapter;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.impl.XSDSchemaImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


class WSDLModelReconcileAdapter extends ModelReconcileAdapter
{                             
  protected Definition definition;

  public WSDLModelReconcileAdapter(Document document, Definition definition)
  {           
    super(document);
    this.definition = definition;
  } 

  // This method is clever enough to deal with 'bad' documents that happen 
  // to have more than one root element.  It picks of the first 'matching' element.
  //
  // TODO (cs) why aren't we calling this from the WSDLModelAdapter when the model is initialized?
  //
  private Element getDefinitionElement(Document document)
  {
    Element definitionElement = null;    
    for (Node node = document.getFirstChild(); node != null; node = node.getNextSibling())
    {
      if (node.getNodeType() == Node.ELEMENT_NODE)
      {
        Element element = (Element)node;
        if (WSDLEditorUtil.getInstance().getWSDLType(element) == WSDLConstants.DEFINITION)
        {
          definitionElement = element;
          break;
        }
      }
    }
    return definitionElement;
  }
  
  protected void handleNodeChanged(Node node)
  {
    if (node instanceof Element)
    {
      reconcileModelObjectForElement((Element)node);      
    }
    else if (node instanceof Document)
    {
      // The document changed so we may need to fix up the 
      // definition's root element
      Document document = (Document)node;    
      Element definitionElement = getDefinitionElement(document);
      if (definitionElement != null && definitionElement != definition.getElement())
      {   
        // here we handle the case where a new 'definition' element was added
        //(e.g. the file was totally blank and then we type in the root element)        
        // See Bug 5366
        //
        if (definitionElement.getLocalName().equals(WSDLConstants.DEFINITION_ELEMENT_TAG))         
        {  
          //System.out.println("****** Setting new definition");
          definition.setElement(definitionElement);
        }
      }      
      else if (definitionElement != null)
      {       
        // handle the case where the definition element's content has changed
        // 
        ((DefinitionImpl)definition).elementChanged(definitionElement);
      }      
      else if (definitionElement == null)
      {
        // if there's no definition element clear out the WSDL
        //
        ((DefinitionImpl)definition).removeAll();
        
        // The removeAll() call does not remove namespaces as well and the model
        // does not reconcile well in this case. Also reset the definition name and target
        // namespace.
        
        definition.getNamespaces().clear();
        definition.setQName(null);
        definition.setTargetNamespace(null);
        
        // Reset the document because removeAll() sets the document to null as well.
        definition.setDocument(document);
      }
    }         
  }
       
  private void reconcileModelObjectForElement(Element element)
  {
    Object modelObject = WSDLEditorUtil.getInstance().findModelObjectForElement(definition, element);  
    if (modelObject != null)
    {
      if (modelObject instanceof XSDSchemaExtensibilityElementImpl)
      {
        XSDSchemaExtensibilityElementImpl ee = (XSDSchemaExtensibilityElementImpl)modelObject;
        ((XSDSchemaImpl)ee.getSchema()).elementChanged(element);
        ee.elementChanged(element);            
      }   
      else if (modelObject instanceof WSDLElementImpl)
      {
        ((WSDLElementImpl)modelObject).elementChanged(element);
      }
      else if (modelObject instanceof XSDConcreteComponent)
      {
        ((XSDConcreteComponent)modelObject).elementChanged(element);        
      }  
    }     
  }  

  /**
   * @deprecated
   */
  protected void reconcileModelObjectForElement(Element element, int eventType, Object feature, Object oldValue, Object newValue, int index)
  {                                          
    reconcileModelObjectForElement(element);
  }  
  
  public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty)
  {
    if (!isDirty)
    {  
      // cs : At this time (when a save occurs) it's a good opportunity
      // to update the model to ensure it's in sync with the source. 
      // That way if the incremental sync between DOM and model has gotten
      // the model out of whack we'll be able to put things right at this point.
      //   
      // TODO (cs) need to do more to ensure model is sync'd up properly      
      ((DefinitionImpl)definition).reconcileReferences(true);
    }
  }
}

Back to the top