/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.auth.facebook;
import com.socialize.auth.AuthProviderInfo;
import com.socialize.auth.AuthProviderType;
import com.socialize.error.SocializeException;
import com.socialize.util.ArrayUtils;
import com.socialize.util.StringUtils;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* @author Jason Polites
*/
public class FacebookAuthProviderInfo implements AuthProviderInfo {
private static final long serialVersionUID = -6472972851879738516L;
public static enum PermissionType {READ, WRITE}
private String appId;
private String[] readPermissions;
private String[] writePermissions;
private PermissionType permissionType = PermissionType.READ;
/* (non-Javadoc)
* @see com.socialize.api.AuthProviderInfo#getType()
*/
@Override
public AuthProviderType getType() {
return AuthProviderType.FACEBOOK;
}
/* (non-Javadoc)
* @see com.socialize.api.AuthProviderInfo#validate()
*/
@Override
public void validate() throws SocializeException {
if(!isValid()) {
throw new SocializeException("No facebook app ID found.");
}
}
public PermissionType getPermissionType() {
return permissionType;
}
public void setPermissionType(PermissionType permissionType) {
this.permissionType = permissionType;
}
@Override
public boolean isValid() {
return !StringUtils.isEmpty(appId);
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
@Deprecated
public String[] getPermissions() {
return getWritePermissions();
}
@Deprecated
public void setPermissions(String[] permissions) {
this.setWritePermissions(permissions);
}
public String[] getReadPermissions() {
return readPermissions;
}
public void setReadPermissions(String[] readPermissions) {
this.readPermissions = readPermissions;
}
public String[] getWritePermissions() {
return writePermissions;
}
public void setWritePermissions(String[] writePermissions) {
this.writePermissions = writePermissions;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((appId == null) ? 0 : appId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
FacebookAuthProviderInfo other = (FacebookAuthProviderInfo) obj;
if (appId == null) {
if (other.appId != null)
return false;
}
else if (!appId.equals(other.appId))
return false;
return true;
}
public void mergeForRead(String[] newPermissions) {
this.readPermissions = merge(newPermissions, this.readPermissions);
}
public void mergeForWrite(String[] newPermissions) {
this.writePermissions = merge(newPermissions, this.writePermissions);
}
String[] merge(String[] newPermissions, String[] oldPermissions) {
Set<String> allPermissions = new HashSet<String>();
if(oldPermissions != null) {
allPermissions.addAll(Arrays.asList(oldPermissions));
}
allPermissions.addAll(Arrays.asList(newPermissions));
oldPermissions = allPermissions.toArray(new String[allPermissions.size()]);
Arrays.sort(oldPermissions);
return oldPermissions;
}
@Override
public boolean merge(AuthProviderInfo info) {
if(info instanceof FacebookAuthProviderInfo) {
FacebookAuthProviderInfo that = (FacebookAuthProviderInfo) info;
if(that.readPermissions != null) {
this.readPermissions = merge(that.readPermissions, this.readPermissions);
}
if(that.writePermissions != null) {
this.writePermissions = merge(that.writePermissions, this.writePermissions);
}
// Only overwrite if we are READ
if(this.permissionType.equals(PermissionType.READ)) {
this.permissionType = that.permissionType;
}
return true;
}
return false;
}
@Override
public boolean matches(AuthProviderInfo info) {
if(this.equals(info)) {
if(info instanceof FacebookAuthProviderInfo) {
FacebookAuthProviderInfo that = (FacebookAuthProviderInfo) info;
if(that.getPermissionType().equals(PermissionType.WRITE)) {
if(this.getPermissionType().equals(that.getPermissionType())) {
return matches(that.writePermissions, this.writePermissions);
}
}
else {
return matches(that.readPermissions, this.readPermissions);
}
}
}
return false;
}
boolean matches(String[] expected, String[] actual) {
if(Arrays.equals(actual, expected)) {
return true;
}
else if(ArrayUtils.isEmpty(expected) && ArrayUtils.isEmpty(actual)) {
return true;
}
else if (actual != null && expected != null){
Arrays.sort(actual);
for (int i = 0; i < expected.length; i++) {
if(Arrays.binarySearch(actual, expected[i]) < 0) {
return false;
}
}
return true;
}
return false;
}
}