1 /**
2 *
3 * Copyright 2003-2004 The Apache Software Foundation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.geronimo.webservices;
18
19 import java.util.ArrayList;
20 import java.util.Map;
21 import javax.wsdl.*;
22 import javax.wsdl.extensions.soap.SOAPBinding;
23 import javax.wsdl.extensions.soap.SOAPBody;
24 import javax.xml.namespace.QName;
25
26 import org.apache.geronimo.validator.ValidationContext;
27 import org.apache.geronimo.validator.ValidationFailure;
28
29 public class LightWeightMappingValidator extends WSDLVisitor {
30
31 private ArrayList operationNames;
32 private ValidationContext context;
33
34 private static final QName XSD_STRING = new QName("http://www.w3.org/2001/XMLSchema", "string");
35
36 public LightWeightMappingValidator(Definition definition) {
37 super(definition);
38 }
39
40 public ValidationContext validate() {
41 if (context == null) {
42 context = new ValidationContext(definition.getQName().toString());
43 walkTree();
44 }
45 return context;
46 }
47
48 public boolean isValid() {
49 ValidationContext context = validate();
50 return !context.hasFailures() && !context.hasErrors();
51 }
52
53 protected void begin() {
54 operationNames = new ArrayList();
55 }
56
57 protected void visit(Definition definition) {
58 if (definition.getServices().values().size() != 1) {
59 context.addFailure(new ValidationFailure("A lightweight RPC/Encoded service must contain only one Service"));
60 }
61 }
62
63 protected void visit(Output output) {
64 Map outputParts = output.getMessage().getParts();
65 if (outputParts.size() != 0 && outputParts.size() != 1) {
66 context.addFailure(new ValidationFailure("The output message must contain zero or one parts: " + output.getName()));
67 }
68
69 }
70
71 protected void visit(Operation operation) {
72 if (!operationNames.add(operation.getName())) {
73 context.addFailure(new ValidationFailure("No two operations can have the same name: " + operation.getName()));
74 }
75 }
76
77 protected void visit(Fault fault) {
78 Part message = fault.getMessage().getPart("message");
79 if (message == null) {
80 context.addFailure(new ValidationFailure("The fault message must contain one part named 'message' : " + fault.getName()));
81 } else if (!XSD_STRING.equals(message.getTypeName())) {
82 context.addFailure(new ValidationFailure("The fault message must contain one part of type 'xsd:string' : " + fault.getName()));
83 }
84 }
85
86
87 protected void visit(BindingInput bindingInput) {
88 SOAPBody body = getSOAPBody(bindingInput.getExtensibilityElements());
89 String encoding = body.getUse();
90 if (encoding == null || !encoding.equals("encoded")) {
91 context.addFailure(new ValidationFailure("The use attribute of the binding input operation must be 'encoded': " + bindingInput.getName()));
92 }
93 }
94
95 protected void visit(BindingOutput bindingOutput) {
96 SOAPBody body = getSOAPBody(bindingOutput.getExtensibilityElements());
97 String encoding = body.getUse();
98 if (encoding == null || !encoding.equals("encoded")) {
99 context.addFailure(new ValidationFailure("The use attribute of the binding output operation must be 'encoded': " + bindingOutput.getName()));
100 }
101 }
102
103 protected void visit(BindingFault bindingFault) {
104 SOAPBody body = getSOAPBody(bindingFault.getExtensibilityElements());
105 String encoding = body.getUse();
106 if (encoding == null || !encoding.equals("encoded")) {
107 context.addFailure(new ValidationFailure("The use attribute of the binding fault operation must be 'encoded': " + bindingFault.getName()));
108 }
109 }
110
111 protected void visit(Binding binding) {
112 SOAPBinding soapBinding = getSOAPBinding(binding);
113 if (soapBinding == null || soapBinding.getStyle() == null || !soapBinding.getStyle().equals("rpc")) {
114 context.addFailure(new ValidationFailure("The messaging style of the binding must be rpc: " + binding.getQName()));
115 }
116 }
117
118 protected void visit(Service service) {
119 if (service.getPorts().values().size() != 1) {
120 context.addFailure(new ValidationFailure("A lightweight RPC/Encoded service must contain only one Port"));
121 }
122 }
123 }