blob: 103b7370580ada335d17032db2e1fe41d30e27db [file] [log] [blame]
/*
* Copyright 1999-2011 Alibaba Group.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.dubbo.monitor.simple.pages;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.container.page.Page;
import com.alibaba.dubbo.container.page.PageHandler;
import com.alibaba.dubbo.monitor.simple.RegistryContainer;
/**
* DependenciesPageHandler
*
* @author william.liangf
*/
public class DependenciesPageHandler implements PageHandler {
public Page handle(URL url) {
String application = url.getParameter("application");
if (application == null || application.length() == 0) {
throw new IllegalArgumentException("Please input application parameter.");
}
boolean reverse = url.getParameter("reverse", false);
List<List<String>> rows = new ArrayList<List<String>>();
Set<String> directly = RegistryContainer.getInstance().getDependencies(application, reverse);
Set<String> indirectly = new HashSet<String>();
appendDependency(rows, reverse, application, 0, new HashSet<String>(), indirectly);
indirectly.remove(application);
return new Page("<a href=\"applications.html\">Applications</a> &gt; " + application +
" &gt; <a href=\"providers.html?application=" + application + "\">Providers</a> | <a href=\"consumers.html?application=" + application + "\">Consumers</a> | " +
(reverse ? "<a href=\"dependencies.html?application=" + application + "\">Depends On</a> | Used By"
: "Depends On | <a href=\"dependencies.html?application=" + application + "&reverse=true\">Used By</a>"), (reverse ? "Used By" : "Depends On") + " (" + directly.size() + "/" + indirectly.size() + ")", new String[] { "Application Name:"}, rows);
}
private void appendDependency(List<List<String>> rows, boolean reverse, String application, int level, Set<String> appended, Set<String> indirectly) {
List<String> row = new ArrayList<String>();
StringBuilder buf = new StringBuilder();
if (level > 0) {
for (int i = 0; i < level; i ++) {
buf.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|");
}
buf.append(reverse ? "&lt;-- " : "--&gt; ");
}
boolean end = false;
if (level > 5) {
buf.append(" <font color=\"blue\">More...</font>");
end = true;
} else {
buf.append(application);
if (appended.contains(application)) {
buf.append(" <font color=\"red\">(Cycle)</font>");
end = true;
}
}
row.add(buf.toString());
rows.add(row);
if (end) {
return;
}
appended.add(application);
indirectly.add(application);
Set<String> dependencies = RegistryContainer.getInstance().getDependencies(application, reverse);
if (dependencies != null && dependencies.size() > 0) {
for (String dependency : dependencies) {
appendDependency(rows, reverse, dependency, level + 1, appended, indirectly);
}
}
appended.remove(application);
}
}