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 org.apache.wiki.api.core.Command; 022import org.apache.wiki.api.core.ContextEnum; 023import org.apache.wiki.api.core.Page; 024import org.apache.wiki.auth.permissions.PagePermission; 025import org.apache.wiki.auth.permissions.PermissionFactory; 026 027import java.security.Permission; 028 029/** 030 * <p>Defines Commands for editing, renaming, and viewing wiki pages. PageCommands can be combined with WikiPages to produce 031 * targeted Commands.</p> 032 * 033 * @since 2.4.22 034 */ 035public final class PageCommand extends AbstractCommand { 036 037 public static final Command ATTACH = new PageCommand( ContextEnum.PAGE_ATTACH, null, PagePermission.UPLOAD_ACTION ); 038 public static final Command COMMENT = new PageCommand( ContextEnum.PAGE_COMMENT, null, PagePermission.COMMENT_ACTION ); 039 public static final Command CONFLICT = new PageCommand( ContextEnum.PAGE_CONFLICT, null, PagePermission.VIEW_ACTION ); 040 public static final Command DELETE = new PageCommand( ContextEnum.PAGE_DELETE, null, PagePermission.DELETE_ACTION ); 041 public static final Command DIFF = new PageCommand( ContextEnum.PAGE_DIFF, null, PagePermission.VIEW_ACTION ); 042 public static final Command EDIT = new PageCommand( ContextEnum.PAGE_EDIT, null, PagePermission.EDIT_ACTION ); 043 public static final Command INFO = new PageCommand( ContextEnum.PAGE_INFO, null, PagePermission.VIEW_ACTION ); 044 public static final Command PREVIEW = new PageCommand( ContextEnum.PAGE_PREVIEW, null, PagePermission.VIEW_ACTION ); 045 public static final Command RENAME = new PageCommand( ContextEnum.PAGE_RENAME, null, PagePermission.RENAME_ACTION ); 046 public static final Command RSS = new PageCommand( ContextEnum.PAGE_RSS, null, PagePermission.VIEW_ACTION ); 047 public static final Command UPLOAD = new PageCommand( ContextEnum.PAGE_UPLOAD, null, PagePermission.UPLOAD_ACTION ); 048 public static final Command VIEW = new PageCommand( ContextEnum.PAGE_VIEW, null, PagePermission.VIEW_ACTION ); 049 public static final Command NONE = new PageCommand( ContextEnum.PAGE_NONE, null, null ); 050 public static final Command OTHER = NONE; 051 052 private final String m_action; 053 054 private final Permission m_permission; 055 056 /** 057 * Constructs a new Command with a specified wiki context, URL pattern, type, and content template. The target for this command is 058 * initialized to <code>null</code>. 059 * 060 * @param currentContext the current context. 061 * @param target the target of the command (a WikiPage); may be <code>null</code> 062 * @param action the action used to construct a suitable PagePermission 063 * @throws IllegalArgumentException if the request content, URL pattern, or type is <code>null</code> 064 */ 065 private PageCommand( final ContextEnum currentContext, final Page target, final String action ) { 066 this( currentContext.getRequestContext(), currentContext.getUrlPattern(), currentContext.getContentTemplate(), target, action ); 067 } 068 069 /** 070 * Constructs a new Command with a specified wiki context, URL pattern, type, and content template. The target for this command is 071 * initialized to <code>null</code>. 072 * 073 * @param requestContext the request context 074 * @param urlPattern the URL pattern 075 * @param target the target of the command (a WikiPage); may be <code>null</code> 076 * @param action the action used to construct a suitable PagePermission 077 * @param contentTemplate the content template; may be <code>null</code> 078 * @throws IllegalArgumentException if the request content, URL pattern, or type is <code>null</code> 079 */ 080 private PageCommand( final String requestContext, 081 final String urlPattern, 082 final String contentTemplate, 083 final Page target, 084 final String action ) { 085 super( requestContext, urlPattern, contentTemplate, target ); 086 m_action = action; 087 if( target == null || m_action == null ) { 088 m_permission = null; 089 } else { 090 m_permission = PermissionFactory.getPagePermission( target, action ); 091 } 092 } 093 094 /** 095 * Creates and returns a targeted Command by combining a WikiPage with this Command. The supplied <code>target</code> object 096 * must be non-<code>null</code> and of type WikiPage. 097 * 098 * @param target the WikiPage to combine into the current Command 099 * @return the new targeted command 100 * @throws IllegalArgumentException if the target is not of the correct type 101 */ 102 public Command targetedCommand( final Object target ) { 103 if( !( target instanceof Page ) ) { 104 throw new IllegalArgumentException( "Target must non-null and of type Page." ); 105 } 106 return new PageCommand( getRequestContext(), getURLPattern(), getContentTemplate(), ( Page )target, m_action ); 107 } 108 109 /** 110 * @see org.apache.wiki.api.core.Command#getName() 111 */ 112 public String getName() { 113 final Object target = getTarget(); 114 if( target == null ) { 115 return getJSPFriendlyName(); 116 } 117 return ( ( Page )target ).getName(); 118 } 119 120 /** 121 * @see org.apache.wiki.api.core.Command#requiredPermission() 122 */ 123 public Permission requiredPermission() { 124 return m_permission; 125 } 126 127}