1/*
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.tools.internal.ws.wsdl.document;
27
28import com.sun.tools.internal.ws.wsdl.framework.*;
29import com.sun.tools.internal.ws.wsdl.parser.MetadataFinder;
30import com.sun.tools.internal.ws.wscompile.ErrorReceiver;
31
32import javax.xml.namespace.QName;
33import java.util.ArrayList;
34import java.util.Iterator;
35
36/**
37 * A WSDL document.
38 *
39 * @author WS Development Team
40 */
41public class WSDLDocument extends AbstractDocument{
42
43    public WSDLDocument(MetadataFinder forest, ErrorReceiver errReceiver) {
44        super(forest, errReceiver);
45    }
46
47    public Definitions getDefinitions() {
48        return _definitions;
49    }
50
51    public void setDefinitions(Definitions d) {
52        _definitions = d;
53    }
54
55    public QName[] getAllServiceQNames() {
56
57        ArrayList serviceQNames = new ArrayList();
58
59        for (Iterator iter = getDefinitions().services(); iter.hasNext();) {
60            Service next = (Service) iter.next();
61            String targetNamespace = next.getDefining().getTargetNamespaceURI();
62            String localName = next.getName();
63            QName serviceQName = new QName(targetNamespace, localName);
64            serviceQNames.add(serviceQName);
65        }
66        return (QName[]) serviceQNames.toArray(new QName[serviceQNames.size()]);
67    }
68
69    public QName[] getAllPortQNames() {
70        ArrayList portQNames = new ArrayList();
71
72        for (Iterator iter = getDefinitions().services(); iter.hasNext();) {
73            Service next = (Service) iter.next();
74            //Iterator ports = next.ports();
75            for (Iterator piter = next.ports(); piter.hasNext();) {
76                // If it's a relative import
77                Port pnext = (Port) piter.next();
78                String targetNamespace =
79                    pnext.getDefining().getTargetNamespaceURI();
80                String localName = pnext.getName();
81                QName portQName = new QName(targetNamespace, localName);
82                portQNames.add(portQName);
83            }
84        }
85        return (QName[]) portQNames.toArray(new QName[portQNames.size()]);
86    }
87
88    public QName[] getPortQNames(String serviceNameLocalPart) {
89
90        ArrayList portQNames = new ArrayList();
91
92        for (Iterator iter = getDefinitions().services(); iter.hasNext();) {
93            Service next = (Service) iter.next();
94            if (next.getName().equals(serviceNameLocalPart)) {
95                for (Iterator piter = next.ports(); piter.hasNext();) {
96                    Port pnext = (Port) piter.next();
97                    String targetNamespace =
98                        pnext.getDefining().getTargetNamespaceURI();
99                    String localName = pnext.getName();
100                    QName portQName = new QName(targetNamespace, localName);
101                    portQNames.add(portQName);
102                }
103            }
104        }
105        return (QName[]) portQNames.toArray(new QName[portQNames.size()]);
106    }
107
108    public void accept(WSDLDocumentVisitor visitor) throws Exception {
109        _definitions.accept(visitor);
110    }
111
112    @Override
113    public void validate(EntityReferenceValidator validator) {
114        GloballyValidatingAction action =
115            new GloballyValidatingAction(this, validator);
116        withAllSubEntitiesDo(action);
117        if (action.getException() != null) {
118            throw action.getException();
119        }
120    }
121
122    @Override
123    protected Entity getRoot() {
124        return _definitions;
125    }
126
127    private Definitions _definitions;
128
129    private static class GloballyValidatingAction implements EntityAction, EntityReferenceAction {
130        public GloballyValidatingAction(
131            AbstractDocument document,
132            EntityReferenceValidator validator) {
133            _document = document;
134            _validator = validator;
135        }
136
137        @Override
138        public void perform(Entity entity) {
139            try {
140                entity.validateThis();
141                entity.withAllEntityReferencesDo(this);
142                entity.withAllSubEntitiesDo(this);
143            } catch (ValidationException e) {
144                if (_exception == null) {
145                    _exception = e;
146                }
147            }
148        }
149
150        @Override
151        public void perform(Kind kind, QName name) {
152            try {
153                _document.find(kind, name);
154            } catch (NoSuchEntityException e) {
155                // failed to resolve, check with the validator
156                if (_exception == null) {
157                    if (_validator == null
158                        || !_validator.isValid(kind, name)) {
159                        _exception = e;
160                    }
161                }
162            }
163        }
164
165        public ValidationException getException() {
166            return _exception;
167        }
168
169        private ValidationException _exception;
170        private AbstractDocument _document;
171        private EntityReferenceValidator _validator;
172    }
173}
174