org.apache.jackrabbit.jca.JCAConnectionRequestInfo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jackrabbit-jca Show documentation
Show all versions of jackrabbit-jca Show documentation
A resource adapter for Jackrabbit as specified by JCA 1.0 and 1.5.
/*
* 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.jackrabbit.jca;
import javax.jcr.Credentials;
import javax.jcr.SimpleCredentials;
import javax.resource.spi.ConnectionRequestInfo;
import java.util.HashMap;
import java.util.Map;
/**
* This class encapsulates the credentials for creating a
* session from the repository.
*/
public final class JCAConnectionRequestInfo implements ConnectionRequestInfo {
/**
* Credentials.
*/
private final Credentials creds;
/**
* Workspace.
*/
private final String workspace;
/**
* Construct the request info.
*/
public JCAConnectionRequestInfo(JCAConnectionRequestInfo cri) {
this(cri.creds, cri.workspace);
}
/**
* Construct the request info.
*/
public JCAConnectionRequestInfo(Credentials creds, String workspace) {
this.creds = creds;
this.workspace = workspace;
}
/**
* Return the workspace.
*/
public String getWorkspace() {
return workspace;
}
/**
* Return the credentials.
*/
public Credentials getCredentials() {
return creds;
}
/**
* Return the hash code.
*/
public int hashCode() {
int hash1 = workspace != null ? workspace.hashCode() : 0;
int hash2 = creds != null ? computeCredsHashCode(creds) : 0;
return hash1 ^ hash2;
}
/**
* Return true if equals.
*/
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (o instanceof JCAConnectionRequestInfo) {
return equals((JCAConnectionRequestInfo) o);
} else {
return false;
}
}
/**
* Return true if equals.
*/
private boolean equals(JCAConnectionRequestInfo o) {
return equals(workspace, o.workspace)
&& equals(creds, o.creds);
}
/**
* Return true if equals.
*/
private boolean equals(Object o1, Object o2) {
if (o1 == o2) {
return true;
} else if ((o1 != null) && (o2 != null)) {
return o1.equals(o2);
} else {
return false;
}
}
/**
* Return true if equals.
*/
private boolean equals(char[] o1, char[] o2) {
if (o1 == o2) {
return true;
} else if ((o1 != null) && (o2 != null)) {
return equals(new String(o1), new String(o2));
} else {
return false;
}
}
/**
* Return true if equals.
*/
private boolean equals(Credentials o1, Credentials o2) {
if (o1 == o2) {
return true;
} else if ((o1 != null) && (o2 != null)) {
if ((o1 instanceof SimpleCredentials) && (o2 instanceof SimpleCredentials)) {
return equals((SimpleCredentials) o1, (SimpleCredentials) o2);
} else {
return o1.equals(o2);
}
} else {
return false;
}
}
/**
* This method compares two simple credentials.
*/
private boolean equals(SimpleCredentials o1, SimpleCredentials o2) {
if (!equals(o1.getUserID(), o2.getUserID())) {
return false;
}
if (!equals(o1.getPassword(), o2.getPassword())) {
return false;
}
Map m1 = getAttributeMap(o1);
Map m2 = getAttributeMap(o2);
return m1.equals(m2);
}
/**
* Return the credentials attributes.
*/
private Map getAttributeMap(SimpleCredentials creds) {
HashMap map = new HashMap();
String[] keys = creds.getAttributeNames();
for (int i = 0; i < keys.length; i++) {
map.put(keys[i], creds.getAttribute(keys[i]));
}
return map;
}
/**
* Returns Credentials instance hash code. Handles instances of
* SimpleCredentials in a special way.
*/
private int computeCredsHashCode(Credentials c) {
if (c instanceof SimpleCredentials) {
return computeSimpleCredsHashCode((SimpleCredentials) c);
}
return c.hashCode();
}
/**
* Computes hash code of a SimpleCredentials instance. Ignores its own
* hashCode() method because it's not overridden in SimpleCredentials.
*/
private int computeSimpleCredsHashCode(SimpleCredentials c) {
String userID = c.getUserID();
char[] password = c.getPassword();
Map m = getAttributeMap(c);
final int prime = 31;
int result = 1;
result = prime * result + ((userID == null) ? 0 : userID.hashCode());
for (int i = 0; i < password.length; i++) {
result = prime * result + password[i];
}
result = prime * result + ((m == null) ? 0 : m.hashCode());
return result;
}
@Override
public String toString() {
return "workspace (" + workspace + ") creds (" + creds + ")";
}
}