/** * 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.jooby.banner; import static com.github.lalyos.jfiglet.FigletFont.convertOneLine; import static java.util.Objects.requireNonNull; import java.util.Optional; import javax.inject.Provider; import org.jooby.Env; import org.jooby.Jooby.Module; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.CharMatcher; import com.google.inject.Binder; import com.google.inject.Key; import com.google.inject.name.Names; import com.typesafe.config.Config; import javaslang.control.Try; /** * <h1>banner</h1> * <p> * Prints out an ASCII art banner on startup using * <a href="https://github.com/lalyos/jfiglet">jfiglet</a>. * </p> * * <h2>usage</h2> * * <pre>{@code * package com.myapp; * * { * use(new Banner()); * } * }</pre> * * <p> * Prints out the value of <code>application.name</code> which here is <code>myapp</code>. Or you * can specify the text to prints out: * </p> * * <pre>{@code * package com.myapp; * * { * use(new Banner("my awesome app")); * } * }</pre> * * <h2>font</h2> * <p> * You can pick and use the font of your choice via {@link #font(String)} option: * </p> * * <pre>{@code * package com.myapp; * * { * use(new Banner("my awesome app").font("slant")); * } * }</pre> * * <p> * Font are distributed within the library inside the <code>/flf</code> classpath folder. A full * list of fonts is available <a href="http://patorjk.com/software/taag">here</a>. * </p> * * @author edgar * @since 1.0.0.CR3 */ public class Banner implements Module { private static final String FONT = "classpath:/flf/%s.flf"; private String font = "speed"; private final Optional<String> text; /** * Creates a new {@link Banner} with the given text. * * @param text Texy to display. */ public Banner(final String text) { this.text = Optional.of(text); } /** * Default banner, defined by <code>application.name</code>. */ public Banner() { this.text = Optional.empty(); } @Override public void configure(final Env env, final Config conf, final Binder binder) { String name = conf.getString("application.name"); Logger log = LoggerFactory.getLogger(name); String v = conf.getString("application.version"); String text = this.text.orElse(name); Provider<String> ascii = () -> Try .of(() -> CharMatcher.WHITESPACE .trimTrailingFrom(convertOneLine(String.format(FONT, font), text))) .getOrElse(text); binder.bind(Key.get(String.class, Names.named("application.banner"))).toProvider(ascii); env.onStart(() -> { log.info("\n{} v{}\n", ascii.get(), v); }); } /** * Set/change default font (speed). * * @param font A font's name. * @return This module. */ public Banner font(final String font) { this.font = requireNonNull(font, "Font is required."); return this; } }