///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.user; import java.util.List; import org.apache.commons.lang.Validate; import org.hibernate.Query; import org.projectforge.access.AccessChecker; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * Stores all user persistent objects such as filter settings, personal settings and persists them to the database. * * @author Kai Reinhard (k.reinhard@micromata.de) * */ public class UserXmlPreferencesMigrationDao extends HibernateDaoSupport { private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(UserXmlPreferencesMigrationDao.class); private AccessChecker accessChecker; private UserGroupCache userGroupCache; private UserXmlPreferencesDao userXmlPreferencesDao; private UserXmlPreferencesCache userXmlPreferencesCache; public void setAccessChecker(final AccessChecker accessChecker) { this.accessChecker = accessChecker; } public void setUserGroupCache(final UserGroupCache userGroupCache) { this.userGroupCache = userGroupCache; } public void setUserXmlPreferencesCache(final UserXmlPreferencesCache userXmlPreferencesCache) { this.userXmlPreferencesCache = userXmlPreferencesCache; } public void setUserXmlPreferencesDao(final UserXmlPreferencesDao userXmlPreferencesDao) { this.userXmlPreferencesDao = userXmlPreferencesDao; } @SuppressWarnings("unchecked") @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public String migrateAllUserPrefs() { accessChecker.checkIsLoggedInUserMemberOfAdminGroup(); final StringBuffer buf = new StringBuffer(); final List<UserXmlPreferencesDO> list = getHibernateTemplate().find( "from " + UserXmlPreferencesDO.class.getSimpleName() + " t order by user.id, key"); int versionNumber = Integer.MAX_VALUE; for (final UserXmlPreferencesDO userPrefs : list) { buf.append(migrateUserPrefs(userPrefs)); if (userPrefs.getVersion() < versionNumber) { versionNumber = userPrefs.getVersion(); } } migrate(versionNumber); userXmlPreferencesCache.refresh(); return buf.toString(); } /** * Here you can insert update or delete statements for all user xml pref entries (e. g. delete all entries with an unused key). * @param version Version number of oldest entry. */ protected void migrate(final int version) { if (version < 4) { // deleteOldKeys("org.projectforge.web.humanresources.HRViewForm:Filter"); // deleteOldKeys("org.projectforge.web.fibu.AuftragListAction:Filter"); // deleteOldKeys("OLD-VERSION-1.1"); // getHibernateTemplate().flush(); } } /** * Unsupported or unused keys should be deleted. This method deletes all entries with the given key. * @param key Key of the entries to delete. */ protected void deleteOldKeys(final String key) { final Query query = getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery( "delete from " + UserXmlPreferencesDO.class.getSimpleName() + " where key = '" + key + "'"); final int numberOfUpdatedEntries = query.executeUpdate(); log.info(numberOfUpdatedEntries + " '" + key + "' entries deleted."); } protected String migrateUserPrefs(final UserXmlPreferencesDO userPrefs) { final Integer userId = userPrefs.getUserId(); Validate.notNull(userId); final StringBuffer buf = new StringBuffer(); buf.append("Checking user preferences for user '"); final PFUserDO user = userGroupCache.getUser(userPrefs.getUserId()); if (user != null) { buf.append(user.getUsername()); } else { buf.append(userPrefs.getUserId()); } buf.append("': " + userPrefs.getKey() + " ... "); if (userPrefs.getVersion() >= UserXmlPreferencesDO.CURRENT_VERSION) { buf.append("version ").append(userPrefs.getVersion()).append(" (up to date)\n"); return buf.toString(); } migrate(userPrefs); final Object data = userXmlPreferencesDao.deserialize(userPrefs, true); buf.append("version "); buf.append(userPrefs.getVersion()); if (data != null || "<null/>".equals(userPrefs.getSerializedSettings()) == true) { buf.append(" OK "); } else { buf.append(" ***not re-usable*** "); } buf.append("\n"); if (data == null) { return buf.toString(); } return buf.toString(); } /** * Fixes incompatible versions of user preferences before de-serialization. * @param userPrefs */ protected static void migrate(final UserXmlPreferencesDO userPrefs) { if (userPrefs.getVersion() < 4) { userPrefs.setVersion(4); } } }