This project has retired. For details please refer to its Attic page.
Source code
001package org.apache.archiva.web.startup;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.commons.lang.StringUtils;
023import org.slf4j.LoggerFactory;
024
025import java.util.regex.Matcher;
026import java.util.regex.Pattern;
027
028/**
029 * Banner 
030 *
031 *
032 */
033public class Banner
034{
035    private static final String eol = System.getProperty("line.separator");
036
037    public static String encode( String raw )
038    {
039        // Canonicalize line ends to make them easier to process
040        raw = raw.replace("\r\n", "\n").replace("\r", "\n");
041
042        StringBuilder encoded = new StringBuilder();
043        int rawlen = raw.length();
044
045        for ( int i = 0; i < rawlen; i++ )
046        {
047            char c = raw.charAt( i );
048            if ( c == '\\' )
049            {
050                encoded.append( "$." );
051            }
052            else if ( c == '$' )
053            {
054                encoded.append( "$$" );
055            }
056            else if ( c == '\n' )
057            {
058                encoded.append( "$n" );
059            }
060            else if ( Character.isDigit( c ) )
061            {
062                encoded.append( c );
063            }
064            else if ( Character.isLetter( c ) )
065            {
066                encoded.append( rot13( c ) );
067            }
068            else if ( i < raw.length() - 1 )
069            {
070                char nc;
071                boolean done = false;
072                int count = 0;
073                for ( int n = i; !done; n++ )
074                {
075                    if ( n >= rawlen )
076                    {
077                        break;
078                    }
079
080                    nc = raw.charAt( n );
081
082                    if ( nc != c )
083                    {
084                        done = true;
085                    }
086                    else
087                    {
088                        count++;
089                    }
090                }
091                if ( count < 3 )
092                {
093                    encoded.append( c );
094                }
095                else
096                {
097                    encoded.append( "$" ).append( String.valueOf( count ) ).append( c );
098                    i += count - 1;
099                }
100            }
101            else
102            {
103                encoded.append( c );
104            }
105        }
106
107        return encoded.toString();
108    }
109
110    public static String decode( String encoded )
111    {
112        StringBuilder decoded = new StringBuilder();
113        int enlen = encoded.length();
114        for ( int i = 0; i < enlen; i++ )
115        {
116            char c = encoded.charAt( i );
117            if ( c == '$' )
118            {
119                char nc = encoded.charAt( i + 1 );
120                if ( nc == '$' )
121                {
122                    decoded.append( '$' );
123                    i++;
124                }
125                else if ( nc == '.' )
126                {
127                    decoded.append( '\\' );
128                    i++;
129                }
130                else if ( nc == 'n' )
131                {
132                    decoded.append( eol );
133                    i++;
134                }
135                else if ( Character.isDigit( nc ) )
136                {
137                    int count = 0;
138                    int nn = i + 1;
139                    while ( Character.isDigit( nc ) )
140                    {
141                        count = ( count * 10 );
142                        count += ( nc - '0' );
143                        nc = encoded.charAt( ++nn );
144                    }
145                    for ( int d = 0; d < count; d++ )
146                    {
147                        decoded.append( nc );
148                    }
149                    i = nn;
150                }
151            }
152            else if ( Character.isLetter( c ) )
153            {
154                decoded.append( rot13( c ) );
155            }
156            else
157            {
158                decoded.append( c );
159            }
160        }
161
162        return decoded.toString();
163    }
164
165    private static char rot13( char c )
166    {
167        if ( ( c >= 'a' ) && ( c <= 'z' ) )
168        {
169            char dc = c += 13;
170            if ( dc > 'z' )
171            {
172                dc -= 26;
173            }
174            return dc;
175        }
176        else if ( ( c >= 'A' ) && ( c <= 'Z' ) )
177        {
178            char dc = c += 13;
179            if ( dc > 'Z' )
180            {
181                dc -= 26;
182            }
183            return dc;
184        }
185        else
186        {
187            return c;
188        }
189    }
190
191    public static String injectVersion( String text, String version )
192    {
193        Pattern pat = Pattern.compile( "#{2,}" );
194        Matcher mat = pat.matcher( text );
195        StringBuilder ret = new StringBuilder();
196        int off = 0;
197
198        while ( mat.find( off ) )
199        {
200            ret.append( text.substring( off, mat.start() ) );
201            String repl = mat.group();
202            ret.append( StringUtils.center( version, repl.length() ) );
203            off = mat.end();
204        }
205
206        ret.append( text.substring( off ) );
207
208        return ret.toString();
209    }
210
211    public static String getBanner( String version )
212    {
213        String encodedBanner = "$26 $34_$n$15 /$._$7 /$34 $.$n$14 /`/@),$4 |  Ba" +
214                " orunys bs nyy bs gur nycnpnf   |$n$14 |  (~'  __| gbvyvat njnl ba " +
215                "gur Ncnpur Nepuvin |$n$6 _,--.$3_/  |$4 $.$5  cebwrpg grnz, V jbhyq y" +
216                "vxr gb$3 |$n$4 ,' ,$5 ($3 |$5 $.$5     jrypbzr lbh gb Nepuvin$6 |$" +
217                "n$4 |  ($6 $.  /$6 |  $32#  |$n$5 $.  )$._/  ,_/$7 |$36 |$n$5 / /$3 " +
218                "( |/$9 |     uggc://nepuvin.ncnpur.bet/     |$n$4 ( |$4 ( |$10 |     hf" +
219                "ref@nepuvin.ncnpur.bet$7 |$n$5 $.|$5 $.|$11 $.$34_/$n$n";
220
221        return injectVersion( decode( encodedBanner ), version );
222    }
223
224    public static void display( String version )
225    {
226        String banner = getBanner( version );
227        LoggerFactory.getLogger( Banner.class ).info( "{} {}{}" , StringUtils.repeat( "_", 25 ), eol, banner );
228    }
229}