com.alibaba.dubbo.container.page.PageServlet Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.container.page;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.utils.StringUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.URL;
/**
* PageServlet
*/
public class PageServlet extends HttpServlet {
protected static final Logger logger = LoggerFactory.getLogger(PageServlet.class);
private static final long serialVersionUID = -8370312705453328501L;
private static PageServlet INSTANCE;
protected final Random random = new Random();
protected final Map pages = new ConcurrentHashMap<>();
protected final List menus = new ArrayList<>();
public static PageServlet getInstance() {
return INSTANCE;
}
public List getMenus() {
return Collections.unmodifiableList(menus);
}
@Override
public void init() throws ServletException {
super.init();
INSTANCE = this;
String config = getServletConfig().getInitParameter("pages");
Collection names;
if (config != null && config.length() > 0) {
names = Arrays.asList(Constants.COMMA_SPLIT_PATTERN.split(config));
} else {
names = ExtensionLoader.getExtensionLoader(PageHandler.class).getSupportedExtensions();
}
for (String name : names) {
PageHandler handler =
ExtensionLoader.getExtensionLoader(PageHandler.class).getExtension(name);
pages.put(ExtensionLoader.getExtensionLoader(PageHandler.class).getExtensionName(handler), handler);
Menu menu = handler.getClass().getAnnotation(Menu.class);
if (menu != null) {
menus.add(handler);
}
}
Collections.sort(menus, new MenuComparator());
}
@Override
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected final void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (!response.isCommitted()) {
PrintWriter writer = response.getWriter();
String uri = request.getRequestURI();
boolean isHtml = false;
if (uri == null || uri.length() == 0 || "/".equals(uri)) {
uri = "index";
isHtml = true;
} else {
if (uri.startsWith("/")) {
uri = uri.substring(1);
}
if (uri.endsWith(".html")) {
uri = uri.substring(0, uri.length() - ".html".length());
isHtml = true;
}
}
if (uri.endsWith("favicon.ico")) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
ExtensionLoader pageHandlerLoader = ExtensionLoader.getExtensionLoader(PageHandler.class);
PageHandler pageHandler = pageHandlerLoader.hasExtension(uri) ? pageHandlerLoader.getExtension(uri) : null;
if (isHtml) {
writer.println("Dubbo ");
writer.println(
"");
writer.println("");
}
if (pageHandler != null) {
Page page = null;
try {
String query = request.getQueryString();
page = pageHandler.handle(
URL.valueOf(request.getRequestURL().toString()
+ (query == null || query.length() == 0 ? "" : "?" + query)));
} catch (Throwable t) {
logger.warn(t.getMessage(), t);
String msg = t.getMessage();
if (msg == null) {
msg = StringUtils.toString(t);
}
if (isHtml) {
writer.println("");
writer.println("");
writer.println(" ");
writer.println(" Error ");
writer.println(" ");
writer.println("");
writer.println("");
writer.println(" ");
writer.println(" ");
writer.println(" "
+ msg.replace("<", "<").replace(">", "<").replace("\n", "
"));
writer.println(" ");
writer.println(" ");
writer.println("");
writer.println("
");
writer.println("
");
} else {
writer.println(msg);
}
}
if (page != null) {
if (isHtml) {
String nav = page.getNavigation();
if (nav == null || nav.length() == 0) {
nav = ExtensionLoader.getExtensionLoader(PageHandler.class)
.getExtensionName(pageHandler);
nav = nav.substring(0, 1).toUpperCase() + nav.substring(1);
}
if (!"index".equals(uri)) {
nav = "Home > " + nav;
}
writeMenu(request, writer, nav);
writeTable(writer, page.getTitle(), page.getColumns(), page.getRows());
} else {
if (page.getRows().size() > 0 && page.getRows().get(0).size() > 0) {
writer.println(page.getRows().get(0).get(0));
}
}
}
} else {
if (isHtml) {
writer.println("");
writer.println("");
writer.println(" ");
writer.println(" Error ");
writer.println(" ");
writer.println("");
writer.println("");
writer.println(" ");
writer.println(" ");
writer.println(" Not found " + uri + " page. Please goto Home page.");
writer.println(" ");
writer.println(" ");
writer.println("");
writer.println("
");
writer.println("
");
} else {
writer.println("Not found " + uri + " page.");
}
}
if (isHtml) {
writer.println("");
}
writer.flush();
}
}
protected final void writeMenu(HttpServletRequest request, PrintWriter writer, String nav) {
writer.println("");
writer.println("");
writer.println(" ");
for (PageHandler handler : menus) {
String uri = ExtensionLoader.getExtensionLoader(PageHandler.class).getExtensionName(handler);
Menu menu = handler.getClass().getAnnotation(Menu.class);
writer.println(" " + menu.name() + " ");
}
writer.println(" ");
writer.println("");
writer.println("");
writer.println(" ");
writer.println(" ");
writer.println(nav);
writer.println(" ");
writer.println(" ");
writer.println("");
writer.println("
");
writer.println("
");
}
protected final void writeTable(PrintWriter writer, String title, List columns, List> rows) {
int n = random.nextInt();
int c = (columns == null
? (rows == null || rows.size() == 0 ? 0 : rows.get(0).size())
: columns.size());
int r = (rows == null ? 0 : rows.size());
writer.println("");
writer.println("");
writer.println(" ");
writer.println(" " + title + " ");
writer.println(" ");
if (columns != null && columns.size() > 0) {
writer.println(" ");
for (int i = 0; i < columns.size(); i++) {
String col = columns.get(i);
if (col.endsWith(":")) {
col += " 0 && (tv.length < iv.length || tv.indexOf(iv) == -1)) { m = false; break; } } } document.getElementById('tr_"
+ n
+ "_' + i).style.display = (m ? '' : 'none');}\" style=\"width: 100%\" />";
}
writer.println(" " + col + " ");
}
writer.println(" ");
}
writer.println("");
if (rows != null && rows.size() > 0) {
writer.println("");
int i = 0;
for (Collection row : rows) {
writer.println(" ");
int j = 0;
for (String col : row) {
writer.println(" " + col
+ " ");
j++;
}
writer.println(" ");
i++;
}
writer.println(" ");
}
writer.println("
");
writer.println("
");
}
}