001/* 
002    Licensed to the Apache Software Foundation (ASF) under one
003    or more contributor license agreements.  See the NOTICE file
004    distributed with this work for additional information
005    regarding copyright ownership.  The ASF licenses this file
006    to you under the Apache License, Version 2.0 (the
007    "License"); you may not use this file except in compliance
008    with the License.  You may obtain a copy of the License at
009
010       http://www.apache.org/licenses/LICENSE-2.0
011
012    Unless required by applicable law or agreed to in writing,
013    software distributed under the License is distributed on an
014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015    KIND, either express or implied.  See the License for the
016    specific language governing permissions and limitations
017    under the License.  
018 */
019package org.apache.wiki.ui;
020
021import java.security.Permission;
022
023import org.apache.wiki.auth.permissions.AllPermission;
024import org.apache.wiki.auth.permissions.WikiPermission;
025
026/**
027 * <p>Defines Commands for wiki-wide operations such as creating groups, editing
028 * preferences and profiles, and logging in/out. WikiCommands can be combined 
029 * with Strings (representing the name of a wiki instance) to produce
030 * targeted Commands.</p>
031 * <p>This class is not <code>final</code>; it may be extended in
032 * the future.</p>
033 * @see org.apache.wiki.WikiEngine#getApplicationName()
034 * @since 2.4.22
035 */
036public final class WikiCommand extends AbstractCommand
037{
038
039    public static final Command CREATE_GROUP
040        = new WikiCommand( "createGroup", "%uNewGroup.jsp", "NewGroupContent.jsp", null, WikiPermission.CREATE_GROUPS_ACTION );
041
042    public static final Command ERROR
043        = new WikiCommand( "error", "%uError.jsp", "DisplayMessage.jsp", null, null );
044
045    public static final Command FIND
046        = new WikiCommand( "find", "%uSearch.jsp", "FindContent.jsp", null, null );
047
048    public static final Command INSTALL
049        = new WikiCommand( "install", "%uInstall.jsp", null, null, null );
050
051    public static final Command LOGIN
052        = new WikiCommand( "login", "%uLogin.jsp?redirect=%n", "LoginContent.jsp", null, WikiPermission.LOGIN_ACTION );
053
054    public static final Command LOGOUT
055        = new WikiCommand( "logout", "%uLogout.jsp", null, null, WikiPermission.LOGIN_ACTION );
056
057    public static final Command MESSAGE
058        = new WikiCommand( "message", "%uMessage.jsp", "DisplayMessage.jsp", null, null );
059    
060    public static final Command PREFS
061        = new WikiCommand( "prefs", "%uUserPreferences.jsp", "PreferencesContent.jsp", null, WikiPermission.EDIT_PROFILE_ACTION );
062
063    public static final Command WORKFLOW
064        = new WikiCommand( "workflow", "%uWorkflow.jsp", "WorkflowContent.jsp", null, null );
065
066    public static final Command ADMIN
067        = new WikiCommand( "admin", "%uadmin/Admin.jsp", "AdminContent.jsp", null );
068
069    private final String m_action;
070    
071    private final Permission m_permission;
072    
073    /**
074     * Constructs a new Command with a specified wiki context, URL pattern,
075     * type, and content template. The WikiPage for this action is initialized
076     * to <code>null</code>.
077     * @param requestContext the request context
078     * @param urlPattern the URL pattern
079     * @param type the type
080     * @param contentTemplate the content template; may be <code>null</code>
081     * @param action The action
082     * @throws IllegalArgumentException if the request content, URL pattern, or
083     *         type is <code>null</code>
084     */
085    private WikiCommand( String requestContext, 
086                         String urlPattern, 
087                         String contentTemplate, 
088                         String target, 
089                         String action )
090    {
091        super( requestContext, urlPattern, contentTemplate, target );
092        m_action = action;
093        if ( target == null || m_action == null )
094        {
095            m_permission = null;
096        }
097        else
098        {
099            m_permission = new WikiPermission( target, action );
100        }
101    }
102
103    /**
104     *  Constructs an admin command.
105     *  
106     *  @param requestContext
107     *  @param urlPattern
108     *  @param contentTemplate
109     */
110    private WikiCommand( String requestContext, 
111                         String urlPattern, 
112                         String contentTemplate,
113                         String target )
114    {
115        super( requestContext, urlPattern, contentTemplate, target );
116        m_action = null;
117
118        m_permission = new AllPermission( target );
119    }
120    /**
121     * Creates and returns a targeted Command by combining a wiki
122     * (a String) with this Command. The supplied <code>target</code>
123     * object must be non-<code>null</code> and of type String.
124     * @param target the name of the wiki to combine into the current Command
125     * @return the new targeted command
126     * @throws IllegalArgumentException if the target is not of the correct type
127     */
128    public Command targetedCommand( Object target )
129    {
130        if ( !( target != null && target instanceof String ) )
131        {
132            throw new IllegalArgumentException( "Target must non-null and of type String." );
133        }
134        return new WikiCommand( getRequestContext(), getURLPattern(), getContentTemplate(), (String)target, m_action );
135    }
136    
137    /**
138     * Always returns the "friendly" JSP name.
139     * @see org.apache.wiki.ui.Command#getName()
140     */
141    public String getName()
142    {
143        return getJSPFriendlyName();
144    }
145
146    /**
147     * @see org.apache.wiki.ui.Command#requiredPermission()
148     */
149    public Permission requiredPermission()
150    {
151        return m_permission;
152    }
153}