Add the @Generated annotation to Marshaller/Receiver classes

and various dobj bits. The @Generated annotation is "@Documented" and
retained at source only.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@6049 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Ray Greenwell
2010-04-07 05:32:11 +00:00
parent d5d9b7f9ea
commit e5b45f2ef0
11 changed files with 104 additions and 0 deletions
@@ -171,6 +171,7 @@ public class GenDObjectTask extends Task
// create our velocity context
VelocityContext ctx = new VelocityContext();
ctx.put("field", fname);
ctx.put("generated", GenUtil.getGeneratedAnnotation(getClass(), 4));
ctx.put("type", GenUtil.simpleName(f));
ctx.put("wrapfield", GenUtil.boxArgument(ftype, "value"));
ctx.put("wrapofield", GenUtil.boxArgument(ftype, "ovalue"));
@@ -265,6 +265,7 @@ public class GenServiceTask extends InvocationTask
VelocityContext ctx = new VelocityContext();
ctx.put("name", name);
ctx.put("generated", getGeneratedAnnotation());
ctx.put("package", mpackage);
ctx.put("methods", sdesc.methods);
ctx.put("listeners", sdesc.listeners);
@@ -536,6 +537,7 @@ public class GenServiceTask extends InvocationTask
VelocityContext ctx = new VelocityContext();
ctx.put("name", name);
ctx.put("generated", getGeneratedAnnotation());
ctx.put("package", dpackage);
ctx.put("methods", sdesc.methods);
ctx.put("imports", imports.toList());
@@ -594,6 +596,7 @@ public class GenServiceTask extends InvocationTask
VelocityContext ctx = new VelocityContext();
ctx.put("name", name);
ctx.put("generated", getGeneratedAnnotation());
ctx.put("package", mpackage);
ctx.put("methods", sdesc.methods);
ctx.put("listeners", sdesc.listeners);
@@ -610,6 +613,15 @@ public class GenServiceTask extends InvocationTask
writeFile(mpath, sw.toString());
}
/**
* Helper to get the appropriate "@Generated" annotation for service classes.
*/
protected String getGeneratedAnnotation ()
{
return GenUtil.getGeneratedAnnotation(getClass(), 0,
"Derived from the Service class java source.");
}
/** Rolls up everything needed for the generate* methods. */
protected class ServiceDescription
{
@@ -24,6 +24,9 @@ package com.threerings.presents.tools;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -237,4 +240,34 @@ public class GenUtil extends com.samskivert.util.GenUtil
return name;
}
/**
* Return an "@Generated" annotation.
*
* @param clazz the class doing the code generation, NOT the generation target.
* @param indent the number of spaces that the annotation is indented.
* @param comments joined by a space and used as explanatory comments.
*/
public static String getGeneratedAnnotation (Class<?> clazz, int indent, String... comments)
{
final int LINE_LENGTH = 100;
String comm = StringUtil.join(comments, " ");
boolean hasComment = !StringUtil.isBlank(comm);
String anno = "@Generated(value={\"" + clazz.getName() + "\"},";
// ISO 8601 date
String date = " date=\"" +
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(new Date()) + "\"";
// wrap the date onto a new line if it's going to be too long, or if we're
// adding a comment (which is also on a new line)
if (hasComment || anno.length() + date.length() + 1 + indent > LINE_LENGTH) {
// put the date on a new line, space it right
date = "\n" + StringUtil.fill(' ', indent + 10) + date;
}
anno += date;
if (hasComment) {
anno += ",\n" + StringUtil.fill(' ', indent + 11) + "comments=\"" + comm + "\"";
}
anno += ")";
return anno;
}
}
@@ -53,6 +53,7 @@ public class SourceFile
while ((line = bin.readLine()) != null) {
llist.add(line);
}
maybeAddGeneratedImport(llist);
_lines = llist.toArray(new String[llist.size()]);
bin.close();
@@ -214,6 +215,45 @@ public class SourceFile
bout.newLine();
}
/**
* Add an import for "@Generated", if needed.
*/
protected void maybeAddGeneratedImport (ArrayList<String> lines)
{
final String IMPORT = "import javax.annotation.Generated;";
int packageLine = -1;
int lastJavaImport = -1;
int firstNonJavaImport = -1;
for (int ii = 0, nn = lines.size(); ii < nn; ii++) {
String line = lines.get(ii).trim();
if (line.equals(IMPORT)) {
return; // we already got one!
} else if (line.startsWith("package ")) {
packageLine = ii;
} else if (line.startsWith("import java")) {
lastJavaImport = ii;
} else if (firstNonJavaImport == -1 && line.startsWith("import ")) {
firstNonJavaImport = ii;
}
}
int insertPoint;
if (lastJavaImport != -1) {
insertPoint = lastJavaImport + 1;
} else if (firstNonJavaImport != -1) {
insertPoint = firstNonJavaImport;
} else {
insertPoint = packageLine + 1;
}
lines.add(insertPoint, IMPORT);
}
protected String[] _lines;
protected int _nstart = -1, _nend = -1;
@@ -1,5 +1,7 @@
package $package;
import javax.annotation.Generated;
#foreach ($import in $imports)
import $import;
#end
@@ -7,6 +9,7 @@ import $import;
/**
* Dispatches requests to the {@link ${name}Provider}.
*/
${generated}
public class ${name}Dispatcher extends InvocationDispatcher<${name}Marshaller>
{
/**
@@ -6,6 +6,7 @@
* clients) will apply the value change when they received the
* attribute changed notification.
*/
${generated}
public void set$upfield ($type value)
{
$type ovalue = this.$field;
@@ -24,6 +25,7 @@
* will apply the value change when they received the attribute
* changed notification.
*/
${generated}
public void set${upfield}At ($elemtype value, int index)
{
$elemtype ovalue = this.$field[index];
@@ -1,2 +1,3 @@
/** The field name of the <code>$field</code> field. */
${generated}
public static final String $capfield = "$field";
@@ -3,6 +3,7 @@
* oid list. The list will not change until the event is actually
* propagated through the system.
*/
${generated}
public void addTo$upfield (int oid)
{
requestOidAdd($capfield, oid);
@@ -13,6 +14,7 @@
* <code>$field</code> oid list. The list will not change until the
* event is actually propagated through the system.
*/
${generated}
public void removeFrom$upfield (int oid)
{
requestOidRemove($capfield, oid);
@@ -3,6 +3,7 @@
* <code>$field</code> set. The set will not change until the event is
* actually propagated through the system.
*/
${generated}
public void addTo$upfield ($etype elem)
{
requestEntryAdd($capfield, $field, elem);
@@ -13,6 +14,7 @@
* the <code>$field</code> set. The set will not change until the
* event is actually propagated through the system.
*/
${generated}
public void removeFrom$upfield (Comparable<?> key)
{
requestEntryRemove($capfield, $field, key);
@@ -23,6 +25,7 @@
* <code>$field</code> set. The set will not change until the event is
* actually propagated through the system.
*/
${generated}
public void update$upfield ($etype elem)
{
requestEntryUpdate($capfield, $field, elem$transport);
@@ -38,6 +41,7 @@
* change. Proxied copies of this object (on clients) will apply the
* value change when they received the attribute changed notification.
*/
${generated}
public void set$upfield ($type value)
{
requestAttributeChange($capfield, value, this.$field);
@@ -1,5 +1,7 @@
package $package;
import javax.annotation.Generated;
#foreach ($import in $imports)
import $import;
#end
@@ -11,6 +13,7 @@ import $import;
* interfaces that marshall the response arguments and deliver them back
* to the requesting client.
*/
${generated}
public class ${name}Marshaller extends InvocationMarshaller
implements ${name}Service
{
@@ -1,5 +1,7 @@
package $package;
import javax.annotation.Generated;
#foreach ($import in $imports)
import $import;
#end
@@ -7,6 +9,7 @@ import $import;
/**
* Defines the server-side of the {@link ${name}Service}.
*/
${generated}
public interface ${name}Provider extends InvocationProvider
{
#foreach ($m in $methods)