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.util.ArrayList;
020 import java.util.List;
021
022 import org.apache.camel.model.AggregateDefinition;
023 import org.apache.camel.model.BeanDefinition;
024 import org.apache.camel.model.ChoiceDefinition;
025 import org.apache.camel.model.FilterDefinition;
026 import org.apache.camel.model.FromDefinition;
027 import org.apache.camel.model.OtherwiseDefinition;
028 import org.apache.camel.model.ProcessorDefinition;
029 import org.apache.camel.model.RecipientListDefinition;
030 import org.apache.camel.model.ResequenceDefinition;
031 import org.apache.camel.model.RoutingSlipDefinition;
032 import org.apache.camel.model.SplitDefinition;
033 import org.apache.camel.model.ToDefinition;
034 import org.apache.camel.model.WhenDefinition;
035
036 import static org.apache.camel.util.ObjectHelper.isEmpty;
037 import static org.apache.camel.util.ObjectHelper.isNotEmpty;
038
039 /**
040 * Represents a node in the EIP diagram tree
041 *
042 * @version $Revision: 751357 $
043 */
044 public class NodeData {
045 public String id;
046 public String image;
047 public String label;
048 public String shape;
049 public String edgeLabel;
050 public String tooltop;
051 public String nodeType;
052 public boolean nodeWritten;
053 public String url;
054 public List<ProcessorDefinition> outputs;
055 public String association = "property";
056 private final String imagePrefix;
057
058 @SuppressWarnings("unchecked")
059 public NodeData(String id, Object node, String imagePrefix) {
060 this.id = id;
061 this.imagePrefix = imagePrefix;
062
063 if (node instanceof ProcessorDefinition) {
064 ProcessorDefinition processorType = (ProcessorDefinition)node;
065 this.edgeLabel = processorType.getLabel();
066 }
067 if (node instanceof FromDefinition) {
068 FromDefinition fromType = (FromDefinition)node;
069 this.tooltop = fromType.getLabel();
070 this.label = removeQueryString(this.tooltop);
071 this.url = "http://camel.apache.org/message-endpoint.html";
072 } else if (node instanceof ToDefinition) {
073 ToDefinition toType = (ToDefinition)node;
074 this.tooltop = toType.getLabel();
075 this.label = removeQueryString(this.tooltop);
076 this.edgeLabel = "";
077 this.url = "http://camel.apache.org/message-endpoint.html";
078 } else if (node instanceof FilterDefinition) {
079 this.image = imagePrefix + "MessageFilterIcon.png";
080 this.label = "Filter";
081 this.nodeType = "Message Filter";
082 } else if (node instanceof WhenDefinition) {
083 this.image = imagePrefix + "MessageFilterIcon.png";
084 this.nodeType = "When Filter";
085 this.label = "When";
086 this.url = "http://camel.apache.org/content-based-router.html";
087 } else if (node instanceof OtherwiseDefinition) {
088 this.nodeType = "Otherwise";
089 this.edgeLabel = "";
090 this.url = "http://camel.apache.org/content-based-router.html";
091 this.tooltop = "Otherwise";
092 } else if (node instanceof ChoiceDefinition) {
093 this.image = imagePrefix + "ContentBasedRouterIcon.png";
094 this.nodeType = "Content Based Router";
095 this.label = "Choice";
096 this.edgeLabel = "";
097
098 ChoiceDefinition choice = (ChoiceDefinition)node;
099 List<ProcessorDefinition> outputs = new ArrayList<ProcessorDefinition>(choice.getWhenClauses());
100 if (choice.getOtherwise() != null) {
101 outputs.add(choice.getOtherwise());
102 }
103 this.outputs = outputs;
104 } else if (node instanceof RecipientListDefinition) {
105 this.image = imagePrefix + "RecipientListIcon.png";
106 this.nodeType = "Recipient List";
107 } else if (node instanceof RoutingSlipDefinition) {
108 this.image = imagePrefix + "RoutingTableIcon.png";
109 this.nodeType = "Routing Slip";
110 this.url = "http://camel.apache.org/routing-slip.html";
111 this.tooltop = ((RoutingSlipDefinition) node).getHeaderName();
112 } else if (node instanceof SplitDefinition) {
113 this.image = imagePrefix + "SplitterIcon.png";
114 this.nodeType = "Splitter";
115 } else if (node instanceof AggregateDefinition) {
116 this.image = imagePrefix + "AggregatorIcon.png";
117 this.nodeType = "Aggregator";
118 } else if (node instanceof ResequenceDefinition) {
119 this.image = imagePrefix + "ResequencerIcon.png";
120 this.nodeType = "Resequencer";
121 } else if (node instanceof BeanDefinition) {
122 BeanDefinition beanRef = (BeanDefinition) node;
123
124 // TODO
125 //this.image = imagePrefix + "Bean.png";
126 this.nodeType = "Bean Ref";
127 this.label = beanRef.getLabel() + " Bean";
128 this.shape = "box";
129 }
130
131 // lets auto-default as many values as we can
132 if (isEmpty(this.nodeType) && node != null) {
133 // TODO we could add this to the model?
134 String name = node.getClass().getName();
135 int idx = name.lastIndexOf('.');
136 if (idx > 0) {
137 name = name.substring(idx + 1);
138 }
139 if (name.endsWith("Type")) {
140 name = name.substring(0, name.length() - 4);
141 }
142 this.nodeType = insertSpacesBetweenCamelCase(name);
143 }
144 if (this.label == null) {
145 if (isEmpty(this.image)) {
146 this.label = this.nodeType;
147 this.shape = "box";
148 } else if (isNotEmpty(this.edgeLabel)) {
149 this.label = "";
150 } else {
151 this.label = node.toString();
152 }
153 }
154 if (isEmpty(this.tooltop)) {
155 if (isNotEmpty(this.nodeType)) {
156 String description = isNotEmpty(this.edgeLabel) ? this.edgeLabel : this.label;
157 this.tooltop = this.nodeType + ": " + description;
158 } else {
159 this.tooltop = this.label;
160 }
161 }
162 if (isEmpty(this.url) && isNotEmpty(this.nodeType)) {
163 this.url = "http://camel.apache.org/" + this.nodeType.toLowerCase().replace(' ', '-') + ".html";
164 }
165 if (node instanceof ProcessorDefinition && this.outputs == null) {
166 ProcessorDefinition processorType = (ProcessorDefinition)node;
167 this.outputs = processorType.getOutputs();
168 }
169 }
170
171 protected String removeQueryString(String text) {
172 int idx = text.indexOf("?");
173 if (idx <= 0) {
174 return text;
175 } else {
176 return text.substring(0, idx);
177 }
178 }
179
180 /**
181 * Lets insert a space before each upper case letter after a lowercase
182 */
183 public static String insertSpacesBetweenCamelCase(String name) {
184 boolean lastCharacterLowerCase = false;
185 StringBuffer buffer = new StringBuffer();
186 int i = 0;
187 for (int size = name.length(); i < size; i++) {
188 char ch = name.charAt(i);
189 if (Character.isUpperCase(ch)) {
190 if (lastCharacterLowerCase) {
191 buffer.append(' ');
192 }
193 lastCharacterLowerCase = false;
194 } else {
195 lastCharacterLowerCase = true;
196 }
197 buffer.append(ch);
198 }
199 return buffer.toString();
200 }
201 }