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.WikiPage;
024import org.apache.wiki.auth.permissions.PagePermission;
025import org.apache.wiki.auth.permissions.PermissionFactory;
026
027/**
028 * <p>Defines Commands for editing, renaming, and viewing wiki pages.
029 * PageCommands can be combined with WikiPages 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 * @since 2.4.22
034 */
035public final class PageCommand extends AbstractCommand
036{
037
038    public static final Command ATTACH
039        = new PageCommand( "att", "%uattach/%n", null, null, PagePermission.UPLOAD_ACTION );
040
041    public static final Command COMMENT
042        = new PageCommand( "comment", "%uComment.jsp?page=%n", "CommentContent.jsp", null, PagePermission.COMMENT_ACTION );
043
044    public static final Command CONFLICT 
045        = new PageCommand( "conflict", "%uPageModified.jsp?page=%n", "ConflictContent.jsp", null, PagePermission.VIEW_ACTION );
046
047    public static final Command DELETE
048        = new PageCommand( "del", "%uDelete.jsp?page=%n", null, null, PagePermission.DELETE_ACTION );
049
050    public static final Command DIFF
051        = new PageCommand( "diff", "%uDiff.jsp?page=%n", "DiffContent.jsp", null, PagePermission.VIEW_ACTION );
052
053    public static final Command EDIT
054        = new PageCommand( "edit", "%uEdit.jsp?page=%n", "EditContent.jsp", null, PagePermission.EDIT_ACTION );
055
056    public static final Command INFO
057        = new PageCommand( "info", "%uPageInfo.jsp?page=%n", "InfoContent.jsp", null, PagePermission.VIEW_ACTION );
058
059    public static final Command PREVIEW
060        = new PageCommand( "preview", "%uPreview.jsp?page=%n", "PreviewContent.jsp", null, PagePermission.VIEW_ACTION );
061
062    public static final Command RENAME
063        = new PageCommand( "rename", "%uRename.jsp?page=%n", "InfoContent.jsp", null, PagePermission.RENAME_ACTION );
064
065    public static final Command RSS
066        = new PageCommand( "rss", "%urss.jsp", null, null, PagePermission.VIEW_ACTION );
067
068    public static final Command UPLOAD
069        = new PageCommand( "upload", "%uUpload.jsp?page=%n", null, null, PagePermission.UPLOAD_ACTION );
070
071    public static final Command VIEW
072        = new PageCommand( "view", "%uWiki.jsp?page=%n", "PageContent.jsp", null, PagePermission.VIEW_ACTION );
073
074    public static final Command NONE
075        = new PageCommand( "", "%u%n", null, null, null );
076
077    public static final Command OTHER = NONE;
078
079    private final String m_action;
080    
081    private final Permission m_permission;
082    
083    /**
084     * Constructs a new Command with a specified wiki context, URL pattern,
085     * type, and content template. The target for this command is initialized to
086     * <code>null</code>.
087     * @param requestContext the request context
088     * @param urlPattern the URL pattern
089     * @param target the target of the command (a WikiPage); may be <code>null</code>
090     * @param action the action used to construct a suitable PagePermission
091     * @param contentTemplate the content template; may be <code>null</code>
092     * @throws IllegalArgumentException if the request content, URL pattern, or
093     *         type is <code>null</code>
094     */
095    private PageCommand( String requestContext, String urlPattern, String contentTemplate, WikiPage target, String action )
096    {
097        super( requestContext, urlPattern, contentTemplate, target );
098        m_action = action;
099        if( target == null || m_action == null )
100        {
101            m_permission = null;
102        }
103        else
104        {
105            m_permission = PermissionFactory.getPagePermission( target, action );
106        }
107    }
108
109    /**
110     * Creates and returns a targeted Command by combining a WikiPage 
111     * with this Command. The supplied <code>target</code> object 
112     * must be non-<code>null</code> and of type WikiPage.
113     * @param target the WikiPage to combine into the current Command
114     * @return the new targeted command
115     * @throws IllegalArgumentException if the target is not of the correct type
116     */
117    public Command targetedCommand( Object target )
118    {
119        if( !( target != null && target instanceof WikiPage ) )
120        {
121            throw new IllegalArgumentException( "Target must non-null and of type WikiPage." );
122        }
123        return new PageCommand( getRequestContext(), getURLPattern(), getContentTemplate(), (WikiPage)target, m_action );
124    }
125
126    /**
127     * @see org.apache.wiki.ui.Command#getName()
128     */
129    public String getName()
130    {
131        Object target = getTarget();
132        if( target == null )
133        {
134            return getJSPFriendlyName();
135        }
136        return ( (WikiPage) target ).getName();
137    }
138
139    /**
140     * @see org.apache.wiki.ui.Command#requiredPermission()
141     */
142    public Permission requiredPermission()
143    {
144        return m_permission;
145    }
146}