org.efaps.admin.common.SystemConfiguration Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of efaps-kernel Show documentation
Show all versions of efaps-kernel Show documentation
eFaps is a framework used to map objects with or without attached files to
a relational database and optional file systems (only for attaches files). Configurable access control can be provided down to object and attribute level depending on implementation and use case. Depending on requirements, events (like triggers) allow to implement business logic and to separate business logic from user interface.
The framework includes integrations (e.g. webdav, full text search) and a web application as 'simple' configurable user interface. Some best practises, example web application modules (e.g. team work module) support administrators and implementers using this framework.
/*
* Copyright 2003 - 2011 The eFaps Team
*
* 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.
*
* Revision: $Rev: 6555 $
* Last Changed: $Date: 2011-05-14 13:21:29 -0500 (Sat, 14 May 2011) $
* Last Changed By: $Author: [email protected] $
*/
package org.efaps.admin.common;
import java.io.IOException;
import java.io.StringReader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import org.efaps.admin.user.Company;
import org.efaps.ci.CIAdminCommon;
import org.efaps.db.Context;
import org.efaps.db.Instance;
import org.efaps.db.transaction.ConnectionResource;
import org.efaps.db.wrapper.SQLSelect;
import org.efaps.util.EFapsException;
import org.efaps.util.cache.AbstractCache;
import org.efaps.util.cache.CacheObjectInterface;
import org.efaps.util.cache.CacheReloadException;
/**
* The class handles the caching for system configurations with their attributes
* and links.
*
* @author The eFaps Team
* @version $Id: SystemConfiguration.java 6555 2011-05-14 18:21:29Z [email protected] $
*/
public final class SystemConfiguration
implements CacheObjectInterface
{
/**
* This static Variable contains the SQL statement used to retrieve the
* SystemAttributes from the eFaps database.
*
* @see SystemConfigurationCache#readCache(Map, Map, Map)
*/
private static final SQLSelect SELECT = new SQLSelect()
.column("CONFIGID")
.column("CONFIGNAME")
.column("CONFIGUUID")
.column("KEY")
.column("VALUE")
.column("UUID")
.column("COMPANYID")
.from("V_CMSYSCONF");
/**
* Caches all instances of {@link SystemConfiguration}.
*/
private static SystemConfigurationCache CACHE = new SystemConfigurationCache();
/**
* The instance variable stores the id of this SystemAttribute.
*
* @see #getId()
*/
private final long id;
/**
* The instance variable stores the UUID of this SystemAttribute.
*
* @see #getUUID()
*/
private final UUID uuid;
/**
* The instance variable stores the Name of this SystemAttribute.
*
* @see #getName()
*/
private final String name;
/**
* Map with all attributes for this system configuration.
*/
private final Map> attributes = new HashMap>();
/**
* Map with all links for this system configuration.
*/
private final Map> links = new HashMap>();
/**
* Map with all object attributes for this system configuration.
*/
private final Map> objectAttributes = new HashMap>();
/**
* Constructor setting instance variables.
*
* @param _id id of the SystemConfiguration
* @param _uuid uuid of the SystemConfiguration
* @param _name name of the SystemConfiguration
*/
private SystemConfiguration(final long _id,
final String _name,
final String _uuid)
{
this.id = _id;
this.uuid = UUID.fromString(_uuid);
this.name = _name;
this.attributes.put(new Long(0), new HashMap());
this.links.put(new Long(0), new HashMap());
this.objectAttributes.put(new Long(0), new HashMap());
}
/**
* Returns for given parameter _id the instance of class
* {@link SystemConfiguration}.
*
* @param _id id of the system configuration
* @return instance of class {@link SystemConfiguration}
* @throws CacheReloadException
*/
public static SystemConfiguration get(final long _id)
{
return SystemConfiguration.CACHE.get(_id);
}
/**
* Returns for given parameter _name the instance of class
* {@link SystemConfiguration}.
*
* @param _name name of the system configuration
* @return instance of class {@link SystemConfiguration}
* @throws CacheReloadException
*/
public static SystemConfiguration get(final String _name)
{
return SystemConfiguration.CACHE.get(_name);
}
/**
* Returns for given parameter _uuid the instance of class
* {@link SystemConfiguration}.
*
* @param _uuid uuid of the system configuration
* @return instance of class {@link SystemConfiguration}
* @throws CacheReloadException
*/
public static SystemConfiguration get(final UUID _uuid)
{
return SystemConfiguration.CACHE.get(_uuid);
}
/**
* This is the getter method for the instance variable {@link #id}.
*
* @return value of instance variable {@link #id}
*/
public long getId()
{
return this.id;
}
/**
* This is the getter method for the instance variable {@link #uuid}.
*
* @return value of instance variable {@link #uuid}
*/
public UUID getUUID()
{
return this.uuid;
}
/**
* This is the getter method for the instance variable {@link #name}.
*
* @return value of instance variable {@link #name}
*/
public String getName()
{
return this.name;
}
/**
* Get a value from the maps. The following logic applies:
*
* - Check if a Context exists
* - If a Context exist check if a company is given
* - If a company is given, check for a company specific map
* - If a company specific map is given search for the key in this map
* - If any of the earlier point fails the value from the default map is returned
*
* @param _key key the value is wanted for
* @param _map map the key will be search in for
* @return String value
* @throws EFapsException on error
*/
private String getValue(final String _key,
final Map> _map)
throws EFapsException
{
Company company = null;
if (Context.isThreadActive()) {
company = Context.getThreadContext().getCompany();
}
final long companyId = company == null ? 0 : company.getId();
Map innerMap;
if (_map.containsKey(companyId)) {
innerMap = _map.get(companyId);
if (!innerMap.containsKey(_key)) {
innerMap = _map.get(new Long(0));
}
} else {
innerMap = _map.get(new Long(0));
}
return innerMap.get(_key);
}
/**
* Returns for given _key
the related link. If no link is found
* null
is returned.
*
* @param _key key of searched link
* @return found link; if not found null
* @throws EFapsException on error
* @see #links
*/
public Instance getLink(final String _key)
throws EFapsException
{
return Instance.get(getValue(_key, this.links));
}
/**
* Returns for given Instance
the related attribute value. If no
* attribute value is found null
is returned.
*
* @param _instance Instance of searched objectattribute
* @return found attribute value; if not found null
* @throws EFapsException on error
* @see #objectAttributes
*/
public String getObjectAttributeValue(final Instance _instance)
throws EFapsException
{
return getObjectAttributeValue(_instance.getOid());
}
/**
* Returns for given OID
the related attribute value. If no
* attribute value is found null
is returned.
*
* @param _oid OID of searched objectattribute
* @return found attribute value; if not found null
* @throws EFapsException on error
* @see #objectAttributes
*/
public String getObjectAttributeValue(final String _oid)
throws EFapsException
{
return getValue(_oid, this.objectAttributes);
}
/**
* Returns for given Instance
the related value as Properties.
* If no attribute is found an empty Properties is returned.
*
* @param _instance Instance of searched attribute
* @return Properties
* @throws EFapsException on error
* @see #objectAttributes
*/
public Properties getObjectAttributeValueAsProperties(final Instance _instance)
throws EFapsException
{
return getObjectAttributeValueAsProperties(_instance.getOid());
}
/**
* Returns for given OID
the related value as Properties.
* If no attribute is found an empty Properties is returned.
*
* @param _key key of searched attribute
* @return Properties
* @throws EFapsException on error
* @see #objectAttributes
*/
public Properties getObjectAttributeValueAsProperties(final String _key)
throws EFapsException
{
final Properties ret = new Properties();
final String value = getValue(_key, this.objectAttributes);
if (value != null) {
try {
ret.load(new StringReader(value));
} catch (final IOException e) {
throw new EFapsException(SystemConfiguration.class, "getObjectAttributeValueAsProperties", e);
}
}
return ret;
}
/**
* Returns for given _key
the related attribute value. If no
* attribute value is found null
is returned.
*
* @param _key key of searched attribute
* @return found attribute value; if not found null
* @throws EFapsException on error
* @see #attributes
*/
public String getAttributeValue(final String _key)
throws EFapsException
{
return getValue(_key, this.attributes);
}
/**
* Returns for given _key
the related boolean attribute value.
* If no attribute value is found false is returned.
*
* @param _key key of searched attribute
* @return found boolean attribute value; if not found false
* @throws EFapsException on error
* @see #attributes
*/
public boolean getAttributeValueAsBoolean(final String _key)
throws EFapsException
{
final String value = getAttributeValue(_key);
return value == null ? false : Boolean.parseBoolean(value);
}
/**
* Returns for given _key
the related integer attribute value.
* If no attribute is found 0
is returned.
*
* @param _key key of searched attribute
* @return found integer attribute value; if not found 0
* @throws EFapsException on error
* @see #attributes
*/
public int getAttributeValueAsInteger(final String _key)
throws EFapsException
{
final String value = getAttributeValue(_key);
return value == null ? 0 : Integer.parseInt(value);
}
/**
* Returns for given _key
the related value as Properties.
* If no attribute is found an empty Properties is returned.
*
* @param _key key of searched attribute
* @return Properties
* @throws EFapsException on error
* @see #attributes
*/
public Properties getAttributeValueAsProperties(final String _key)
throws EFapsException
{
final Properties ret = new Properties();
final String value = getAttributeValue(_key);
if (value != null) {
try {
ret.load(new StringReader(value));
} catch (final IOException e) {
throw new EFapsException(SystemConfiguration.class, "getAttributeValueAsProperties", e);
}
}
return ret;
}
/**
* Method to initialize the {@link #CACHE cache} for the system
* configurations.
*/
public static void initialize()
{
SystemConfiguration.CACHE.initialize(SystemConfiguration.class);
}
/**
* Cache for all system configurations.
*/
private static class SystemConfigurationCache
extends AbstractCache
{
/**
* Reads all system configurations with their attributes and links and
* stores them in the given mapping caches.
*
* @param _newCache4Id cache for the mapping between id and system
* configuration
* @param _newCache4Name cache for the mapping between name and system
* configuration
* @param _newCache4UUID cache for the mapping between UUID and system
* configuration
* @throws CacheReloadException if cache could not be reloaded
*/
@Override
protected void readCache(final Map _newCache4Id,
final Map _newCache4Name,
final Map _newCache4UUID)
throws CacheReloadException
{
ConnectionResource con = null;
try {
con = Context.getThreadContext().getConnectionResource();
Statement stmt = null;
try {
stmt = con.getConnection().createStatement();
final ResultSet rs = stmt.executeQuery(SystemConfiguration.SELECT.getSQL());
long id = 0;
SystemConfiguration config = null;
while (rs.next()) {
final long configId = rs.getLong(1);
final String configName = rs.getString(2).trim();
final String configUUID = rs.getString(3).trim();
final String key = rs.getString(4).trim();
final String value = rs.getString(5).trim();
final String uuid = rs.getString(6).trim();
final Long companyId = rs.getLong(7);
if (id != configId) {
id = configId;
config = new SystemConfiguration(configId, configName, configUUID);
_newCache4Id.put(config.getId(), config);
_newCache4Name.put(config.getName(), config);
_newCache4UUID.put(config.getUUID(), config);
}
final UUID uuidTmp = UUID.fromString(uuid);
final Map> configMap;
if (uuidTmp.equals(CIAdminCommon.SystemConfigurationLink.uuid)) {
configMap = config.links;
} else if (uuidTmp.equals(CIAdminCommon.SystemConfigurationObjectAttribute.uuid)) {
configMap = config.objectAttributes;
} else {
configMap = config.attributes;
}
final Map map;
if (configMap.containsKey(companyId)) {
map = configMap.get(companyId);
} else {
map = new HashMap();
configMap.put(companyId, map);
}
map.put(key, value);
}
rs.close();
} finally {
if (stmt != null) {
stmt.close();
}
}
con.commit();
} catch (final SQLException e) {
throw new CacheReloadException("could not read attribute types", e);
} catch (final EFapsException e) {
throw new CacheReloadException("could not read attribute types", e);
} finally {
if ((con != null) && con.isOpened()) {
try {
con.abort();
} catch (final EFapsException e) {
throw new CacheReloadException("could not read attribute types", e);
}
}
}
}
}
}