// Copyright (C) 2006-2008 Google 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.google.enterprise.connector.mock.jcr;
import com.google.enterprise.connector.mock.MockRepository;
import com.google.enterprise.connector.mock.MockRepositoryDocument;
import com.google.enterprise.connector.mock.MockRepositoryProperty;
import javax.jcr.Credentials;
import javax.jcr.LoginException;
import javax.jcr.Repository;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
/**
* MockJcrRepository is the parent of a set of classes that wrap the simple
* "MockRepository" classes as a JCR implementation.
* <p>
* This class implements the corresponding JCR interface, with these
* limitations:
* <ul>
* <li> Some level 1 calls are not implemented because they will never be used
* by our connector infrastructure. Eventually, these will be documented as part
* of framework documentation. In this implementation, they also throw
* UnsupportedOperation exceptions. These are grouped above the level 2 calls.
* <li> Some level 1 calls are not currently needed by our implementation, but
* may be soon. These are marked with todos and throw UnsupportedOperation
* exceptions.
* </ul>
*/
public class MockJcrRepository implements Repository {
private final MockRepository repo;
/**
* Creates a MockJcrRepository from a MockRepository.
*
* @param repo
*/
public MockJcrRepository(MockRepository repo) {
this.repo = repo;
}
/**
* Gets this MockJcrRepository's MockRepository - only for testing.
*
* @return the MockRepository
*/
public MockRepository getRepo() {
return repo;
}
public Session login(Credentials creds) throws LoginException {
return makeSession(creds);
}
//
// The following methods are JCR level 1 - but we do not anticipate using them
//
public Session login(Credentials arg0, String arg1) {
throw new UnsupportedOperationException();
}
public Session login(String arg0) {
throw new UnsupportedOperationException();
}
public Session login() {
throw new UnsupportedOperationException();
}
public String[] getDescriptorKeys() {
throw new UnsupportedOperationException();
}
public String getDescriptor(String arg0) {
throw new UnsupportedOperationException();
}
private Session makeSession(Credentials creds) throws LoginException {
if (!(creds instanceof SimpleCredentials)) {
throw new IllegalArgumentException();
}
SimpleCredentials simpleCreds = (SimpleCredentials) creds;
if (!authenticate(simpleCreds)) {
throw new LoginException("Given credentials not valid.");
}
MockJcrSession session = new MockJcrSession(this);
session.setCreds(simpleCreds);
return session;
}
private boolean authenticate(SimpleCredentials creds) {
String userID = creds.getUserID();
String password = new String (creds.getPassword());
if (userID == null || userID.length() < 1) {
return true;
}
MockRepositoryDocument doc = repo.getStore().getDocByID("users");
if (doc == null) {
return true;
}
MockRepositoryProperty property = doc.getProplist().getProperty("acl");
if (property == null) {
return true;
}
String[] values = property.getValues();
for (int i=0; i<values.length; i++) {
if (values[i].equals(userID)) {
if (userID.equals(password)) {
return true;
} else {
return false;
}
}
}
return false;
}
}