Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 2754F9CBD for ; Tue, 25 Oct 2011 16:40:02 +0000 (UTC) Received: (qmail 15622 invoked by uid 500); 25 Oct 2011 16:40:02 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 15577 invoked by uid 500); 25 Oct 2011 16:40:02 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 15570 invoked by uid 99); 25 Oct 2011 16:40:02 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Oct 2011 16:40:02 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 25 Oct 2011 16:39:57 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 51E9123889EC for ; Tue, 25 Oct 2011 16:39:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1188773 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/codegen/ tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/ tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/ tools/wadlto/jaxrs... Date: Tue, 25 Oct 2011 16:39:34 -0000 To: commits@cxf.apache.org From: sergeyb@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111025163934.51E9123889EC@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: sergeyb Date: Tue Oct 25 16:39:33 2011 New Revision: 1188773 URL: http://svn.apache.org/viewvc?rev=1188773&view=rev Log: [CXF-3881] Optionally generating enums Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/codegen/SourceGenerator.java cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml cxf/trunk/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/codegen/SourceGenerator.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/codegen/SourceGenerator.java?rev=1188773&r1=1188772&r2=1188773&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/codegen/SourceGenerator.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/codegen/SourceGenerator.java Tue Oct 25 16:39:33 2011 @@ -148,6 +148,8 @@ public class SourceGenerator { private String resourcePackageName; private String resourceName; private String wadlPath; + private String wadlNamespace = WadlGenerator.WADL_NS; + private boolean generateEnums; private Map properties; @@ -173,6 +175,18 @@ public class SourceGenerator { supportMultipleXmlReps = support; } + public void setWadlNamespace(String ns) { + this.wadlNamespace = ns; + } + + public String getWadlNamespace() { + return wadlNamespace; + } + + public void setGenerateEnums(boolean generate) { + this.generateEnums = generate; + } + private String getClassPackageName(String wadlPackageName) { if (resourcePackageName != null) { return resourcePackageName; @@ -232,13 +246,13 @@ public class SourceGenerator { for (int i = 0; i < resourceEls.size(); i++) { Element resource = getResourceElement(app, resourceEls.get(i), gInfo, typeClassNames, resourceEls.get(i).getAttribute("type"), src); - writeResourceClass(app, resource, - new ContextInfo(typeClassNames, gInfo, generateInterfaces), - src, true); + writeResourceClass(resource, + new ContextInfo(app, src, typeClassNames, gInfo, generateInterfaces), + true); if (generateInterfaces && generateImpl) { - writeResourceClass(app, resource, - new ContextInfo(typeClassNames, gInfo, false), - src, true); + writeResourceClass(resource, + new ContextInfo(app, src, typeClassNames, gInfo, false), + true); } if (resourceName != null) { break; @@ -350,9 +364,9 @@ public class SourceGenerator { } - private void writeResourceClass(Application app, Element rElement, + private void writeResourceClass(Element rElement, ContextInfo info, - File src, boolean isRoot) { + boolean isRoot) { String resourceId = resourceName != null ? resourceName : rElement.getAttribute("id"); if (resourceId.length() == 0) { @@ -405,29 +419,29 @@ public class SourceGenerator { writeImplementsInterface(sbCode, qname.getLocalPart(), info.isInterfaceGenerated()); sbCode.append(" {" + getLineSep() + getLineSep()); - writeMethods(rElement, imports, sbCode, info, resourceId, isRoot, ""); + writeMethods(rElement, classPackage, imports, sbCode, info, resourceId, isRoot, ""); sbCode.append("}"); writeImports(sbImports, imports, classPackage); - createJavaSourceFile(src, new QName(classPackage, className), sbCode, sbImports); + createJavaSourceFile(info.getSrcDir(), new QName(classPackage, className), sbCode, sbImports, true); - writeSubresourceClasses(app, rElement, info, src, isRoot, resourceId); + writeSubresourceClasses(rElement, info, isRoot, resourceId); } - private void writeSubresourceClasses(Application app, Element rElement, ContextInfo info, - File src, boolean isRoot, String resourceId) { + private void writeSubresourceClasses(Element rElement, ContextInfo info, + boolean isRoot, String resourceId) { List childEls = getWadlElements(rElement, "resource"); for (Element subEl : childEls) { String id = subEl.getAttribute("id"); if (id.length() > 0 && !resourceId.equals(id) && !id.startsWith("{java") && !id.startsWith("java")) { - Element subElement = getResourceElement(app, subEl, info.getGrammarInfo(), - info.getTypeClassNames(), subEl.getAttribute("type"), src); - writeResourceClass(app, subElement, info, src, false); + Element subElement = getResourceElement(info.getApp(), subEl, info.getGrammarInfo(), + info.getTypeClassNames(), subEl.getAttribute("type"), info.getSrcDir()); + writeResourceClass(subElement, info, false); } - writeSubresourceClasses(app, subEl, info, src, false, id); + writeSubresourceClasses(subEl, info, false, id); } } @@ -488,17 +502,20 @@ public class SourceGenerator { + getLineSep() + " * Created by Apache CXF WadlToJava code generator" + getLineSep() + "**/"; } - - private void writeMethods(Element rElement, - Set imports, StringBuilder sbCode, + //CHECKSTYLE:OFF + private void writeMethods(Element rElement, + String classPackage, + Set imports, + StringBuilder sbCode, ContextInfo info, String resourceId, boolean isRoot, String currentPath) { + //CHECKSTYLE:ON List methodEls = getWadlElements(rElement, "method"); for (Element methodEl : methodEls) { - writeResourceMethod(methodEl, imports, sbCode, info, isRoot, currentPath); + writeResourceMethod(methodEl, classPackage, imports, sbCode, info, isRoot, currentPath); } List childEls = getWadlElements(rElement, "resource"); @@ -507,9 +524,9 @@ public class SourceGenerator { String newPath = (currentPath + path).replace("//", "/"); String id = childEl.getAttribute("id"); if (id.length() == 0) { - writeMethods(childEl, imports, sbCode, info, id, false, newPath); + writeMethods(childEl, classPackage, imports, sbCode, info, id, false, newPath); } else { - writeResourceMethod(childEl, imports, sbCode, info, false, newPath); + writeResourceMethod(childEl, classPackage, imports, sbCode, info, false, newPath); } } } @@ -551,7 +568,8 @@ public class SourceGenerator { } } - private void writeResourceMethod(Element methodEl, + private void writeResourceMethod(Element methodEl, + String classPackage, Set imports, StringBuilder sbCode, ContextInfo info, @@ -637,7 +655,7 @@ public class SourceGenerator { !isRoot && !isResourceElement && resourceEl.getAttribute("id").length() > 0); Element repElement = getActualRepElement(allRequestReps, inXmlRep); - writeRequestTypes(firstRequestEl, repElement, inParamElements, + writeRequestTypes(firstRequestEl, classPackage, repElement, inParamElements, jaxpSourceRequired, sbCode, imports, info); sbCode.append(")"); if (info.isInterfaceGenerated()) { @@ -715,7 +733,7 @@ public class SourceGenerator { return xmlElement; } for (Element el : repElements) { - Element param = DOMUtils.getFirstChildWithName(el, WadlGenerator.WADL_NS, "param"); + Element param = DOMUtils.getFirstChildWithName(el, getWadlNamespace(), "param"); if (param != null) { return el; } @@ -776,15 +794,16 @@ public class SourceGenerator { } sbCode.append(localName).append(" "); } - + //CHECKSTYLE:OFF private void writeRequestTypes(Element requestEl, + String classPackage, Element repElement, List inParamEls, boolean jaxpRequired, StringBuilder sbCode, Set imports, ContextInfo info) { - + //CHECKSTYLE:ON boolean form = false; boolean formParamsAvailable = false; if (requestEl != null) { @@ -802,6 +821,15 @@ public class SourceGenerator { paramAnn = FormParam.class; } String name = paramEl.getAttribute("name"); + boolean enumCreated = false; + if (generateEnums) { + List options = + DOMUtils.findAllElementsByTagNameNS(paramEl, getWadlNamespace(), "option"); + if (options.size() > 0) { + generateEnumClass(getTypicalClassName(name), options, info.getSrcDir(), classPackage); + enumCreated = true; + } + } if (writeAnnotations(info.isInterfaceGenerated())) { writeAnnotation(sbCode, imports, paramAnn, name, false, false); sbCode.append(" "); @@ -822,7 +850,9 @@ public class SourceGenerator { addImport(imports, List.class.getName()); type = "List<" + type + ">"; } - sbCode.append(type).append(" ").append(name.replaceAll("[\\.\\-]", "_")); + String paramName = enumCreated ? getTypicalClassName(name) + : name.replaceAll("[\\.\\-]", "_"); + sbCode.append(type).append(" ").append(paramName); if (i + 1 < inParamEls.size()) { sbCode.append(", "); if (i + 1 >= 4 && ((i + 1) % 4) == 0) { @@ -857,9 +887,40 @@ public class SourceGenerator { } } + private void generateEnumClass(String clsName, List options, File src, String classPackage) { + StringBuilder sbImports = new StringBuilder(); + StringBuilder sbCode = new StringBuilder(); + sbImports.append(getClassComment()).append(getLineSep()); + sbImports.append("package " + classPackage) + .append(";").append(getLineSep()).append(getLineSep()); + + sbCode.append("public enum " + clsName); + sbCode.append(" {" + getLineSep()); + + for (int i = 0; i < options.size(); i++) { + String value = options.get(i).getAttribute("value"); + sbCode.append(TAB).append(value.toUpperCase()); + if (i + 1 < options.size()) { + sbCode.append(","); + } + sbCode.append(getLineSep()); + } + sbCode.append("}"); + createJavaSourceFile(src, new QName(classPackage, clsName), sbCode, sbImports, false); + } + + private String getTypicalClassName(String name) { + String theName = name.toUpperCase(); + if (theName.length() == 1) { + return theName; + } else { + return theName.substring(0, 1) + theName.substring(1).toLowerCase(); + } + } + private List getWadlElements(Element parent, String name) { List elements = parent != null - ? DOMUtils.getChildrenWithName(parent, WadlGenerator.WADL_NS, name) + ? DOMUtils.getChildrenWithName(parent, getWadlNamespace(), name) : CastUtils.cast(Collections.emptyList(), Element.class); if (!"resource".equals(name)) { for (int i = 0; i < elements.size(); i++) { @@ -912,7 +973,7 @@ public class SourceGenerator { } } } else { - Element param = DOMUtils.getFirstChildWithName(repElement, WadlGenerator.WADL_NS, "param"); + Element param = DOMUtils.getFirstChildWithName(repElement, getWadlNamespace(), "param"); if (param != null) { return getPrimitiveType(param); } @@ -979,11 +1040,14 @@ public class SourceGenerator { sbCode.append(getLineSep()).append(TAB); } - private void createJavaSourceFile(File src, QName qname, StringBuilder sbCode, StringBuilder sbImports) { + private void createJavaSourceFile(File src, QName qname, StringBuilder sbCode, StringBuilder sbImports, + boolean serviceClass) { String content = sbImports.toString() + getLineSep() + sbCode.toString(); String namespace = qname.getNamespaceURI(); - generatedServiceClasses.add(namespace + "." + qname.getLocalPart()); + if (serviceClass) { + generatedServiceClasses.add(namespace + "." + qname.getLocalPart()); + } namespace = namespace.replace(".", getFileSep()); @@ -1303,11 +1367,25 @@ public class SourceGenerator { private Set typeClassNames; private GrammarInfo gInfo; private Set resourceClassNames = new HashSet(); + private Application rootApp; + private File srcDir; - public ContextInfo(Set typeClassNames, GrammarInfo gInfo, boolean interfaceIsGenerated) { + public ContextInfo(Application rootApp, + File srcDir, + Set typeClassNames, + GrammarInfo gInfo, + boolean interfaceIsGenerated) { this.interfaceIsGenerated = interfaceIsGenerated; this.typeClassNames = typeClassNames; this.gInfo = gInfo; + this.rootApp = rootApp; + this.srcDir = srcDir; + } + public Application getApp() { + return rootApp; + } + public File getSrcDir() { + return srcDir; } public boolean isInterfaceGenerated() { return interfaceIsGenerated; Modified: cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java?rev=1188773&r1=1188772&r2=1188773&view=diff ============================================================================== --- cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java (original) +++ cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/WadlToolConstants.java Tue Oct 25 16:39:33 2011 @@ -44,6 +44,9 @@ public final class WadlToolConstants { public static final String CFG_NO_ADDRESS_BINDING = ToolConstants.CFG_NO_ADDRESS_BINDING; + public static final String CFG_WADL_NAMESPACE = "wadlNamespace"; + public static final String CFG_GENERATE_ENUMS = "generateEnums"; + public static final String CFG_WADLURL = "wadl"; Modified: cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java?rev=1188773&r1=1188772&r2=1188773&view=diff ============================================================================== --- cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java (original) +++ cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainer.java Tue Oct 25 16:39:33 2011 @@ -117,6 +117,11 @@ public class JAXRSContainer extends Abst sg.setPackageName((String)context.get(WadlToolConstants.CFG_PACKAGENAME)); sg.setResourceName((String)context.get(WadlToolConstants.CFG_RESOURCENAME)); + String wadlNs = (String)context.get(WadlToolConstants.CFG_WADL_NAMESPACE); + if (wadlNs != null) { + sg.setWadlNamespace(wadlNs); + } + sg.setSupportMultipleXmlReps(context.optionSet(WadlToolConstants.CFG_MULTIPLE_XML_REPS)); // set the base path sg.setWadlPath(wadlURL); @@ -137,6 +142,10 @@ public class JAXRSContainer extends Abst // TODO: consider introducing an option too for users be able to // supply custom type mappings sg.setSchemaTypesMap(DEFAULT_TYPES_MAP); + + if (context.optionSet(WadlToolConstants.CFG_GENERATE_ENUMS)) { + sg.setGenerateEnums(true); + } // generate String codeType = context.optionSet(WadlToolConstants.CFG_TYPES) Modified: cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml?rev=1188773&r1=1188772&r2=1188773&view=diff ============================================================================== --- cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml (original) +++ cxf/trunk/tools/wadlto/jaxrs/src/main/java/org/apache/cxf/tools/wadlto/jaxrs/jaxrs-toolspec.xml Tue Oct 25 16:39:33 2011 @@ -32,6 +32,16 @@ Examples: + +