Java tutorial
/* * Adito * * Copyright (C) 2003-2006 3SP LTD. All Rights Reserved * * This program 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; either version 2 of * the License, or (at your option) any later version. * This program 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, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.adito.applications; import java.io.File; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Calendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.adito.boot.ContextHolder; import com.adito.boot.SystemProperties; import com.adito.core.CoreEvent; import com.adito.core.CoreListener; import com.adito.core.CoreServlet; import com.adito.extensions.store.ExtensionStore; import com.adito.extensions.types.PluginDefinition; import com.adito.jdbc.DBUpgrader; import com.adito.jdbc.JDBCDatabaseEngine; import com.adito.jdbc.JDBCPreparedStatement; import com.adito.jdbc.JDBCUtil; /** * Implementation of a {@link com.adito.security.SystemDatabase} that uses * a JDBC compliant database to store Adito's basic configuration and * resources. */ public class JDBCApplicationShortcutDatabase implements ApplicationShortcutDatabase, CoreListener { private static final Log log = LogFactory.getLog(JDBCApplicationShortcutDatabase.class); private JDBCDatabaseEngine db; /** * Constructor */ public JDBCApplicationShortcutDatabase() { } /* * (non-Javadoc) * * @see com.adito.core.Database#open(com.adito.core.CoreServlet) */ public void open(CoreServlet controllingServlet) throws Exception { throw new Exception("Plugin databases need a PluginDefinition."); } /* * (non-Javadoc) * * @see com.adito.boot.Database#close() */ public void close() throws Exception { } /* * (non-Javadoc) * * @see com.adito.boot.Database#cleanup() */ public void cleanup() throws Exception { } /* * (non-Javadoc) * * @see com.adito.core.CoreListener#coreEvent(com.adito.core.CoreEvent) */ public void coreEvent(CoreEvent evt) { } /* * (non-Javadoc) * * @see com.adito.extensions.ApplicationShortcutDatabase#createApplicationShortcut(java.lang.String, * java.lang.String, java.lang.String, java.util.Map) */ public int createApplicationShortcut(String application, String name, String description, Map settings, boolean autoStart, int realmID) throws Exception { JDBCPreparedStatement ps = db.getStatement("createApplicationShortcut.insert"); try { ps.setString(1, application); ps.setString(2, name); ps.setString(3, description); ps.setInt(4, autoStart ? 1 : 0); Calendar now = Calendar.getInstance(); ps.setString(5, db.formatTimestamp(now)); ps.setString(6, db.formatTimestamp(now)); ps.setInt(7, realmID); ps.execute(); int id = db.getLastInsertId(ps, "createApplicationShortcut.lastInsertId"); JDBCPreparedStatement ps3 = db.getStatement("createApplicationShortcut.insertParameters"); try { for (Iterator it = settings.keySet().iterator(); it.hasNext();) { String parameter = (String) it.next(); String value = (String) settings.get(parameter); ps3.setInt(1, id); ps3.setString(2, parameter); ps3.setString(3, value); ps3.execute(); ps3.reset(); } } finally { ps3.releasePreparedStatement(); } return id; } finally { ps.releasePreparedStatement(); } } /* * (non-Javadoc) * * @see com.adito.extensions.ApplicationShortcutDatabase#updateApplicationShortcut(int, * java.lang.String, java.lang.String, java.util.Map) */ public void updateApplicationShortcut(int id, String name, String description, Map settings, boolean autoStart) throws Exception { JDBCPreparedStatement ps = db.getStatement("updateApplicationShortcut.update"); // Update the actual shortcut try { ps.setString(1, name); ps.setString(2, description); ps.setInt(3, autoStart ? 1 : 0); Calendar now = Calendar.getInstance(); ps.setString(4, db.formatTimestamp(now)); ps.setInt(5, id); ps.execute(); } finally { ps.releasePreparedStatement(); } // Delete the current parameters ps = db.getStatement("updateApplicationShortcut.deleteParameters"); try { ps.setInt(1, id); ps.execute(); } finally { ps.releasePreparedStatement(); } // Insert the parameters again ps = db.getStatement("createApplicationShortcut.insertParameters"); try { for (Iterator it = settings.keySet().iterator(); it.hasNext();) { String parameter = (String) it.next(); String value = (String) settings.get(parameter); ps.setInt(1, id); ps.setString(2, parameter); ps.setString(3, value); ps.execute(); ps.reset(); } } finally { ps.releasePreparedStatement(); } } /* * (non-Javadoc) * * @see com.adito.extensions.ApplicationShortcutDatabase#removeApplicationShortcuts(java.lang.String) */ public void removeApplicationShortcuts(String applicationId) throws Exception { JDBCPreparedStatement ps = db.getStatement("removeApplicationShortcuts.select"); ps.setString(1, applicationId); try { ResultSet rs = ps.executeQuery(); try { while (rs.next()) { JDBCPreparedStatement ps2 = db.getStatement("removeApplicationShortcuts.delete.favorites"); ps2.setInt(1, ApplicationsPlugin.APPLICATION_SHORTCUT_RESOURCE_TYPE_ID); ps2.setInt(2, rs.getInt("resource_id")); try { ps2.execute(); } finally { ps2.releasePreparedStatement(); } ps2 = db.getStatement("removeApplicationShortcuts.delete.shortcutParameters"); ps2.setString(1, String.valueOf(rs.getInt("resource_id"))); try { ps2.execute(); } finally { ps2.releasePreparedStatement(); } } } finally { rs.close(); } } finally { ps.releasePreparedStatement(); } ps = db.getStatement("removeApplicationShortcuts.delete.shortcuts"); ps.setString(1, applicationId); try { ps.execute(); } finally { ps.releasePreparedStatement(); } } /* * (non-Javadoc) * * @see com.adito.extensions.ApplicationShortcutDatabase#getShortcuts() */ public List<ApplicationShortcut> getShortcuts() throws Exception { JDBCPreparedStatement ps = db.getStatement("getShortcuts.selectAll"); Vector<ApplicationShortcut> v = new Vector<ApplicationShortcut>(); try { ResultSet rs = ps.executeQuery(); try { while (rs.next()) { v.add(buildShortcut(rs)); } } finally { rs.close(); } } finally { ps.releasePreparedStatement(); } return v; } /* * (non-Javadoc) * * @see com.adito.extensions.ApplicationShortcutDatabase#getShortcut(int) */ public ApplicationShortcut getShortcut(int shortcutId) throws Exception { JDBCPreparedStatement ps = db.getStatement("getShortcut.select"); ps.setInt(1, shortcutId); try { ResultSet rs = ps.executeQuery(); try { if (rs.next()) { return buildShortcut(rs); } else { return null; } } finally { rs.close(); } } finally { ps.releasePreparedStatement(); } } /* * (non-Javadoc) * * @see com.adito.extensions.ApplicationShortcutDatabase#deleteShortcut(int) */ public ApplicationShortcut deleteShortcut(int shortcutId) throws Exception { ApplicationShortcut sc = getShortcut(shortcutId); if (sc == null) { throw new Exception("Application shortcut " + shortcutId + " does not exist."); } JDBCPreparedStatement ps = db.getStatement("deleteShortcuts.delete.favorite"); // Delete a favorite try { ps.setString(1, String.valueOf(shortcutId)); ps.setInt(2, ApplicationsPlugin.APPLICATION_SHORTCUT_RESOURCE_TYPE_ID); ps.execute(); ps.reset(); } finally { ps.releasePreparedStatement(); } // Delete a shortcut ps = db.getStatement("deleteShortcuts.delete.shortcut"); try { ps.setInt(1, shortcutId); ps.execute(); ps.reset(); } finally { ps.releasePreparedStatement(); } // Delete all parameters for a shortcut ps = db.getStatement("deleteShortcuts.delete.shortcutParameters"); try { ps.setInt(1, shortcutId); ps.execute(); ps.reset(); } finally { ps.releasePreparedStatement(); } return sc; } /** * @param rs * @return ApplicationShortcut * @throws Exception */ ApplicationShortcut buildShortcut(ResultSet resultSet) throws Exception { int resourceId = resultSet.getInt("resource_id"); String name = resultSet.getString("name"); String description = resultSet.getString("description"); String application = resultSet.getString("application"); Calendar dateCreated = JDBCUtil.getCalendar(resultSet, "date_created"); Calendar dateAmended = JDBCUtil.getCalendar(resultSet, "date_amended"); int realmId = resultSet.getInt("realm_id"); boolean autoStart = resultSet.getBoolean("auto_start"); Map<String, String> settings = getParameters(resourceId); return new DefaultApplicationShortcut(realmId, resourceId, name, description, dateCreated, dateAmended, application, settings, autoStart); } private Map<String, String> getParameters(int resourceId) throws SQLException, ClassNotFoundException { JDBCPreparedStatement ps2 = db.getStatement("buildShortcut.select.parameters"); ps2.setInt(1, resourceId); Map<String, String> settings = new HashMap<String, String>(); try { ResultSet rs2 = ps2.executeQuery(); try { while (rs2.next()) { settings.put(rs2.getString("parameter"), rs2.getString("value")); } } finally { rs2.close(); } } finally { ps2.releasePreparedStatement(); } return settings; } /* (non-Javadoc) * @see com.adito.plugin.PluginDatabase#open(com.adito.core.CoreServlet, com.adito.plugin.PluginDefinition) */ public void open(CoreServlet controllingServlet, PluginDefinition def) throws Exception { String dbName = SystemProperties.get("adito.systemDatabase.jdbc.dbName", "explorer_configuration"); controllingServlet.addDatabase(dbName, ContextHolder.getContext().getDBDirectory()); String jdbcUser = SystemProperties.get("adito.jdbc.username", "sa"); String jdbcPassword = SystemProperties.get("adito.jdbc.password", ""); String vendorDB = SystemProperties.get("adito.jdbc.vendorClass", "com.adito.jdbc.hsqldb.HSQLDBDatabaseEngine"); if (log.isInfoEnabled()) { log.info("System database is being opened..."); log.info("JDBC vendor class implementation is " + vendorDB); } db = (JDBCDatabaseEngine) Class.forName(vendorDB).newInstance(); db.init("applicationShortcutsDatabase", dbName, jdbcUser, jdbcPassword, null); File upgradeDir = new File(def.getDescriptor().getApplicationBundle().getBaseDir(), "upgrade"); DBUpgrader upgrader = new DBUpgrader( ExtensionStore.getInstance().getExtensionBundle(ApplicationsPlugin.BUNDLE_ID).getVersion(), db, ContextHolder.getContext().getDBDirectory(), upgradeDir); upgrader.upgrade(); CoreServlet.getServlet().addCoreListener(this); } /* (non-Javadoc) * @see com.adito.applications.ApplicationShortcutDatabase#getShortcuts(int) */ public List<ApplicationShortcut> getShortcuts(int realmID) throws Exception { JDBCPreparedStatement ps = db.getStatement("getShortcuts.realm.selectAll"); Vector<ApplicationShortcut> v = new Vector<ApplicationShortcut>(); try { ps.setInt(1, realmID); ResultSet rs = ps.executeQuery(); try { while (rs.next()) { v.add(buildShortcut(rs)); } } finally { rs.close(); } } finally { ps.releasePreparedStatement(); } return v; } /* (non-Javadoc) * @see com.adito.applications.ApplicationShortcutDatabase#getShortcut(java.lang.String, int) */ public ApplicationShortcut getShortcut(String name, int realmID) throws Exception { JDBCPreparedStatement ps = db.getStatement("getShortcutByName.select"); ps.setString(1, name); ps.setInt(2, realmID); try { ResultSet rs = ps.executeQuery(); try { if (rs.next()) { return buildShortcut(rs); } else { return null; } } finally { rs.close(); } } finally { ps.releasePreparedStatement(); } } }