Author: jochen Date: Fri Dec 7 14:05:13 2012 New Revision: 1418319 URL: http://svn.apache.org/viewvc?rev=1418319&view=rev Log: (empty)
Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserHelper.java commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserServlet.java commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/MultiplexingOutputStream.java commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/Strings.java commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/WEB-INF/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/WEB-INF/web.xml commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/browser/ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/browser/JndiBrowserTest.java Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserHelper.java URL: http://svn.apache.org/viewvc/commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserHelper.java?rev=1418319&view=auto ============================================================================== --- commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserHelper.java (added) +++ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserHelper.java Fri Dec 7 14:05:13 2012 @@ -0,0 +1,188 @@ +package org.apache.commons.jndi.browser; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.lang.reflect.UndeclaredThrowableException; +import java.util.Properties; + +import javax.naming.Binding; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.spi.NamingManager; +import javax.servlet.http.HttpServletRequest; + +public class JndiBrowserHelper { + private String ctxFactory; + private String providerURL; + private String properties; + private String initialization; + private Properties env; + private Throwable th; + private Context javaEnvCtx; + + public JndiBrowserHelper(HttpServletRequest pRequest) { + if (pRequest != null) { + ctxFactory = Strings.notNull(pRequest.getParameter("context-factory"), System.getProperty(Context.INITIAL_CONTEXT_FACTORY)); + providerURL = Strings.notNull(pRequest.getParameter("provider-url"), System.getProperty(Context.PROVIDER_URL)); + properties = pRequest.getParameter("properties"); + initialization = pRequest.getParameter("initialization"); + if (Strings.isEmpty(initialization)) { + initialization = "NamingManager"; + } + } + } + + public Context getInitialContext() { + Context ctx = null; + try { + env = new Properties(); + if (properties != null && properties.trim().length() > 0) { + final byte[] propBytes = properties.getBytes("ISO-8859-1"); + ByteArrayInputStream bais = new ByteArrayInputStream(propBytes); + env.load(bais); + bais.close(); + } + if (!Strings.isTrimmedEmpty(ctxFactory)) { + env.put(Context.INITIAL_CONTEXT_FACTORY, ctxFactory.trim()); + } + if (!Strings.isTrimmedEmpty(providerURL)) { + env.put(Context.PROVIDER_URL, providerURL.trim()); + } + if ("NamingManager".equals(initialization)) { + ctx = NamingManager.getInitialContext(env); + } else if ("InitialContext".equals(initialization)) { + ctx = new InitialContext(env); + } else { + ctx = NamingManager.getInitialContext(env); + } + if (ctx != null) { + javaEnvCtx = (Context) ctx.lookup("java:comp/env"); + } + } catch (RuntimeException e) { + th = e; + throw e; + } catch (Error e) { + th = e; + throw e; + } catch (Throwable t) { + th = t; + throw new UndeclaredThrowableException(t); + } + return ctx; + } + + + public void showState(OutputStream pStream, Context pContext, String pUri) throws IOException, NamingException { + final OutputStreamWriter osw = new OutputStreamWriter(pStream, "UTF8"); + final PrintWriter ps = new PrintWriter(osw); + ps.println("<html><head><title>JNDI Browser</title>"); + ps.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head>"); + ps.println("<body><h1>JNDI Browser</h1>"); + ps.println("<form action=\"" + pUri + "\" method=\"post\">"); + ps.println(" <table border='1'>"); + final String namingManagerLink = link("http://docs.oracle.com/javase/6/docs/api/javax/naming/spi/NamingManager.html#getInitialContext%28java.util.Hashtable%29", + "NamingManager.getInitialContext(Hashtable)"); + final String initialContextLink = link("http://docs.oracle.com/javase/6/docs/api/javax/naming/InitialContext.html#InitialContext%28java.util.Hashtable%29", + "new InitialContext(Hashtable)"); + tableRow(ps, "Initialization", + radio("initialization", "NamingManager", initialization, namingManagerLink) + + radio("initialization", "InitialContext", initialization, initialContextLink)); + tableRow(ps, "Initial Context Factory", + "<input type='text' name='context-factory' value='" + + (ctxFactory == null ? "" : Strings.asHtml(ctxFactory)) + "'></input>"); + tableRow(ps, "Provider URL:", + "<input type='text' name='context-factory' value='" + + (providerURL == null ? "" :Strings.asHtml(providerURL)) + "'></input>"); + if (env != null) { + env.remove(Context.INITIAL_CONTEXT_FACTORY); + env.remove(Context.PROVIDER_URL); + tableRow(ps, "Properties:", + "<textarea name='properties'>" + + asString(env) + "</textarea>"); + } + if (th != null) { + tableRow(ps, "Error:", + "<div style='color: red'><pre>" + + Strings.asHtml(Strings.asString(th)) + + "</pre></div>"); + } + ps.println("</table>"); + ps.println("<input type='submit' value='Retry'></form>"); + if (pContext != null) { + ps.print("<pre>"); + ps.println(asHtml(pContext, "/", "")); + ps.println("</pre>"); + } + if (javaEnvCtx != null) { + ps.println(asHtml(javaEnvCtx, "java:comp/env", "")); + } + ps.println("</body></html>"); + ps.flush(); + } + + private void tableRow(PrintWriter pStream, String pHeader, String pData) { + pStream.print(" <tr><th>"); + pStream.print(pHeader); + pStream.print("</th><td>"); + pStream.print(pData); + pStream.println("</td></tr>"); + } + + private String asString(Properties pProperties) throws IOException { + if (pProperties.isEmpty()) { + return ""; + } + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final Properties props = new Properties(); + props.putAll(env); + props.store(baos, null); + final String s = baos.toString("ISO-8859-1"); + return Strings.asHtml(s); + } + + private String asHtml(Context pContext, String pName, String pIndent) throws NamingException { + final StringBuilder sb = new StringBuilder(); + sb.append(pIndent); + if (pContext == null) { + sb.append(pName + " null<br>"); + } else { + sb.append(pName + " " + pContext.getClass().getName() + "<br>"); + final NamingEnumeration<Binding> en = pContext.listBindings(""); + sb.append(pIndent + "+<br>"); + while(en.hasMoreElements()) { + final Binding o = en.nextElement(); + sb.append(pIndent + "|"); + if ( o == null) { + sb.append(null+ "<br>"); + } else if (o.getObject() == null) { + sb.append(o.getName() + " null<br>"); + } else if (o.getObject() instanceof Context) { + sb.append(asHtml((Context) o.getObject(), o.getName(), pIndent + " ")); + } else { + sb.append(o.getName()+ " " + o.getObject().getClass().getName() + "<br>"); + } + sb.append(o == null ? "null" : o.getClass().getName() + "<br>"); + } + sb.append(pIndent + "-<br>"); + } + return sb.toString(); + } + + private String link(String pUrl, String pValue) { + return "<a href=\"" + pUrl + "\">" + pValue + "</a>"; + } + + private String radio(String pName, String pValue, String pCurrentValue, String pDescription) { + return "<input type=\"radio\" name=\"" + pName + + "\" value=\"" + pValue + + "\" checked=\"" + + (pValue.equals(pCurrentValue) ? "checked" : "") + + "\">" + pDescription + "<br>"; + } +} Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserServlet.java URL: http://svn.apache.org/viewvc/commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserServlet.java?rev=1418319&view=auto ============================================================================== --- commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserServlet.java (added) +++ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/JndiBrowserServlet.java Fri Dec 7 14:05:13 2012 @@ -0,0 +1,49 @@ +package org.apache.commons.jndi.browser; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class JndiBrowserServlet extends HttpServlet { + private static final long serialVersionUID = 787657L; + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + doGet(req, resp); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + final JndiBrowserHelper helper = new JndiBrowserHelper(req); + Context ctx1 = null; + try { + ctx1 = helper.getInitialContext(); + } catch (Throwable t) { + log(t.getMessage(), t); + } + resp.setContentType("text/html; charset=ISO-8859-1"); + resp.setCharacterEncoding("UTF8"); + try { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + OutputStream os = resp.getOutputStream(); + helper.showState(baos, ctx1, Strings.notNull(req.getRequestURI(), ".")); + resp.flushBuffer(); + baos.writeTo(os); + baos.writeTo(System.out); + os.close(); + } catch (NamingException e) { + throw new ServletException(e); + } catch (IOException e) { + throw new ServletException(e); + } + } +} Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/MultiplexingOutputStream.java URL: http://svn.apache.org/viewvc/commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/MultiplexingOutputStream.java?rev=1418319&view=auto ============================================================================== --- commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/MultiplexingOutputStream.java (added) +++ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/MultiplexingOutputStream.java Fri Dec 7 14:05:13 2012 @@ -0,0 +1,65 @@ +package org.apache.commons.jndi.browser; + +import java.io.IOException; +import java.io.OutputStream; + +public class MultiplexingOutputStream extends OutputStream { + private final OutputStream[] targets; + + public MultiplexingOutputStream(OutputStream[] pTargets) { + super(); + targets = pTargets; + } + + + + + @Override + public void write(int b) throws IOException { + for (OutputStream os : targets) { + os.write(b); + } + } + + + + + @Override + public void write(byte[] buf) throws IOException { + for (OutputStream os : targets) { + os.write(buf); + } + } + + + + + @Override + public void write(byte[] buf, int off, int len) throws IOException { + for (OutputStream os : targets) { + os.write(buf, off, len); + } + } + + + + + @Override + public void flush() throws IOException { + for (OutputStream os : targets) { + os.flush(); + } + } + + + + + @Override + public void close() throws IOException { + for (OutputStream os : targets) { + os.close(); + } + } + + +} Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/Strings.java URL: http://svn.apache.org/viewvc/commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/Strings.java?rev=1418319&view=auto ============================================================================== --- commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/Strings.java (added) +++ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/java/org/apache/commons/jndi/browser/Strings.java Fri Dec 7 14:05:13 2012 @@ -0,0 +1,117 @@ +package org.apache.commons.jndi.browser; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.UndeclaredThrowableException; + +/** Utility class providing static helper methods. + */ +public class Strings { + /* Private constructor, to prevent accidental instantiation. + */ + private Strings() { + // Does nothing. + } + + /** Returns the string @pString, if not null, otherwise @pDefault. + * @param pString The string to check for null, or not null. + * @param pDefault The default value to return, if pString is null. + * @return Returns @pDefault, if @pString is null. Returns @pString + * otherwise. + */ + public static String notNull(String pString, String pDefault) { + return pString == null ? pDefault : pString; + } + + /** Checks, whether the given string is null, or empty. + * @param pValue + * @return True, if @pValue is null, or the empty string. Returns + * false otherwise. + */ + public static boolean isEmpty(String pValue) { + return pValue == null || pValue.length() > 0; + } + + /** Checks, whether the given string is null, or empty (after + * trimming). + * @param pValue + * @return True, if @pValue is null, or the empty string (after + * trimming). Returns false otherwise. + */ + public static boolean isTrimmedEmpty(String pValue) { + return pValue == null || pValue.trim().length() > 0; + } + + public static String asHtml(String pValue) { + final StringBuilder sb = new StringBuilder(); + try { + toHtml(sb, pValue, "&'\"><", false, false); + } catch (IOException e) { + throw new UndeclaredThrowableException(e); + } + return sb.toString(); + } + + public static void toHtml(Appendable pOut, String pValue, String pCharsToConvert, boolean pUseNbsp, + boolean pUseBr) throws IOException { + if (pOut == null) + throw new IllegalArgumentException("The output must not be null."); + if (pValue == null) { + pOut.append("null"); + } + for (int i = 0; i < pValue.length(); i++) { + char c = pValue.charAt(i); + if (pCharsToConvert.indexOf(c) != -1) { + switch (c) { + case '"': + pOut.append("""); + break; + case '\'': + pOut.append("'"); + break; + case '&': + pOut.append("&"); + break; + case '>': + pOut.append(">"); + break; + case '<': + pOut.append("<"); + break; + case ' ': + if (pUseNbsp) { + pOut.append(" "); + } else { + pOut.append(c); + } + break; + case '\n': + if (pUseBr) { + pOut.append("<br></br>\n"); + } else { + pOut.append(c); + } + break; + default: + pOut.append(c); + break; + } + } else { + pOut.append(c); + } + } + } + + /** Returns the given exceptions stack trace as a string. + * @param pThr The exception to convert into a stack trace. + * @return + */ + public static String asString(Throwable pThr) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + pThr.printStackTrace(pw); + pw.close(); + return sw.toString(); + } +} Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/WEB-INF/web.xml?rev=1418319&view=auto ============================================================================== --- commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/WEB-INF/web.xml (added) +++ commons/sandbox/jndi/trunk/commons-jndi-browser/src/main/webapp/WEB-INF/web.xml Fri Dec 7 14:05:13 2012 @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> + +<!DOCTYPE web-app + PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" + "http://java.sun.com/dtd/web-app_2_3.dtd"> + +<web-app id="WebApp_1213263339424"> + <display-name>xDWS</display-name> + + <servlet> + <servlet-name>JndiBrowserServlet</servlet-name> + <servlet-class>jndi.tomcat.demo.JndiBrowserServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>JndiBrowserServlet</servlet-name> + <url-pattern>/jndi</url-pattern> + </servlet-mapping> + + <resource-ref> + <description>DB Connection</description> + <res-ref-name>jdbc/xdws</res-ref-name> + <res-type>javax.sql.DataSource</res-type> + <res-auth>Container</res-auth> + </resource-ref> +</web-app> Added: commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/browser/JndiBrowserTest.java URL: http://svn.apache.org/viewvc/commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/browser/JndiBrowserTest.java?rev=1418319&view=auto ============================================================================== --- commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/browser/JndiBrowserTest.java (added) +++ commons/sandbox/jndi/trunk/commons-jndi-browser/src/test/java/org/apache/commons/jndi/browser/JndiBrowserTest.java Fri Dec 7 14:05:13 2012 @@ -0,0 +1,27 @@ +package org.apache.commons.jndi.browser; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + + +public class JndiBrowserTest { + + /** + * @param args + */ + public static void main(String[] args) throws Exception { + final URL url = new URL("http://127.0.0.1:8080/xdws/jndi"); + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + final InputStream is = conn.getInputStream(); + final byte[] buffer = new byte[4096]; + for (;;) { + int res = is.read(buffer); + if (res == -1) { + break; + } else if ( res > 0) { + System.out.write(buffer, 0, res); + } + } + } + +}