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 }