001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2008
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.core.structure;
034:
035: import com.flexive.core.DatabaseConst;
036: import com.flexive.shared.CacheAdmin;
037: import com.flexive.shared.EJBLookup;
038: import com.flexive.shared.cache.FxCacheException;
039: import com.flexive.shared.configuration.DivisionData;
040: import com.flexive.shared.exceptions.FxApplicationException;
041: import com.flexive.shared.exceptions.FxNotFoundException;
042: import com.flexive.shared.interfaces.GlobalConfigurationEngine;
043: import org.apache.commons.logging.Log;
044: import org.apache.commons.logging.LogFactory;
045: import org.jboss.cache.CacheException;
046:
047: import javax.naming.Context;
048: import javax.naming.InitialContext;
049: import javax.naming.NamingException;
050: import javax.sql.DataSource;
051: import java.sql.Connection;
052: import java.sql.SQLException;
053:
054: /**
055: * Environment helper functions (core)
056: *
057: * @author Markus Plesser (markus.plesser@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
058: */
059: final class FxEnvironmentUtils {
060: private static transient Log LOG = LogFactory
061: .getLog(FxEnvironmentUtils.class);
062:
063: /**
064: * Includes the division id into the path.
065: *
066: * @param divisionId the division
067: * @param path the path to encode
068: * @return the encoded path
069: * @throws FxCacheException if the division id could not be resolved
070: */
071: private static String divisionEncodePath(int divisionId,
072: final String path) throws FxCacheException {
073: if (!DivisionData.isValidDivisionId(divisionId)) {
074: throw new FxCacheException("Division ID missing");
075: }
076: return "#" + divisionId + (path.startsWith("/") ? "" : "/")
077: + path;
078: // return "/Division" + divisionId + (path.startsWith("/") ? "" : "/") + path;
079: }
080:
081: /**
082: * Get an object from the cache
083: *
084: * @param divisionId
085: * @param path
086: * @param key
087: * @return requested object or <code>null</code> if not found
088: * @throws CacheException on errors
089: */
090: protected static Object cacheGet(int divisionId, String path,
091: Object key) throws FxCacheException {
092: return CacheAdmin.getInstance().get(
093: divisionEncodePath(divisionId, path), key);
094: }
095:
096: /**
097: * Put an object into the cache
098: *
099: * @param divisionId
100: * @param path
101: * @param key
102: * @param value
103: * @throws FxCacheException
104: */
105: protected static void cachePut(int divisionId, String path,
106: Object key, Object value) throws FxCacheException {
107: if (CacheAdmin.ENVIRONMENT_RUNTIME.equals(key)) {
108: CacheAdmin.environmentChanged();
109: }
110: CacheAdmin.getInstance().put(
111: divisionEncodePath(divisionId, path), key, value);
112: }
113:
114: /**
115: * Remove a path from the cache
116: *
117: * @param divisionId
118: * @param path
119: * @throws FxCacheException
120: */
121: protected static void cacheRemove(int divisionId, String path)
122: throws FxCacheException {
123: CacheAdmin.getInstance().remove(
124: divisionEncodePath(divisionId, path));
125: }
126:
127: /**
128: * Remove an object from the cache
129: *
130: * @param divisionId the division
131: * @param path path in cache
132: * @param key key
133: * @throws FxCacheException on errors
134: */
135: protected static void cacheRemove(int divisionId, String path,
136: String key) throws FxCacheException {
137: CacheAdmin.getInstance().remove(
138: divisionEncodePath(divisionId, path), key);
139: }
140:
141: /**
142: * Get a DB Connection for the given division
143: *
144: * @param divisionId the division
145: * @return connection
146: * @throws SQLException on errors
147: */
148: protected static Connection getDbConnection(int divisionId)
149: throws SQLException {
150: // Check division
151: if (!DivisionData.isValidDivisionId(divisionId)) {
152: throw new SQLException(
153: "Unable to obtain connection: Division not defined");
154: }
155: // Try to obtain a connection
156: String finalDsName = null;
157: try {
158: Context c = new InitialContext();
159: if (divisionId == DivisionData.DIVISION_GLOBAL) {
160: // Special case: global config database
161: finalDsName = DatabaseConst.DS_GLOBAL_CONFIG;
162: } else {
163: // else: get data source from global configuration
164: GlobalConfigurationEngine globalConfiguration = EJBLookup
165: .getGlobalConfigurationEngine();
166: finalDsName = globalConfiguration.getDivisionData(
167: divisionId).getDataSource();
168: }
169: return ((DataSource) c.lookup(finalDsName)).getConnection();
170: } catch (NamingException exc) {
171: String sErr = "Naming Exception, unable to retrieve Connection to ["
172: + finalDsName + "]: " + exc.getMessage();
173: LOG.error(sErr);
174: throw new SQLException(sErr);
175: } catch (FxNotFoundException exc) {
176: String sErr = "Failed to retrieve datasource for division "
177: + divisionId + " (not configured).";
178: LOG.error(sErr);
179: throw new SQLException(sErr);
180: } catch (FxApplicationException exc) {
181: String sErr = "Failed to load datasource configuration: "
182: + exc.getMessage();
183: LOG.error(sErr);
184: throw new SQLException(sErr);
185: }
186: }
187: }
|