/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2009-2011 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ /* * JdbcHandler.java * * Created on August 10, 2006, 2:32 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ /** * * @author anilam */ package org.glassfish.admingui.common.handlers; import com.sun.jsftemplating.annotation.Handler; import com.sun.jsftemplating.annotation.HandlerInput; import com.sun.jsftemplating.annotation.HandlerOutput; import com.sun.jsftemplating.layout.descriptors.handler.HandlerContext; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.glassfish.admingui.common.util.GuiUtil; import org.glassfish.admingui.common.util.RestUtil; public class JdbcTempHandler { /** Creates a new instance of JdbcHandler */ public JdbcTempHandler() { } /** * <p> This handler gets the default values and resource type and puts them in session */ @Handler(id = "setJDBCPoolWizard", input = { @HandlerInput(name = "fromStep2", type = Boolean.class), @HandlerInput(name = "attrMap", type = Map.class)}, output = { @HandlerOutput(name = "ResTypeList", type = java.util.List.class), @HandlerOutput(name = "DBVendorList", type = java.util.List.class) }) public static void setJDBCPoolWizard(HandlerContext handlerCtx) { //We need to use 2 maps for JDBC Connection Pool creation because there are extra info we need to keep track in //the wizard, but cannot be passed to the creation API. Boolean fromStep2 = (Boolean) handlerCtx.getInputValue("fromStep2"); if ((fromStep2 != null) && fromStep2) { //wizardPool is already in session map } else { Map attrMap = (Map) handlerCtx.getInputValue("attrMap"); Map sessionMap = handlerCtx.getFacesContext().getExternalContext().getSessionMap(); sessionMap.put("wizardMap", attrMap); sessionMap.put("wizardPoolExtra", new HashMap()); //sessionMap.put("wizardPoolProperties", new HashMap()); } handlerCtx.setOutputValue("ResTypeList", resTypeList); handlerCtx.setOutputValue("DBVendorList", dbVendorList); } /** * <p> This handler gets the datasource classname and properties and sets them in session */ @Handler(id = "gf.updateJDBCPoolWizardStep1") public static void updateJDBCPoolWizardStep1(HandlerContext handlerCtx) { //Map pool = (Map) handlerCtx.getFacesContext().getExternalContext().getSessionMap().get("wizardPool"); Map extra = (Map) handlerCtx.getFacesContext().getExternalContext().getSessionMap().get("wizardPoolExtra"); String resType = (String) extra.get("resType"); String dbVendorBox = (String) extra.get("DBVendorBox"); String dbVendorField = (String) extra.get("DBVendorField"); String introspect = (String) extra.get("introspect"); if (introspect == null || introspect.isEmpty()) { introspect = Boolean.toString(false); } String dbVendor = (GuiUtil.isEmpty(dbVendorField)) ? dbVendorBox : dbVendorField; extra.put("DBVendor", dbVendor); String previousResType = (String) extra.get("PreviousResType"); String previousDB = (String) extra.get("PreviousDB"); String previousInstrospect = (String) extra.get("PreviousIntrospect"); if (resType.equals(previousResType) && dbVendor.equals(previousDB) && introspect.equals(previousInstrospect)) { //&& !GuiUtil.isEmpty((String) extra.get("DatasourceClassname"))) { //User didn't change type and DB, keep the datasource classname as the same. } else { if (!GuiUtil.isEmpty(resType) && !GuiUtil.isEmpty(dbVendor)) { try { List dsl = getJdbcDriverClassNames(dbVendor, resType, Boolean.valueOf(introspect)); if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("======= getJdbcDriverClassNames(" + dbVendor + ", " + resType + ")"); guiLogger.fine("======= # of items for JDBC_DRIVER_CLASS_NAMES_KEY " + dsl.size()); for (int i = 0; i < dsl.size(); i++) { guiLogger.fine("classname[" + i + "] : " + dsl.get(i)); } } List<Map<String, String>> noprops = new ArrayList<Map<String, String>>(); String dslName = (dsl != null && (dsl.size() > 0)) ? (String) dsl.get(0) : ""; if (resType.equals(DRIVER)) { extra.put("DList", dsl); extra.put("DSList", ""); extra.put("DatasourceClassnameField", ""); extra.put("dsClassname", Boolean.FALSE); extra.put("driverClassname", dslName); } else { extra.put("DSList", dsl); extra.put("DList", ""); extra.put("DriverClassnameField", ""); extra.put("dsClassname", Boolean.TRUE); extra.put("datasourceClassname", dslName); } if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("===== getConnectionDefinitionPropertiesAndDefaults(\"" + dslName + "\"," + resType + ")"); } Map<String, String> props = getConnectionDefinitionPropertiesAndDefaults(dslName, resType); if (props.size() > 0) { if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("======= getConnectionDefinitionPropertiesAndDefaults returns # of properties: " + props.size()); } handlerCtx.getFacesContext().getExternalContext().getSessionMap().put("wizardPoolProperties", GuiUtil.convertMapToListOfMap(props)); } else { if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("======= getConnectionDefinitionPropertiesAndDefaults returns NULL"); } handlerCtx.getFacesContext().getExternalContext().getSessionMap().put("wizardPoolProperties", noprops); } } catch (Exception ex) { GuiUtil.getLogger().info(GuiUtil.getCommonMessage("log.error.updateJDBCPoolWizardStep1" + ex.getLocalizedMessage())); if (GuiUtil.getLogger().isLoggable(Level.FINE)){ ex.printStackTrace(); } } } else { // Allow user to provide DataSource ClassName when resourceType is not of type Driver // or is not selected. if (DRIVER.equals(resType)) { extra.put("DatasourceClassnameField", ""); extra.put("dsClassname", Boolean.FALSE); } else { extra.put("DatasourceClassnameField", ""); extra.put("dsClassname", Boolean.TRUE); } } extra.put("PreviousResType", resType); extra.put("PreviousDB", dbVendor); extra.put("PreviousIntrospect", introspect); } } /** * <p> updates the wizard map properties on step 2 */ @Handler(id = "gf.updateJdbcConnectionPoolPropertiesTable") public static void updateJdbcConnectionPoolPropertiesTable(HandlerContext handlerCtx) { Map extra = (Map) handlerCtx.getFacesContext().getExternalContext().getSessionMap().get("wizardPoolExtra"); String resType = (String) extra.get("resType"); String classname = (String) extra.get("datasourceClassname"); List<Map<String, String>> noprops = new ArrayList<Map<String, String>>(); if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("===== getConnectionDefinitionPropertiesAndDefaults(\"" + classname + "\"," + resType + ")"); } Map<String, String> props = getConnectionDefinitionPropertiesAndDefaults(classname, resType); if (props.size() != 0) { if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("======= getConnectionDefinitionPropertiesAndDefaults returns # of properties: " + props.size()); } handlerCtx.getFacesContext().getExternalContext().getSessionMap().put("wizardPoolProperties", GuiUtil.convertMapToListOfMap(props)); } else { if (guiLogger.isLoggable(Level.FINE)) { guiLogger.fine("======= getConnectionDefinitionPropertiesAndDefaults returns NULL"); } handlerCtx.getFacesContext().getExternalContext().getSessionMap().put("wizardPoolProperties", noprops); } } /** * <p> updates the wizard map properties on step 2 */ @Handler(id = "updateJdbcConnectionPoolWizardStep2") public static void updateJdbcConnectionPoolWizardStep2(HandlerContext handlerCtx) { Map extra = (Map) handlerCtx.getFacesContext().getExternalContext().getSessionMap().get("wizardPoolExtra"); Map attrs = (Map) handlerCtx.getFacesContext().getExternalContext().getSessionMap().get("wizardMap"); String resType = (String) extra.get("resType"); String classname = (String) extra.get("datasourceClassname"); String driver = (String) extra.get("driverClassname"); String name = (String) extra.get("name"); String classnamefield = (String) extra.get("DatasourceClassnameField"); String driverfield = (String) extra.get("DriverClassnameField"); attrs.put("name", name); attrs.put("resType", resType); if ("".equals(attrs.get("transactionIsolationLevel"))) { attrs.remove("transactionIsolationLevel"); } if (!GuiUtil.isEmpty(classnamefield) || !GuiUtil.isEmpty(driverfield)) { attrs.put("datasourceClassname", classnamefield); attrs.put("driverClassname", driverfield); } else if (!GuiUtil.isEmpty(classname) || !GuiUtil.isEmpty(driver)) { attrs.put("datasourceClassname", classname); attrs.put("driverClassname", driver); } else { GuiUtil.handleError(handlerCtx, GuiUtil.getMessage("org.glassfish.jdbc.admingui.Strings", "msg.Error.classNameCannotBeEmpty")); return; } } /** * <p> This handler adds the class name table column depends on the resource type. */ @Handler(id = "gf.addClassNameColumn", input = { @HandlerInput(name = "poolsData", type = List.class)}, output = { @HandlerOutput(name = "result", type = java.util.List.class) }) public static void addClassNameColumn(HandlerContext handlerCtx) { List<Map<String, String>> poolsData = (List<Map<String, String>>) handlerCtx.getInputValue("poolsData"); if (poolsData != null) { for (Map<String, String> poolData : poolsData) { String resType = poolData.get("resType"); String driverClassName = poolData.get("driverClassname"); String datasourceClassName = poolData.get("datasourceClassname"); if (!resType.isEmpty()) { if (resType.equals("java.sql.Driver")) { poolData.put("className", driverClassName); } else { poolData.put("className", datasourceClassName); } } else { if (!datasourceClassName.isEmpty()) { poolData.put("className", datasourceClassName); } if (!driverClassName.isEmpty()) { poolData.put("className", driverClassName); } } } } handlerCtx.setOutputValue("result", poolsData); } private static List getJdbcDriverClassNames(String dbVendor, String resType, boolean introspect) { String endpoint = (String) GuiUtil.getSessionValue("REST_URL"); endpoint = endpoint + "/resources/get-jdbc-driver-class-names"; Map<String, Object> attrs = new HashMap<String, Object>(); attrs.put("dbVendor", dbVendor); attrs.put("restype", resType); attrs.put("introspect", ((Boolean) introspect).toString()); List<String> jdbcClassNames = new ArrayList<String>(); try { Map<String, Object> responseMap = RestUtil.restRequest(endpoint, attrs, "GET", null, false); Map<String, Object> extraPropsMap = (Map<String, Object>) ((Map<String, Object>) responseMap.get("data")).get("extraProperties"); if ( extraPropsMap != null) { jdbcClassNames = (List<String>) extraPropsMap.get("driverClassNames"); } } catch (Exception ex) { GuiUtil.getLogger().severe("Error in getJdbcDriverClassNames ; \nendpoint = " + endpoint + "attrs=" + attrs + "method=GET"); //we don't need to call GuiUtil.handleError() because thats taken care of in restRequest() when we pass in the handler. } return jdbcClassNames; } private static List getDatabaseVendorNames() { String endpoint = (String) GuiUtil.getSessionValue("REST_URL"); endpoint = endpoint + "/resources/get-database-vendor-names"; List<String> vendorList = new ArrayList<String>(); try { Map<String, Object> responseMap = RestUtil.restRequest(endpoint, null, "GET", null, false); Map<String, Object> extraPropsMap = (Map<String, Object>) ((Map<String, Object>) responseMap.get("data")).get("extraProperties"); if ( extraPropsMap != null) { vendorList = (List<String>) extraPropsMap.get("vendorNames"); } } catch (Exception ex) { GuiUtil.getLogger().severe("Error in getDatabaseVendorNames ; \nendpoint = " + endpoint + "attrs=null method=GET"); //we don't need to call GuiUtil.handleError() because thats taken care of in restRequest() when we pass in the handler. } return vendorList; } private static Map<String, String> getConnectionDefinitionPropertiesAndDefaults(String datasourceClassName, String resType) { String endpoint = (String) GuiUtil.getSessionValue("REST_URL"); endpoint = endpoint + "/resources/get-connection-definition-properties-and-defaults"; Map<String, Object> attrs = new HashMap<String, Object>(); attrs.put("connectionDefinitionClass", datasourceClassName); attrs.put("restype", resType); Map<String, String> connDefProps = new HashMap<String, String>(); try { Map<String, Object> responseMap = RestUtil.restRequest(endpoint, attrs, "GET", null, false); Map<String, Object> extraPropsMap = (Map<String, Object>) ((Map<String, Object>) responseMap.get("data")).get("extraProperties"); if ( extraPropsMap != null) { connDefProps = (Map<String, String>) extraPropsMap.get("connectionDefinitionPropertiesAndDefaults"); } } catch (Exception ex) { GuiUtil.getLogger().severe("Error in getConnectionDefinitionPropertiesAndDefaults ; \nendpoint = " + endpoint + "attrs=" + attrs + "method=GET"); //we don't need to call GuiUtil.handleError() because thats taken care of in restRequest() when we pass in the handler. } return connDefProps; } public static final Logger guiLogger = GuiUtil.getLogger(); public static final String REASON_FAILED_KEY = "ReasonFailedKey"; //public static final String SET_KEY = "SetKey"; //public static final String BOOLEAN_KEY = "BooleanKey"; static private final String DATA_SOURCE = "javax.sql.DataSource"; static private final String XADATA_SOURCE = "javax.sql.XADataSource"; static private final String CCDATA_SOURCE = "javax.sql.ConnectionPoolDataSource"; static private final String DRIVER = "java.sql.Driver"; static private final String JAVADB = "JavaDB"; static private final String ORACLE = "Oracle"; static private final String DERBY = "Derby"; static private final String SYBASE = "Sybase"; static private final String DB2 = "DB2"; static private final String POINTBASE = "PointBase"; static private final String POSTGRESQL = "PostgreSQL"; static private final String INFORMIX = "Informix"; static private final String CLOUDSCAPE = "Cloudscape"; static private final String MSSQL = "Microsoft SQL Server"; static private final String MYSQL = "MySQL"; static private List resTypeList = new ArrayList(); static private List dbVendorList = new ArrayList(); static { dbVendorList = getDatabaseVendorNames(); dbVendorList.add(0, ""); resTypeList.add(""); resTypeList.add(DATA_SOURCE); resTypeList.add(XADATA_SOURCE); resTypeList.add(CCDATA_SOURCE); resTypeList.add(DRIVER); // dbVendorList.add(""); // dbVendorList.add(JAVADB); // dbVendorList.add(ORACLE); // dbVendorList.add(DERBY); // dbVendorList.add(SYBASE); // dbVendorList.add(DB2); // dbVendorList.add(POINTBASE); // dbVendorList.add(POSTGRESQL); // dbVendorList.add(INFORMIX); // dbVendorList.add(CLOUDSCAPE); // dbVendorList.add(MSSQL); // dbVendorList.add(MYSQL); // Collections.sort(dbVendorList); } }