diff --git a/build.xml b/build.xml
index 9234e1658..ddd86dc3c 100644
--- a/build.xml
+++ b/build.xml
@@ -47,6 +47,8 @@
+
+
@@ -214,6 +216,15 @@
+
+
+
+
+
+
@@ -223,7 +234,7 @@
-
+
@@ -238,7 +249,8 @@
-
+
@@ -250,8 +262,7 @@
-
-
+
@@ -271,17 +282,16 @@
-
+
+ excludes="**/InvocationReceiver.java,**/SignalReceiver.java"/>
-
+
-
@@ -320,13 +330,6 @@
-
-
-
-
-
-
@@ -349,7 +352,7 @@
-
diff --git a/src/cpp/presents/data/ClientObject.cpp b/src/cpp/presents/data/ClientObject.cpp
index f083e5585..c75c6c885 100644
--- a/src/cpp/presents/data/ClientObject.cpp
+++ b/src/cpp/presents/data/ClientObject.cpp
@@ -10,7 +10,6 @@ void ClientObject::readObject (ObjectInputStream& in)
presents::dobj::DObject::readObject(in);
username = boost::static_pointer_cast(in.readObject());
receivers = boost::static_pointer_cast(in.readObject());
- permPolicy = boost::static_pointer_cast(in.readObject());
}
void ClientObject::writeObject (ObjectOutputStream& out) const
@@ -18,5 +17,4 @@ void ClientObject::writeObject (ObjectOutputStream& out) const
presents::dobj::DObject::writeObject(out);
out.writeObject(username);
out.writeObject(receivers);
- out.writeObject(permPolicy);
}
diff --git a/src/cpp/presents/data/ClientObject.h b/src/cpp/presents/data/ClientObject.h
index 3b1a6f087..f0fd1f41b 100644
--- a/src/cpp/presents/data/ClientObject.h
+++ b/src/cpp/presents/data/ClientObject.h
@@ -5,7 +5,6 @@
#include "presents/ObjectOutputStream.h"
#include "presents/streamers/StreamableStreamer.h"
-#include "presents/data/PermissionPolicy.h"
#include "presents/dobj/DObject.h"
#include "presents/dobj/DSet.h"
#include "util/Name.h"
@@ -18,7 +17,6 @@ public:
Shared username;
Shared receivers;
- Shared permPolicy;
virtual void readObject(ObjectInputStream& in);
virtual void writeObject(ObjectOutputStream& out) const;
diff --git a/src/main/java/com/threerings/admin/web/client/ConfigFieldEditor.java b/src/main/java/com/threerings/admin/web/client/ConfigFieldEditor.java
index baf399196..87f4a370e 100644
--- a/src/main/java/com/threerings/admin/web/client/ConfigFieldEditor.java
+++ b/src/main/java/com/threerings/admin/web/client/ConfigFieldEditor.java
@@ -120,7 +120,7 @@ public abstract class ConfigFieldEditor
resetField();
_box.addValueChangeHandler(new ValueChangeHandler() {
- public void onValueChange (ValueChangeEvent changeEvent) {
+ public void onValueChange (ValueChangeEvent changeEvent) {
updateModificationState();
}
});
@@ -152,11 +152,11 @@ public abstract class ConfigFieldEditor
_value = buildWidget(field);
_name = new Label(field.name);
- _name.setStyleName("fieldName");
+ _name.setStyleName("fieldName");
_reset = new Label("X");
- _reset.setStyleName("resetButton");
- _reset.addClickHandler(new ClickHandler() {
+ _reset.setStyleName("resetButton");
+ _reset.addClickHandler(new ClickHandler() {
public void onClick (ClickEvent event) {
resetField();
updateModificationState();
@@ -203,5 +203,5 @@ public abstract class ConfigFieldEditor
protected Command _onChange;
protected Label _name, _reset;
- protected Widget _value;
+ protected Widget _value;
}
diff --git a/src/main/java/com/threerings/admin/web/server/ConfigServlet.java b/src/main/java/com/threerings/admin/web/server/ConfigServlet.java
index d69dc39df..bfb7a7ea9 100644
--- a/src/main/java/com/threerings/admin/web/server/ConfigServlet.java
+++ b/src/main/java/com/threerings/admin/web/server/ConfigServlet.java
@@ -91,7 +91,7 @@ public abstract class ConfigServlet extends RemoteServiceServlet
public ConfigurationRecord updateConfiguration (final String key, final ConfigField[] updates)
throws ServiceException
{
- requireAdminUser();
+ requireAdminUser();
final ServletWaiter waiter =
new ServletWaiter("updateConfiguration");
@@ -156,11 +156,11 @@ public abstract class ConfigServlet extends RemoteServiceServlet
* Implemented on a project by project basis to provide a security fence for configuration
* editing powers.
*/
- protected abstract void requireAdminUser ()
- throws ServiceException;
+ protected abstract void requireAdminUser ()
+ throws ServiceException;
@Inject protected ConfigRegistry _confReg;
- @Inject protected RootDObjectManager _omgr;
+ @Inject protected RootDObjectManager _omgr;
protected static Map, FieldType> TYPES = ImmutableMap., FieldType>builder()
.put(Integer.class, FieldType.INTEGER)
diff --git a/src/main/java/com/threerings/bureau/server/BureauSender.java b/src/main/java/com/threerings/bureau/server/BureauSender.java
index ea353e2bd..a59e209c9 100644
--- a/src/main/java/com/threerings/bureau/server/BureauSender.java
+++ b/src/main/java/com/threerings/bureau/server/BureauSender.java
@@ -21,11 +21,10 @@
package com.threerings.bureau.server;
-import com.threerings.presents.data.ClientObject;
-import com.threerings.presents.server.InvocationSender;
-
import com.threerings.bureau.client.BureauDecoder;
import com.threerings.bureau.client.BureauReceiver;
+import com.threerings.presents.data.ClientObject;
+import com.threerings.presents.server.InvocationSender;
/**
* Used to issue notifications to a {@link BureauReceiver} instance on a
diff --git a/src/main/java/com/threerings/crowd/server/LocationSender.java b/src/main/java/com/threerings/crowd/server/LocationSender.java
index 411789eda..1673571a6 100644
--- a/src/main/java/com/threerings/crowd/server/LocationSender.java
+++ b/src/main/java/com/threerings/crowd/server/LocationSender.java
@@ -21,11 +21,10 @@
package com.threerings.crowd.server;
-import com.threerings.presents.data.ClientObject;
-import com.threerings.presents.server.InvocationSender;
-
import com.threerings.crowd.client.LocationDecoder;
import com.threerings.crowd.client.LocationReceiver;
+import com.threerings.presents.data.ClientObject;
+import com.threerings.presents.server.InvocationSender;
/**
* Used to issue notifications to a {@link LocationReceiver} instance on a
diff --git a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java
index 267f6081e..f58c24a0f 100644
--- a/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenActionScriptStreamableTask.java
@@ -34,7 +34,6 @@ import org.apache.tools.ant.Project;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
-import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.io.Files;
@@ -113,12 +112,8 @@ public class GenActionScriptStreamableTask extends GenTask
// Merge in the previously generated version
String existing = Files.toString(outputLocation, Charsets.UTF_8);
output = new GeneratedSourceMerger().merge(output, existing);
- } else if (!outputLocation.getParentFile().exists()) {
- // Make sure the directory exists before trying to write there
- Preconditions.checkArgument(outputLocation.getParentFile().mkdirs(),
- "Unable to create directory to write '%s'", outputLocation.getAbsolutePath());
}
- Files.write(output, outputLocation, Charsets.UTF_8);
+ writeFile(outputLocation.getAbsolutePath(), output);
}
protected static class ASField
diff --git a/src/main/java/com/threerings/presents/tools/GenDObjectTask.java b/src/main/java/com/threerings/presents/tools/GenDObjectTask.java
index d8a61c173..60e957b44 100644
--- a/src/main/java/com/threerings/presents/tools/GenDObjectTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenDObjectTask.java
@@ -21,20 +21,17 @@
package com.threerings.presents.tools;
+import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
-
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
-import java.io.File;
import com.google.common.collect.Lists;
-
import com.samskivert.util.StringUtil;
-
import com.threerings.presents.annotation.TransportHint;
import com.threerings.presents.dobj.DObject;
import com.threerings.presents.dobj.DSet;
@@ -165,7 +162,7 @@ public class GenDObjectTask extends GenTask
}
// now bolt everything back together into a class declaration
- sfile.writeTo(source, fsection.toString(), msection.toString());
+ writeFile(source.getAbsolutePath(), sfile.generate(fsection.toString(), msection.toString()));
}
/** {@link DObject} resolved with the proper classloader so that we
diff --git a/src/main/java/com/threerings/presents/tools/GenReceiverTask.java b/src/main/java/com/threerings/presents/tools/GenReceiverTask.java
index ef0b9710c..2415ca0cf 100644
--- a/src/main/java/com/threerings/presents/tools/GenReceiverTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenReceiverTask.java
@@ -114,11 +114,11 @@ public class GenReceiverTask extends InvocationTask
String mpath = source.getPath();
mpath = mpath.replace("Receiver", "Sender");
mpath = replacePath(mpath, "/client/", "/server/");
- writeFile(mpath, mergeTemplate(SENDER_TMPL,
- "name", name,
- "package", spackage,
- "methods", methods,
- "imports", implist));
+ writeTemplate(SENDER_TMPL, mpath,
+ "name", name,
+ "package", spackage,
+ "methods", methods,
+ "imports", implist);
}
protected void generateDecoder (Class> receiver, File source, String rname, String rpackage,
@@ -136,12 +136,12 @@ public class GenReceiverTask extends InvocationTask
// determine the path to our sender file
String mpath = source.getPath();
mpath = mpath.replace("Receiver", "Decoder");
- writeFile(mpath, mergeTemplate(DECODER_TMPL,
- "name", name,
- "receiver_code", rcode,
- "package", rpackage,
- "methods", methods,
- "imports", implist));
+ writeTemplate(DECODER_TMPL, mpath,
+ "name", name,
+ "receiver_code", rcode,
+ "package", rpackage,
+ "methods", methods,
+ "imports", implist);
}
/** Specifies the path to the sender template. */
diff --git a/src/main/java/com/threerings/presents/tools/GenServiceTask.java b/src/main/java/com/threerings/presents/tools/GenServiceTask.java
index bf6882d4c..9adfcde13 100644
--- a/src/main/java/com/threerings/presents/tools/GenServiceTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenServiceTask.java
@@ -180,6 +180,14 @@ public class GenServiceTask extends InvocationTask
}
}
+ /**
+ * Configures to output extra information when generating code.
+ */
+ public void setVerbose (boolean verbose)
+ {
+ _verbose = verbose;
+ }
+
/**
* Configures the path to our ActionScript source files.
*/
@@ -280,7 +288,7 @@ public class GenServiceTask extends InvocationTask
String mpath = source.getPath();
mpath = mpath.replace("Service", "Marshaller");
mpath = replacePath(mpath, "/client/", "/data/");
- writeFile(mpath, mergeTemplate(MARSHALLER_TMPL, ctx));
+ writeTemplate(MARSHALLER_TMPL, mpath, ctx);
// if we're not configured with an ActionScript source root, don't generate the
// ActionScript versions
@@ -350,7 +358,7 @@ public class GenServiceTask extends InvocationTask
// generate an ActionScript version of our marshaller
String ampath = _asroot + File.separator + mppath + File.separator + mname + ".as";
- writeFile(ampath, mergeTemplate(AS_MARSHALLER_TMPL, ctx));
+ writeTemplate(AS_MARSHALLER_TMPL, ampath, ctx);
// ----------- Part III - as listener marshallers
@@ -387,7 +395,7 @@ public class GenServiceTask extends InvocationTask
ctx.put("listener", listener);
String aslpath = _asroot + File.separator + mppath +
File.separator + mname + "_" + listener.getListenerName() + "Marshaller.as";
- writeFile(aslpath, mergeTemplate(AS_LISTENER_MARSHALLER_TMPL, ctx));
+ writeTemplate(AS_LISTENER_MARSHALLER_TMPL, aslpath, ctx);
}
// ----------- Part IV - as service
@@ -434,7 +442,7 @@ public class GenServiceTask extends InvocationTask
// generate an ActionScript version of our service
String aspath = _asroot + File.separator + sppath + File.separator + sname + ".as";
- writeFile(aspath, mergeTemplate(AS_SERVICE_TMPL, ctx));
+ writeTemplate(AS_SERVICE_TMPL, aspath, ctx);
// ----------- Part V - as service listeners
Class> isil = InvocationService.InvocationListener.class;
@@ -471,12 +479,12 @@ public class GenServiceTask extends InvocationTask
String aslpath = _asroot + File.separator + sppath + File.separator +
sname + "_" + listener.getListenerName() + "Listener.as";
- writeFile(aslpath, mergeTemplate(AS_LISTENER_SERVICE_TMPL, ctx));
+ writeTemplate(AS_LISTENER_SERVICE_TMPL, aslpath, ctx);
if (_aslistenerAdapters.contains(sname)) {
String aslapath = _asroot + File.separator + sppath + File.separator +
sname + "_" + listener.getListenerName() + "ListenerAdapter.as";
- writeFile(aslapath, mergeTemplate(AS_LISTENER_ADAPTER_SERVICE_TMPL, ctx));
+ writeTemplate(AS_LISTENER_ADAPTER_SERVICE_TMPL, aslapath, ctx);
}
}
}
@@ -531,12 +539,12 @@ public class GenServiceTask extends InvocationTask
String mpath = source.getPath();
mpath = mpath.replace("Service", "Dispatcher");
mpath = replacePath(mpath, "/client/", "/server/");
- writeFile(mpath, mergeTemplate(DISPATCHER_TMPL,
- "name", name,
- "generated", getGeneratedAnnotation(name),
- "package", dpackage,
- "methods", sdesc.methods,
- "imports", imports.toList()));
+ writeTemplate(DISPATCHER_TMPL, mpath,
+ "name", name,
+ "generated", getGeneratedAnnotation(name),
+ "package", dpackage,
+ "methods", sdesc.methods,
+ "imports", imports.toList());
}
protected void generateProvider (File source, ServiceDescription sdesc)
@@ -584,13 +592,13 @@ public class GenServiceTask extends InvocationTask
String mpath = source.getPath();
mpath = mpath.replace("Service", "Provider");
mpath = replacePath(mpath, "/client/", "/server/");
- writeFile(mpath, mergeTemplate(PROVIDER_TMPL,
- "name", name,
- "generated", getGeneratedAnnotation(name),
- "package", mpackage,
- "methods", sdesc.methods,
- "listeners", sdesc.listeners,
- "imports", imports.toList()));
+ writeTemplate(PROVIDER_TMPL, mpath,
+ "name", name,
+ "generated", getGeneratedAnnotation(name),
+ "package", mpackage,
+ "methods", sdesc.methods,
+ "listeners", sdesc.listeners,
+ "imports", imports.toList());
}
/**
@@ -677,6 +685,9 @@ public class GenServiceTask extends InvocationTask
}
}
+ /** Show extra output if set. */
+ protected boolean _verbose;
+
/** The path to our ActionScript source files. */
protected File _asroot;
diff --git a/src/main/java/com/threerings/presents/tools/GenStreamableTask.java b/src/main/java/com/threerings/presents/tools/GenStreamableTask.java
index a8e9c5f21..b946d1f4e 100644
--- a/src/main/java/com/threerings/presents/tools/GenStreamableTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenStreamableTask.java
@@ -28,7 +28,6 @@ import java.io.File;
import java.io.IOException;
import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
import com.google.common.collect.Lists;
@@ -42,13 +41,14 @@ import com.threerings.presents.dobj.DObject;
* Streamable} classes that have protected or private members so that they can be used in a
* sandboxed environment.
*/
-public class GenStreamableTask extends Task
+public class GenStreamableTask extends GenTask
{
/**
- * Adds a nested <fileset> element which enumerates streamable source files.
+ * Adds a nested <fileset> element which enumerates streamable source
+ * files.
*/
- public void addFileset (FileSet set)
- {
+ @Override
+ public void addFileset(FileSet set) {
_filesets.add(set);
}
@@ -98,6 +98,7 @@ public class GenStreamableTask extends Task
/**
* Processes a resolved {@link Streamable} class instance.
*/
+ @Override
protected void processClass (File source, Class> sclass)
throws IOException
{
@@ -156,11 +157,7 @@ public class GenStreamableTask extends Task
System.err.println("Converting " + sclass.getName() + "...");
- try {
- sfile.writeTo(source, null, methods.toString());
- } catch (IOException ioe) {
- System.err.println("Error writing " + source + ": " + ioe);
- }
+ writeFile(source.getAbsolutePath(), sfile.generate(null, methods.toString()));
}
protected String toReadObject (Field field)
diff --git a/src/main/java/com/threerings/presents/tools/GenTask.java b/src/main/java/com/threerings/presents/tools/GenTask.java
index 8c34e2b0f..3af648ceb 100644
--- a/src/main/java/com/threerings/presents/tools/GenTask.java
+++ b/src/main/java/com/threerings/presents/tools/GenTask.java
@@ -21,28 +21,35 @@
package com.threerings.presents.tools;
-import java.util.List;
-import java.util.Map;
+import static com.google.common.base.Charsets.UTF_8;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.util.ClasspathUtils;
-import com.google.common.collect.Maps;
import com.google.common.collect.Lists;
-
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.io.Files;
import com.samskivert.io.StreamUtil;
import com.samskivert.mustache.Mustache;
+
public abstract class GenTask extends Task
{
/**
@@ -53,14 +60,6 @@ public abstract class GenTask extends Task
_filesets.add(set);
}
- /**
- * Configures to output extra information when generating code.
- */
- public void setVerbose (boolean verbose)
- {
- _verbose = verbose;
- }
-
/**
* Configures us with a header file that we'll prepend to all
* generated source files.
@@ -86,12 +85,24 @@ public abstract class GenTask extends Task
((AntClassLoader)_cloader).setParent(getClass().getClassLoader());
}
+ /**
+ * Fails the build if generation would change files rather than generating
+ * code.
+ */
+ public void setChecking (boolean checking)
+ {
+ _checking = checking;
+ }
+
/**
* Performs the actual work of the task.
*/
@Override
public void execute ()
{
+ if (_checking) {
+ log("Only checking if generation would change files", Project.MSG_VERBOSE);
+ }
for (FileSet fs : _filesets) {
DirectoryScanner ds = fs.getDirectoryScanner(getProject());
File fromDir = fs.getDir(getProject());
@@ -105,6 +116,47 @@ public abstract class GenTask extends Task
}
}
}
+ if (_checking && !_modifiedPaths.isEmpty()) {
+ throw new BuildException("Generation would produce changes!");
+ }
+
+ }
+
+ protected void writeTemplate (String templatePath, String outputPath, Object... data)
+ throws IOException
+ {
+ writeTemplate(templatePath, outputPath, createMap(data));
+ }
+
+ protected void writeTemplate (String templatePath, String outputPath, Map data)
+ throws IOException
+ {
+ String output = mergeTemplate(templatePath, data);
+ if (_header != null) {
+ output = _header + output;
+ }
+ writeFile(outputPath, output);
+ }
+
+ protected void writeFile (String outputPath, String output) throws IOException
+ {
+ File dest = new File(outputPath);
+ if (dest.exists()) {
+ if (Files.toString(dest, UTF_8).equals(output)) {
+ log("Skipping '" + outputPath + "' as it hasn't changed", Project.MSG_VERBOSE);
+ return;
+ }
+ } else if (!dest.getParentFile().exists() && !dest.getParentFile().mkdirs()) {
+ throw new BuildException("Unable to create directory for '" + dest.getAbsolutePath() + "'");
+ }
+ _modifiedPaths.add(outputPath);
+ if (_checking) {
+ log("Generating '" + outputPath + "' would have produced changes!", Project.MSG_ERR);
+ return;
+ }
+ log("Writing file " + outputPath, Project.MSG_VERBOSE);
+
+ new PrintWriter(dest, "UTF-8").append(output).close();
}
/**
@@ -114,13 +166,9 @@ public abstract class GenTask extends Task
* be any object.
*/
protected String mergeTemplate (String template, Object... data)
- throws Exception
+ throws IOException
{
- Map ctx = Maps.newHashMap();
- for (int ii = 0; ii < data.length; ii += 2) {
- ctx.put((String)data[ii], data[ii+1]);
- }
- return mergeTemplate(template, ctx);
+ return mergeTemplate(template, createMap(data));
}
/**
@@ -129,10 +177,20 @@ public abstract class GenTask extends Task
* @return a string containing the merged text.
*/
protected String mergeTemplate (String template, Map data)
- throws Exception
+ throws IOException
{
- return Mustache.compiler().escapeHTML(false).compile(new InputStreamReader(
- getClass().getClassLoader().getResourceAsStream(template), "UTF-8")).execute(data);
+ Reader reader =
+ new InputStreamReader(getClass().getClassLoader().getResourceAsStream(template), UTF_8);
+ return Mustache.compiler().escapeHTML(false).compile(reader).execute(data);
+ }
+
+ protected Map createMap (Object... data)
+ {
+ Map ctx = Maps.newHashMap();
+ for (int ii = 0; ii < data.length; ii += 2) {
+ ctx.put((String)data[ii], data[ii+1]);
+ }
+ return ctx;
}
/**
@@ -172,12 +230,12 @@ public abstract class GenTask extends Task
/** A list of filesets that contain java source to be processed. */
protected List _filesets = Lists.newArrayList();
- /** Show extra output if set. */
- protected boolean _verbose;
-
/** Used to do our own classpath business. */
protected ClassLoader _cloader;
/** A header to put on all generated source files. */
protected String _header;
+
+ protected boolean _checking;
+ protected Set _modifiedPaths = Sets.newHashSet();
}
diff --git a/src/main/java/com/threerings/presents/tools/InvocationTask.java b/src/main/java/com/threerings/presents/tools/InvocationTask.java
index e1cc2eecc..8ceab2310 100644
--- a/src/main/java/com/threerings/presents/tools/InvocationTask.java
+++ b/src/main/java/com/threerings/presents/tools/InvocationTask.java
@@ -31,10 +31,6 @@ import java.util.Arrays;
import java.util.List;
import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import org.apache.tools.ant.BuildException;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -395,22 +391,6 @@ public abstract class InvocationTask extends GenTask
super.execute();
}
- protected void writeFile (String path, String data)
- throws IOException
- {
- if (_verbose) {
- System.out.println("Writing file " + path);
- }
- if (_header != null) {
- data = _header + data;
- }
- File dest = new File(path);
- if (!dest.getParentFile().exists() && !dest.getParentFile().mkdirs()) {
- throw new BuildException("Unable to create directory for " + dest.getAbsolutePath());
- }
- new PrintWriter(dest, "UTF-8").append(data).close();
- }
-
protected static void checkedAdd (List list, T value)
{
if (!list.contains(value)) {
diff --git a/src/main/java/com/threerings/presents/tools/SourceFile.java b/src/main/java/com/threerings/presents/tools/SourceFile.java
index acd08d517..1ccfda1be 100644
--- a/src/main/java/com/threerings/presents/tools/SourceFile.java
+++ b/src/main/java/com/threerings/presents/tools/SourceFile.java
@@ -27,8 +27,8 @@ import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
-import java.io.FileWriter;
import java.io.IOException;
+import java.io.StringWriter;
import com.google.common.collect.Lists;
@@ -129,11 +129,11 @@ public class SourceFile
* @param fsection the new "generated fields" to write to the file, or null.
* @param msection the new "generated methods" to write to the file, or null.
*/
- public void writeTo (File dest, String fsection, String msection)
+ public String generate (String fsection, String msection)
throws IOException
{
- BufferedWriter bout = new BufferedWriter(new FileWriter(dest));
-
+ StringWriter writer = new StringWriter();
+ BufferedWriter bout = new BufferedWriter(writer);
addOrRemoveGeneratedImport(StringUtil.deNull(fsection).contains("@Generated(") ||
StringUtil.deNull(msection).contains("@Generated("));
@@ -180,6 +180,7 @@ public class SourceFile
writeln(bout, _lines.get(ii));
}
bout.close();
+ return writer.toString();
}
/** Helper function for sanity checking marker existence. */
diff --git a/src/main/java/com/threerings/presents/tools/cpp/CPPUtil.java b/src/main/java/com/threerings/presents/tools/cpp/CPPUtil.java
index 83f8bbd06..aaf641f9d 100644
--- a/src/main/java/com/threerings/presents/tools/cpp/CPPUtil.java
+++ b/src/main/java/com/threerings/presents/tools/cpp/CPPUtil.java
@@ -6,19 +6,10 @@ import java.lang.reflect.TypeVariable;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
-import java.io.BufferedWriter;
import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
-import com.google.common.io.Resources;
-import com.samskivert.mustache.Mustache;
-
import com.threerings.presents.dobj.DSet;
public class CPPUtil
@@ -70,19 +61,6 @@ public class CPPUtil
}
}
- public static void writeTemplate (String tmplPath, File root, String path,
- Map ctx)
- throws IOException
- {
- String tmpl =
- Resources.toString(Resources.getResource(tmplPath), Charsets.UTF_8);
- File file = new File(root, path);
- file.getParentFile().mkdirs();
- BufferedWriter out = new BufferedWriter(new FileWriter(file));
- Mustache.compiler().escapeHTML(false).compile(tmpl).execute(ctx, out);
- out.close();
- }
-
public static String makeCPPName (Class> sclass)
{
return makeCPPName(makeNamespaces(sclass), sclass.getSimpleName());
@@ -103,6 +81,17 @@ public class CPPUtil
return Joiner.on(File.separator).join(namespaces) + File.separator + className+ ext;
}
+ public static String makePath (File root, Class> klass, String ext)
+ {
+ return new File(root, makePath(klass, ext)).getAbsolutePath();
+ }
+
+
+ public static String makePath (File root, List namespaces, String className, String ext)
+ {
+ return new File(root, makePath(namespaces, className, ext)).getAbsolutePath();
+ }
+
public static List makeNamespaces (String pack)
{
Iterable split = Splitter.on(".").split(pack);
diff --git a/src/main/java/com/threerings/presents/tools/cpp/GenCPPReceiverTask.java b/src/main/java/com/threerings/presents/tools/cpp/GenCPPReceiverTask.java
index a11bda6b6..c90f5797d 100644
--- a/src/main/java/com/threerings/presents/tools/cpp/GenCPPReceiverTask.java
+++ b/src/main/java/com/threerings/presents/tools/cpp/GenCPPReceiverTask.java
@@ -1,5 +1,7 @@
package com.threerings.presents.tools.cpp;
+import static com.threerings.presents.tools.cpp.CPPUtil.makePath;
+
import java.lang.reflect.Type;
import java.util.Iterator;
@@ -39,8 +41,7 @@ public class GenCPPReceiverTask extends GenReceiverTask
ctx.put("receiverCode", rcode);
ctx.put("argbuilder", new CPPArgBuilder(false));
- CPPUtil.writeTemplate(DECODER_HEADER_TMPL, _cpproot,
- CPPUtil.makePath(namespaces, dname, ".h"), ctx);
+ writeTemplate(DECODER_HEADER_TMPL, makePath(_cpproot, namespaces, dname, ".h"), ctx);
Set receiverHeaderIncludes = Sets.newTreeSet();
Set decoderImplIncludes = Sets.newTreeSet();
@@ -60,13 +61,9 @@ public class GenCPPReceiverTask extends GenReceiverTask
}
ctx.put("includes", decoderImplIncludes);
- CPPUtil.writeTemplate(DECODER_CPP_TMPL, _cpproot,
- CPPUtil.makePath(namespaces, dname, ".cpp"), ctx);
-
-
+ writeTemplate(DECODER_CPP_TMPL, makePath(_cpproot, namespaces, dname, ".cpp"), ctx);
ctx.put("includes", receiverHeaderIncludes);
- CPPUtil.writeTemplate(RECEIVER_HEADER_TMPL, _cpproot,
- CPPUtil.makePath(namespaces, rname, ".h"), ctx);
+ writeTemplate(RECEIVER_HEADER_TMPL, makePath(_cpproot, namespaces, rname, ".h"), ctx);
super.generateDecoder(receiver, source, rname, rpackage, methods, imports, rcode);
}
diff --git a/src/main/java/com/threerings/presents/tools/cpp/GenCPPServiceTask.java b/src/main/java/com/threerings/presents/tools/cpp/GenCPPServiceTask.java
index ee58ad192..8580375ec 100644
--- a/src/main/java/com/threerings/presents/tools/cpp/GenCPPServiceTask.java
+++ b/src/main/java/com/threerings/presents/tools/cpp/GenCPPServiceTask.java
@@ -15,7 +15,6 @@ import com.threerings.presents.tools.GenServiceTask;
import static com.threerings.presents.tools.cpp.CPPUtil.makeNamespaces;
import static com.threerings.presents.tools.cpp.CPPUtil.makePath;
-import static com.threerings.presents.tools.cpp.CPPUtil.writeTemplate;
public class GenCPPServiceTask extends GenServiceTask
{
@@ -58,9 +57,9 @@ public class GenCPPServiceTask extends GenServiceTask
}
}
ctx.put("includes", implIncludes);
- writeTemplate(CPP_TMPL, _cpproot, makePath(namespaces, name, ".cpp"), ctx);
+ writeTemplate(CPP_TMPL, makePath(_cpproot, namespaces, name, ".cpp"), ctx);
ctx.put("includes", includes);
- writeTemplate(HEADER_TMPL, _cpproot, makePath(namespaces, name, ".h"), ctx);
+ writeTemplate(HEADER_TMPL, makePath(_cpproot, namespaces, name, ".h"), ctx);
super.generateMarshaller(source, sdesc);
}
diff --git a/src/main/java/com/threerings/presents/tools/cpp/GenCPPStreamableTask.java b/src/main/java/com/threerings/presents/tools/cpp/GenCPPStreamableTask.java
index 486b8f2cb..e14fa29bb 100644
--- a/src/main/java/com/threerings/presents/tools/cpp/GenCPPStreamableTask.java
+++ b/src/main/java/com/threerings/presents/tools/cpp/GenCPPStreamableTask.java
@@ -134,10 +134,10 @@ public class GenCPPStreamableTask extends GenTask
// now write all that out to the target source file
ctx.put("includes", headerIncludes);
- CPPUtil.writeTemplate(HEADER_TMPL, _cpproot, makePath(sclass, ".h"), ctx);
+ writeTemplate(HEADER_TMPL, makePath(_cpproot, sclass, ".h"), ctx);
ctx.put("includes", implIncludes);
- CPPUtil.writeTemplate(CPP_TMPL, _cpproot, makePath(sclass, ".cpp"), ctx);
+ writeTemplate(CPP_TMPL, makePath(_cpproot, sclass, ".cpp"), ctx);
}
protected static void addInclude (Class> ftype, Set includes)