/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.cxf.rs.security.oauth2.common;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Cacheable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OrderColumn;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlRootElement;
/**
* Provides the complete information about a given opaque permission.
* For example, a scope parameter such as "read_calendar" will be
* translated into the instance of this class in order to provide
* the human readable description and optionally restrict it to
* a limited set of HTTP verbs and request URIs
*/
@XmlRootElement
@Entity
@Cacheable
public class OAuthPermission implements Serializable {
private static final long serialVersionUID = -6486616235830491290L;
private List<String> httpVerbs = new LinkedList<String>();
private List<String> uris = new LinkedList<String>();
private String permission;
private String description;
private boolean isDefaultPermission;
private boolean invisibleToClient;
public OAuthPermission() {
}
public OAuthPermission(String permission) {
this.permission = permission;
}
public OAuthPermission(String permission, String description) {
this.description = description;
this.permission = permission;
}
/**
* Gets the optional list of HTTP verbs
* @return the list of HTTP verbs
*/
@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
public List<String> getHttpVerbs() {
return httpVerbs;
}
/**
* Sets the optional list of HTTP verbs, example,
* "GET" and "POST", etc
* @param httpVerbs the list of HTTP verbs
*/
public void setHttpVerbs(List<String> httpVerbs) {
this.httpVerbs = httpVerbs;
}
/**
* Gets the optional list of relative request URIs
* @return the list of URIs
*/
@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
public List<String> getUris() {
return uris;
}
/**
* Sets the optional list of relative request URIs
* @param uri the list of URIs
*/
public void setUris(List<String> uri) {
this.uris = uri;
}
/**
* Gets the permission description
* @return the description
*/
public String getDescription() {
return description;
}
/**
* Sets the permission description
* @param description
*/
public void setDescription(String description) {
this.description = description;
}
/**
* Get the permission value such as "read_calendar"
* @return the value
*/
@Id
public String getPermission() {
return permission;
}
/**
* Sets the permission value such as "read_calendar"
* @param permission the permission value
*/
public void setPermission(String permission) {
this.permission = permission;
}
/**
* Indicates if this permission has been allocated by default or not.
* Authorization View handlers may use this property to optimize the way the user selects the
* scopes.
* For example, assume that read', 'add' and 'update' scopes are supported and the
* 'read' scope is always allocated. This can be presented at the UI level as follows:
* the read-only check-box control will represent a 'read' scope and a user will be able to
* optionally select 'add' and/or 'update' scopes, in addition to the default 'read' one.
* @param isDefault true if the permission has been allocated by default
*/
public void setDefaultPermission(boolean value) {
this.isDefaultPermission = value;
}
public boolean isDefaultPermission() {
return isDefaultPermission;
}
@Deprecated
@Transient
public boolean isDefault() {
return isDefaultPermission;
}
public boolean isInvisibleToClient() {
return invisibleToClient;
}
/**
* Set the visibility status; by default all the scopes approved by a user can
* be optionally reported to the client in access token responses. Some scopes may need
* to stay 'invisible' to client.
* @param invisibleToClient
*/
public void setInvisibleToClient(boolean invisibleToClient) {
this.invisibleToClient = invisibleToClient;
}
@Override
public boolean equals(Object object) {
if (!(object instanceof OAuthPermission)) {
return false;
}
OAuthPermission that = (OAuthPermission)object;
if (getHttpVerbs() != null && that.getHttpVerbs() == null
|| getHttpVerbs() == null && that.getHttpVerbs() != null
|| getHttpVerbs() != null && !getHttpVerbs().equals(that.getHttpVerbs())) {
return false;
}
if (getUris() != null && that.getUris() == null
|| getUris() == null && that.getUris() != null
|| getUris() != null && !getUris().equals(that.getUris())) {
return false;
}
if (!getPermission().equals(that.getPermission())) {
return false;
}
if (getDescription() != null && that.getDescription() == null
|| getDescription() == null && that.getDescription() != null
|| getDescription() != null && !getDescription().equals(that.getDescription())) {
return false;
}
if (isInvisibleToClient() != that.isInvisibleToClient() //NOPMD
|| isDefaultPermission() != that.isDefaultPermission()) { //NOPMD
return false;
}
return true;
}
@Override
public int hashCode() {
int hashCode = 17;
if (getHttpVerbs() != null) {
hashCode = 31 * hashCode + getHttpVerbs().hashCode();
}
if (getUris() != null) {
hashCode = 31 * hashCode + getUris().hashCode();
}
hashCode = 31 * hashCode + getPermission().hashCode();
if (getDescription() != null) {
hashCode = 31 * hashCode + getDescription().hashCode();
}
hashCode = 31 * hashCode + Boolean.hashCode(isInvisibleToClient());
hashCode = 31 * hashCode + Boolean.hashCode(isDefaultPermission());
return hashCode;
}
}