/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2010-2013 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. */ package org.glassfish.admingui.common.handlers; import java.io.UnsupportedEncodingException; import java.util.Map; import java.util.List; 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.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import org.glassfish.admingui.common.util.DeployUtil; import org.glassfish.admingui.common.util.GuiUtil; import org.glassfish.admingui.common.util.TargetUtil; /** * * @author Anissa Lam */ public class ResourceHandlers { /* * This handler takes in a list of rows, there should be 'Enabled' attribute in each row. * Get the resource-ref of this resource and do a logical And with this Enabled attribute * to get the real status */ @Handler(id = "gf.getResourceRealStatus", input = { @HandlerInput(name = "endpoint", type = String.class), @HandlerInput(name = "rows", type = java.util.List.class, required = true)}, output = { @HandlerOutput(name = "result", type = List.class)}) public static void getResourceRealStatus(HandlerContext handlerCtx) { List<Map> rows = (List) handlerCtx.getInputValue("rows"); Map<String, String> targetsMap = new HashMap<String, String>(); for (Map oneRow : rows) { try { String name = (String) oneRow.get("name"); String encodedName = URLEncoder.encode(name, "UTF-8"); List<String> targets = DeployUtil.getApplicationTarget(name, "resource-ref"); if (targets.size() == 0) { continue; //The resource is only created on domain, no source-ref exists. } String enabledStr = DeployUtil.getTargetEnableInfo(encodedName, false, false); List<String> targetUrls = new ArrayList<String>(); for (String target : targets) { if (TargetUtil.isCluster(target)) { targetsMap.put(GuiUtil.getSessionValue("REST_URL") + "/clusters/cluster/" + target, target); targetUrls.add(GuiUtil.getSessionValue("REST_URL") + "/clusters/cluster/" + target); } else { targetsMap.put(GuiUtil.getSessionValue("REST_URL") + "/servers/server/" + target, target); targetUrls.add(GuiUtil.getSessionValue("REST_URL") + "/servers/server/" + target); } } oneRow.put("targetUrls", targetUrls); oneRow.put("targetsMap", targetsMap); oneRow.put("enabled", enabledStr); } catch (Exception ex) { GuiUtil.handleException(handlerCtx, ex); } } handlerCtx.setOutputValue("result", rows); } /** * <p> This handler looks into the config properties, and confidential list, and returns a List of Map for populating the properties table. </p> * This is called for creating new objects. */ @Handler(id="gf.getConfigPropsInfo", input={ @HandlerInput(name="extraProps", type=java.util.Map.class), @HandlerInput(name="key", type=String.class), @HandlerInput(name="confidentialKey", type=String.class, defaultValue="confidentialConfigProps")}, output={ @HandlerOutput(name="result", type=java.util.List.class), @HandlerOutput(name="hasConfidentialProps", type=java.lang.Boolean.class)}) public static void getConfigPropsInfo(HandlerContext handlerCtx) { Map<String,Object> extraProps = (Map) handlerCtx.getInputValue("extraProps"); String key = (String) handlerCtx.getInputValue("key"); String confidentialKey = (String) handlerCtx.getInputValue("confidentialKey"); Boolean hasConfidential = true; Map<String, String> allProps = (Map<String, String>) extraProps.get(key); List<String> confidentialPropsNames = (List<String>) extraProps.get(confidentialKey); if (confidentialPropsNames == null || confidentialPropsNames.isEmpty()){ hasConfidential = false; } List<Map> result = new ArrayList(); for(Map.Entry<String, String> e : allProps.entrySet()){ Map<String, Object> oneRow = new HashMap(); String name = e.getKey(); String value = (e.getValue() == null) ? "" : e.getValue(); oneRow.put("selected", false); oneRow.put("name", name); if ( hasConfidential && confidentialPropsNames.contains(name)){ oneRow.put("value", ""); oneRow.put("confValue", value); oneRow.put("confValue2", value); oneRow.put("isConfidential", true); }else{ oneRow.put("value", value); oneRow.put("confValue", ""); oneRow.put("confValue2", ""); oneRow.put("isConfidential", false); } result.add(oneRow); } handlerCtx.setOutputValue("result", result); handlerCtx.setOutputValue("hasConfidentialProps", hasConfidential); } /* This method goes through the table list, if there is confidential properties, will ensure that the masked value1 and value2 is the same. * And will copy this to the property value column to continue processing. * This method is called just before saving the properties. */ @Handler(id="gf.combineProperties", input={ @HandlerInput(name="tableList", type=java.util.List.class)}, output={ @HandlerOutput(name="combined", type=java.util.List.class)}) public static void combineProperties(HandlerContext handlerCtx) { List<Map> tableList = (List) handlerCtx.getInputValue("tableList"); List<Map> combined = new ArrayList(); for(Map oneRow: tableList){ Map newRow = new HashMap(); boolean isC = (Boolean) oneRow.get("isConfidential"); String name = (String)oneRow.get("name"); newRow.put("name", name); if (GuiUtil.isEmpty(name)){ continue; } if(isC){ String v1 = (String) oneRow.get("confValue"); String v2 = (String) oneRow.get("confValue2"); if(v1 == null){ if (v2 != null){ GuiUtil.handleError(handlerCtx, "Confidential property '" + name + "' does not match."); return; } continue; } if(! v1.equals(v2)){ GuiUtil.handleError(handlerCtx, "Confidential property '" + name + "' does not match."); return; } newRow.put("value",v1); }else{ newRow.put("value", oneRow.get("value")); } combined.add(newRow); } handlerCtx.setOutputValue("combined", combined); } @Handler(id="gf.buildConfidentialPropsTable", input={ @HandlerInput(name="propsMaps", type=List.class), @HandlerInput(name="confidentialList", type=java.util.List.class)}, output={ @HandlerOutput(name="result", type=java.util.List.class), @HandlerOutput(name="hasConfidentialProps", type=Boolean.class) }) public static void buildConfidentialPropsTable(HandlerContext handlerCtx) { List<String> confidentialList = (List<String>) handlerCtx.getInputValue("confidentialList"); List<Map<String, String>> propsMaps = (List<Map<String, String>>) handlerCtx.getInputValue("propsMaps"); Boolean hasConfidential = true; if (confidentialList == null || confidentialList.isEmpty()){ hasConfidential = false; } Boolean hasConf = false; List<Map> result = new ArrayList(); for( Map<String, String> oneProp : propsMaps){ Map<String, Object> oneRow = new HashMap(); String name = oneProp.get("name"); String value = oneProp.get("value"); if (value == null) value=""; oneRow.put("selected", false); oneRow.put("name", name); if ( hasConfidential && confidentialList.contains(name)){ oneRow.put("value", ""); oneRow.put("confValue", value); oneRow.put("confValue2", value); oneRow.put("isConfidential", true); hasConf = true; }else{ oneRow.put("value", value); oneRow.put("confValue", ""); oneRow.put("confValue2", ""); oneRow.put("isConfidential", false); } result.add(oneRow); } handlerCtx.setOutputValue("result", result); handlerCtx.setOutputValue("hasConfidentialProps", hasConf); } //getLogicalJndiName(logicalMap="#{requestScope.tmpJMap.data.extraProperties.#{pageSession.logicalJndiMapKey}}", listRow="#{pageSession.listOfRows}"); @Handler(id="gf.getLogicalJndiName", input={ @HandlerInput(name="logicalMapList", type=List.class, required=true), @HandlerInput(name="listRow", type=java.util.List.class)}, output={ @HandlerOutput(name="result", type=java.util.List.class) }) public static void getLogicalJndiName(HandlerContext handlerCtx) { List<Map<String, String>> logicalMapList = (List<Map<String, String>>) handlerCtx.getInputValue("logicalMapList"); List<Map<String, Object>> listRow = (List<Map<String, Object>>) handlerCtx.getInputValue("listRow"); if (listRow==null || listRow.isEmpty()){ handlerCtx.setOutputValue("result", listRow); return; } //listRow is the row for each resource table, need to extract its logical jndi name for logicalMapList and add that to the row. try{ for(Map<String, Object> onerow: listRow){ String name= (String) onerow.get("name"); onerow.put("logicalJndiName", ""); onerow.put("encodedLogicalJndiName", ""); for(Map<String, String> logicalMap : logicalMapList){ if(name.equals(logicalMap.get("name"))){ String lname = logicalMap.get("logical-jndi-name"); if (!GuiUtil.isEmpty(lname)){ onerow.put("logicalJndiName", lname); onerow.put("encodedLogicalJndiName", URLEncoder.encode(lname, "UTF-8")); } break; } } } handlerCtx.setOutputValue("result", listRow); } catch (Exception ex) { GuiUtil.handleException(handlerCtx, ex); } } }