/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * 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 version 2 of the License. * * 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 org.rhq.core.db.ant.dbsetup; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import mazz.i18n.Msg; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Environment; import org.rhq.core.db.ant.DbAntI18NFactory; import org.rhq.core.db.ant.DbAntI18NResourceKeys; import org.rhq.core.db.setup.DBSetup; /** * Ant task wrapper around {@link DBSetup}. */ public class DBSetupTask extends Task { private static final Msg MSG = DbAntI18NFactory.getMsg(); private File xmlFile; private String jdbcUrl; private String jdbcUser; private String jdbcPassword; private boolean dataOnly = false; private boolean uninstall = false; private boolean exportXml = false; private ArrayList<Environment.Variable> sysProps = new ArrayList<Environment.Variable>(); // These are used when "dataOnly" is true, to only setup a single table private String table = null; private boolean doDelete = false; public void setXmlFile(File xmlFile) { this.xmlFile = xmlFile; } public void setJdbcUrl(String url) { this.jdbcUrl = url; } public void setJdbcUser(String user) { this.jdbcUser = user; } public void setJdbcPassword(String pass) { this.jdbcPassword = pass; } public void setDataOnly(boolean data_only) { this.dataOnly = data_only; } public void setUninstall(boolean uninstall) { this.uninstall = uninstall; } public void setExportXml(boolean export) { this.exportXml = export; } public void setTable(String table) { this.table = table; } public void setDelete(boolean del) { this.doDelete = del; } /** * Support subelements to set System properties e.g <sysproperty key="foo" value="bar" /> After the task has * completed, the system properties will be reverted to their old values (of if the system property didn't exist * before, it will be removed). * * @param sysprop */ public void addSysproperty(Environment.Variable sysprop) { sysProps.add(sysprop); } /** * @see org.apache.tools.ant.Task#execute() */ public void execute() throws BuildException { validateAttributes(); // being able to set system properties can be useful to set JDBC LoggerDriver system properties // but remember the old values so we can revert back to them after the task finishes Properties old_sysprops = new Properties(); // old values for keys that existed List<String> nonexistent_sysprops = new ArrayList<String>(); // keys that didn't exist in system properties for (Environment.Variable env_var : sysProps) { String old_value = System.setProperty(env_var.getKey(), env_var.getValue()); if (old_value == null) { nonexistent_sysprops.add(env_var.getKey()); } else { old_sysprops.put(env_var.getKey(), old_value); } } try { DBSetup dbs = new DBSetup(jdbcUrl, jdbcUser, jdbcPassword); if (uninstall) { dbs.uninstall(xmlFile.getAbsolutePath()); } else if (exportXml) { dbs.export(xmlFile.getAbsolutePath()); } else if (table == null) { dbs.setup(xmlFile.getAbsolutePath()); } else { dbs.setup(xmlFile.getAbsolutePath(), table, dataOnly, doDelete); } } catch (Exception e) { throw new BuildException(e); } finally { // revert back to the old system properties for (String name : nonexistent_sysprops) { System.clearProperty(name); } for (Map.Entry old_entry : old_sysprops.entrySet()) { System.setProperty((String) old_entry.getKey(), (String) old_entry.getValue()); } } } private void validateAttributes() throws BuildException { if (xmlFile == null) { throw new BuildException(MSG.getMsg(DbAntI18NResourceKeys.TASK_MISSING_ATTRIB, getTaskName(), "xmlFile")); } if (jdbcUrl == null) { throw new BuildException(MSG.getMsg(DbAntI18NResourceKeys.TASK_MISSING_ATTRIB, getTaskName(), "jdbcUrl")); } } }