package com.sun.tools.xjc.addon.krasa;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import javax.validation.Valid;
import javax.xml.namespace.QName;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.tools.common.ToolConstants;
import org.apache.cxf.tools.common.ToolContext;
import org.apache.cxf.tools.common.ToolException;
import org.apache.cxf.tools.common.model.JAnnotation;
import org.apache.cxf.tools.common.model.JavaInterface;
import org.apache.cxf.tools.common.model.JavaMethod;
import org.apache.cxf.tools.common.model.JavaModel;
import org.apache.cxf.tools.common.model.JavaParameter;
import org.apache.cxf.tools.wsdlto.frontend.jaxws.generators.SEIGenerator;
import org.apache.cxf.tools.wsdlto.frontend.jaxws.processor.WSDLToJavaProcessor;
public class ValidSEIGenerator extends SEIGenerator {
private static final String VALID_PARAM = "VALID_PARAM";
private static final String VALID_RETURN = "VALID_RETURN";
private boolean validIn = true;
private boolean validOut = true;
@Override
public void generate(ToolContext penv) throws ToolException {
parseArguments(penv);
JAnnotation validAnno = new JAnnotation(Valid.class);
Map<QName, JavaModel> map = CastUtils.cast((Map<?, ?>) penv.get(WSDLToJavaProcessor.MODEL_MAP));
for (JavaModel javaModel : map.values()) {
Map<String, JavaInterface> interfaces = javaModel.getInterfaces();
for (JavaInterface intf : interfaces.values()) {
intf.addImport(Valid.class.getCanonicalName());
List<JavaMethod> methods = intf.getMethods();
for (JavaMethod method : methods) {
List<JavaParameter> parameters = method.getParameters();
if (validOut) {
method.addAnnotation(VALID_RETURN, validAnno);
}
for (JavaParameter param : parameters) {
if (validIn && (param.isIN() || param.isINOUT())) {
param.addAnnotation(VALID_PARAM, validAnno);
}
if (validOut && (param.isOUT() || param.isINOUT())) {
param.addAnnotation(VALID_RETURN, validAnno);
}
}
}
}
}
super.generate(penv);
}
private void parseArguments(ToolContext penv) {
if (penv.get(ToolConstants.CFG_XJC_ARGS) != null) {
String[] xjcArgs = (String[]) penv.get(ToolConstants.CFG_XJC_ARGS);
for (String arg : xjcArgs) {
String[] parts = arg.split("=");
if (parts[0].contains(JaxbValidationsPlugins.GENERATE_SERVICE_VALIDATION_ANNOTATIONS)) {
parseValidationPolicy(parts[1]);
}
LOG.log(Level.FINE, "xjc arg:" + arg);
}
}
}
public void parseValidationPolicy(String policy) {
if ("in".equalsIgnoreCase(policy)) {
validOut = false;
} else if ("out".equalsIgnoreCase(policy)) {
validIn = false;
}
}
public String getName() {
return "krasa";
}
}