]> source.dussan.org Git - archiva.git/blob
76a5223ee4d1f5f893edc0f4446b892e900d9123
[archiva.git] /
1 package org.apache.maven.archiva.web.startup;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import java.util.regex.Matcher;
23 import java.util.regex.Pattern;
24
25 import org.apache.commons.lang.StringUtils;
26 import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
27 import org.slf4j.LoggerFactory;
28
29 /**
30  * Banner 
31  *
32  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
33  * @version $Id$
34  * 
35  * @plexus.component 
36  *              role="org.apache.maven.archiva.web.startup.Banner"
37  *              role-hint="default"
38  */
39 public class Banner
40 {
41     public static String encode( String raw )
42     {
43         StringBuffer encoded = new StringBuffer();
44         int rawlen = raw.length();
45
46         for ( int i = 0; i < rawlen; i++ )
47         {
48             char c = raw.charAt( i );
49             if ( c == '\\' )
50             {
51                 encoded.append( "$." );
52             }
53             else if ( c == '$' )
54             {
55                 encoded.append( "$$" );
56             }
57             else if ( c == '\n' )
58             {
59                 encoded.append( "$n" );
60             }
61             else if ( Character.isDigit( c ) )
62             {
63                 encoded.append( c );
64             }
65             else if ( Character.isLetter( c ) )
66             {
67                 encoded.append( rot13( c ) );
68             }
69             else if ( i < raw.length() - 1 )
70             {
71                 char nc;
72                 boolean done = false;
73                 int count = 0;
74                 for ( int n = i; !done; n++ )
75                 {
76                     if ( n >= rawlen )
77                     {
78                         break;
79                     }
80
81                     nc = raw.charAt( n );
82
83                     if ( nc != c )
84                     {
85                         done = true;
86                     }
87                     else
88                     {
89                         count++;
90                     }
91                 }
92                 if ( count < 3 )
93                 {
94                     encoded.append( c );
95                 }
96                 else
97                 {
98                     encoded.append( "$" ).append( String.valueOf( count ) ).append( c );
99                     i += count - 1;
100                 }
101             }
102             else
103             {
104                 encoded.append( c );
105             }
106         }
107
108         return encoded.toString();
109     }
110
111     public static String decode( String encoded )
112     {
113         StringBuffer decoded = new StringBuffer();
114         int enlen = encoded.length();
115         for ( int i = 0; i < enlen; i++ )
116         {
117             char c = encoded.charAt( i );
118             if ( c == '$' )
119             {
120                 char nc = encoded.charAt( i + 1 );
121                 if ( nc == '$' )
122                 {
123                     decoded.append( '$' );
124                     i++;
125                 }
126                 else if ( nc == '.' )
127                 {
128                     decoded.append( '\\' );
129                     i++;
130                 }
131                 else if ( nc == 'n' )
132                 {
133                     decoded.append( '\n' );
134                     i++;
135                 }
136                 else if ( Character.isDigit( nc ) )
137                 {
138                     int count = 0;
139                     int nn = i + 1;
140                     while ( Character.isDigit( nc ) )
141                     {
142                         count = ( count * 10 );
143                         count += ( nc - '0' );
144                         nc = encoded.charAt( ++nn );
145                     }
146                     for ( int d = 0; d < count; d++ )
147                     {
148                         decoded.append( nc );
149                     }
150                     i = nn;
151                 }
152             }
153             else if ( Character.isLetter( c ) )
154             {
155                 decoded.append( rot13( c ) );
156             }
157             else
158             {
159                 decoded.append( c );
160             }
161         }
162
163         return decoded.toString();
164     }
165
166     private static char rot13( char c )
167     {
168         if ( ( c >= 'a' ) && ( c <= 'z' ) )
169         {
170             char dc = c += 13;
171             if ( dc > 'z' )
172             {
173                 dc -= 26;
174             }
175             return dc;
176         }
177         else if ( ( c >= 'A' ) && ( c <= 'Z' ) )
178         {
179             char dc = c += 13;
180             if ( dc > 'Z' )
181             {
182                 dc -= 26;
183             }
184             return dc;
185         }
186         else
187         {
188             return c;
189         }
190     }
191
192     public static String injectVersion( String text, String version )
193     {
194         Pattern pat = Pattern.compile( "#{2,}" );
195         Matcher mat = pat.matcher( text );
196         StringBuffer ret = new StringBuffer();
197         int off = 0;
198
199         while ( mat.find( off ) )
200         {
201             ret.append( text.substring( off, mat.start() ) );
202             String repl = mat.group();
203             ret.append( StringUtils.center( version, repl.length() ) );
204             off = mat.end();
205         }
206
207         ret.append( text.substring( off ) );
208
209         return ret.toString();
210     }
211
212     public static String getBanner( String version )
213     {
214         String encodedBanner = "$26 $34_$n$15 /$._$7 /$34 $.$n$14 /`/@),$4 |  Ba" +
215                 " orunys bs nyy bs gur nycnpn'f  |$n$14 |  (~'  __|  gbvyvat njnl ba " +
216                 "gur Ncnpur Znira  |$n$6 _,--.$3_/  |$4 $.$5 cebwrpg grnzf, V jbhyq y" +
217                 "vxr gb$3 |$n$4 ,' ,$5 ($3 |$5 $.$5 jrypbzr lbh gb Znira Nepuvin$4 |$" +
218                 "n$4 |  ($6 $.  /$6 |  $32#  |$n$5 $.  )$._/  ,_/$7 |$36 |$n$5 / /$3 " +
219                 "( |/$9 |  uggc://znira.ncnpur.bet/nepuvin/  |$n$4 ( |$4 ( |$10 |  ne" +
220                 "puvin-hfref@znira.ncnpur.bet$4 |$n$5 $.|$5 $.|$11 $.$34_/$n$n";
221
222         return injectVersion( decode( encodedBanner ), version );
223     }
224
225     public void display() 
226     {
227         String banner = getBanner( ArchivaVersion.determineVersion( this.getClass().getClassLoader() ) );
228         LoggerFactory.getLogger( Banner.class ).info( StringUtils.repeat( "_", 25 ) + "\n" + banner );
229     }
230 }