001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.view; 018 019 import java.io.File; 020 import java.io.FileWriter; 021 import java.io.IOException; 022 import java.io.PrintWriter; 023 import java.util.ArrayList; 024 import java.util.HashMap; 025 import java.util.List; 026 import java.util.Map; 027 import java.util.Set; 028 029 import org.apache.camel.CamelContext; 030 import org.apache.camel.model.ChoiceType; 031 import org.apache.camel.model.FromType; 032 import org.apache.camel.model.MulticastType; 033 import org.apache.camel.model.ProcessorType; 034 import org.apache.camel.model.RouteType; 035 import org.apache.camel.model.ToType; 036 import org.apache.camel.model.language.ExpressionType; 037 import org.apache.camel.util.CollectionStringBuffer; 038 import org.apache.commons.logging.Log; 039 import org.apache.commons.logging.LogFactory; 040 041 /** 042 * @version $Revision: 382 $ 043 */ 044 public abstract class GraphGeneratorSupport { 045 private static final transient Log LOG = LogFactory.getLog(RouteDotGenerator.class); 046 protected String dir; 047 protected int clusterCounter; 048 protected String extension; 049 050 //private String imagePrefix = "http://www.enterpriseintegrationpatterns.com/img/"; 051 private String imagePrefix = "http://activemq.apache.org/camel/images/eip/"; 052 private Map<Object, NodeData> nodeMap = new HashMap<Object, NodeData>(); 053 private boolean makeParentDirs = true; 054 private Map<String, List<RouteType>> routeGroupMap; 055 056 protected GraphGeneratorSupport(String dir, String extension) { 057 this.dir = dir; 058 this.extension = extension; 059 } 060 061 public String getDir() { 062 return dir; 063 } 064 065 /** 066 * Sets the destination directory in which to create the diagrams 067 */ 068 public void setDir(String dir) { 069 this.dir = dir; 070 } 071 072 public void drawRoutes(CamelContext context) throws IOException { 073 File parent = new File(dir); 074 if (makeParentDirs) { 075 parent.mkdirs(); 076 } 077 List<RouteType> routes = context.getRouteDefinitions(); 078 routeGroupMap = createRouteGroupMap(routes); 079 080 // generate the global file 081 generateFile(parent, "routes" + extension, routeGroupMap); 082 083 if (routeGroupMap.size() >= 1) { 084 Set<Map.Entry<String, List<RouteType>>> entries = routeGroupMap.entrySet(); 085 for (Map.Entry<String, List<RouteType>> entry : entries) { 086 087 Map<String, List<RouteType>> map = new HashMap<String, List<RouteType>>(); 088 String group = entry.getKey(); 089 map.put(group, entry.getValue()); 090 091 // generate the file containing just the routes in this group 092 generateFile(parent, group + extension, map); 093 } 094 } 095 } 096 097 private void generateFile(File parent, String fileName, Map<String, List<RouteType>> map) throws IOException { 098 nodeMap.clear(); 099 clusterCounter = 0; 100 101 PrintWriter writer = new PrintWriter(new FileWriter(new File(parent, fileName))); 102 try { 103 generateFile(writer, map); 104 } finally { 105 writer.close(); 106 } 107 } 108 109 protected abstract void generateFile(PrintWriter writer, Map<String, List<RouteType>> map); 110 111 protected boolean isMulticastNode(ProcessorType node) { 112 return node instanceof MulticastType || node instanceof ChoiceType; 113 } 114 115 protected String getLabel(List<ExpressionType> expressions) { 116 CollectionStringBuffer buffer = new CollectionStringBuffer(); 117 for (ExpressionType expression : expressions) { 118 buffer.append(getLabel(expression)); 119 } 120 return buffer.toString(); 121 } 122 123 protected String getLabel(ExpressionType expression) { 124 if (expression != null) { 125 return expression.getLabel(); 126 } 127 return ""; 128 } 129 130 protected NodeData getNodeData(Object node) { 131 Object key = node; 132 if (node instanceof FromType) { 133 FromType fromType = (FromType)node; 134 key = fromType.getUriOrRef(); 135 } else if (node instanceof ToType) { 136 ToType toType = (ToType)node; 137 key = toType.getUriOrRef(); 138 } 139 NodeData answer = nodeMap.get(key); 140 if (answer == null) { 141 String id = "node" + (nodeMap.size() + 1); 142 answer = new NodeData(id, node, imagePrefix); 143 nodeMap.put(key, answer); 144 } 145 return answer; 146 } 147 148 protected Map<String, List<RouteType>> createRouteGroupMap(List<RouteType> routes) { 149 Map<String, List<RouteType>> map = new HashMap<String, List<RouteType>>(); 150 for (RouteType route : routes) { 151 String group = route.getGroup(); 152 if (group == null) { 153 group = "Camel Routes"; 154 } 155 List<RouteType> list = map.get(group); 156 if (list == null) { 157 list = new ArrayList<RouteType>(); 158 map.put(group, list); 159 } 160 list.add(route); 161 } 162 return map; 163 } 164 }