001 /** 002 * 003 * Copyright 2005 The Apache Software Foundation 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.geronimo.system.main; 018 019 import java.io.PrintStream; 020 import java.net.InetSocketAddress; 021 import java.util.ArrayList; 022 import java.util.Collections; 023 import java.util.HashMap; 024 import java.util.Iterator; 025 import java.util.List; 026 import java.util.Map; 027 import java.util.Set; 028 029 import org.apache.commons.logging.Log; 030 import org.apache.commons.logging.LogFactory; 031 import org.apache.geronimo.gbean.AbstractName; 032 import org.apache.geronimo.gbean.AbstractNameQuery; 033 import org.apache.geronimo.gbean.GAttributeInfo; 034 import org.apache.geronimo.gbean.GBeanData; 035 import org.apache.geronimo.gbean.GBeanInfo; 036 import org.apache.geronimo.kernel.Kernel; 037 import org.apache.geronimo.kernel.management.State; 038 039 /** 040 * @version $Rev: 424015 $ $Date: 2006-07-20 11:23:38 -0700 (Thu, 20 Jul 2006) $ 041 */ 042 public class StartupMonitorUtil { 043 private final static Log log = LogFactory.getLog(StartupMonitor.class.getName()); 044 045 public static synchronized void wrapUp(PrintStream out, Kernel kernel) { 046 List apps = new ArrayList(); // type = String (message) 047 List webs = new ArrayList(); // type = WebAppInfo 048 List ports = new ArrayList(); // type = AddressHolder 049 Map failed = new HashMap(); // key = AbstractName, value = String (message) 050 String serverInfo = null; 051 try { 052 Set gbeans = kernel.listGBeans((AbstractNameQuery) null); 053 Map beanInfos = new HashMap(); // key = GBeanInfo, value = List (of attribute names) 054 for (Iterator it = gbeans.iterator(); it.hasNext();) { 055 AbstractName name = (AbstractName) it.next(); 056 if (isApplicationModule(name)) { 057 apps.add(" " + decodeModule(name.getNameProperty("j2eeType")) + ": " + name.getNameProperty("name")); 058 } 059 if (isWebModule(name)) { 060 webs.add(kernel.getAttribute(name, "URLFor").toString()); 061 } 062 063 int stateValue = kernel.getGBeanState(name); 064 if (stateValue != State.RUNNING_INDEX) { 065 GBeanData data = kernel.getGBeanData(name); 066 State state = State.fromInt(stateValue); 067 StringBuffer buf = new StringBuffer(); 068 buf.append("(").append(state.getName()); 069 // Since it's not unusual for a failure to be caused by a port binding failure 070 // we'll see if there's a likely looking port attribute in the config data 071 // for the GBean. It's a long shot, but hey. 072 if (data != null && data.getAttributes() != null) { 073 Map map = data.getAttributes(); 074 for (Iterator it2 = map.keySet().iterator(); it2.hasNext();) { 075 String att = (String) it2.next(); 076 if (att.equals("port") || att.indexOf("Port") > -1) { 077 buf.append(",").append(att).append("=").append(map.get(att)); 078 } 079 } 080 } 081 buf.append(")"); 082 failed.put(name, buf.toString()); 083 continue; 084 } 085 086 // Check if this is ServerInfo 087 GBeanInfo info = kernel.getGBeanInfo(name); 088 if (info.getClassName().equals("org.apache.geronimo.system.serverinfo.ServerInfo")) { 089 serverInfo = (String) kernel.getAttribute(name, "version"); 090 } 091 092 // Look for any SocketAddress properties 093 List list = (List) beanInfos.get(info); 094 if (list == null) { 095 list = new ArrayList(3); 096 beanInfos.put(info, list); 097 Set atts = info.getAttributes(); 098 for (Iterator it2 = atts.iterator(); it2.hasNext();) { 099 GAttributeInfo att = (GAttributeInfo) it2.next(); 100 if (att.getType().equals("java.net.InetSocketAddress")) { 101 list.add(att); 102 } 103 } 104 } 105 for (int i = 0; i < list.size(); i++) { 106 GAttributeInfo att = (GAttributeInfo) list.get(i); 107 try { 108 InetSocketAddress addr = (InetSocketAddress) kernel.getAttribute(name, att.getName()); 109 if (addr == null) { 110 log.debug("No value for GBean " + name + " attribute " + att.getName()); 111 continue; 112 } else if (addr.getAddress() == null || addr.getAddress().getHostAddress() == null) { 113 log.debug("Null address or host for GBean " + name + " " + att.getName() + ": " + addr.getAddress()); 114 } 115 String attName = info.getName(); 116 if (list.size() > 1) { 117 attName += " " + decamelize(att.getName()); 118 } else if (info.getAttribute("name") != null) { 119 attName += " " + kernel.getAttribute(name, "name"); 120 } 121 ports.add(new AddressHolder(attName, addr)); 122 } catch (IllegalStateException e) { 123 // We weren't able to load a port for this service -- that's a bummer 124 } 125 } 126 } 127 } catch (Exception e) { 128 e.printStackTrace(); 129 } 130 131 Collections.sort(apps); 132 133 // Helpful output: list of ports we listen on 134 if (ports.size() > 0) { 135 Collections.sort(ports); 136 System.out.println(" Listening on Ports:"); 137 int max = 0; 138 for (int i = 0; i < ports.size(); i++) { 139 AddressHolder holder = (AddressHolder) ports.get(i); 140 if (holder.getAddress().getAddress() != null && holder.getAddress().getAddress().getHostAddress() != null) 141 { 142 max = Math.max(max, holder.getAddress().getAddress().getHostAddress().length()); 143 } 144 } 145 for (int i = 0; i < ports.size(); i++) { 146 AddressHolder holder = (AddressHolder) ports.get(i); 147 StringBuffer buf = new StringBuffer(); 148 buf.append(" "); 149 if (holder.getAddress().getPort() < 10) { 150 buf.append(' '); 151 } 152 if (holder.getAddress().getPort() < 100) { 153 buf.append(' '); 154 } 155 if (holder.getAddress().getPort() < 1000) { 156 buf.append(' '); 157 } 158 if (holder.getAddress().getPort() < 10000) { 159 buf.append(' '); 160 } 161 buf.append(holder.getAddress().getPort()).append(' '); 162 String address = holder.getAddress().getAddress() == null || holder.getAddress().getAddress().getHostAddress() == null ? "" : 163 holder.getAddress().getAddress().getHostAddress(); 164 buf.append(address); 165 for (int j = address.length(); j <= max; j++) { 166 buf.append(' '); 167 } 168 buf.append(holder.getName()); 169 out.println(buf.toString()); 170 } 171 out.println(); 172 } 173 // Helpful output: list of applications started 174 if (apps.size() > 0) { 175 out.println(" Started Application Modules:"); 176 for (int i = 0; i < apps.size(); i++) { 177 out.println((String) apps.get(i)); 178 } 179 out.println(); 180 } 181 // Helpful output: Web URLs 182 if (webs.size() > 0) { 183 Collections.sort(webs); 184 out.println(" Web Applications:"); 185 for (int i = 0; i < webs.size(); i++) { 186 out.println(" " + webs.get(i)); 187 } 188 out.println(); 189 } 190 191 // Helpful output: list of GBeans that did not start 192 if (failed.size() > 0) { 193 out.println(" WARNING: Some GBeans were not started successfully:"); 194 for (Iterator it = failed.keySet().iterator(); it.hasNext();) { 195 AbstractName name = (AbstractName) it.next(); 196 String state = (String) failed.get(name); 197 if (name.getNameProperty("name") != null) { 198 log.debug("Unable to start " + name + " " + state); 199 out.println(" " + name.getNameProperty("name") + " " + state); 200 } else { 201 out.println(" " + name + " " + state); 202 } 203 } 204 out.println(); 205 } 206 207 StringBuffer msg = new StringBuffer(); 208 msg.append("Geronimo Application Server started"); 209 if (serverInfo != null) { 210 msg.append(" (version ").append(serverInfo).append(")"); 211 } 212 out.println(msg.toString()); 213 out.flush(); 214 } 215 216 private static boolean isApplicationModule(AbstractName abstractName) { 217 String type = abstractName.getNameProperty("j2eeType"); 218 String app = abstractName.getNameProperty("J2EEApplication"); 219 String name = abstractName.getNameProperty("name"); 220 if (type != null && (app == null || app.equals("null"))) { 221 return (type.equals("WebModule") || type.equals("J2EEApplication") || type.equals("EJBModule") || type.equals("AppClientModule") || type.equals("ResourceAdapterModule")) && !name.startsWith("geronimo/system"); 222 } 223 return false; 224 } 225 226 private static boolean isWebModule(AbstractName abstractName) { 227 String type = abstractName.getNameProperty("j2eeType"); 228 return type != null && type.equals("WebModule"); 229 } 230 231 private static String decodeModule(String value) { 232 if (value.equals("WebModule")) { 233 return "WAR"; 234 } else if (value.equals("J2EEApplication")) { 235 return "EAR"; 236 } else if (value.equals("EJBModule")) { 237 return "JAR"; 238 } else if (value.equals("AppClientModule")) { 239 return "CAR"; 240 } else if (value.equals("ResourceAdapterModule")) { 241 return "RAR"; 242 } else { 243 return "UNK"; 244 } 245 } 246 247 private static String decamelize(String s) { 248 if (s == null || s.equals("")) { 249 return s; 250 } 251 StringBuffer buf = new StringBuffer(); 252 buf.append(Character.toUpperCase(s.charAt(0))); 253 for (int i = 1; i < s.length(); i++) { 254 if (Character.isUpperCase(s.charAt(i))) { 255 if (s.length() > i + 1 && Character.isLowerCase(s.charAt(i + 1))) { 256 buf.append(" "); 257 } 258 } 259 buf.append(s.charAt(i)); 260 } 261 return buf.toString(); 262 } 263 264 private static class AddressHolder implements Comparable { 265 private String name; 266 private InetSocketAddress address; 267 268 public AddressHolder(String name, InetSocketAddress address) { 269 this.name = name; 270 this.address = address; 271 } 272 273 public String getName() { 274 return name; 275 } 276 277 public void setName(String name) { 278 this.name = name; 279 } 280 281 public InetSocketAddress getAddress() { 282 return address; 283 } 284 285 public void setAddress(InetSocketAddress address) { 286 this.address = address; 287 } 288 289 public int compareTo(Object o) { 290 AddressHolder other = (AddressHolder) o; 291 int value = address.getPort() - other.address.getPort(); 292 return value == 0 ? address.getAddress().toString().compareTo(other.address.getAddress().toString()) : value; 293 } 294 } 295 }