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.ejb.beans.search;
034:
035: import com.flexive.shared.CacheAdmin;
036: import com.flexive.shared.FxContext;
037: import com.flexive.shared.configuration.SystemParameters;
038: import com.flexive.shared.exceptions.FxApplicationException;
039: import com.flexive.shared.exceptions.FxNotFoundException;
040: import com.flexive.shared.exceptions.FxRuntimeException;
041: import com.flexive.shared.interfaces.*;
042: import com.flexive.shared.search.*;
043: import com.flexive.shared.structure.FxEnvironment;
044: import org.apache.commons.logging.Log;
045: import org.apache.commons.logging.LogFactory;
046:
047: import javax.ejb.EJB;
048: import javax.ejb.Stateless;
049: import javax.ejb.TransactionManagement;
050: import javax.ejb.TransactionManagementType;
051: import java.util.Arrays;
052:
053: /**
054: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
055: * @version $Rev: 181 $
056: */
057: @TransactionManagement(TransactionManagementType.CONTAINER)
058: @Stateless(name="ResultPreferencesEngine")
059: public class ResultPreferencesEngineBean implements
060: ResultPreferencesEngine, ResultPreferencesEngineLocal {
061: private static final Log LOG = LogFactory
062: .getLog(ResultPreferencesEngineBean.class);
063:
064: @EJB
065: ConfigurationEngineLocal configuration;
066: @EJB
067: DivisionConfigurationEngineLocal divisionConfiguration;
068: @EJB
069: UserConfigurationEngineLocal userConfiguration;
070:
071: /** {@inheritDoc} */
072: public ResultPreferences load(long typeId, ResultViewType viewType,
073: ResultLocation location) throws FxApplicationException {
074: ResultPreferences preferences;
075: try {
076: preferences = configuration.get(
077: SystemParameters.USER_RESULT_PREFERENCES, getKey(
078: typeId, viewType, location));
079: } catch (FxNotFoundException e) {
080: if (typeId >= 0) {
081: // use global default
082: return load(-1, viewType, location);
083: } else if (typeId == -1) {
084: // if no global default is defined, use hardcoded default settings
085: preferences = new ResultPreferences(Arrays
086: .asList(new ResultColumnInfo(Table.CONTENT,
087: "@pk", null)), Arrays
088: .asList(new ResultOrderByInfo(Table.CONTENT,
089: "@pk", null, SortDirection.ASCENDING)),
090: 25, 100);
091: } else {
092: throw e;
093: }
094: }
095: final ResultPreferences checkedPreferences = checkProperties(preferences);
096: if (checkedPreferences != null) {
097: // check performed, store new version in configuration
098: // We need to obey fallback preferences - i.e. use the source configuration for the preferences object
099: try {
100: FxContext.get().runAsSystem();
101: // we may have to update the division configuration here, so we need superuser privileges
102: configuration.putInSource(
103: SystemParameters.USER_RESULT_PREFERENCES,
104: getKey(typeId, viewType, location),
105: checkedPreferences);
106: } catch (FxNotFoundException e) {
107: LOG.warn("Using internal default result preferences ["
108: + getKey(typeId, viewType, location)
109: + "], this may cause performance problems.");
110: } finally {
111: FxContext.get().stopRunAsSystem();
112: }
113: return checkedPreferences;
114: }
115: return preferences;
116: }
117:
118: /** {@inheritDoc} */
119: public boolean isCustomized(long typeId, ResultViewType viewType,
120: ResultLocation location) throws FxApplicationException {
121: try {
122: configuration.get(SystemParameters.USER_RESULT_PREFERENCES,
123: getKey(typeId, viewType, location));
124: return true;
125: } catch (FxNotFoundException e) {
126: return false;
127: }
128: }
129:
130: /** {@inheritDoc} */
131: public void save(ResultPreferences preferences, long typeId,
132: ResultViewType viewType, ResultLocation location)
133: throws FxApplicationException {
134: configuration.put(SystemParameters.USER_RESULT_PREFERENCES,
135: getKey(typeId, viewType, location), preferences);
136: }
137:
138: /** {@inheritDoc} */
139: public void saveDefaultPreferences(ResultPreferences preferences,
140: long typeId, ResultViewType viewType,
141: ResultLocation location) throws FxApplicationException {
142: // div conf already checks for supervisor access
143: divisionConfiguration.put(
144: SystemParameters.USER_RESULT_PREFERENCES, getKey(
145: typeId, viewType, location), preferences);
146: }
147:
148: /** {@inheritDoc} */
149: public void remove(long typeId, ResultViewType viewType,
150: ResultLocation location) throws FxApplicationException {
151: configuration.remove(SystemParameters.USER_RESULT_PREFERENCES,
152: getKey(typeId, viewType, location));
153: }
154:
155: private String getKey(long typeId, ResultViewType viewType,
156: ResultLocation location) {
157: return typeId + "/" + viewType.name() + "/"
158: + location.getName();
159: }
160:
161: /**
162: * Check all properties in preferences for their validity. If no check was performed,
163: * null is returned, otherwise a new result preferences object with the new timestamp is returned.
164: *
165: * @param preferences the preferences to be checked
166: * @return returns null if no check was performed,
167: * otherwise a new result preferences object with the new timestamp is returned.
168: */
169: private ResultPreferences checkProperties(
170: ResultPreferences preferences) {
171: // TODO check structure timestamp
172: if (preferences.getLastChecked() != -1) {
173: return null;
174: }
175: final FxEnvironment environment = CacheAdmin.getEnvironment();
176: ResultPreferencesEdit rpe = preferences.getEditObject();
177:
178: // clean up selected columns
179: for (ResultColumnInfo info : preferences.getSelectedColumns()) {
180: if (!info.isProperty()) {
181: continue;
182: }
183: try {
184: environment.getProperty(info.getPropertyName());
185: } catch (FxRuntimeException e) {
186: if (LOG.isDebugEnabled()) {
187: LOG.debug("Removing property "
188: + info.getPropertyName() + " for user "
189: + FxContext.get().getTicket());
190: }
191: rpe.removeSelectedColumn(info);
192: }
193: }
194:
195: // clean up order by columns
196: for (ResultOrderByInfo info : preferences.getOrderByColumns()) {
197: if (!info.isProperty()) {
198: continue;
199: }
200: try {
201: environment.getProperty(info.getPropertyName());
202: } catch (FxRuntimeException e) {
203: if (LOG.isDebugEnabled()) {
204: LOG.debug("Removing property "
205: + info.getPropertyName() + " for user "
206: + FxContext.get().getTicket());
207: }
208: rpe.removeOrderByColumn(info);
209: }
210: }
211: rpe.setLastChecked(System.currentTimeMillis());
212: return rpe;
213: }
214: }
|