| package org.apache.archiva.web.startup; |
| |
| /* |
| * 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. |
| */ |
| |
| import org.apache.commons.lang3.StringUtils; |
| import org.slf4j.LoggerFactory; |
| |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| /** |
| * Banner |
| * |
| * |
| */ |
| public class Banner |
| { |
| private static final String eol = System.getProperty("line.separator"); |
| |
| public static String encode( String raw ) |
| { |
| // Canonicalize line ends to make them easier to process |
| raw = raw.replace("\r\n", "\n").replace("\r", "\n"); |
| |
| StringBuilder encoded = new StringBuilder(); |
| int rawlen = raw.length(); |
| |
| for ( int i = 0; i < rawlen; i++ ) |
| { |
| char c = raw.charAt( i ); |
| if ( c == '\\' ) |
| { |
| encoded.append( "$." ); |
| } |
| else if ( c == '$' ) |
| { |
| encoded.append( "$$" ); |
| } |
| else if ( c == '\n' ) |
| { |
| encoded.append( "$n" ); |
| } |
| else if ( Character.isDigit( c ) ) |
| { |
| encoded.append( c ); |
| } |
| else if ( Character.isLetter( c ) ) |
| { |
| encoded.append( rot13( c ) ); |
| } |
| else if ( i < raw.length() - 1 ) |
| { |
| char nc; |
| boolean done = false; |
| int count = 0; |
| for ( int n = i; !done; n++ ) |
| { |
| if ( n >= rawlen ) |
| { |
| break; |
| } |
| |
| nc = raw.charAt( n ); |
| |
| if ( nc != c ) |
| { |
| done = true; |
| } |
| else |
| { |
| count++; |
| } |
| } |
| if ( count < 3 ) |
| { |
| encoded.append( c ); |
| } |
| else |
| { |
| encoded.append( "$" ).append( String.valueOf( count ) ).append( c ); |
| i += count - 1; |
| } |
| } |
| else |
| { |
| encoded.append( c ); |
| } |
| } |
| |
| return encoded.toString(); |
| } |
| |
| public static String decode( String encoded ) |
| { |
| StringBuilder decoded = new StringBuilder(); |
| int enlen = encoded.length(); |
| for ( int i = 0; i < enlen; i++ ) |
| { |
| char c = encoded.charAt( i ); |
| if ( c == '$' ) |
| { |
| char nc = encoded.charAt( i + 1 ); |
| if ( nc == '$' ) |
| { |
| decoded.append( '$' ); |
| i++; |
| } |
| else if ( nc == '.' ) |
| { |
| decoded.append( '\\' ); |
| i++; |
| } |
| else if ( nc == 'n' ) |
| { |
| decoded.append( eol ); |
| i++; |
| } |
| else if ( Character.isDigit( nc ) ) |
| { |
| int count = 0; |
| int nn = i + 1; |
| while ( Character.isDigit( nc ) ) |
| { |
| count = ( count * 10 ); |
| count += ( nc - '0' ); |
| nc = encoded.charAt( ++nn ); |
| } |
| for ( int d = 0; d < count; d++ ) |
| { |
| decoded.append( nc ); |
| } |
| i = nn; |
| } |
| } |
| else if ( Character.isLetter( c ) ) |
| { |
| decoded.append( rot13( c ) ); |
| } |
| else |
| { |
| decoded.append( c ); |
| } |
| } |
| |
| return decoded.toString(); |
| } |
| |
| private static char rot13( char c ) |
| { |
| if ( ( c >= 'a' ) && ( c <= 'z' ) ) |
| { |
| char dc = c += 13; |
| if ( dc > 'z' ) |
| { |
| dc -= 26; |
| } |
| return dc; |
| } |
| else if ( ( c >= 'A' ) && ( c <= 'Z' ) ) |
| { |
| char dc = c += 13; |
| if ( dc > 'Z' ) |
| { |
| dc -= 26; |
| } |
| return dc; |
| } |
| else |
| { |
| return c; |
| } |
| } |
| |
| public static String injectVersion( String text, String version ) |
| { |
| Pattern pat = Pattern.compile( "#{2,}" ); |
| Matcher mat = pat.matcher( text ); |
| StringBuilder ret = new StringBuilder(); |
| int off = 0; |
| |
| while ( mat.find( off ) ) |
| { |
| ret.append( text.substring( off, mat.start() ) ); |
| String repl = mat.group(); |
| ret.append( StringUtils.center( version, repl.length() ) ); |
| off = mat.end(); |
| } |
| |
| ret.append( text.substring( off ) ); |
| |
| return ret.toString(); |
| } |
| |
| public static String getBanner( String version ) |
| { |
| String encodedBanner = "$26 $34_$n$15 /$._$7 /$34 $.$n$14 /`/@),$4 | Ba" + |
| " orunys bs nyy bs gur nycnpnf |$n$14 | (~' __| gbvyvat njnl ba " + |
| "gur Ncnpur Nepuvin |$n$6 _,--.$3_/ |$4 $.$5 cebwrpg grnz, V jbhyq y" + |
| "vxr gb$3 |$n$4 ,' ,$5 ($3 |$5 $.$5 jrypbzr lbh gb Nepuvin$6 |$" + |
| "n$4 | ($6 $. /$6 | $32# |$n$5 $. )$._/ ,_/$7 |$36 |$n$5 / /$3 " + |
| "( |/$9 | uggc://nepuvin.ncnpur.bet/ |$n$4 ( |$4 ( |$10 | hf" + |
| "ref@nepuvin.ncnpur.bet$7 |$n$5 $.|$5 $.|$11 $.$34_/$n$n"; |
| |
| return injectVersion( decode( encodedBanner ), version ); |
| } |
| |
| public static void display( String version ) |
| { |
| String banner = getBanner( version ); |
| LoggerFactory.getLogger( Banner.class ).info( "{} {}{}" , StringUtils.repeat( "_", 25 ), eol, banner ); |
| } |
| } |