blob: d1c3cf52fb9b8660b404ea40032b3cc9e9b43c49 [file] [log] [blame]
/*
* 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.
*
*/
/* $Id$ */
package org.apache.lenya.ac.file;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.cocoon.util.NetUtils;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceResolver;
import org.apache.lenya.ac.AccessControlException;
import org.apache.lenya.ac.GroupManager;
import org.apache.lenya.ac.IPRangeManager;
import org.apache.lenya.ac.RoleManager;
import org.apache.lenya.ac.UserManager;
import org.apache.lenya.ac.UserType;
import org.apache.lenya.ac.impl.AbstractAccreditableManager;
import org.apache.lenya.util.Assert;
/**
* File-based accreditable manager.
*/
public class FileAccreditableManager extends AbstractAccreditableManager {
private ServiceManager manager;
/**
* Creates a new FileAccessController based on a configuration directory.
* @param manager The service manager.
* @param logger The logger.
* @param configurationUri The configuration directory URI.
* @param _userTypes The supported user types.
*/
public FileAccreditableManager(ServiceManager manager, Logger logger,
String configurationUri, UserType[] _userTypes) {
super(logger);
Assert.notNull("service manager", manager);
this.manager = manager;
Assert.notNull("configuration directory", configurationUri);
this.configurationDirectoryUri = configurationUri;
this.userTypes = new HashSet(Arrays.asList(_userTypes));
}
private File configurationDirectory;
private Set userTypes;
/**
* Returns the supported user types.
* @return An array of user types.
* @throws AccessControlException if an error occurs.
*/
public UserType[] getUserTypes() throws AccessControlException {
if (this.userTypes == null)
throw new AccessControlException("User types not initialized");
return (UserType[]) this.userTypes.toArray(new UserType[this.userTypes.size()]);
}
/**
* Returns the configuration directory.
* @return The configuration directory.
* @throws AccessControlException when something went wrong.
*/
public File getConfigurationDirectory() throws AccessControlException {
if (this.configurationDirectory == null) {
if (this.configurationDirectoryUri == null) {
throw new AccessControlException("Configuration directory not set!");
}
Source source = null;
SourceResolver resolver = null;
File directory;
try {
getLogger().debug(
"Configuration directory Path: [" + this.configurationDirectoryUri + "]");
resolver = (SourceResolver) getManager().lookup(SourceResolver.ROLE);
source = resolver.resolveURI(this.configurationDirectoryUri);
getLogger().debug("Configuration directory URI: " + source.getURI());
directory = new File(new URI(NetUtils.encodePath(source.getURI())));
} catch (Exception e) {
throw new AccessControlException(e);
} finally {
if (resolver != null) {
if (source != null) {
resolver.release(source);
}
getManager().release(resolver);
}
}
this.configurationDirectory = directory;
}
return this.configurationDirectory;
}
// provided for backward compatibility
protected static final String DEFAULT_USER_TYPE_CLASS = FileUser.class.getName();
protected static final String DEFAULT_USER_TYPE_KEY = "Local User";
protected static final String DEFAULT_USER_CREATE_USE_CASE = "userAddUser";
/**
* Returns the default user type.
* @return A user type.
*/
public static UserType getDefaultUserType() {
return new UserType(DEFAULT_USER_TYPE_KEY, DEFAULT_USER_TYPE_CLASS,
DEFAULT_USER_CREATE_USE_CASE);
}
private String configurationDirectoryUri;
/**
* Returns the service manager.
* @return A service manager.
*/
protected ServiceManager getManager() {
return this.manager;
}
/**
* @see org.apache.lenya.ac.impl.AbstractAccreditableManager#initializeGroupManager()
*/
protected GroupManager initializeGroupManager() throws AccessControlException {
FileGroupManager _manager = FileGroupManager.instance(this, getConfigurationDirectory(),
getLogger());
return _manager;
}
/**
* @see org.apache.lenya.ac.impl.AbstractAccreditableManager#initializeIPRangeManager()
*/
protected IPRangeManager initializeIPRangeManager() throws AccessControlException {
FileIPRangeManager _manager = FileIPRangeManager.instance(this,
getConfigurationDirectory(), getLogger());
return _manager;
}
/**
* @see org.apache.lenya.ac.impl.AbstractAccreditableManager#initializeRoleManager()
*/
protected RoleManager initializeRoleManager() throws AccessControlException {
FileRoleManager _manager = FileRoleManager.instance(this, getConfigurationDirectory(),
getLogger());
return _manager;
}
/**
* @see org.apache.lenya.ac.impl.AbstractAccreditableManager#initializeUserManager()
*/
protected UserManager initializeUserManager() throws AccessControlException {
FileUserManager _manager = FileUserManager.instance(this, getConfigurationDirectory(),
getUserTypes(), getLogger());
return _manager;
}
public String getConfigurationCollectionUri() {
try {
return "file://" + getConfigurationDirectory().getCanonicalPath();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String getId() {
try {
Assert.notNull("configuration directory", this.getConfigurationDirectory());
return this.getConfigurationDirectory().getCanonicalPath();
} catch (IOException e) {
throw new RuntimeException(e);
}
catch(AccessControlException e) {
throw new RuntimeException(e);
}
}
}