001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.connector.deployment.dconfigbean; 019 020 import java.util.Arrays; 021 import java.util.HashSet; 022 import java.util.Iterator; 023 import java.util.Map; 024 import java.util.Set; 025 026 import javax.enterprise.deploy.model.DDBean; 027 import javax.enterprise.deploy.model.XpathEvent; 028 import javax.enterprise.deploy.model.XpathListener; 029 030 import org.apache.geronimo.xbeans.geronimo.GerConfigPropertySettingType; 031 032 /** 033 * 034 * 035 * @version $Rev: 476049 $ $Date: 2006-11-16 23:35:17 -0500 (Thu, 16 Nov 2006) $ 036 * 037 * */ 038 public class ConfigPropertiesHelper { 039 040 public static void initializeConfigSettings(DDBean ddBean, ConfigPropertiesSource configPropertiesSource, Map configPropertiesMap, String configPropertyXPath, String configPropertyNameXPath) { 041 DDBean[] configProperties = ddBean.getChildBean(configPropertyXPath); 042 GerConfigPropertySettingType[] configPropertySettings = configPropertiesSource.getConfigPropertySettingArray(); 043 044 if (configPropertySettings.length == 0) { 045 //we are new 046 for (int i = 0; i < configProperties.length; i++) { 047 DDBean configProperty = configProperties[i]; 048 GerConfigPropertySettingType configPropertySetting = configPropertiesSource.addNewConfigPropertySetting(); 049 String name = configProperty.getText(configPropertyNameXPath)[0]; 050 ConfigPropertySettingDConfigBean configPropertySettingDConfigBean = new ConfigPropertySettingDConfigBean(configProperty, configPropertySetting); 051 configPropertiesMap.put(name, configPropertySettingDConfigBean); 052 } 053 } else { 054 //we are read in from xml. Check correct length 055 assert configProperties.length == configPropertySettings.length; 056 for (int i = 0; i < configProperties.length; i++) { 057 DDBean configProperty = configProperties[i]; 058 GerConfigPropertySettingType configPropertySetting = configPropertySettings[i]; 059 String name = configProperty.getText(configPropertyNameXPath)[0]; 060 assert name.equals(configPropertySetting.getName()); 061 ConfigPropertySettingDConfigBean configPropertySettingDConfigBean = new ConfigPropertySettingDConfigBean(configProperty, configPropertySetting); 062 configPropertiesMap.put(name, configPropertySettingDConfigBean); 063 } 064 } 065 } 066 067 public static XpathListener initialize(DDBean parentDDBean, final ConfigPropertiesHelper.ConfigPropertiesSource configPropertiesSource, String configPropertyXPath, String configPropertyNameXPath) { 068 DDBean[] beans = parentDDBean.getChildBean(configPropertyXPath); 069 ConfigPropertySettings[] configs = new ConfigPropertySettings[beans.length]; 070 Set xmlBeans = new HashSet(Arrays.asList(configPropertiesSource.getConfigPropertySettingArray())); 071 for (int i = 0; i < beans.length; i++) { 072 DDBean bean = beans[i]; 073 String[] names = bean.getText(configPropertyNameXPath); 074 String name = names.length == 1 ? names[0] : ""; 075 GerConfigPropertySettingType target = null; 076 for (Iterator it = xmlBeans.iterator(); it.hasNext();) { 077 GerConfigPropertySettingType setting = (GerConfigPropertySettingType) it.next(); 078 if (setting.getName().equals(name)) { 079 target = setting; 080 xmlBeans.remove(target); 081 break; 082 } 083 } 084 if (target == null) { 085 target = configPropertiesSource.addNewConfigPropertySetting(); 086 } 087 configs[i] = new ConfigPropertySettings(); 088 configs[i].initialize(target, bean); 089 } 090 for (Iterator it = xmlBeans.iterator(); it.hasNext();) { // used to be in XmlBeans, no longer anything matching in J2EE DD 091 GerConfigPropertySettingType target = (GerConfigPropertySettingType) it.next(); 092 GerConfigPropertySettingType[] xmlConfigs = configPropertiesSource.getConfigPropertySettingArray(); 093 for (int i = 0; i < xmlConfigs.length; i++) { 094 if (xmlConfigs[i] == target) { 095 configPropertiesSource.removeConfigPropertySetting(i); 096 break; 097 } 098 } 099 } 100 configPropertiesSource.setConfigPropertySettings(configs); 101 XpathListener configListener = new XpathListener() { 102 public void fireXpathEvent(XpathEvent xpe) { 103 ConfigPropertySettings[] configs = configPropertiesSource.getConfigPropertySettings(); 104 if (xpe.isAddEvent()) { 105 ConfigPropertySettings[] bigger = new ConfigPropertySettings[configs.length + 1]; 106 System.arraycopy(configs, 0, bigger, 0, configs.length); 107 bigger[configs.length] = new ConfigPropertySettings(); 108 bigger[configs.length].initialize(configPropertiesSource.addNewConfigPropertySetting(), xpe.getBean()); 109 configPropertiesSource.setConfigPropertySettings(bigger); 110 } else if (xpe.isRemoveEvent()) { 111 int index = -1; 112 for (int i = 0; i < configs.length; i++) { 113 if (configs[i].matches(xpe.getBean())) { 114 // remove the XMLBean 115 GerConfigPropertySettingType[] xmlConfigs = configPropertiesSource.getConfigPropertySettingArray(); 116 for (int j = 0; j < xmlConfigs.length; j++) { 117 GerConfigPropertySettingType test = xmlConfigs[j]; 118 if (test == configs[i].getConfigPropertySetting()) { 119 configPropertiesSource.removeConfigPropertySetting(j); 120 break; 121 } 122 } 123 // clean up the JavaBean 124 configs[i].dispose(); 125 index = i; 126 break; 127 } 128 } 129 // remove the JavaBean from my list 130 if (index > -1) { 131 ConfigPropertySettings[] smaller = new ConfigPropertySettings[configs.length - 1]; 132 System.arraycopy(configs, 0, smaller, 0, index); 133 System.arraycopy(configs, index + 1, smaller, index, smaller.length - index); 134 configPropertiesSource.setConfigPropertySettings(smaller); 135 } 136 } 137 // ignore change event (no contents, no attributes) 138 } 139 }; 140 parentDDBean.addXpathListener(configPropertyXPath, configListener); 141 return configListener; 142 } 143 144 public interface ConfigPropertiesSource { 145 GerConfigPropertySettingType[] getConfigPropertySettingArray(); 146 147 GerConfigPropertySettingType addNewConfigPropertySetting(); 148 149 void removeConfigPropertySetting(int j); 150 151 ConfigPropertySettings[] getConfigPropertySettings(); 152 153 void setConfigPropertySettings(ConfigPropertySettings[] configs); 154 } 155 }