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 /**
018 * Licensed to the Apache Software Foundation (ASF) under one or more
019 * contributor license agreements. See the NOTICE file distributed with
020 * this work for additional information regarding copyright ownership.
021 * The ASF licenses this file to You under the Apache License, Version 2.0
022 * (the "License"); you may not use this file except in compliance with
023 * the License. You may obtain a copy of the License at
024 *
025 * http://www.apache.org/licenses/LICENSE-2.0
026 *
027 * Unless required by applicable law or agreed to in writing, software
028 * distributed under the License is distributed on an "AS IS" BASIS,
029 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
030 * See the License for the specific language governing permissions and
031 * limitations under the License.
032 */
033 package org.apache.camel.view;
034
035
036 import java.util.ArrayList;
037 import java.util.List;
038
039 import org.apache.camel.model.AggregatorType;
040 import org.apache.camel.model.ChoiceType;
041 import org.apache.camel.model.FilterType;
042 import org.apache.camel.model.FromType;
043 import org.apache.camel.model.OtherwiseType;
044 import org.apache.camel.model.ProcessorType;
045 import org.apache.camel.model.RecipientListType;
046 import org.apache.camel.model.ResequencerType;
047 import org.apache.camel.model.RoutingSlipType;
048 import org.apache.camel.model.SplitterType;
049 import org.apache.camel.model.ToType;
050 import org.apache.camel.model.WhenType;
051
052 import static org.apache.camel.util.ObjectHelper.isNotNullAndNonEmpty;
053 import static org.apache.camel.util.ObjectHelper.isNullOrBlank;
054 /**
055 * Represents a node in the EIP diagram tree
056 *
057 * @version $Revision: 36652 $
058 */
059 public class NodeData {
060 public String id;
061 public String image;
062 public String label;
063 public String shape;
064 public String edgeLabel;
065 public String tooltop;
066 public String nodeType;
067 public boolean nodeWritten;
068 public String url;
069 public List<ProcessorType> outputs;
070 public String association = "property";
071 private final String imagePrefix;
072
073 public NodeData(String id, Object node, String imagePrefix) {
074 this.id = id;
075 this.imagePrefix = imagePrefix;
076
077 if (node instanceof ProcessorType) {
078 ProcessorType processorType = (ProcessorType)node;
079 this.edgeLabel = processorType.getLabel();
080 }
081 if (node instanceof FromType) {
082 FromType fromType = (FromType)node;
083 this.tooltop = fromType.getLabel();
084 this.label = removeQueryString(this.tooltop);
085 this.url = "http://activemq.apache.org/camel/message-endpoint.html";
086 } else if (node instanceof ToType) {
087 ToType toType = (ToType)node;
088 this.tooltop = toType.getLabel();
089 this.label = removeQueryString(this.tooltop);
090 this.edgeLabel = "";
091 this.url = "http://activemq.apache.org/camel/message-endpoint.html";
092 } else if (node instanceof FilterType) {
093 this.image = imagePrefix + "MessageFilterIcon.png";
094 this.nodeType = "Message Filter";
095 } else if (node instanceof WhenType) {
096 this.image = imagePrefix + "MessageFilterIcon.png";
097 this.nodeType = "When Filter";
098 this.url = "http://activemq.apache.org/camel/content-based-router.html";
099 } else if (node instanceof OtherwiseType) {
100 this.nodeType = "Otherwise";
101 this.edgeLabel = "";
102 this.url = "http://activemq.apache.org/camel/content-based-router.html";
103 this.tooltop = "Otherwise";
104 } else if (node instanceof ChoiceType) {
105 this.image = imagePrefix + "ContentBasedRouterIcon.png";
106 this.nodeType = "Content Based Router";
107 this.label = "";
108 this.edgeLabel = "";
109
110 ChoiceType choice = (ChoiceType)node;
111 List<ProcessorType> outputs = new ArrayList<ProcessorType>(choice.getWhenClauses());
112 outputs.add(choice.getOtherwise());
113 this.outputs = outputs;
114 } else if (node instanceof RecipientListType) {
115 this.image = imagePrefix + "RecipientListIcon.png";
116 this.nodeType = "Recipient List";
117 } else if (node instanceof RoutingSlipType) {
118 this.image = imagePrefix + "RoutingTableIcon.png";
119 this.nodeType = "Routing Slip";
120 this.url = "http://activemq.apache.org/camel/routing-slip.html";
121 this.tooltop = ((RoutingSlipType) node).getHeaderName();
122 } else if (node instanceof SplitterType) {
123 this.image = imagePrefix + "SplitterIcon.png";
124 this.nodeType = "Splitter";
125 } else if (node instanceof AggregatorType) {
126 this.image = imagePrefix + "AggregatorIcon.png";
127 this.nodeType = "Aggregator";
128 } else if (node instanceof ResequencerType) {
129 this.image = imagePrefix + "ResequencerIcon.png";
130 this.nodeType = "Resequencer";
131 }
132
133 // lets auto-default as many values as we can
134 if (isNullOrBlank(this.nodeType)) {
135 // TODO we could add this to the model?
136 String name = node.getClass().getName();
137 int idx = name.lastIndexOf('.');
138 if (idx > 0) {
139 name = name.substring(idx + 1);
140 }
141 if (name.endsWith("Type")) {
142 name = name.substring(0, name.length() - 4);
143 }
144 this.nodeType = insertSpacesBetweenCamelCase(name);
145 }
146 if (this.label == null) {
147 if (isNullOrBlank(this.image)) {
148 this.label = this.nodeType;
149 this.shape = "box";
150 } else if (isNotNullAndNonEmpty(this.edgeLabel)) {
151 this.label = "";
152 } else {
153 this.label = node.toString();
154 }
155 }
156 if (isNullOrBlank(this.tooltop)) {
157 if (isNotNullAndNonEmpty(this.nodeType)) {
158 String description = isNotNullAndNonEmpty(this.edgeLabel) ? this.edgeLabel : this.label;
159 this.tooltop = this.nodeType + ": " + description;
160 } else {
161 this.tooltop = this.label;
162 }
163 }
164 if (isNullOrBlank(this.url) && isNotNullAndNonEmpty(this.nodeType)) {
165 this.url = "http://activemq.apache.org/camel/" + this.nodeType.toLowerCase().replace(' ', '-')
166 + ".html";
167 }
168 if (node instanceof ProcessorType && this.outputs == null) {
169 ProcessorType processorType = (ProcessorType)node;
170 this.outputs = processorType.getOutputs();
171 }
172 }
173
174 protected String removeQueryString(String text) {
175 int idx = text.indexOf("?");
176 if (idx <= 0) {
177 return text;
178 } else {
179 return text.substring(0, idx);
180 }
181 }
182
183 /**
184 * Lets insert a space before each upper case letter after a lowercase
185 */
186 public static String insertSpacesBetweenCamelCase(String name) {
187 boolean lastCharacterLowerCase = false;
188 StringBuffer buffer = new StringBuffer();
189 int i = 0;
190 for (int size = name.length(); i < size; i++) {
191 char ch = name.charAt(i);
192 if (Character.isUpperCase(ch)) {
193 if (lastCharacterLowerCase) {
194 buffer.append(' ');
195 }
196 lastCharacterLowerCase = false;
197 } else {
198 lastCharacterLowerCase = true;
199 }
200 buffer.append(ch);
201 }
202 return buffer.toString();
203 }
204 }