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.io.StringWriter;
024 import java.util.ArrayList;
025 import java.util.HashMap;
026 import java.util.List;
027 import java.util.Map;
028 import java.util.Set;
029
030 import org.apache.camel.CamelContext;
031 import org.apache.camel.model.ChoiceDefinition;
032 import org.apache.camel.model.FromDefinition;
033 import org.apache.camel.model.MulticastDefinition;
034 import org.apache.camel.model.ProcessorDefinition;
035 import org.apache.camel.model.RouteDefinition;
036 import org.apache.camel.model.ToDefinition;
037 import org.apache.camel.model.language.ExpressionDefinition;
038 import org.apache.camel.util.CollectionStringBuffer;
039 import org.apache.commons.logging.Log;
040 import org.apache.commons.logging.LogFactory;
041
042 /**
043 * @version $Revision: 752939 $
044 */
045 public abstract class GraphGeneratorSupport {
046 protected final transient Log log = LogFactory.getLog(getClass());
047 protected String dir;
048 protected int clusterCounter;
049 protected String extension;
050
051 //private String imagePrefix = "http://www.enterpriseintegrationpatterns.com/img/";
052 private String imagePrefix = "http://camel.apache.org/images/eip/";
053 private Map<Object, NodeData> nodeMap = new HashMap<Object, NodeData>();
054 private boolean makeParentDirs = true;
055 private Map<String, List<RouteDefinition>> routeGroupMap;
056
057 protected GraphGeneratorSupport(String dir, String extension) {
058 this.dir = dir;
059 this.extension = extension;
060 }
061
062 public String getDir() {
063 return dir;
064 }
065
066 /**
067 * Sets the destination directory in which to create the diagrams
068 */
069 public void setDir(String dir) {
070 this.dir = dir;
071 }
072
073 public String getImagePrefix() {
074 return imagePrefix;
075 }
076
077 public void setImagePrefix(String imagePrefix) {
078 this.imagePrefix = imagePrefix;
079 }
080
081 public String getRoutesText(CamelContext context) throws IOException {
082 List<RouteDefinition> routes = context.getRouteDefinitions();
083 routeGroupMap = createRouteGroupMap(routes);
084 return createRouteMapText();
085 }
086
087 public String getRouteText(RouteDefinition route) throws IOException {
088 routeGroupMap = createRouteGroupMap(route);
089 return createRouteMapText();
090 }
091
092 private String createRouteMapText() {
093 StringWriter buffer = new StringWriter();
094 PrintWriter writer = new PrintWriter(buffer);
095 generateFile(writer, routeGroupMap);
096 writer.close();
097 return buffer.toString();
098 }
099
100 public void drawRoutes(CamelContext context) throws IOException {
101 File parent = new File(dir);
102 if (makeParentDirs) {
103 parent.mkdirs();
104 }
105 List<RouteDefinition> routes = context.getRouteDefinitions();
106 routeGroupMap = createRouteGroupMap(routes);
107
108 // generate the global file
109 generateFile(parent, "routes" + extension, routeGroupMap);
110
111 if (routeGroupMap.size() >= 1) {
112 Set<Map.Entry<String, List<RouteDefinition>>> entries = routeGroupMap.entrySet();
113 for (Map.Entry<String, List<RouteDefinition>> entry : entries) {
114
115 Map<String, List<RouteDefinition>> map = new HashMap<String, List<RouteDefinition>>();
116 String group = entry.getKey();
117 map.put(group, entry.getValue());
118
119 // generate the file containing just the routes in this group
120 generateFile(parent, group + extension, map);
121 }
122 }
123 }
124
125 private void generateFile(File parent, String fileName, Map<String, List<RouteDefinition>> map) throws IOException {
126 nodeMap.clear();
127 clusterCounter = 0;
128
129 PrintWriter writer = new PrintWriter(new FileWriter(new File(parent, fileName)));
130 try {
131 generateFile(writer, map);
132 } finally {
133 writer.close();
134 }
135 }
136
137 protected abstract void generateFile(PrintWriter writer, Map<String, List<RouteDefinition>> map);
138
139 protected boolean isMulticastNode(ProcessorDefinition node) {
140 return node instanceof MulticastDefinition || node instanceof ChoiceDefinition;
141 }
142
143 protected String getLabel(List<ExpressionDefinition> expressions) {
144 CollectionStringBuffer buffer = new CollectionStringBuffer();
145 for (ExpressionDefinition expression : expressions) {
146 buffer.append(getLabel(expression));
147 }
148 return buffer.toString();
149 }
150
151 protected String getLabel(ExpressionDefinition expression) {
152 if (expression != null) {
153 return expression.getLabel();
154 }
155 return "";
156 }
157
158 protected NodeData getNodeData(Object node) {
159 Object key = node;
160 if (node instanceof FromDefinition) {
161 FromDefinition fromType = (FromDefinition) node;
162 key = fromType.getUriOrRef();
163 } else if (node instanceof ToDefinition) {
164 ToDefinition toType = (ToDefinition) node;
165 key = toType.getUriOrRef();
166 }
167 NodeData answer = nodeMap.get(key);
168 if (answer == null) {
169 String id = "node" + (nodeMap.size() + 1);
170 answer = new NodeData(id, node, imagePrefix);
171 nodeMap.put(key, answer);
172 }
173 return answer;
174 }
175
176 protected Map<String, List<RouteDefinition>> createRouteGroupMap(List<RouteDefinition> routes) {
177 Map<String, List<RouteDefinition>> map = new HashMap<String, List<RouteDefinition>>();
178 for (RouteDefinition route : routes) {
179 addRouteToMap(map, route);
180 }
181 return map;
182 }
183
184 protected Map<String, List<RouteDefinition>> createRouteGroupMap(RouteDefinition route) {
185 Map<String, List<RouteDefinition>> map = new HashMap<String, List<RouteDefinition>>();
186 addRouteToMap(map, route);
187 return map;
188 }
189
190 protected void addRouteToMap(Map<String, List<RouteDefinition>> map, RouteDefinition route) {
191 String group = route.getGroup();
192 if (group == null) {
193 group = "Camel Routes";
194 }
195 List<RouteDefinition> list = map.get(group);
196 if (list == null) {
197 list = new ArrayList<RouteDefinition>();
198 map.put(group, list);
199 }
200 list.add(route);
201 }
202 }