Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  //
  // $Id: GenStreamableTask.java 6776 2012-02-03 21:25:13Z mdb $
  //
  // Narya library - tools for developing networked games
  // Copyright (C) 2002-2012 Three Rings Design, Inc., All Rights Reserved
  // http://code.google.com/p/narya/
  //
  // This library is free software; you can redistribute it and/or modify it
  // under the terms of the GNU Lesser General Public License as published
 // by the Free Software Foundation; either version 2.1 of the License, or
 // (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 // Lesser General Public License for more details.
 //
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 package com.threerings.presents.tools;
 
 
 import java.io.File;
 
 
 
 
Generates readObject() and writeObject() methods for com.threerings.io.Streamable classes that have protected or private members so that they can be used in a sandboxed environment.
 
 public class GenStreamableTask extends GenTask
 {
    
Adds a nested <fileset> element which enumerates streamable source files.
 
     @Override
     public void addFileset(FileSet set) {
         .add(set);
     }
 
     @Override
     public void execute ()
     {
         for (FileSet fs : ) {
             DirectoryScanner ds = fs.getDirectoryScanner(getProject());
             File fromDir = fs.getDir(getProject());
             String[] srcFiles = ds.getIncludedFiles();
             for (String srcFile : srcFiles) {
                 processClass(new File(fromDirsrcFile));
             }
         }
     }

    
Processes a com.threerings.io.Streamable source file.
 
     protected void processClass (File source)
     {
         // load up the file and determine it's package and classname
         String name = null;
         try {
             name = GenUtil.readClassName(source);
         } catch (Exception e) {
             ..println("Failed to parse " + source + ": " + e.getMessage());
             return;
         }
 
         ..println("Considering " + name + "...");
 
         try {
             // in order for annotations to work, this task and all the classes it uses must be
             // loaded from the same class loader as the classes on which we are going to
             // introspect; this is non-ideal but unavoidable
             processClass(sourcegetClass().getClassLoader().loadClass(name));
         } catch (ClassNotFoundException cnfe) {
             ..println("Failed to load " + name + ".\nMissing class: " + cnfe.getMessage());
             ..println("Be sure to set the 'classpathref' attribute to a classpath\n" +
                                "that contains your projects invocation service classes.");
         } catch (Exception e) {
             e.printStackTrace(.);
         }
     }

    
Processes a resolved com.threerings.io.Streamable class instance.
    @Override
    protected void processClass (File sourceClass<?> sclass)
        throws IOException
    {
        StreamableClassRequirements reqs = new StreamableClassRequirements(sclass);
        // we must implement Streamable, not be a DObject and have some fields that need to be
        // streamed
        if (!Streamable.class.isAssignableFrom(sclass) || DObject.class.isAssignableFrom(sclass) ||
                reqs.streamedFields.isEmpty()) {
            // System.err.println("Skipping " + sclass.getName() + "...");
            return;
        }
        // add readObject() and writeObject() definitions
        StringBuilder readbuf = new StringBuilder();
        StringBuilder writebuf = new StringBuilder();
        if (reqs.superclassStreamable) {
            readbuf.append("        super.readObject(ins);\n");
            writebuf.append("        super.writeObject(out);\n");
        }
        for (Field field : reqs.streamedFields) {
            readbuf.append("        ");
            readbuf.append(field.getName()).append(" = ");
            readbuf.append(toReadObject(field));
            readbuf.append(";\n");
            writebuf.append("        out.");
            writebuf.append(toWriteObject(field));
            writebuf.append(";\n");
        }
        readbuf.append();
        writebuf.append();
        SourceFile sfile = new SourceFile();
        try {
            sfile.readFrom(source);
        } catch (IOException ioe) {
            ..println("Error reading " + source + ": " + ioe);
        }
        // don't overwrite an existing readObject() or writeObject()
        StringBuilder methods = new StringBuilder();
        if (!sfile.containsString("public void readObject")) {
            methods.append(readbuf);
        }
        if (!sfile.containsString("public void writeObject")) {
            if (methods.length() > 0) {
                methods.append("\n");
            }
            methods.append(writebuf);
        }
        if (methods.length() == 0) {
            return// nothing to do
        }
        ..println("Converting " + sclass.getName() + "...");
        writeFile(source.getAbsolutePath(), sfile.generate(nullmethods.toString()));
    }
    protected String toReadObject (Field field)
    {
        Class<?> type = field.getType();
        if (type.equals(String.class)) {
            return "ins.readUTF()";
        } else if (type.equals(.) || type.equals(Boolean.class)) {
            return "ins.readBoolean()";
        } else if (type.equals(.) || type.equals(Byte.class)) {
            return "ins.readByte()";
        } else if (type.equals(.) || type.equals(Short.class)) {
            return "ins.readShort()";
        } else if (type.equals(.) || type.equals(Integer.class)) {
            return "ins.readInt()";
        } else if (type.equals(.) || type.equals(Long.class)) {
            return "ins.readLong()";
        } else if (type.equals(.) || type.equals(Float.class)) {
            return "ins.readFloat()";
        } else if (type.equals(.) || type.equals(Double.class)) {
            return "ins.readDouble()";
        } else {
            return "(" + GenUtil.simpleName(field) + ")ins.readObject()";
        }
    }
    protected String toWriteObject (Field field)
    {
        Class<?> type = field.getType();
        String name = field.getName();
        if (type.equals(.) || type.equals(Boolean.class)) {
            return "writeBoolean(" + name + ")";
        } else if (type.equals(.) || type.equals(Byte.class)) {
            return "writeByte(" + name + ")";
        } else if (type.equals(.) || type.equals(Short.class)) {
            return "writeShort(" + name + ")";
        } else if (type.equals(.) || type.equals(Integer.class)) {
            return "writeInt(" + name + ")";
        } else if (type.equals(.) || type.equals(Long.class)) {
            return "writeLong(" + name + ")";
        } else if (type.equals(.) || type.equals(Float.class)) {
            return "writeFloat(" + name + ")";
        } else if (type.equals(.) || type.equals(Double.class)) {
            return "writeDouble(" + name + ")";
        } else if (type.equals(String.class)) {
            return "writeUTF(" + name + ")";
        } else {
            return "writeObject(" + name + ")";
        }
    }

    
A list of filesets that contain tile images.
    protected ArrayList<FileSet_filesets = Lists.newArrayList();
    protected static final String READ_OPEN =
        "    // from interface Streamable\n" +
        "    public void readObject (ObjectInputStream ins)\n" +
        "        throws IOException, ClassNotFoundException\n" +
        "    {\n";
    protected static final String READ_CLOSE = "    }\n";
    protected static final String WRITE_OPEN =
        "    // from interface Streamable\n" +
        "    public void writeObject (ObjectOutputStream out)\n" +
        "        throws IOException\n" +
        "    {\n";
    protected static final String WRITE_CLOSE = "    }\n";
New to GrepCode? Check out our FAQ X