You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/05/10 18:17:36 UTC
svn commit: r1101526 - 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...
Author: sergeyb
Date: Tue May 10 16:17:36 2011
New Revision: 1101526
URL: http://svn.apache.org/viewvc?rev=1101526&view=rev
Log:
[CXF-3498] Support for various default options
Added:
cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml (with props)
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/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=1101526&r1=1101525&r2=1101526&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 May 10 16:17:36 2011
@@ -84,6 +84,8 @@ public class SourceGenerator {
private static final Logger LOG = LogUtils.getL7dLogger(SourceGenerator.class);
+ private static final String DEFAULT_PACKAGE_NAME = "application";
+ private static final String DEFAULT_RESOURCE_NAME = "Resource";
private static final String TAB = " ";
private static final Map<String, Class<?>> HTTP_METHOD_ANNOTATIONS;
@@ -108,6 +110,8 @@ public class SourceGenerator {
private Comparator<String> importsComparator;
private boolean generateInterfaces = true;
private boolean generateImpl;
+ private String resourcePackageName;
+ private String resourceName;
private Map<String, String> properties;
@@ -119,6 +123,16 @@ public class SourceGenerator {
this.properties = properties;
}
+ private String getClassPackageName(String wadlPackageName) {
+ if (resourcePackageName != null) {
+ return resourcePackageName;
+ } else if (wadlPackageName != null && wadlPackageName.length() > 0) {
+ return wadlPackageName;
+ } else {
+ return DEFAULT_PACKAGE_NAME;
+ }
+ }
+
private String getLineSep() {
String value = properties.get(LINE_SEP_PROPERTY);
return value == null ? System.getProperty(LINE_SEP_PROPERTY) : value;
@@ -134,7 +148,7 @@ public class SourceGenerator {
Set<String> typeClassNames = new HashSet<String>();
List<Element> schemaElements = getSchemaElements(appElement);
- if (!schemaElements.isEmpty()) {
+ if (schemaElements != null && !schemaElements.isEmpty()) {
// generate classes from schema
JCodeModel codeModel = createCodeModel(schemaElements, typeClassNames);
if (codeModel != null) {
@@ -162,11 +176,15 @@ public class SourceGenerator {
}
GrammarInfo gInfo = getGrammarInfo(appElement, schemaElements);
- for (Element resource : resourceEls) {
+ for (int i = 0; i < resourceEls.size(); i++) {
+ Element resource = resourceEls.get(i);
writeResourceClass(resource, typeClassNames, gInfo, src, generateInterfaces);
if (generateInterfaces && generateImpl) {
writeResourceClass(resource, typeClassNames, gInfo, src, false);
}
+ if (resourceName != null) {
+ break;
+ }
}
generateMainClass(resourcesEls.get(0), src);
@@ -175,7 +193,7 @@ public class SourceGenerator {
private GrammarInfo getGrammarInfo(Element appElement, List<Element> schemaElements) {
- if (schemaElements.isEmpty()) {
+ if (schemaElements == null || schemaElements.isEmpty()) {
return null;
}
@@ -210,12 +228,12 @@ public class SourceGenerator {
private void writeResourceClass(Element rElement, Set<String> typeClassNames,
GrammarInfo gInfo, File src, boolean interfaceIsGenerated) {
- String resourceId = rElement.getAttribute("id");
- String path = rElement.getAttribute("path");
+ String resourceId = resourceName != null
+ ? resourceName : rElement.getAttribute("id");
if (resourceId.length() == 0) {
- LOG.warning("Resource with path " + path + " can not be mapped to a class");
- return;
+ resourceId = DEFAULT_RESOURCE_NAME;
}
+ String path = rElement.getAttribute("path");
QName qname = JAXRSUtils.convertStringToQName(resourceId);
@@ -228,14 +246,17 @@ public class SourceGenerator {
StringBuilder sbCode = new StringBuilder();
Set<String> imports = createImports();
+ final String classPackage = getClassPackageName(qname.getNamespaceURI());
+ final String className = getClassName(qname.getLocalPart(), interfaceIsGenerated);
+
sbImports.append(getClassComment()).append(getLineSep());
- sbImports.append("package " + qname.getNamespaceURI())
+ sbImports.append("package " + classPackage)
.append(";").append(getLineSep()).append(getLineSep());
if (writeAnnotations(interfaceIsGenerated)) {
writeAnnotation(sbCode, imports, Path.class, path, true, false);
}
- String className = getClassName(qname.getLocalPart(), interfaceIsGenerated);
+
sbCode.append("public " + getClassType(interfaceIsGenerated) + " " + className);
writeImplementsInterface(sbCode, qname.getLocalPart(), interfaceIsGenerated);
sbCode.append(" {" + getLineSep() + getLineSep());
@@ -253,9 +274,9 @@ public class SourceGenerator {
}
}
sbCode.append("}");
- writeImports(sbImports, imports);
+ writeImports(sbImports, imports, classPackage);
- createJavaSourceFile(src, new QName(qname.getNamespaceURI(), className), sbCode, sbImports);
+ createJavaSourceFile(src, new QName(classPackage, className), sbCode, sbImports);
for (Element subEl : childEls) {
String id = subEl.getAttribute("id");
@@ -339,8 +360,12 @@ public class SourceGenerator {
}
}
- private void writeImports(StringBuilder sbImports, Set<String> imports) {
+ private void writeImports(StringBuilder sbImports, Set<String> imports, String classPackage) {
for (String clsName : imports) {
+ int index = clsName.lastIndexOf(".");
+ if (index != -1 && clsName.substring(0, index).equals(classPackage)) {
+ continue;
+ }
sbImports.append("import " + clsName).append(";").append(getLineSep());
}
}
@@ -349,8 +374,11 @@ public class SourceGenerator {
Set<String> imports, StringBuilder sbCode,
Set<String> typeClassNames, GrammarInfo gInfo,
boolean interfaceIsGenerated) {
- String id = methodEl.getAttribute("id");
String methodName = methodEl.getAttribute("name");
+ String id = methodEl.getAttribute("id");
+ if (id.length() == 0) {
+ id = methodName.toLowerCase();
+ }
List<Element> responseEls = DOMUtils.getChildrenWithName(methodEl,
WadlGenerator.WADL_NS, "response");
@@ -359,14 +387,8 @@ public class SourceGenerator {
if (writeAnnotations(interfaceIsGenerated)) {
- String path = resourceEl.getAttribute("path");
- if (id.length() == 0) {
- LOG.warning("Method with path " + path + " can not be mapped to a class method");
- return;
- }
sbCode.append(TAB);
- writeAnnotation(sbCode, imports, Path.class, path, true, true);
-
+
if (methodName.length() > 0) {
if (HTTP_METHOD_ANNOTATIONS.containsKey(methodName.toLowerCase())) {
writeAnnotation(sbCode, imports,
@@ -378,6 +400,10 @@ public class SourceGenerator {
writeFormatAnnotations(requestEls, sbCode, imports, true);
writeFormatAnnotations(responseEls, sbCode, imports, false);
}
+
+ String path = resourceEl.getAttribute("path");
+ writeAnnotation(sbCode, imports, Path.class, path, true, true);
+
} else {
sbCode.append(getLineSep()).append(TAB);
}
@@ -396,11 +422,14 @@ public class SourceGenerator {
typeClassNames);
String localName = clsSimpleName == null ? qname.getLocalPart()
: clsSimpleName.substring(packageName.length() + 1);
+ String subResponseNs = clsSimpleName == null ? getClassPackageName(qname.getNamespaceURI())
+ : clsSimpleName.substring(0, packageName.length());
String parentId = ((Element)resourceEl.getParentNode()).getAttribute("id");
- writeSubResponseType(id.equals(parentId), clsSimpleName == null ? qname.getNamespaceURI()
- : clsSimpleName.substring(0, packageName.length()), localName, sbCode, imports);
+ writeSubResponseType(id.equals(parentId), subResponseNs, localName, sbCode, imports);
+
// TODO : we need to take care of multiple subresource locators with diff @Path
// returning the same type; also we might have ids like "{org.apache.cxf}Book#getName"
+
sbCode.append("get" + localName);
}
@@ -429,7 +458,7 @@ public class SourceGenerator {
sbCode.append("}");
}
- private void addFormParameters(List<Element> inParamElements, Element requestEl) {
+ private boolean addFormParameters(List<Element> inParamElements, Element requestEl) {
List<Element> repElements =
DOMUtils.getChildrenWithName(requestEl, WadlGenerator.WADL_NS, "representation");
@@ -438,8 +467,10 @@ public class SourceGenerator {
if (MediaType.APPLICATION_FORM_URLENCODED.equals(mediaType)) {
inParamElements.addAll(DOMUtils.getChildrenWithName(repElements.get(0),
WadlGenerator.WADL_NS, "param"));
+ return true;
}
}
+ return false;
}
private boolean writeResponseType(List<Element> responseEls, StringBuilder sbCode,
@@ -481,8 +512,7 @@ public class SourceGenerator {
if (requestEls.size() == 1 && inParamEls.size() == 0) {
inParamEls.addAll(DOMUtils.getChildrenWithName(requestEls.get(0),
WadlGenerator.WADL_NS, "param"));
- addFormParameters(inParamEls, requestEls.get(0));
- form = true;
+ form = addFormParameters(inParamEls, requestEls.get(0));
}
String elementName = null;
@@ -717,7 +747,8 @@ public class SourceGenerator {
}
private Set<String> createImports() {
- return importsComparator == null ? new TreeSet<String>() : new TreeSet<String>(importsComparator);
+ return importsComparator == null ? new TreeSet<String>(new DefaultImportsComparator())
+ : new TreeSet<String>(importsComparator);
}
public void setGenerateInterfaces(boolean generateInterfaces) {
@@ -728,6 +759,14 @@ public class SourceGenerator {
this.generateImpl = generate;
}
+ public void setPackageName(String name) {
+ this.resourcePackageName = name;
+ }
+
+ public void setResourceName(String name) {
+ this.resourceName = name;
+ }
+
private static class GrammarInfo {
private Map<String, String> nsMap;
private Map<String, String> elementTypeMap;
@@ -746,6 +785,22 @@ public class SourceGenerator {
}
}
+ private static class DefaultImportsComparator implements Comparator<String> {
+ private static final String JAVAX_PREFIX = "javax";
+ public int compare(String s1, String s2) {
+ boolean javax1 = s1.startsWith(JAVAX_PREFIX);
+ boolean javax2 = s1.startsWith(JAVAX_PREFIX);
+ if (javax1 && !javax2) {
+ return -1;
+ } else if (!javax1 && javax2) {
+ return 1;
+ } else {
+ return s1.compareTo(s2);
+ }
+ }
+
+ }
+
static class InnerErrorListener {
public void error(SAXParseException ex) {
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=1101526&r1=1101525&r2=1101526&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 May 10 16:17:36 2011
@@ -35,7 +35,7 @@ public final class WadlToolConstants {
public static final String CFG_TYPES = ToolConstants.CFG_TYPES;
public static final String CFG_PACKAGENAME = ToolConstants.CFG_PACKAGENAME;
- public static final String CFG_INTERFACENAME = "interfacename";
+ public static final String CFG_RESOURCENAME = "resourcename";
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=1101526&r1=1101525&r2=1101526&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 May 10 16:17:36 2011
@@ -89,6 +89,8 @@ public class JAXRSContainer extends Abst
sg.setGenerateInterfaces(isInterface);
sg.setGenerateImplementation(true);
}
+ sg.setPackageName((String)context.get(WadlToolConstants.CFG_PACKAGENAME));
+ sg.setResourceName((String)context.get(WadlToolConstants.CFG_RESOURCENAME));
// generate
String codeType = context.optionSet(WadlToolConstants.CFG_TYPES)
Modified: cxf/trunk/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java?rev=1101526&r1=1101525&r2=1101526&view=diff
==============================================================================
--- cxf/trunk/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java (original)
+++ cxf/trunk/tools/wadlto/jaxrs/src/test/java/org/apache/cxf/tools/wadlto/jaxrs/JAXRSContainerTest.java Tue May 10 16:17:36 2011
@@ -36,11 +36,60 @@ public class JAXRSContainerTest extends
public void testCodeGenInterfaces() {
try {
JAXRSContainer container = new JAXRSContainer(null);
+
ToolContext context = new ToolContext();
+ context.put(WadlToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath());
+ context.put(WadlToolConstants.CFG_WADLURL, getLocation("/wadl/bookstore.xml"));
+ //context.put(WadlToolConstants.CFG_COMPILE, "true");
+
+ container.setContext(context);
+ container.execute();
+
+ assertNotNull(output.list());
+
+ verifyFiles("java", false, "org.apache.cxf.jaxrs.model.wadl");
+ //verifyFiles("class");
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void testCodeGenNoIds() {
+ try {
+ JAXRSContainer container = new JAXRSContainer(null);
+ ToolContext context = new ToolContext();
context.put(WadlToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath());
+ context.put(WadlToolConstants.CFG_WADLURL, getLocation("/wadl/singleResource.xml"));
+ context.put(WadlToolConstants.CFG_RESOURCENAME, "CustomResource");
+
+ container.setContext(context);
+ container.execute();
+ assertNotNull(output.list());
+
+ List<File> files = FileUtils.getFilesRecurse(output, ".+\\." + "java" + "$");
+ assertEquals(1, files.size());
+ assertTrue(checkContains(files, "application.CustomResource.java"));
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ @Test
+ public void testCodeGenInterfacesCustomPackage() {
+ try {
+ JAXRSContainer container = new JAXRSContainer(null);
+
+ ToolContext context = new ToolContext();
+ context.put(WadlToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath());
context.put(WadlToolConstants.CFG_WADLURL, getLocation("/wadl/bookstore.xml"));
+ context.put(WadlToolConstants.CFG_PACKAGENAME, "custom.books");
//context.put(WadlToolConstants.CFG_COMPILE, "true");
container.setContext(context);
@@ -48,7 +97,7 @@ public class JAXRSContainerTest extends
assertNotNull(output.list());
- verifyFiles("java", false);
+ verifyFiles("java", false, "custom.books");
//verifyFiles("class");
} catch (Exception e) {
@@ -61,10 +110,9 @@ public class JAXRSContainerTest extends
public void testCodeGenImpl() {
try {
JAXRSContainer container = new JAXRSContainer(null);
- ToolContext context = new ToolContext();
+ ToolContext context = new ToolContext();
context.put(WadlToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath());
-
context.put(WadlToolConstants.CFG_WADLURL, getLocation("/wadl/bookstore.xml"));
context.put(WadlToolConstants.CFG_SERVER, "true");
//context.put(WadlToolConstants.CFG_COMPILE, "true");
@@ -74,7 +122,7 @@ public class JAXRSContainerTest extends
assertNotNull(output.list());
- verifyFiles("java", false);
+ verifyFiles("java", false, "org.apache.cxf.jaxrs.model.wadl");
//verifyFiles("classes");
} catch (Exception e) {
fail();
@@ -86,10 +134,9 @@ public class JAXRSContainerTest extends
public void testCodeGenInterfaceAndImpl() {
try {
JAXRSContainer container = new JAXRSContainer(null);
+
ToolContext context = new ToolContext();
-
context.put(WadlToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath());
-
context.put(WadlToolConstants.CFG_WADLURL, getLocation("/wadl/bookstore.xml"));
context.put(WadlToolConstants.CFG_INTERFACE, "true");
context.put(WadlToolConstants.CFG_SERVER, "true");
@@ -100,7 +147,7 @@ public class JAXRSContainerTest extends
assertNotNull(output.list());
- verifyFiles("java", true);
+ verifyFiles("java", true, "org.apache.cxf.jaxrs.model.wadl");
//verifyFiles("classes");
} catch (Exception e) {
fail();
@@ -112,10 +159,9 @@ public class JAXRSContainerTest extends
public void testCodeGenTypesOnly() {
try {
JAXRSContainer container = new JAXRSContainer(null);
- ToolContext context = new ToolContext();
+ ToolContext context = new ToolContext();
context.put(WadlToolConstants.CFG_OUTPUTDIR, output.getCanonicalPath());
-
context.put(WadlToolConstants.CFG_WADLURL, getLocation("/wadl/bookstore.xml"));
context.put(WadlToolConstants.CFG_TYPES, "true");
@@ -132,25 +178,26 @@ public class JAXRSContainerTest extends
}
}
- private void verifyFiles(String ext, boolean interfacesAndImpl) {
+ private void verifyFiles(String ext, boolean interfacesAndImpl, String resourcePackage) {
List<File> files = FileUtils.getFilesRecurse(output, ".+\\." + ext + "$");
assertEquals(interfacesAndImpl ? 9 : 7, files.size());
- assertTrue(checkContains(files, "superbooks.Book." + ext));
- assertTrue(checkContains(files, "superbooks.Book2." + ext));
- assertTrue(checkContains(files, "superbooks.Chapter." + ext));
- assertTrue(checkContains(files, "superbooks.ObjectFactory." + ext));
- assertTrue(checkContains(files, "superbooks.package-info." + ext));
- assertTrue(checkContains(files, "org.apache.cxf.jaxrs.model.wadl.FormInterface." + ext));
- assertTrue(checkContains(files, "org.apache.cxf.jaxrs.model.wadl.BookStore." + ext));
+ doVerifyTypes(files, ext);
+
+ assertTrue(checkContains(files, resourcePackage + ".FormInterface." + ext));
+ assertTrue(checkContains(files, resourcePackage + ".BookStore." + ext));
if (interfacesAndImpl) {
- assertTrue(checkContains(files, "org.apache.cxf.jaxrs.model.wadl.FormInterfaceImpl." + ext));
- assertTrue(checkContains(files, "org.apache.cxf.jaxrs.model.wadl.BookStoreImpl." + ext));
+ assertTrue(checkContains(files, resourcePackage + ".FormInterfaceImpl." + ext));
+ assertTrue(checkContains(files, resourcePackage + ".BookStoreImpl." + ext));
}
}
private void verifyTypes(String ext) {
List<File> files = FileUtils.getFilesRecurse(output, ".+\\." + ext + "$");
assertEquals(5, files.size());
+ doVerifyTypes(files, ext);
+ }
+
+ private void doVerifyTypes(List<File> files, String ext) {
assertTrue(checkContains(files, "superbooks.Book." + ext));
assertTrue(checkContains(files, "superbooks.Book2." + ext));
assertTrue(checkContains(files, "superbooks.Chapter." + ext));
Added: cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml?rev=1101526&view=auto
==============================================================================
--- cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml (added)
+++ cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml Tue May 10 16:17:36 2011
@@ -0,0 +1,16 @@
+<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:prefix1="http://superbooks">
+
+ <resources base="http://localhost:8080/baz">
+ <param name="id" style="template" type="xs:long"/>
+ <resource path="/bookstore/{id}">
+ <method name="GET">
+ <request/>
+ <response>
+ <representation mediaType="text/plain">
+ <param name="result" style="plain" type="xs:string"/>
+ </representation>
+ </response>
+ </method>
+ </resource>
+ </resources>
+</application>
Propchange: cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml
------------------------------------------------------------------------------
svn:keywords = Rev Date
Propchange: cxf/trunk/tools/wadlto/jaxrs/src/test/resources/wadl/singleResource.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml