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}