1
2
3
4
5
6
7
8
9
10
11 package psiprobe.controllers.sql;
12
13 import java.sql.Connection;
14 import java.sql.DatabaseMetaData;
15 import java.sql.SQLException;
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.LinkedHashMap;
19 import java.util.List;
20 import java.util.Map;
21
22 import javax.naming.NamingException;
23 import javax.servlet.http.HttpServletRequest;
24 import javax.servlet.http.HttpServletResponse;
25 import javax.sql.DataSource;
26
27 import org.apache.catalina.Context;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30 import org.springframework.beans.factory.annotation.Value;
31 import org.springframework.stereotype.Controller;
32 import org.springframework.web.bind.ServletRequestUtils;
33 import org.springframework.web.bind.annotation.RequestMapping;
34 import org.springframework.web.servlet.ModelAndView;
35
36 import psiprobe.controllers.AbstractContextHandlerController;
37
38
39
40
41
42 @Controller
43 public class ConnectionTestController extends AbstractContextHandlerController {
44
45
46 private static final Logger logger = LoggerFactory.getLogger(ConnectionTestController.class);
47
48 @RequestMapping(path = "/sql/connection.ajax")
49 @Override
50 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
51 throws Exception {
52 return super.handleRequest(request, response);
53 }
54
55 @Override
56 protected ModelAndView handleContext(String contextName, Context context,
57 HttpServletRequest request, HttpServletResponse response) throws Exception {
58
59 String resourceName = ServletRequestUtils.getStringParameter(request, "resource");
60 DataSource dataSource = null;
61
62 try {
63 dataSource = getContainerWrapper().getResourceResolver().lookupDataSource(context,
64 resourceName, getContainerWrapper());
65 } catch (NamingException e) {
66 request.setAttribute("errorMessage", getMessageSourceAccessor().getMessage(
67 "probe.src.dataSourceTest.resource.lookup.failure", new Object[] {resourceName}));
68 logger.trace("", e);
69 }
70
71 if (dataSource == null) {
72 request.setAttribute("errorMessage", getMessageSourceAccessor().getMessage(
73 "probe.src.dataSourceTest.resource.lookup.failure", new Object[] {resourceName}));
74 } else {
75 try {
76
77 try (Connection conn = dataSource.getConnection()) {
78 DatabaseMetaData md = conn.getMetaData();
79
80 List<Map<String, String>> dbMetaData = new ArrayList<>();
81
82 addDbMetaDataEntry(dbMetaData, "probe.jsp.dataSourceTest.dbMetaData.dbProdName",
83 md.getDatabaseProductName());
84 addDbMetaDataEntry(dbMetaData, "probe.jsp.dataSourceTest.dbMetaData.dbProdVersion",
85 md.getDatabaseProductVersion());
86 addDbMetaDataEntry(dbMetaData, "probe.jsp.dataSourceTest.dbMetaData.jdbcDriverName",
87 md.getDriverName());
88 addDbMetaDataEntry(dbMetaData, "probe.jsp.dataSourceTest.dbMetaData.jdbcDriverVersion",
89 md.getDriverVersion());
90 addDbMetaDataEntry(dbMetaData, "probe.jsp.dataSourceTest.dbMetaData.jdbcVersion",
91 String.valueOf(md.getJDBCMajorVersion()));
92
93 return new ModelAndView(getViewName(), "dbMetaData", dbMetaData);
94 }
95 } catch (SQLException e) {
96 String message = getMessageSourceAccessor().getMessage(
97 "probe.src.dataSourceTest.connection.failure", new Object[] {e.getMessage()});
98 logger.error(message, e);
99 request.setAttribute("errorMessage", message);
100 }
101 }
102
103 return new ModelAndView(getViewName());
104 }
105
106 @Override
107 protected boolean isContextOptional() {
108 return true;
109 }
110
111
112
113
114
115
116
117
118 private void addDbMetaDataEntry(Collection<Map<String, String>> list, String name, String value) {
119 Map<String, String> entry = new LinkedHashMap<>();
120 entry.put("propertyName", getMessageSourceAccessor().getMessage(name));
121 entry.put("propertyValue", value);
122 list.add(entry);
123 }
124
125 @Value("ajax/sql/connection")
126 @Override
127 public void setViewName(String viewName) {
128 super.setViewName(viewName);
129 }
130
131 }