/* * 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 org.apache.felix.ipojo.arch; import java.io.PrintStream; import java.lang.reflect.Field; import java.util.List; import org.apache.felix.ipojo.ComponentInstance; import org.apache.felix.ipojo.Factory; import org.apache.felix.ipojo.HandlerFactory; import org.apache.felix.ipojo.IPojoFactory; import org.apache.felix.ipojo.architecture.Architecture; import org.apache.felix.ipojo.architecture.InstanceDescription; import org.apache.felix.shell.Command; /** * Implementation of the arch command printing the actual architecture. * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> */ public class ArchCommandImpl implements Command { /** List of arch services. */ private Architecture[] m_archs; /** Factory services. */ private Factory[] m_factories; /** Handler Factories. */ private HandlerFactory[] m_handlers; /** * Get the command name. * @return the command name (arch) * @see org.apache.felix.shell.Command#getName() */ public String getName() { return "arch"; } /** * Gets help message. * @return the command usage. * @see org.apache.felix.shell.Command#getUsage() */ public String getUsage() { return "arch [-factories] [-instances] [-handlers] [-factory factory_name] [-instance instance_name]"; } /** * Gets a small description. * @return get a description. * @see org.apache.felix.shell.Command#getShortDescription() */ public String getShortDescription() { return "Architecture command : display the architecture"; } /** * Executes the arch command. * @param line : command line * @param out : the default output stream * @param err : the error output stream * @see org.apache.felix.shell.Command#execute(java.lang.String, java.io.PrintStream, java.io.PrintStream) */ public void execute(String line, PrintStream out, PrintStream err) { String line2 = line.substring("arch".length()).trim(); if (line2.equalsIgnoreCase("-instances") || line2.length() == 0) { printInstances(out); return; } if (line2.equalsIgnoreCase("-factories")) { printFactories(out); return; } if (line2.startsWith("-factory")) { String name = line2.substring("-factory".length()).trim(); printFactory(name, out, err); return; } if (line2.startsWith("-instance")) { String name = line2.substring("-instance".length()).trim(); printInstance(name, out, err); return; } if (line2.startsWith("-handlers")) { printHandlers(out); return; } if (line2.startsWith("-stats")) { printStats(out); return; } err.println(getUsage()); } /** * Prints the statistics. * @param out the out */ private void printStats(PrintStream out) { try { Field field = IPojoFactory.class.getDeclaredField("INSTANCE_NAME"); field.setAccessible(true); // The field is not accessible. List names = (List) field.get(null); out.println("Number of living instances : " + names.size()); out.println("Created instances : " + names); } catch (SecurityException e) { out.println("Cannot compute stats : " + e.getMessage()); } catch (IllegalArgumentException e) { out.println("Cannot compute stats : " + e.getMessage()); } catch (IllegalAccessException e) { out.println("Cannot compute stats : " + e.getMessage()); } catch (NoSuchFieldException e) { out.println("Cannot compute stats : " + e.getMessage()); } } /** * Prints instance list. * @param out : default print stream */ private void printInstances(PrintStream out) { for (int i = 0; i < m_archs.length; i++) { InstanceDescription instance = m_archs[i].getInstanceDescription(); if (instance.getState() == ComponentInstance.VALID) { out.println("Instance " + instance.getName() + " -> valid"); } if (instance.getState() == ComponentInstance.INVALID) { out.println("Instance " + instance.getName() + " -> invalid"); } if (instance.getState() == ComponentInstance.STOPPED) { out.println("Instance " + instance.getName() + " -> stopped"); } } } /** * Prints instance description. * @param name : instance name * @param out : default print stream * @param err : error print stream (if the instance is not found) */ private void printInstance(String name, PrintStream out, PrintStream err) { for (int i = 0; i < m_archs.length; i++) { InstanceDescription instance = m_archs[i].getInstanceDescription(); if (instance.getName().equalsIgnoreCase(name)) { out.println(instance.getDescription()); return; } } err.println("Instance " + name + " not found"); } /** * Prints factories. * @param out : output stream */ private void printFactories(PrintStream out) { for (int i = 0; i < m_factories.length; i++) { if (m_factories[i].getMissingHandlers().size() == 0) { out.println("Factory " + m_factories[i].getName() + " (VALID)"); } else { out.println("Factory " + m_factories[i].getName() + " (INVALID : " + m_factories[i].getMissingHandlers() + ")"); } } } /** * Prints factory description. * @param name : factory name * @param out : default print stream * @param err : error print stream (if the factory is not found) */ private void printFactory(String name, PrintStream out, PrintStream err) { boolean found = false; for (int i = 0; i < m_factories.length; i++) { if (m_factories[i].getName().equalsIgnoreCase(name)) { // Skip a line if already found if (found) { out.println(); } out.println(m_factories[i].getDescription()); found = true; } } if (! found) { err.println("Factory " + name + " not found"); } } /** * Prints the list of available handlers (and validity). * @param out : default print stream */ private void printHandlers(PrintStream out) { for (int i = 0; i < m_handlers.length; i++) { String name = m_handlers[i].getHandlerName(); if ("composite".equals(m_handlers[i].getType())) { name = name + " [composite]"; } if (m_handlers[i].getMissingHandlers().size() == 0) { out.println("Handler " + name + " (VALID)"); } else { out.println("Handler " + name + " (INVALID : " + m_handlers[i].getMissingHandlers() + ")"); } } } }