blob: 0efd19391cc93b3db6bfe90b62e0da63df5ba50e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. 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. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.roller.weblogger.business.jpa;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.InitializationException;
import org.apache.roller.weblogger.business.PropertiesManager;
import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
import org.apache.roller.weblogger.config.runtime.ConfigDef;
import org.apache.roller.weblogger.config.runtime.DisplayGroup;
import org.apache.roller.weblogger.config.runtime.PropertyDef;
import org.apache.roller.weblogger.config.runtime.RuntimeConfigDefs;
import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
/*
* JPAPropertiesManagerImpl.java
*
* Created on May 29, 2006, 2:06 PM
*
*/
@com.google.inject.Singleton
public class JPAPropertiesManagerImpl implements PropertiesManager {
/** The logger instance for this class. */
private static Log log = LogFactory.getLog(
JPAPropertiesManagerImpl.class);
private final JPAPersistenceStrategy strategy;
/**
* Creates a new instance of JPAPropertiesManagerImpl
*/
@com.google.inject.Inject
protected JPAPropertiesManagerImpl(JPAPersistenceStrategy strategy) {
log.debug("Instantiating JPA Properties Manager");
this.strategy = strategy;
}
/**
* @inheritDoc
*/
@Override
public void initialize() throws InitializationException {
Map<String, RuntimeConfigProperty> props;
try {
// retrieve properties from database
props = this.getProperties();
// if any default props missing from the properties DB table,
// initialize them and save them to that table.
initializeMissingProps(props);
this.saveProperties(props);
} catch (Exception e) {
log.fatal("Failed to initialize runtime configuration properties."+
"Please check that the database has been upgraded!", e);
throw new RuntimeException(e);
}
}
/**
* Retrieve a single property by name.
*/
@Override
public RuntimeConfigProperty getProperty(String name) throws WebloggerException {
return (RuntimeConfigProperty) strategy
.load(RuntimeConfigProperty.class,name);
}
/**
* Retrieve all properties.
*
* Properties are returned in a Map to make them easy to lookup. The Map
* uses the property name as the key and the RuntimeConfigProperty object
* as the value.
*/
@Override
public Map<String, RuntimeConfigProperty> getProperties() throws WebloggerException {
HashMap<String, RuntimeConfigProperty> props = new HashMap<>();
List<RuntimeConfigProperty> list = strategy.getNamedQuery("RuntimeConfigProperty.getAll",
RuntimeConfigProperty.class).getResultList();
/*
* for convenience sake we are going to put the list of props
* into a map for users to access it. The value element of the
* hash still needs to be the RuntimeConfigProperty object so that
* we can save the elements again after they have been updated
*/
for (RuntimeConfigProperty prop : list) {
props.put(prop.getName(), prop);
}
return props;
}
/**
* Save a single property.
*/
@Override
public void saveProperty(RuntimeConfigProperty property)
throws WebloggerException {
this.strategy.store(property);
}
/**
* Save all properties.
*/
@Override
public void saveProperties(Map properties) throws WebloggerException {
// just go through the list and saveProperties each property
for (Object prop : properties.values()) {
this.strategy.store(prop);
}
}
/**
* This method compares the property definitions in the RuntimeConfigDefs
* file with the properties in the given Map and initializes any properties
* that were not found in the Map.
*
* If the Map of props is empty/null then we will initialize all properties.
**/
private Map initializeMissingProps(Map<String, RuntimeConfigProperty> props) {
if(props == null) {
props = new HashMap<>();
}
// start by getting our runtimeConfigDefs
RuntimeConfigDefs runtimeConfigDefs =
WebloggerRuntimeConfig.getRuntimeConfigDefs();
// can't do initialization without our config defs
if(runtimeConfigDefs == null) {
return props;
}
// iterate through all the definitions and add properties
// that are not already in our props map
for (ConfigDef configDef : runtimeConfigDefs.getConfigDefs()) {
for (DisplayGroup dGroup : configDef.getDisplayGroups()) {
for (PropertyDef propDef : dGroup.getPropertyDefs()) {
// do we already have this prop? if not then add it
if(!props.containsKey(propDef.getName())) {
RuntimeConfigProperty newprop =
new RuntimeConfigProperty(
propDef.getName(), propDef.getDefaultValue());
props.put(propDef.getName(), newprop);
log.info("Property " + propDef.getName() +
" not yet in roller_properties database table, will store with " +
"default value of [" + propDef.getDefaultValue() + "`]");
}
}
}
}
return props;
}
@Override
public void release() {}
}