BlojsomConfiguration.java [plain text]
package org.blojsom.blog;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.blojsom.BlojsomException;
import org.blojsom.authorization.AuthorizationProvider;
import org.blojsom.event.BlojsomEventBroadcaster;
import org.blojsom.event.BlojsomListener;
import org.blojsom.util.BlojsomConstants;
import org.blojsom.util.BlojsomProperties;
import org.blojsom.util.BlojsomUtils;
import javax.servlet.ServletConfig;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
public class BlojsomConfiguration implements BlojsomConstants {
private Log _logger = LogFactory.getLog(BlojsomConfiguration.class);
private String _blojsomUsers;
private String _defaultUser;
private String _baseConfigurationDirectory;
private String _fetcherClass;
private String _installationDirectory;
private String _templatesDirectory;
private String _resourceDirectory;
private String _qualifiedResourceDirectory;
private String _resourceManager;
private String _authorizationProviderClass;
private static AuthorizationProvider _authorizationProvider = null;
private String _globalBlogHome;
private static BlojsomEventBroadcaster _eventBroadcaster = null;
private String _installedLocales;
private ServletConfig _servletConfig;
private Map _blogUsers;
private Map _blojsomConfiguration;
private Map _blogIDs;
public BlojsomConfiguration(ServletConfig servletConfig, Map blojsomConfiguration) throws BlojsomConfigurationException {
_blojsomConfiguration = blojsomConfiguration;
_servletConfig = servletConfig;
_installationDirectory = servletConfig.getServletContext().getRealPath("/");
if (BlojsomUtils.checkNullOrBlank(_installationDirectory)) {
_logger.error("No installation directory set for blojsom");
throw new BlojsomConfigurationException("No installation directory set for blojsom");
} else {
if (!_installationDirectory.endsWith("/")) {
_installationDirectory += "/";
}
}
try {
System.setProperty("blojsom.installation.directory", _installationDirectory);
} catch (Exception e) {
_logger.error(e);
}
_logger.debug("Using installation directory: " + _installationDirectory);
_baseConfigurationDirectory = getBlojsomPropertyAsString(BLOJSOM_CONFIGURATION_BASE_DIRECTORY_IP);
if (BlojsomUtils.checkNullOrBlank(_baseConfigurationDirectory)) {
_baseConfigurationDirectory = BLOJSOM_DEFAULT_CONFIGURATION_BASE_DIRECTORY;
} else {
_baseConfigurationDirectory = BlojsomUtils.checkStartingAndEndingSlash(_baseConfigurationDirectory);
}
_baseConfigurationDirectory = _baseConfigurationDirectory.trim();
_logger.debug("Using base configuration directory: " + _baseConfigurationDirectory);
_templatesDirectory = getBlojsomPropertyAsString(BLOJSOM_TEMPLATES_DIRECTORY_IP);
if (BlojsomUtils.checkNullOrBlank(_templatesDirectory)) {
_templatesDirectory = BLOJSOM_DEFAULT_TEMPLATES_DIRECTORY;
} else {
if (!_templatesDirectory.startsWith("/")) {
_templatesDirectory = '/' + _templatesDirectory;
}
}
_templatesDirectory = _templatesDirectory.trim();
_logger.debug("Using templates directory: " + _templatesDirectory);
_resourceDirectory = getBlojsomPropertyAsString(BLOJSOM_RESOURCE_DIRECTORY_IP);
if (BlojsomUtils.checkNullOrBlank(_resourceDirectory)) {
_resourceDirectory = BLOJSOM_DEFAULT_RESOURCE_DIRECTORY;
} else {
if (!_resourceDirectory.startsWith("/")) {
_resourceDirectory = '/' + _resourceDirectory;
}
}
_resourceDirectory = _resourceDirectory.trim();
_logger.debug("Using resources directory: " + _resourceDirectory);
String eventBroadcaster = getBlojsomPropertyAsString(BLOJSOM_BROADCASTER_IP);
if (BlojsomUtils.checkNullOrBlank(eventBroadcaster)) {
eventBroadcaster = BLOJSOM_DEFAULT_BROADCASTER;
}
try {
Class broadcasterClass = Class.forName(eventBroadcaster);
if (_eventBroadcaster == null) {
_eventBroadcaster = (BlojsomEventBroadcaster) broadcasterClass.newInstance();
}
_logger.debug("Using event broadcaster: " + eventBroadcaster);
String listenerConfiguration = servletConfig.getInitParameter(BLOJSOM_LISTENER_CONFIGURATION_IP);
if (!BlojsomUtils.checkNullOrBlank(listenerConfiguration)) {
Properties listenerProperties = BlojsomUtils.loadProperties(servletConfig, BLOJSOM_LISTENER_CONFIGURATION_IP, true);
Iterator listenerIterator = listenerProperties.keySet().iterator();
while (listenerIterator.hasNext()) {
Object key = listenerIterator.next();
String listenerClassname = listenerProperties.getProperty(key.toString());
Class listenerClass = Class.forName(listenerClassname);
BlojsomListener listener = (BlojsomListener) listenerClass.newInstance();
_eventBroadcaster.addListener(listener);
}
}
} catch (BlojsomException e) {
_logger.error(e);
throw new BlojsomConfigurationException(e);
} catch (ClassNotFoundException e) {
_logger.error(e);
throw new BlojsomConfigurationException("Unable to instantiate event broadcaster: " + eventBroadcaster, e);
} catch (InstantiationException e) {
_logger.error(e);
throw new BlojsomConfigurationException("Unable to instantiate event broadcaster: " + eventBroadcaster, e);
} catch (IllegalAccessException e) {
_logger.error(e);
throw new BlojsomConfigurationException("Unable to instantiate event broadcaster: " + eventBroadcaster, e);
}
_qualifiedResourceDirectory = servletConfig.getServletContext().getRealPath(_resourceDirectory);
_logger.debug("Using qualified resource directory: " + _qualifiedResourceDirectory);
_globalBlogHome = getBlojsomPropertyAsString(BLOJSOM_BLOG_HOME_IP);
if (!BlojsomUtils.checkNullOrBlank(_globalBlogHome)) {
if (_globalBlogHome.startsWith("{")) {
int closingBraceIndex = _globalBlogHome.indexOf("}");
String property = _globalBlogHome.substring(1, closingBraceIndex);
property = System.getProperty(property);
if (BlojsomUtils.checkNullOrBlank(property)) {
_logger.error("Global blog home directory property not found: " + property);
_globalBlogHome = null;
} else {
String afterProperty = _globalBlogHome.substring(closingBraceIndex + 1);
_globalBlogHome = property + afterProperty;
_globalBlogHome = BlojsomUtils.replace(_globalBlogHome, "\\", "/");
}
}
if (!BlojsomUtils.checkNullOrBlank(_globalBlogHome)) {
_globalBlogHome = _globalBlogHome.trim();
if (!_globalBlogHome.endsWith("/")) {
_globalBlogHome += "/";
}
File blogHomeDirectory = new File(_globalBlogHome);
if (!blogHomeDirectory.exists()) {
if (!blogHomeDirectory.mkdirs()) {
_logger.error("Unable to create global blog home directory: " + _globalBlogHome);
_globalBlogHome = null;
}
}
}
if (!BlojsomUtils.checkNullOrBlank(_globalBlogHome)) {
_logger.debug("Using global blog-home directory: " + _globalBlogHome);
}
} else {
_globalBlogHome = "";
}
String[] users;
Object listOfUsers = getBlojsomProperty(BLOJSOM_USERS_IP);
if (listOfUsers instanceof List) {
List blojsomUsers = getBlojsomPropertyAsList(BLOJSOM_USERS_IP);
users = (String[]) blojsomUsers.toArray(new String[blojsomUsers.size()]);
_blojsomUsers = BlojsomUtils.arrayOfStringsToString(users);
} else {
_blojsomUsers = getBlojsomPropertyAsString(BLOJSOM_USERS_IP);
users = BlojsomUtils.parseCommaList(_blojsomUsers);
}
if (users.length == 0) {
_logger.error("No users defined for this blojsom blog");
throw new BlojsomConfigurationException("No users defined for this blojsom blog");
} else {
_blogUsers = new HashMap();
_blogIDs = new HashMap();
for (int i = 0; i < users.length; i++) {
String user = users[i];
_blogIDs.put(user, user);
}
String defaultUser = getBlojsomPropertyAsString(BLOJSOM_DEFAULT_USER_IP);
if (BlojsomUtils.checkNullOrBlank(defaultUser)) {
_logger.error("No default user defined in configuration property: " + BLOJSOM_DEFAULT_USER_IP);
throw new BlojsomConfigurationException("No default user defined in configuration property: " + BLOJSOM_DEFAULT_USER_IP);
}
if (!_blogIDs.containsKey(defaultUser)) {
_logger.error("Default user does not match any of the registered blojsom users: " + defaultUser);
throw new BlojsomConfigurationException("Default user does not match any of the registered blojsom users: " + defaultUser);
}
_defaultUser = defaultUser;
_logger.debug("blojsom default user: " + _defaultUser);
_fetcherClass = getBlojsomPropertyAsString(BLOJSOM_FETCHER_IP);
if ((_fetcherClass == null) || "".equals(_fetcherClass)) {
_fetcherClass = BLOG_DEFAULT_FETCHER;
}
}
_resourceManager = getBlojsomPropertyAsString(BLOJSOM_RESOURCE_MANAGER_IP);
if (BlojsomUtils.checkNullOrBlank(_resourceManager)) {
_resourceManager = BLOJSOM_DEFAULT_RESOURCE_MANAGER;
}
_logger.debug("Using resource manager: " + _resourceManager);
_installedLocales = getBlojsomPropertyAsString(BLOJSOM_INSTALLED_LOCALES_IP);
if (BlojsomUtils.checkNullOrBlank(_installedLocales)) {
_installedLocales = BLOG_LANGUAGE_DEFAULT + "_" + BLOG_COUNTRY_DEFAULT;
}
_logger.debug("Using installed locales: " + _installedLocales);
_authorizationProviderClass = getBlojsomPropertyAsString(BLOJSOM_AUTHORIZATION_PROVIDER_IP);
if (BlojsomUtils.checkNullOrBlank(_authorizationProviderClass)) {
_authorizationProviderClass = DEFAULT_AUTHORIZATION_PROVIDER;
}
_logger.debug("Using authorization provider: " + _authorizationProviderClass);
try {
Class authorizationProviderClass = Class.forName(_authorizationProviderClass);
_authorizationProvider = (AuthorizationProvider) authorizationProviderClass.newInstance();
_authorizationProvider.init(_servletConfig, this);
} catch (ClassNotFoundException e) {
throw new BlojsomConfigurationException(e);
} catch (InstantiationException e) {
throw new BlojsomConfigurationException(e);
} catch (IllegalAccessException e) {
throw new BlojsomConfigurationException(e);
} catch (BlojsomConfigurationException e) {
throw new BlojsomConfigurationException(e);
}
}
public Map getBlojsomConfiguration() {
return Collections.unmodifiableMap(_blojsomConfiguration);
}
public String getBlojsomPropertyAsString(String propertyKey) {
if (_blojsomConfiguration.containsKey(propertyKey)) {
return (String) _blojsomConfiguration.get(propertyKey);
}
return null;
}
public List getBlojsomPropertyAsList(String propertyKey) {
if (_blojsomConfiguration.containsKey(propertyKey)) {
Object value = _blojsomConfiguration.get(propertyKey);
if (value instanceof List) {
return (List) value;
} else {
ArrayList values = new ArrayList();
values.add(value);
return values;
}
}
return null;
}
public Object getBlojsomProperty(String propertyKey) {
return _blojsomConfiguration.get(propertyKey);
}
public String getDefaultUser() {
return _defaultUser;
}
public String getBaseConfigurationDirectory() {
return _baseConfigurationDirectory;
}
public String getFetcherClass() {
return _fetcherClass;
}
public String getInstallationDirectory() {
return _installationDirectory;
}
public String getTemplatesDirectory() {
return _templatesDirectory;
}
public String getResourceDirectory() {
return _resourceDirectory;
}
public String getQualifiedResourceDirectory() {
return _qualifiedResourceDirectory;
}
public String[] getBlojsomUsers() {
Iterator blogs = _blogIDs.keySet().iterator();
ArrayList blogsList = new ArrayList();
while (blogs.hasNext()) {
String blogID = (String) blogs.next();
blogsList.add(blogID);
}
return (String[]) blogsList.toArray(new String[blogsList.size()]);
}
public Map getBlogUsers() {
return _blogUsers;
}
public String getResourceManager() {
return _resourceManager;
}
public String getAuthorizationProvider() {
return _authorizationProviderClass;
}
public String getGlobalBlogHome() {
return _globalBlogHome;
}
public BlojsomEventBroadcaster getEventBroadcaster() {
return _eventBroadcaster;
}
public String[] getInstalledLocalesAsStrings() {
return BlojsomUtils.parseCommaList(_installedLocales);
}
public Locale[] getInstalledLocales() {
String[] localeStrings = getInstalledLocalesAsStrings();
Locale[] locales = new Locale[localeStrings.length];
for (int i = 0; i < localeStrings.length; i++) {
String localeString = localeStrings[i];
locales[i] = BlojsomUtils.getLocaleFromString(localeString);
}
return locales;
}
public boolean checkBlogIDExists(String blogID) {
return _blogIDs.containsKey(blogID);
}
public BlogUser loadBlog(String blogID) throws BlojsomException {
InputStream is;
BlogUser blogUser = new BlogUser();
blogUser.setId(blogID);
Properties userProperties = new BlojsomProperties();
_logger.info("Attemping to load " + _baseConfigurationDirectory + blogID + '/' + BLOG_DEFAULT_PROPERTIES);
is = _servletConfig.getServletContext().getResourceAsStream(_baseConfigurationDirectory + blogID + '/' + BLOG_DEFAULT_PROPERTIES);
if (is != null) {
try {
userProperties.load(is);
is.close();
} catch (IOException e) {
_logger.error(e);
throw new BlojsomConfigurationException(e);
}
Blog userBlog = null;
try {
if (!BlojsomUtils.checkNullOrBlank(_globalBlogHome) &&
!userProperties.containsKey(BLOG_HOME_IP)) {
String usersBlogHome = _globalBlogHome + blogID + "/";
File blogHomeDirectory = new File(usersBlogHome);
if (!blogHomeDirectory.exists()) {
if (!blogHomeDirectory.mkdirs()) {
_logger.error("Unable to create blog-home directory for blog: " + blogHomeDirectory.toString());
throw new BlojsomConfigurationException("Unable to create blog-home directory for blog: " + blogHomeDirectory.toString());
}
}
userProperties.setProperty(BLOG_HOME_IP, usersBlogHome);
_logger.debug("Setting blog blog-home directory: " + usersBlogHome);
}
userBlog = new Blog(userProperties);
blogUser.setBlog(userBlog);
_authorizationProvider.loadAuthenticationCredentials(blogUser);
_logger.debug("Added blojsom blog: " + blogUser.getId());
File resourceDirectory = new File(_qualifiedResourceDirectory + File.separator + blogID);
if (!resourceDirectory.exists()) {
_logger.debug("Creating resource directory for blog " + blogID);
resourceDirectory.mkdirs();
}
} catch (BlojsomConfigurationException e) {
_logger.error(e);
_logger.error("Marking blog as invalid: " + blogUser.getId());
throw new BlojsomConfigurationException(e);
}
} else {
throw new BlojsomConfigurationException("Unable to load blog configuration for blog: " + blogUser.getId());
}
return blogUser;
}
public Map getBlogIDs() {
return Collections.unmodifiableMap(_blogIDs);
}
public void addBlogID(String blogID) {
_blogIDs.put(blogID, blogID);
}
public void removeBlogID(String blogID) {
_blogIDs.remove(blogID);
}
}