/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML 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 3 of * the License, or (at your option) any later version. * * CloudML 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 CloudML. If not, see * <http://www.gnu.org/licenses/>. */ package org.cloudml.codecs; import org.cloudml.core.*; import org.cloudml.core.visitors.AbstractVisitListener; /** * Traverse the deployment model a output DOT code for visualisation */ public class DotPrinter extends AbstractVisitListener { private final SymbolTable symbols; private StringBuilder dotText; public DotPrinter() { this.symbols = new SymbolTable(); } public DotPrinter(SymbolTable symbols) { this.symbols = symbols; } @Override public void onDeploymentEntry(Deployment subject) { ensureBufferIsReady(); dotText.append("digraph Deployment {\n"); } @Override public void onDeploymentExit(Deployment subject) { dotText.append("}\n"); } @Override public void onExternalComponentInstanceEntry(ExternalComponentInstance subject) { ensureBufferIsReady(); dotText.append("\t") .append(symbols.initialise(subject)) .append(" [") .append(componentFormatting(subject)).append("];\n"); } @Override public void onVMInstanceEntry(VMInstance subject) { ensureBufferIsReady(); dotText.append("\t") .append(symbols.initialise(subject)) .append(" [") .append(vmFormatting(subject)).append("];\n"); } private String vmFormatting(ComponentInstance<? extends Component> subject) { return "label=\"" + subject.getName() + "\", style=\"filled\""; } private String componentFormatting(ComponentInstance<? extends Component> subject) { return "label=\"" + subject.getName() + "\""; } @Override public void onInternalComponentInstanceEntry(InternalComponentInstance subject) { ensureBufferIsReady(); dotText.append("\t") .append(symbols.initialise(subject)) .append(" [") .append(componentFormatting(subject)).append("];\n"); } @Override public void onRelationshipInstanceEntry(RelationshipInstance subject) { ensureBufferIsReady(); dotText.append("\t") .append(symbols.get(subject.getClientComponent())) .append(" -> ") .append(symbols.get(subject.getServerComponent())) .append(" [") .append(relationshipFormating(subject)) .append(" ];\n"); } private String relationshipFormating(RelationshipInstance subject) { return "label=\"" + subject.getName() + "\""; } @Override public void onExecuteInstanceEntry(ExecuteInstance subject) { ensureBufferIsReady(); dotText.append("\t") .append(symbols.get(subject.getSubject())) .append(" -> ") .append(symbols.get(subject.getHost())) .append(" [") .append(executeOnFormatting(subject)) .append(" ];\n"); } private String executeOnFormatting(ExecuteInstance subject) { return "style=\"dashed\""; } private void ensureBufferIsReady() { if (dotText == null) { dotText = new StringBuilder(); } } public String getDotText() { ensureBufferIsReady(); return dotText.toString(); } }