/*
* Copyright 2012 Nodeable Inc
*
* Licensed 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 com.streamreduce.core.model;
import com.google.code.morphia.annotations.EntityListeners;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
/**
* Represents the credentials for a Connection object.
*
* <p>While the class has fields for various authentication methods, it's up to the connection client to
* determine the correct fields to use. In some cases only identity or identity/credential are used (and
* possibly overloaded), while other cases may see different fields in use.
* </p>
*/
@EntityListeners(ConnectionCredentialsEncrypter.class)
public class ConnectionCredentials {
private String identity;
private String credential;
private String apiKey;
private String oauthToken;
private String oauthTokenSecret;
private String oauthRefreshToken;
private transient String oauthVerifier;
public ConnectionCredentials(@NotNull String identity, @Nullable String credential) {
this.identity = identity;
this.credential = credential;
}
public ConnectionCredentials(@NotNull String identity, @NotNull String credential, @NotNull String apiKey) {
this.identity = identity;
this.credential = credential;
this.apiKey = apiKey;
}
public ConnectionCredentials() {
}
/**
* Returns the cloud's "username" argument.
* <p/>
* (Note: Username is in quotes because you might not see username
* in the UI and might instead see the cloud provider's
* verbiage for the argument. For example, for AWS the
* username argument corresponds to the "Access Key ID".)
*
* @return the cloud's username argument
*/
public String getIdentity() {
return identity;
}
/**
* Sets the cloud's "username" argument.
*
* @param identity the new username argument for the cloud
*/
public void setIdentity(String identity) {
this.identity = identity;
}
/**
* Returns the cloud's "password" argument, which for some
* cloud providers this could be null or empty signifying it is not used.
* <p/>
* (Note: Password is in quotes because you might not see password
* in the UI and might instead see the cloud provider's
* verbiage for the argument. For example, for AWS the
* password argument corresponds to the "Secret Key ID".)
*
* @return the cloud's password argument
*/
public String getCredential() {
return credential;
}
/**
* Sets the cloud's "password" argument.
*
* @param credential the new password argument for the cloud
*/
public void setCredential(String credential) {
this.credential = credential;
}
/**
* Returns the API key used for the associated connection. See the class docs for more information.
*
* @return connection API key
*/
public String getApiKey() {
return apiKey;
}
public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}
/**
* Returns the OAuth token.
*
* @return string
*/
public String getOauthToken() {
return oauthToken;
}
public void setOauthToken(String oauthToken) {
this.oauthToken = oauthToken;
}
public String getOauthVerifier() {
return oauthVerifier;
}
public void setOauthVerifier(String oauthVerifier) {
this.oauthVerifier = oauthVerifier;
}
/**
* Returns the OAuth token secret.
*
* @return string
*/
public String getOauthTokenSecret() {
return oauthTokenSecret;
}
public void setOauthTokenSecret(String oauthTokenSecret) {
this.oauthTokenSecret = oauthTokenSecret;
}
/**
* Returns the OAuth refresh token.
*
* @return string
*/
public String getOauthRefreshToken() {
return oauthRefreshToken;
}
public void setOauthRefreshToken(String oauthRefreshToken) {
this.oauthRefreshToken = oauthRefreshToken;
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(StringUtils.lowerCase(identity))
.append(credential)
.append(apiKey)
.append(oauthToken)
.append(oauthTokenSecret)
.append(oauthVerifier)
.append(oauthRefreshToken)
.toHashCode();
}
@Override
public boolean equals(Object o) {
if (o instanceof ConnectionCredentials) {
ConnectionCredentials that = (ConnectionCredentials) o;
return new EqualsBuilder()
.append(StringUtils.lowerCase(this.identity), StringUtils.lowerCase(that.identity))
.append(this.credential, that.credential)
.append(this.apiKey, that.apiKey)
.append(this.oauthToken, that.oauthToken)
.append(this.oauthTokenSecret, that.oauthTokenSecret)
.append(this.oauthVerifier, that.oauthVerifier)
.append(this.oauthRefreshToken, that.oauthRefreshToken)
.isEquals();
}
return false;
}
/**
* <p>... because clone sucks.</p>
*
* <p>Used to make a defensive copy before serialization of ConnectionCredentials so that the original reference
* is not encrypted.</p>
*
* @param orig An original instance of ConnectionCredentials
* @return A new instance of ConnectionCredentials with the same values as the original, or null if null was passed
* in.
*/
public static ConnectionCredentials copyOf(ConnectionCredentials orig) {
if (orig == null) { return null; }
ConnectionCredentials newCC = new ConnectionCredentials();
newCC.identity = orig.identity;
newCC.credential = orig.credential;
newCC.apiKey = orig.apiKey;
newCC.oauthToken = orig.oauthToken;
newCC.oauthTokenSecret = orig.oauthTokenSecret;
newCC.oauthVerifier = orig.oauthVerifier;
return newCC;
}
}