All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xmlvm.util.skeleton.ClassSkeleton Maven / Gradle / Ivy

There is a newer version: 0.96-beta4
Show newest version
/* Copyright (c) 2002-2011 by XMLVM.org
 *
 * Project Info:  http://www.xmlvm.org
 *
 * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 * USA.
 */

package org.xmlvm.util.skeleton;

import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ClassSkeleton
{

	private static final String COPYRIGHT= "/*\n" + " * Copyright (c) 2002-2011 by XMLVM.org\n" + " *\n" + " * Project Info:  http://www.xmlvm.org\n" + " *\n" + " * This program is free software; you can redistribute it and/or modify it\n" + " * under the terms of the GNU Lesser General Public License as published by\n" + " * the Free Software Foundation; either version 2.1 of the License, or\n" + " * (at your option) any later version.\n" + " *\n" + " * This library is distributed in the hope that it will be useful, but\n" + " * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n" + " * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public\n" + " * License for more details.\n" + " *\n" + " * You should have received a copy of the GNU Lesser General Public\n" + " * License along with this library; if not, write to the Free Software\n" + " * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,\n" + " * USA.\n" + " */\n\n";
	private static final String LINE= "// ----------------------------------------------------------------------------\n";
	private static final String INIT= "__init_";
	private static final char DOT= '_';
	private static final String PARAM= "___";
	/* */
	private StringBuilder hfile;
	private StringBuilder mfile;
	private StringBuilder test;
	private final Class c;

	public ClassSkeleton(Class c)
	{
		this.c= c;
		hfile= new StringBuilder();
		mfile= new StringBuilder();
		test= new StringBuilder();

		String jclass= c.getName();
		String classname= fixName(jclass);
		String shortname= getShort();

		/* Create .h header */
		hfile.append(COPYRIGHT);
		hfile.append("// ").append(shortname).append('\n');
		hfile.append(LINE);
		hfile.append("typedef ").append(shortname).append(' ').append(classname).append(";\n\n");
		hfile.append("@interface ").append(shortname).append(" (cat_").append(classname).append(");\n");

		/* Create .m header */
		mfile.append(COPYRIGHT);
		mfile.append("#import \"").append(classname).append(".h\"\n\n");
		mfile.append("// ").append(shortname).append('\n');
		mfile.append(LINE);
		mfile.append("@implementation ").append(shortname).append(" (cat_").append(classname).append(");\n\n");

		/* Create .h * .m body */
		for (Constructor constr : c.getConstructors())
			buildMethod(INIT + classname, constr.getParameterTypes(), null, c.getModifiers());
		for (Method meth : c.getMethods())
			if (meth.getDeclaringClass().getName().equals(jclass))
				buildMethod(meth.getName(), meth.getParameterTypes(), meth.getReturnType(), meth.getModifiers());

		/* Create footers */
		hfile.append("@end\n");
		mfile.append("@end\n");

		storeBuffer("out/" + classname + ".h", hfile);
		storeBuffer("out/" + classname + ".m", mfile);
	}

	private void buildMethod(String method, Class[] parameters, Class returntype, int type)
	{
		if ((type & Modifier.PUBLIC) == 0)
			return; // Only public elements!

		String decl= getMethodDecleration(method, parameters, returntype, type);
		hfile.append(decl).append(";\n");
		mfile.append(decl).append("\n{\n  // TODO: implement code\n}\n\n");
	}

	private String getMethodDecleration(String method, Class[] parameters, Class returntype, int type)
	{
		StringBuilder name= new StringBuilder();
		StringBuilder params= new StringBuilder();

		name.append((type & Modifier.STATIC) == 0 ? "- (" : "+ (");
		name.append(getTypeRef(returntype)).append(") ");

		name.append(fixName(method));
		for (int i= 0; i < parameters.length; i++)
		{
			Class cc= parameters[i];
			String pname= fixName(cc.getName());
			name.append(PARAM).append(pname);

			params.append(" :").append("(").append(getTypeRef(cc)).append(")").append("a").append(i + 1);
		}
		name.append(params);
		return name.toString();
	}

	private String getTypeRef(Class type)
	{
		if (type == null)
			return "void";
		if (type.isPrimitive())
			return type.toString();
		else
			return fixName(type.getName()) + "*";
	}

	private String fixName(String oldname)
	{
		return oldname.replace('.', DOT);
	}

	private String getShort()
	{
		String classname= c.getName();
		int lastdot= classname.lastIndexOf('.');
		return classname.substring(lastdot + 1, classname.length());
	}

	private boolean storeBuffer(String filename, StringBuilder buffer)
	{
		FileWriter out= null;
		try
		{
			out= new FileWriter(filename);
			out.append(buffer);
			out.close();
			return true;
		}
		catch (IOException ex)
		{
		}
		finally
		{
			try
			{
				out.close();
			}
			catch (IOException ex)
			{
			}
		}
		return false;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy