/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.util; import static java.lang.Boolean.TRUE; import static org.mule.runtime.core.api.config.MuleProperties.SYSTEM_PROPERTY_PREFIX; import org.mule.runtime.core.api.MuleContext; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; /** * Implements singleton pattern to allow different splash-screen implementations following the concept of header, body, and * footer. Header and footer are reserved internally to Mule but body can be used to customize splash-screen output. External code * can e.g. hook into the start-up splash-screen as follows: * * <pre> * <code> * SplashScreen splashScreen = SplashScreen.getInstance(ServerStartupSplashScreen.class); * splashScreen.addBody("Some extra text"); * </code> * </pre> */ public abstract class SplashScreen { public static final String RUNTIME_VERBOSE = SYSTEM_PROPERTY_PREFIX + "runtime.verbose"; /** * Determines whether extra information should be display. */ protected static PropertyChecker RUNTIME_VERBOSE_PROPERTY = new PropertyChecker(RUNTIME_VERBOSE, TRUE.toString()); protected static final String VALUE_FORMAT = " - %s"; private static final String KEY_VALUE_FORMAT = VALUE_FORMAT + " = %s"; protected List<String> header = new ArrayList<String>(); protected List<String> body = new ArrayList<String>(); protected List<String> footer = new ArrayList<String>(); /** * Setting the header clears body and footer assuming a new splash-screen is built. * */ final public void setHeader(MuleContext context) { header.clear(); doHeader(context); } final public void addBody(String line) { doBody(line); } final public void setFooter(MuleContext context) { footer.clear(); doFooter(context); } public static String miniSplash(final String message) { // middle dot char return StringMessageUtils.getBoilerPlate(message, '+', 60); } protected void doHeader(MuleContext context) { // default reserved for mule core info } protected void doBody(String line) { body.add(line); } protected void doFooter(MuleContext context) { // default reserved for mule core info } protected void listItems(Collection<String> items, String description) { if (!items.isEmpty()) { doBody(description); for (String item : items) { doBody(String.format(VALUE_FORMAT, item)); } } } protected void listItems(Map<String, String> map, String description) { if (!map.isEmpty()) { doBody(description); for (String key : map.keySet()) { doBody(String.format(KEY_VALUE_FORMAT, key, map.get(key))); } } } public String toString() { List<String> boilerPlate = new ArrayList<String>(header); boilerPlate.addAll(body); boilerPlate.addAll(footer); return StringMessageUtils.getBoilerPlate(boilerPlate, '*', 70); } protected SplashScreen() { // make sure no one else creates an instance } }