/** * $Id: EntityCustomAction.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $ * $URL: https://source.sakaiproject.org/svn/entitybroker/trunk/api/src/java/org/sakaiproject/entitybroker/entityprovider/annotations/EntityCustomAction.java $ * EntityCustomAction.java - entity-broker - Jul 28, 2008 11:09:39 AM - azeckoski ************************************************************************** * Copyright (c) 2008 The Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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. */ package org.sakaiproject.entitybroker.entityprovider.annotations; import java.io.OutputStream; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.Map; import org.sakaiproject.entitybroker.EntityReference; import org.sakaiproject.entitybroker.EntityView; import org.sakaiproject.entitybroker.entityprovider.capabilities.ActionsExecutable; import org.sakaiproject.entitybroker.entityprovider.extension.ActionReturn; import org.sakaiproject.entitybroker.entityprovider.extension.CustomAction; import org.sakaiproject.entitybroker.exception.EntityException; import org.sakaiproject.entitybroker.exception.EntityNotFoundException; import org.sakaiproject.entitybroker.exception.FormatUnsupportedException; /** * This annotation indicates that this method is a custom action from {@link ActionsExecutable}, * this should not be placed on any methods defined by a capability but should be placed on methods * which you want to be exposed as custom actions<br/> * By default the name of the method is used as the action key and this will work for read requests * (viewKey is set to {@link EntityView#VIEW_SHOW}), * you can add in action and viewKey annotation params to change those settings<br/> * You can describe this action using the key: <prefix>.action.<actionKey> = description<br/> * The methods annotated by this can have the following argument (parameter) types: <br/> * (type => data which will be given to the method) <br/> * {@link EntityView} : the current entity view for this request (contains extension, url, segments) <br/> * {@link EntityReference} : the current entity reference (prefix and optional id) <br/> * {@link String} : entity prefix <br/> * {@link Search} : the search object based on the incoming params <br/> * {@link OutputStream} : stream to place outbound data (probably binary) into for transmission <br/> * {@link Map} ({@link String} => {@link Object}) : a map of the actions parameters (params from the action request) <br/> * <br/> * These methods should return one of the following: <br/> * 1) null (this is ok in most circumstances to indicate the method is done, use an exception to indicate failure) <br/> * 2) an {@link ActionReturn} (this is a special object used to indicate return states and handle binary data) <br/> * 3) an {@link EntityData} (this is a special object used to wrap the object and provide meta data) <br/> * 4) a UTF-8 encoded OutputStream or String <br/> * 5) a List of entity objects <br/> * 6) an entity object <br/> * 7) a boolean value (true indicates success and is the same as returning null, false indicates failure and causes an {@link EntityNotFoundException} <br/> * <br/> * Can throw the following exceptions and have them translated and handled, all others will pass through:<br/> * {@link EntityNotFoundException} to indicate the entity request could not find the data that was requested <br/> * {@link IllegalArgumentException} to indicate that the incoming params or the request was invalid <br/> * {@link FormatUnsupportedException} to indicate that the requested format is not supported for this entity request <br/> * {@link EntityException} to indicate a specific entity failure occurred, can include a response code and error message <br/> * {@link SecurityException} to indicate that the the current user is no allowed to perform this action <br/> * {@link UnsupportedOperationException} to indicate that the current action being requested is invalid (typically indicates bad combination of viewKey and action) <br/> * {@link IllegalStateException} to indicate a general failure has occurred <br/> * <br/> * @see CustomAction * @see ActionsExecutable * * @author Aaron Zeckoski (azeckoski @ gmail.com) */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface EntityCustomAction { /** * (optional) The action key which will be used to trigger the action (e.g. promote) <br/> * By default the name of the method is used as the action key if this is not set, * trigger this action using a URL like: /direct/{prefix}/{name} * @return the name to use for this custom action */ String action() default ""; /** * (optional) Must match one of the VIEW constants from {@link EntityView}, * if not set this will default to {@link EntityView#VIEW_SHOW} <br/> * The view type which this action works with (i.e. allowed to trigger the action), this * roughly translates to the GET/POST/PUT/DELETE in http<br/> * e.g. GET /user/action would be {@link EntityView#VIEW_LIST} * while POST /user/aaronz/action would be {@link EntityView#VIEW_NEW}, * can be null or "" (empty string, for annotations you must use this since null is not a constant) * to match all viewkeys (i.e. to allow this action * from any http method type and on collections and entities) <br/> * @return the view key constant from {@link EntityView} */ String viewKey() default EntityView.VIEW_SHOW; }