/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package cb.generator;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
/**
* Simple representation of a Java Class.
*
* @version $Id: ClassImpl.java,v 1.3 2011/09/12 11:47:23 gpolet Exp $
* @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public class ClassImpl extends NodeImpl implements Class {
private String pack;
private ArrayList fields = new ArrayList();
private ArrayList methods = new ArrayList();
private ArrayList super_classes = new ArrayList();
private ArrayList interfaces = new ArrayList();
private ArrayList prefix = new ArrayList();
private boolean isInterface;
protected cb.petal.Class clazz;
public ClassImpl() {
}
public void setClazz(cb.petal.Class c) {
clazz = c;
}
public cb.petal.Class getClazz() {
return clazz;
}
@Override
public void setPackage(String p) {
pack = p;
}
@Override
public String getPackage() {
return pack;
}
public void isInterface(boolean i) {
isInterface = i;
}
@Override
public boolean isInterface() {
return isInterface;
}
@Override
public void addField(Field f) {
fields.add(f);
}
@Override
public void removeField(Field f) {
fields.remove(f);
}
@Override
public void addMethod(Method f) {
methods.add(f);
}
@Override
public void removeMethod(Method f) {
methods.remove(f);
}
@Override
public void addSuperClass(String s) {
super_classes.add(s);
}
@Override
public void removeSuperClass(String s) {
super_classes.remove(s);
}
@Override
public void addImplementedInterface(String s) {
interfaces.add(s);
}
@Override
public void removeImplementedInterface(String s) {
interfaces.remove(s);
}
@Override
public String getQualifiedName() {
if (pack != null && !"".equals(pack)) {
return pack + "." + name;
} else {
return name;
}
}
@Override
public void addPrefixCode(String c) {
prefix.add(c);
}
@Override
public Collection getMethods() {
return methods;
}
@Override
public Collection getFields() {
return fields;
}
public Collection getSuperClasses() {
return super_classes;
}
public Collection getImplementedInterfaces() {
return interfaces;
}
protected static void print(PrintWriter stream, String pre, String o, String post) {
if (o != null && !"".equals(o)) {
stream.print(pre + o + post);
}
}
/**
* Default implementation prints Java code
*/
@Override
public void dump(PrintWriter stream) {
print(stream, "package ", pack, ";\n");
for (Iterator i = prefix.iterator(); i.hasNext();) {
stream.println(i.next());
}
stream.println("\n/** Created with Generator/" + "<a href=\"http://crazybeans.sourceforge.net/\">" + "\n * CrazyBeans</a> "
+ new Date() + "\n *");
// Print documentation if any
if (clazz != null) {
cb.petal.StringLiteral str = (cb.petal.StringLiteral) clazz.getProperty("documentation");
if (str != null) {
Collection lines = str.getLines();
for (Iterator i = lines.iterator(); i.hasNext();) {
stream.println(" * " + i.next());
}
}
}
stream.println(" * @cbversion " + cb.util.Constants.VERSION + "\n */");
print(stream, "", getAccess(), " ");
if (isInterface()) {
stream.print("interface " + getName() + " ");
} else {
stream.print("class " + getName() + " ");
}
if (!super_classes.isEmpty()) {
stream.print("extends ");
for (Iterator i = super_classes.iterator(); i.hasNext();) {
stream.print(i.next());
if (i.hasNext()) {
stream.print(", ");
}
}
stream.print(" ");
}
if (!interfaces.isEmpty() && !isInterface()) {
stream.print("implements ");
for (Iterator i = interfaces.iterator(); i.hasNext();) {
stream.print(i.next());
if (i.hasNext()) {
stream.print(", ");
}
}
stream.print(" ");
}
stream.println("{");
for (Iterator i = getFields().iterator(); i.hasNext();) {
((Field) i.next()).dump(stream);
}
stream.println();
for (Iterator i = getMethods().iterator(); i.hasNext();) {
((Method) i.next()).dump(stream);
if (i.hasNext()) {
stream.println();
}
}
stream.println("}");
}
@Override
public boolean equals(Object o) {
if (o instanceof Class) {
Class c = (Class) o;
return getQualifiedName().equals(c.getQualifiedName());
} else {
return false;
}
}
@Override
public int hashCode() {
return getQualifiedName().hashCode();
}
}