Skip to main content
summaryrefslogtreecommitdiffstats
blob: 6dc2435dfe7e8074ec65b8ad2ae8acecd574f5fd (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
/*******************************************************************************
 * Copyright (c) 2002-2005 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 - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsi.internal.core.xml.schema;

import java.util.List;

import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.util.TestUtils;
import org.eclipse.wst.wsi.internal.core.xml.XMLUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * This class processes target namespaces. Note this class is a specialization
 * of org.wsi.xml.schema.XMLSchemaProcessor.
 * 
 * @author Peter Brittenham (peterbr@us.ibm.com)
 * @version 1.0.1
 */
public class TargetNamespaceProcessor extends XMLSchemaProcessor
{

  /**
   * Constructor for TargetNamespaceProcess.
   * 
   * @param context
   *            document context
   * @param documentList
   *            cache of previously parsed documents
   */
  public TargetNamespaceProcessor(String context)
  {
    super(context, false);
  }

  protected void processSchema(Element element)
  {
    String tns = null;
    Attr attr = XMLUtils.getAttribute(element, ATTR_XSD_TARGETNAMESPACE);

    // If the attribute was found and value is not null, then add it to the list
    if ((attr != null) && ((tns = attr.getValue()) != null))
    {
      // Add the targetNamespace to the return list
      returnList.add(tns);
    }
  }

  /**
   * Search for all schema elements, load the xsd documents, and then process
   * them.
   * 
   * @param node
   *            node.
   * @return a list.
   * @throws WSIException
   *             if the XML schema file is not found or if it is not formatted
   *             correctly.
   */
  public List processAllSchema(Node node) throws WSIException
  {
    return processAllSchema(node, context);
  }

  /**
   * Search for all schema elements, load the xsd documents, and then process
   * them.
   * 
   * @param node
   *            node.
   * @return a list.
   * @throws WSIException
   *             if the XML schema file is not found or if it is not formatted
   *             correctly.
   */
  private List processAllSchema(Node node, String ctx) throws WSIException
  {
	ClassLoader currentLoader = Thread.currentThread().getContextClassLoader();   
	try
	{
   	  Thread.currentThread().setContextClassLoader(XMLUtils.class.getClassLoader());   
	
      // if xsd:schema element is found -> process schema
      if (XMLUtils.equals(node, ELEM_XSD_SCHEMA))
      {
        processSchema((Element) node);

        Node n = node.getFirstChild();
        while (n != null)
        {
          if (Node.ELEMENT_NODE == n.getNodeType()&& XMLUtils.equals(n, ELEM_XSD_IMPORT))
          {
            Attr schemaLocation = XMLUtils.getAttribute((Element) n, ATTR_XSD_SCHEMALOCATION);

            // Try to parse imported XSD
            if (schemaLocation != null && schemaLocation.getValue() != null)
            {
         	  if (!schemaLocations.contains(schemaLocation.getValue()))
          	  {
                schemaLocations.add(schemaLocation.getValue());
                try
                {
                  // Read and pParse the XML schema document
                  Document document = parseXMLDocumentURL(schemaLocation.getValue(), ctx, TestUtils.getXMLSchemaLocation());
                  processAllSchema(document.getDocumentElement(), XMLUtils.createURLString(schemaLocation.getValue(), ctx));
                }
                catch (WSIException e)
                {
                  if (throwException) throw e;
                }
                catch (Throwable t)
               {
                 // NOTE: An exception will occur if the XML schema file is not
  			     // found or if it is not formatted correctly
                 if (throwException) throw new WSIException(t.getMessage(), t);
               }
             }
           }
         }
         n = n.getNextSibling();
       }
     }

     // Return list created by the class that extends this class
     return returnList;
    }
    finally
    { 
      Thread.currentThread().setContextClassLoader(currentLoader);
    }    
}
}

Back to the top