in tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/SourceGenerator.java [633:800]
private void writeResourceMethod(Element methodEl,
String classPackage,
Set<String> imports,
StringBuilder sbCode,
ContextInfo info,
boolean isRoot,
String currentPath,
Map<String, Integer> methodNameMap) {
//CHECKSTYLE:ON: ParameterNumber
StringBuilder sbMethodCode = sbCode;
StringBuilder sbMethodDocs = null;
StringBuilder sbMethodRespDocs = null;
boolean doCreateJavaDocs = isJavaDocNeeded(info);
if (doCreateJavaDocs) {
sbMethodCode = new StringBuilder();
sbMethodDocs = startMethodDocs(methodEl);
sbMethodRespDocs = new StringBuilder();
}
boolean isResourceElement = "resource".equals(methodEl.getLocalName());
Element resourceEl = isResourceElement ? methodEl : (Element)methodEl.getParentNode();
List<Element> responseEls = getWadlElements(methodEl, "response");
List<Element> requestEls = getWadlElements(methodEl, "request");
Element firstRequestEl = !requestEls.isEmpty() ? requestEls.get(0) : null;
List<Element> allRequestReps = getWadlElements(firstRequestEl, "representation");
List<Element> requestRepsWithElements = new ArrayList<>();
boolean duplicatesAvailable =
getRepsWithElements(allRequestReps, requestRepsWithElements, info.getGrammarInfo());
String methodName = methodEl.getAttribute("name");
final String methodNameLowerCase = methodName.toLowerCase();
String idAttribute = methodEl.getAttribute("id");
final String id = idAttribute.isEmpty() ? methodNameLowerCase : idAttribute;
final boolean responseRequired = isMethodMatched(responseMethods, methodNameLowerCase, id);
final boolean suspendedAsync = !responseRequired
&& isMethodMatched(suspendedAsyncMethods, methodNameLowerCase, id);
final boolean oneway = isMethodMatched(onewayMethods, methodNameLowerCase, id);
boolean jaxpSourceRequired = requestRepsWithElements.size() > 1 && !supportMultipleRepsWithElements;
int numOfMethods = jaxpSourceRequired ? 1 : requestRepsWithElements.size();
for (int i = 0; i < numOfMethods; i++) {
List<Element> requestReps = allRequestReps;
Element requestRepWithElement = requestRepsWithElements.get(i);
String suffixName = "";
if (supportMultipleRepsWithElements && requestRepWithElement != null
&& requestRepsWithElements.size() > 1) {
String elementRef = requestRepWithElement.getAttribute("element");
int index = elementRef.indexOf(':');
suffixName = elementRef.substring(index + 1).replace("-", "");
if (duplicatesAvailable) {
String mediaType = requestRepWithElement.getAttribute("mediaType");
if (!StringUtils.isEmpty(mediaType)) {
String subType = MediaType.valueOf(mediaType).getSubtype();
String[] parts = subType.split("\\+");
if (parts.length == 2) {
suffixName += StringUtils.capitalize(parts[1]);
} else {
suffixName += StringUtils.capitalize(parts[0].replaceAll("[\\.-]", ""));
}
}
}
requestReps = Collections.singletonList(requestRepWithElement);
}
if (writeAnnotations(info.isInterfaceGenerated())) {
sbMethodCode.append(TAB);
if (!methodNameLowerCase.isEmpty()) {
if (HTTP_METHOD_ANNOTATIONS.containsKey(methodNameLowerCase)) {
writeAnnotation(sbMethodCode, imports, HTTP_METHOD_ANNOTATIONS.get(methodNameLowerCase), null)
.append(lineSeparator).append(TAB);
} else {
writeCustomHttpMethod(info, classPackage, methodName, sbMethodCode, imports);
}
writeFormatAnnotations(requestReps, sbMethodCode, imports, true, null);
List<Element> responseReps = getWadlElements(getOKResponse(responseEls), "representation");
writeFormatAnnotations(responseReps,
sbMethodCode, imports, false, requestRepWithElement);
if (supportBeanValidation && !responseRequired
&& isRepWithElementAvailable(responseReps, info.getGrammarInfo())) {
addImport(imports, BEAN_VALID_FULL_NAME);
sbMethodCode.append('@').append(BEAN_VALID_SIMPLE_NAME).append(lineSeparator).append(TAB);
}
if (oneway) {
writeAnnotation(sbMethodCode, imports, Oneway.class, null)
.append(lineSeparator).append(TAB);
}
}
if (!isRoot && !"/".equals(currentPath)) {
writeAnnotation(sbMethodCode, imports, Path.class, currentPath)
.append(lineSeparator).append(TAB);
}
} else {
sbMethodCode.append(lineSeparator).append(TAB);
}
if (!info.isInterfaceGenerated()) {
sbMethodCode.append("public ");
}
boolean responseTypeAvailable = true;
if (!methodNameLowerCase.isEmpty()) {
responseTypeAvailable = writeResponseType(responseEls,
requestRepWithElement,
sbMethodCode,
sbMethodRespDocs,
imports,
info,
responseRequired,
suspendedAsync);
String genMethodName = id + suffixName;
if (methodNameLowerCase.equals(genMethodName) && idAttribute.isEmpty()) {
List<PathSegment> segments = JAXRSUtils.getPathSegments(currentPath, true, true);
StringBuilder sb = new StringBuilder();
for (PathSegment ps : segments) {
String pathSeg = ps.getPath().replaceAll("\\{", "").replaceAll("\\}", "");
int index = pathSeg.indexOf(':');
if (index > 0) {
pathSeg = pathSeg.substring(0, index);
}
sb.append(pathSeg);
}
genMethodName += StringUtils.capitalize(sb.toString());
}
genMethodName = genMethodName.replace("-", "");
Integer value = methodNameMap.get(genMethodName);
if (value == null) {
value = 0;
}
methodNameMap.put(genMethodName, ++value);
if (value > 1) {
genMethodName = genMethodName + value.toString();
}
sbMethodCode.append(genMethodName);
} else {
writeSubresourceMethod(resourceEl, imports, sbMethodCode, info, id, suffixName);
}
sbMethodCode.append('(');
List<Element> inParamElements = getParameters(resourceEl, info.getInheritedParams(),
!isRoot && !isResourceElement && !resourceEl.getAttribute("id").isEmpty());
Element repElement = getActualRepElement(allRequestReps, requestRepWithElement);
writeRequestTypes(firstRequestEl, classPackage, repElement, inParamElements,
jaxpSourceRequired, sbMethodCode, sbMethodDocs, imports, info, suspendedAsync);
sbMethodCode.append(')');
writeThrows(responseEls, sbMethodCode, sbMethodDocs, imports, info);
if (info.isInterfaceGenerated()) {
sbMethodCode.append(';');
} else {
generateEmptyMethodBody(sbMethodCode, responseTypeAvailable);
}
sbMethodCode.append(lineSeparator).append(lineSeparator);
}
finalizeMethodDocs(doCreateJavaDocs, sbCode, sbMethodDocs, sbMethodRespDocs, sbMethodCode);
}