package org.objectstyle.wolips.eomodeler.doc;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.apache.velocity.runtime.resource.loader.FileResourceLoader;
import org.objectstyle.wolips.eomodeler.core.model.EOAttribute;
import org.objectstyle.wolips.eomodeler.core.model.EOEntity;
import org.objectstyle.wolips.eomodeler.core.model.EOModel;
import org.objectstyle.wolips.eomodeler.core.model.EOModelGroup;
import org.objectstyle.wolips.eomodeler.core.model.EORelationship;
import org.objectstyle.wolips.thirdparty.velocity.WOLipsVelocityUtils;
import org.osgi.framework.Bundle;
public class EOModelGraffleGenerator {
private int _id;
private Map<Object, Integer> _ids;
private VelocityEngine _velocityEngine;
private VelocityContext _context;
private EOModelGroup _modelGroup;
private File _outputFile;
private FileWriter _outputWriter;
public EOModelGraffleGenerator(boolean insideEclipse, EOModelGroup modelGroup, File templatePath, File outputFile) throws Exception {
Bundle templateBundle = insideEclipse ? Activator.getDefault().getBundle() : null;
_id = 2;
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(this.getClass().getClassLoader());
try {
_velocityEngine = new VelocityEngine();
_velocityEngine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, org.apache.velocity.runtime.log.NullLogSystem.class.getName());
StringBuffer templatePaths = new StringBuffer();
templatePaths.append(".");
if (templatePath != null) {
templatePaths.append(",");
templatePaths.append(templatePath.getAbsolutePath());
}
_velocityEngine.setProperty("resource.loader", "file,class");
_velocityEngine.setProperty("file.resource.loader.class", FileResourceLoader.class.getName());
_velocityEngine.setProperty("file.resource.loader.path", templatePaths.toString());
_velocityEngine.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
_velocityEngine.init();
} finally {
thread.setContextClassLoader(loader);
}
_context = new VelocityContext();
_ids = new HashMap<Object, Integer>();
_modelGroup = modelGroup;
_outputFile = outputFile;
}
public Integer nextID() {
return Integer.valueOf(++_id);
}
protected void generateConnections() throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception {
for (EOModel model : _modelGroup.getModels()) {
for (EOEntity entity : model.getEntities()) {
if (entity.isPrototype()) {
continue;
}
EOEntity parentEntity = entity.getParent();
if (parentEntity != null) {
_context.put("id", _ids.get(entity.getName() + "Parent"));
_context.put("fromID", _ids.get(entity));
_context.put("toID", _ids.get(parentEntity));
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/subEntity.vm"));
}
for (EORelationship relationship : entity.getRelationships()) {
_context.put("relationship", relationship);
_context.put("id", _ids.get(relationship.getFullyQualifiedName() + "Line"));
_context.put("fromID", _ids.get(relationship));
_context.put("toID", _ids.get(relationship.getDestination()));
if (relationship.isToOne()) {
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/toOne.vm"));
} else if (relationship.isToMany()) {
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/toMany.vm"));
}
}
}
}
}
protected void generateNodes() throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, Exception {
for (EOModel model : _modelGroup.getModels()) {
for (EOEntity entity : model.getEntities()) {
if (entity.isPrototype()) {
continue;
}
_context.put("id", _ids.get(entity.getName() + "Group"));
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/groupHeader.vm"));
int entityX = (int) (Math.random() * 2000);
int entityY = (int) (Math.random() * 2000);
int marginTop = 26;
int attributeHeight = 20;
int relationshipHeight = 20;
int verticalSpacer = 20;
int marginBottom = 20;
int width = 220;
int attributeNum = 0;
for (EOAttribute attribute : entity.getAttributes()) {
_context.put("attribute", attribute);
_context.put("id", _ids.get(attribute));
_context.put("x", entityX);
_context.put("y", entityY + marginTop + attributeHeight * attributeNum);
_context.put("width", width);
_context.put("height", attributeHeight);
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/attribute.vm"));
attributeNum++;
}
int relationshipNum = 0;
for (EORelationship relationship : entity.getRelationships()) {
_context.put("relationship", relationship);
_context.put("id", _ids.get(relationship));
_context.put("x", entityX);
_context.put("y", entityY + marginTop + attributeHeight * attributeNum + verticalSpacer + relationshipHeight * relationshipNum);
_context.put("width", width);
_context.put("height", relationshipHeight);
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/relationship.vm"));
relationshipNum++;
}
int height = marginTop + entity.getAttributes().size() * attributeHeight + verticalSpacer + entity.getRelationships().size() * relationshipHeight + marginBottom;
_context.put("entity", entity);
_context.put("id", _ids.get(entity));
_context.put("x", entityX);
_context.put("y", entityY);
_context.put("width", width);
_context.put("height", height);
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/entity.vm"));
_context.put("id", _ids.get(entity.getName() + "Group"));
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/groupFooter.vm"));
}
}
}
public void generate() throws Exception {
_outputWriter = new FileWriter(_outputFile);
try {
for (EOModel model : _modelGroup.getModels()) {
_ids.put(model, nextID());
for (EOEntity entity : model.getEntities()) {
if (entity.isPrototype()) {
continue;
}
_ids.put(entity, nextID());
_ids.put(entity.getName() + "Group", nextID());
EOEntity parentEntity = entity.getParent();
if (parentEntity != null) {
_ids.put(entity.getName() + "Parent", nextID());
}
for (EOAttribute attribute : entity.getAttributes()) {
_ids.put(attribute, nextID());
}
for (EORelationship relationship : entity.getRelationships()) {
_ids.put(relationship, nextID());
_ids.put(relationship.getFullyQualifiedName() + "Line", nextID());
}
}
}
_context.put("id", nextID());
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/header.vm"));
generateNodes();
generateConnections();
_outputWriter.append(WOLipsVelocityUtils.writeTemplateToString(_velocityEngine, _context, "graffle/footer.vm"));
} finally {
_outputWriter.close();
}
}
}