001: package org.objectweb.celtix.tools.processors.wsdl2.internal;
002:
003: import java.util.Collection;
004: import java.util.Map;
005:
006: import javax.wsdl.Fault;
007: import javax.wsdl.Message;
008: import javax.wsdl.Part;
009:
010: import com.sun.tools.xjc.api.S2JJAXBModel;
011:
012: import org.objectweb.celtix.tools.common.ProcessorEnvironment;
013: import org.objectweb.celtix.tools.common.ToolConstants;
014: import org.objectweb.celtix.tools.common.ToolException;
015: import org.objectweb.celtix.tools.common.model.JavaException;
016: import org.objectweb.celtix.tools.common.model.JavaExceptionClass;
017: import org.objectweb.celtix.tools.common.model.JavaField;
018: import org.objectweb.celtix.tools.common.model.JavaMethod;
019: import org.objectweb.celtix.tools.common.model.JavaModel;
020: import org.objectweb.celtix.tools.utils.ProcessorUtil;
021:
022: public class FaultProcessor extends AbstractProcessor {
023:
024: public FaultProcessor(ProcessorEnvironment penv) {
025: super (penv);
026: }
027:
028: public void process(JavaMethod method, Map<String, Fault> faults)
029: throws ToolException {
030: if (faults == null) {
031: return;
032: }
033:
034: Collection<Fault> faultsValue = faults.values();
035: for (Fault fault : faultsValue) {
036: processFault(method, fault);
037: }
038: }
039:
040: private boolean isNameCollision(String packageName, String className) {
041: boolean collision = collector.containTypesClass(packageName,
042: className)
043: || collector.containSeiClass(packageName, className);
044: return collision;
045: }
046:
047: @SuppressWarnings("unchecked")
048: private void processFault(JavaMethod method, Fault fault)
049: throws ToolException {
050: JavaModel model = method.getInterface().getJavaModel();
051: Message faultMessage = fault.getMessage();
052: String name = ProcessorUtil.mangleNameToClassName(faultMessage
053: .getQName().getLocalPart());
054: String namespace = faultMessage.getQName().getNamespaceURI();
055: String packageName = ProcessorUtil.parsePackageName(namespace,
056: env.mapPackageName(namespace));
057:
058: while (isNameCollision(packageName, name)) {
059: name = name + "_Exception";
060: }
061:
062: collector.addExceptionClassName(packageName, name, packageName
063: + "." + name);
064:
065: method.addException(new JavaException(name, name, namespace));
066:
067: Map<String, Part> faultParts = faultMessage.getParts();
068: Collection<Part> faultValues = faultParts.values();
069:
070: JavaExceptionClass expClass = new JavaExceptionClass(model);
071: expClass.setName(name);
072: expClass.setNamespace(namespace);
073: expClass.setPackageName(packageName);
074: S2JJAXBModel jaxbModel = (S2JJAXBModel) env
075: .get(ToolConstants.RAW_JAXB_MODEL);
076: for (Part part : faultValues) {
077:
078: String fName = part.getName();
079: String fType = ProcessorUtil.resolvePartType(part,
080: jaxbModel);
081: String fNamespace = ProcessorUtil
082: .resolvePartNamespace(part);
083: String fPackageName = ProcessorUtil.parsePackageName(
084: fNamespace, env.mapPackageName(fNamespace));
085:
086: JavaField fField = new JavaField(fName, fType, fNamespace);
087: fField.setQName(ProcessorUtil.getElementName(part));
088:
089: if (!method.getInterface().getPackageName().equals(
090: fPackageName)) {
091: fField.setClassName(fPackageName + "." + fType);
092: }
093: if (!fType.equals(ProcessorUtil.resolvePartType(part))) {
094: fField.setClassName(ProcessorUtil.resolvePartType(part,
095: jaxbModel, true));
096: }
097:
098: expClass.addField(fField);
099: }
100: model.addExceptionClass(name, expClass);
101: }
102: }
|