## 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.



#if ( $data.getMessage() )
        #info( $data.getMessage() )
#end

#if ($!success) <div align="center"><h1>$success</h1></div> 
       <p>
               You're now successfully running a <a href="http://turbine.apache.org/">Turbine</a> based
               application, deployed to <font color="red">$data.ServerData.ContextPath</a></font> on
               your web container.
       </p>
      
       <p>
               You can (and should!) change or remove this page at any time. It is
               intended to give you immediate feedback if you just deployed an newly
               setup Turbine application.
       </p>
       
#end
    
     ## including a secured does not trigger the security check, as it is just handled by velocity, not turbine
     #parse("/screens/TestSecure.vm")
     
     ## trigger the security check, but without all context
     ## <a href="$link.setPage("TestSecure.vm")">Test a secure access without context</a>
     ## trigger the security check
     <a href="$link.setPage("TestSecure.vm").addPathInfo("action","SecureAction")">Test a secure access with context</a>
     
