001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.html; 016 017 import java.util.Collections; 018 import java.util.Iterator; 019 import java.util.List; 020 import java.util.Properties; 021 import java.util.StringTokenizer; 022 023 import org.apache.tapestry.BaseComponent; 024 import org.apache.tapestry.IMarkupWriter; 025 import org.apache.tapestry.IRender; 026 import org.apache.tapestry.IRequestCycle; 027 import org.apache.tapestry.web.WebUtils; 028 029 /** 030 * Supports the {@link org.apache.tapestry.pages.Exception} page by displaying the request, 031 * session, servlet context and servlet object for the current request. 032 * 033 * @author Howard M. Lewis Ship 034 * @since 4.0 035 */ 036 public abstract class RequestDisplay extends BaseComponent 037 { 038 private boolean _even; 039 040 public void renderSystemProperties(IMarkupWriter writer) 041 { 042 _even = true; 043 044 Properties p = System.getProperties(); 045 046 String pathSeparator = p.getProperty("path.separator"); 047 048 writer.begin("div"); 049 writer.attribute("class", "described-object-title"); 050 writer.print("JVM System Properties"); 051 writer.end(); 052 writer.println(); 053 054 writer.begin("table"); 055 writer.attribute("class", "described-object"); 056 057 Iterator i = WebUtils.toSortedList(p.keys()).iterator(); 058 059 while (i.hasNext()) 060 { 061 String key = (String) i.next(); 062 String value = p.getProperty(key); 063 064 renderKeyAndValue(writer, key, value, pathSeparator); 065 } 066 067 writer.end(); 068 } 069 070 private void renderKeyAndValue(IMarkupWriter writer, String key, String value, 071 String pathSeparator) 072 { 073 String[] values = split(key, value, pathSeparator); 074 075 for (int i = 0; i < values.length; i++) 076 { 077 writer.begin("tr"); 078 079 writer.attribute("class", _even ? "even" : "odd"); 080 081 _even = !_even; 082 083 writer.begin("th"); 084 085 if (i == 0) 086 writer.print(key); 087 088 writer.end(); 089 writer.begin("td"); 090 writer.print(values[i]); 091 writer.end("tr"); 092 writer.println(); 093 } 094 } 095 096 private String[] split(String key, String value, String pathSeparator) 097 { 098 if (!key.endsWith(".path")) 099 return new String[] 100 { value }; 101 102 StringTokenizer tokenizer = new StringTokenizer(value, pathSeparator); 103 List values = Collections.list(tokenizer); 104 105 return (String[]) values.toArray(new String[values.size()]); 106 } 107 108 public IRender getSystemPropertiesRenderer() 109 { 110 return new IRender() 111 { 112 public void render(IMarkupWriter writer, IRequestCycle cycle) 113 { 114 renderSystemProperties(writer); 115 } 116 }; 117 } 118 }