/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.tools.validator.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.wsdl.Binding;
import javax.wsdl.BindingOperation;
import javax.wsdl.Definition;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.mime.MIMEContent;
import javax.wsdl.extensions.mime.MIMEMultipartRelated;
import javax.wsdl.extensions.mime.MIMEPart;
import org.apache.cxf.binding.soap.SOAPBindingUtil;
import org.apache.cxf.helpers.CastUtils;
public class MIMEBindingValidator
extends AbstractDefinitionValidator {
public MIMEBindingValidator(Definition def) {
super(def);
}
public boolean isValid() {
Collection<Binding> bindings = CastUtils.cast(def.getBindings().values());
for (Binding binding : bindings) {
Collection<BindingOperation> bindingOps = CastUtils.cast(binding.getBindingOperations());
for (BindingOperation bindingOperation : bindingOps) {
if (bindingOperation.getBindingInput() == null) {
continue;
}
Collection<ExtensibilityElement> exts = CastUtils.cast(bindingOperation
.getBindingInput()
.getExtensibilityElements());
for (ExtensibilityElement extElement : exts) {
if (extElement instanceof MIMEMultipartRelated
&& !doValidate((MIMEMultipartRelated)extElement,
bindingOperation.getName())) {
return false;
}
}
}
}
return true;
}
private boolean doValidate(MIMEMultipartRelated mimeExt, String operationName) {
boolean gotRootPart = false;
List<MIMEPart> parts = CastUtils.cast(mimeExt.getMIMEParts());
for (MIMEPart mPart : parts) {
List<MIMEContent> mimeContents = new ArrayList<>();
List<ExtensibilityElement> extns = CastUtils.cast(mPart.getExtensibilityElements());
for (ExtensibilityElement extElement : extns) {
if (SOAPBindingUtil.isSOAPBody(extElement)) {
if (gotRootPart) {
addErrorMessage("Operation("
+ operationName
+ "): There's more than one soap body mime part"
+ " in its binding input");
return false;
}
gotRootPart = true;
} else if (extElement instanceof MIMEContent) {
mimeContents.add((MIMEContent)extElement);
}
}
if (!doValidateMimeContentPartNames(mimeContents, operationName)) {
return false;
}
}
if (!gotRootPart) {
addErrorMessage("Operation("
+ operationName
+ "): There's no soap body in mime part"
+ " in its binding input");
return false;
}
return true;
}
private boolean doValidateMimeContentPartNames(List<MIMEContent> mimeContents,
String operationName) {
// validate mime:content(s) in the mime:part as per R2909
String partName = null;
for (MIMEContent mimeContent : mimeContents) {
String mimeContnetPart = mimeContent.getPart();
if (mimeContnetPart == null) {
addErrorMessage("Operation("
+ operationName
+ "): Must provide part attribute value for meme:content elements");
return false;
} else {
if (partName == null) {
partName = mimeContnetPart;
} else {
if (!partName.equals(mimeContnetPart)) {
addErrorMessage("Operation("
+ operationName
+ "): Part attribute value for meme:content "
+ "elements are different");
return false;
}
}
}
}
return true;
}
}