| /******************************************************************************* |
| * Copyright (c) 2009 Shane Clarke. |
| * 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: |
| * Shane Clarke - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.ws.internal.jaxws.core.annotations.validation; |
| |
| import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.PARAMETER_STYLE; |
| import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.STYLE; |
| import static org.eclipse.jst.ws.internal.jaxws.core.utils.JAXWSUtils.USE; |
| |
| import java.util.Collection; |
| |
| import javax.jws.soap.SOAPBinding; |
| import javax.jws.soap.SOAPBinding.ParameterStyle; |
| import javax.jws.soap.SOAPBinding.Style; |
| import javax.jws.soap.SOAPBinding.Use; |
| |
| import org.eclipse.jst.ws.annotations.core.processor.AbstractAnnotationProcessor; |
| import org.eclipse.jst.ws.annotations.core.utils.AnnotationUtils; |
| import org.eclipse.jst.ws.internal.jaxws.core.JAXWSCoreMessages; |
| |
| import com.sun.mirror.declaration.AnnotationMirror; |
| import com.sun.mirror.declaration.AnnotationTypeDeclaration; |
| import com.sun.mirror.declaration.Declaration; |
| import com.sun.mirror.declaration.MethodDeclaration; |
| import com.sun.mirror.declaration.TypeDeclaration; |
| |
| public class SOAPBindingRules extends AbstractAnnotationProcessor { |
| |
| @Override |
| public void process() { |
| AnnotationTypeDeclaration soapBindingDeclaration = (AnnotationTypeDeclaration) environment |
| .getTypeDeclaration(SOAPBinding.class.getName()); |
| |
| Collection<Declaration> annotatedTypes = environment |
| .getDeclarationsAnnotatedWith(soapBindingDeclaration); |
| |
| for (Declaration declaration : annotatedTypes) { |
| checkForEncodedUse(declaration); |
| if (declaration instanceof TypeDeclaration) { |
| checkForRPCBareOnTypeDeclaration((TypeDeclaration) declaration); |
| } |
| |
| if (declaration instanceof MethodDeclaration) { |
| checkForRPCStyleOnMethodDeclaration((MethodDeclaration) declaration); |
| } |
| } |
| } |
| |
| private void checkForRPCBareOnTypeDeclaration(TypeDeclaration typeDeclaration) { |
| AnnotationMirror soapBinding = AnnotationUtils.getAnnotation(typeDeclaration, SOAPBinding.class); |
| String style = AnnotationUtils.getStringValue(soapBinding, STYLE); |
| if (style != null && style.equals(Style.RPC.toString())) { |
| String parameterStyle = AnnotationUtils.getStringValue(soapBinding, PARAMETER_STYLE); |
| if (parameterStyle != null && parameterStyle.equals(ParameterStyle.BARE.toString())) { |
| printError(soapBinding.getPosition(), JAXWSCoreMessages.SOAPBINDING_RPC_NO_BARE_PARAMETER_STYLE); |
| } |
| // check for Document style @SOAPBinding on methods |
| Collection<? extends MethodDeclaration> methodDeclarations = typeDeclaration.getMethods(); |
| for (MethodDeclaration methodDeclaration : methodDeclarations) { |
| AnnotationMirror soapBinding2 = AnnotationUtils.getAnnotation(methodDeclaration, SOAPBinding.class); |
| if (soapBinding2 != null) { |
| String style2 = AnnotationUtils.getStringValue(soapBinding2, STYLE); |
| if (style2 == null || style2.equals(Style.DOCUMENT.toString())) { |
| printError(soapBinding2.getPosition(), JAXWSCoreMessages.SOAPBINDING_NO_MIXED_BINDINGS); |
| } |
| } |
| } |
| } |
| } |
| |
| private void checkForEncodedUse(Declaration declaration) { |
| AnnotationMirror soapBinding = AnnotationUtils.getAnnotation(declaration, SOAPBinding.class); |
| String use = AnnotationUtils.getStringValue(soapBinding, USE); |
| if (use != null && use.equals(Use.ENCODED.toString())) { |
| String style = AnnotationUtils.getStringValue(soapBinding, STYLE); |
| if (style == null || style.equals(Style.DOCUMENT.toString())) { |
| printError(soapBinding.getPosition(), JAXWSCoreMessages.SOAPBINDING_DOCUMENT_ENCODED_NOT_SUPPORTED); |
| } else { |
| printError(soapBinding.getPosition(), JAXWSCoreMessages.SOAPBINDING_RPC_ENCODED_NOT_SUPPORTED); |
| } |
| } |
| } |
| |
| private void checkForRPCStyleOnMethodDeclaration(MethodDeclaration methodDeclaration) { |
| AnnotationMirror soapBinding = AnnotationUtils.getAnnotation(methodDeclaration, SOAPBinding.class); |
| String style = AnnotationUtils.getStringValue(soapBinding, STYLE); |
| if (style != null && style.equals(Style.RPC.toString())) { |
| printFixableError(soapBinding.getPosition(), |
| JAXWSCoreMessages.SOAPBINDING_NO_RPC_STYLE_ON_METHODS); |
| } |
| } |
| } |