/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.artemis.tests.unit.ra; import java.beans.PropertyDescriptor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; import org.apache.activemq.artemis.ra.ActiveMQResourceAdapter; import org.apache.activemq.artemis.ra.ConnectionFactoryProperties; import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; import org.junit.Test; import static java.beans.Introspector.getBeanInfo; public class ConnectionFactoryPropertiesTest extends ActiveMQTestBase { private static final SortedSet<String> UNSUPPORTED_CF_PROPERTIES; private static final SortedSet<String> UNSUPPORTED_RA_PROPERTIES; static { UNSUPPORTED_CF_PROPERTIES = new TreeSet<>(); UNSUPPORTED_CF_PROPERTIES.add("discoveryGroupName"); UNSUPPORTED_CF_PROPERTIES.add("incomingInterceptorList"); UNSUPPORTED_CF_PROPERTIES.add("outgoingInterceptorList"); UNSUPPORTED_RA_PROPERTIES = new TreeSet<>(); UNSUPPORTED_RA_PROPERTIES.add("HA"); UNSUPPORTED_RA_PROPERTIES.add("jgroupsChannelName"); UNSUPPORTED_RA_PROPERTIES.add("jgroupsFile"); UNSUPPORTED_RA_PROPERTIES.add("discoveryAddress"); UNSUPPORTED_RA_PROPERTIES.add("discoveryPort"); UNSUPPORTED_RA_PROPERTIES.add("discoveryLocalBindAddress"); UNSUPPORTED_RA_PROPERTIES.add("discoveryRefreshTimeout"); UNSUPPORTED_RA_PROPERTIES.add("discoveryInitialWaitTimeout"); UNSUPPORTED_RA_PROPERTIES.add("connectionParameters"); UNSUPPORTED_RA_PROPERTIES.add("connectorClassName"); UNSUPPORTED_RA_PROPERTIES.add("managedConnectionFactory"); UNSUPPORTED_RA_PROPERTIES.add("jndiParams"); UNSUPPORTED_RA_PROPERTIES.add("password"); UNSUPPORTED_RA_PROPERTIES.add("passwordCodec"); UNSUPPORTED_RA_PROPERTIES.add("useMaskedPassword"); UNSUPPORTED_RA_PROPERTIES.add("useAutoRecovery"); UNSUPPORTED_RA_PROPERTIES.add("useLocalTx"); UNSUPPORTED_RA_PROPERTIES.add("userName"); UNSUPPORTED_RA_PROPERTIES.add("jgroupsChannelLocatorClass"); UNSUPPORTED_RA_PROPERTIES.add("jgroupsChannelRefName"); UNSUPPORTED_RA_PROPERTIES.add("entries"); // TODO: shouldn't this be also set on the ActiveMQConnectionFactory: // https://community.jboss.org/thread/211815?tstart=0 UNSUPPORTED_RA_PROPERTIES.add("connectionPoolName"); } @Test public void testCompareConnectionFactoryAndResourceAdapterProperties() throws Exception { SortedSet<String> connectionFactoryProperties = findAllPropertyNames(ActiveMQConnectionFactory.class); connectionFactoryProperties.removeAll(UNSUPPORTED_CF_PROPERTIES); SortedSet<String> raProperties = findAllPropertyNames(ActiveMQResourceAdapter.class); raProperties.removeAll(UNSUPPORTED_RA_PROPERTIES); compare("ActiveMQ Connection Factory", connectionFactoryProperties, "ActiveMQ Resource Adapter", raProperties); } private static void compare(String name1, SortedSet<String> set1, String name2, SortedSet<String> set2) { Set<String> onlyInSet1 = new TreeSet<>(set1); onlyInSet1.removeAll(set2); Set<String> onlyInSet2 = new TreeSet<>(set2); onlyInSet2.removeAll(set1); if (!onlyInSet1.isEmpty() || !onlyInSet2.isEmpty()) { fail(String.format("in %s only: %s\nin %s only: %s", name1, onlyInSet1, name2, onlyInSet2)); } assertEquals(set2, set1); } private SortedSet<String> findAllPropertyNames(Class<?> clazz) throws Exception { SortedSet<String> names = new TreeSet<>(); for (PropertyDescriptor propDesc : getBeanInfo(clazz).getPropertyDescriptors()) { if (propDesc == null || propDesc.getWriteMethod() == null) { continue; } names.add(propDesc.getDisplayName()); } return names; } @Test public void testEquality() throws Exception { ConnectionFactoryProperties cfp1 = new ConnectionFactoryProperties(); List<String> connectorClassNames1 = new ArrayList<>(); connectorClassNames1.add("myConnector"); cfp1.setParsedConnectorClassNames(connectorClassNames1); List<Map<String, Object>> connectionParameters1 = new ArrayList<>(); Map<String, Object> params1 = new HashMap<>(); params1.put("port", "0"); connectionParameters1.add(params1); cfp1.setParsedConnectionParameters(connectionParameters1); cfp1.setAutoGroup(true); ConnectionFactoryProperties cfp2 = new ConnectionFactoryProperties(); List<String> connectorClassNames2 = new ArrayList<>(); connectorClassNames2.add("myConnector"); cfp2.setParsedConnectorClassNames(connectorClassNames2); List<Map<String, Object>> connectionParameters2 = new ArrayList<>(); Map<String, Object> params2 = new HashMap<>(); params2.put("port", "0"); connectionParameters2.add(params2); cfp2.setParsedConnectionParameters(connectionParameters2); cfp2.setAutoGroup(true); assertTrue(cfp1.equals(cfp2)); } @Test public void testInequality() throws Exception { ConnectionFactoryProperties cfp1 = new ConnectionFactoryProperties(); List<String> connectorClassNames1 = new ArrayList<>(); connectorClassNames1.add("myConnector"); cfp1.setParsedConnectorClassNames(connectorClassNames1); List<Map<String, Object>> connectionParameters1 = new ArrayList<>(); Map<String, Object> params1 = new HashMap<>(); params1.put("port", "0"); connectionParameters1.add(params1); cfp1.setParsedConnectionParameters(connectionParameters1); cfp1.setAutoGroup(true); ConnectionFactoryProperties cfp2 = new ConnectionFactoryProperties(); List<String> connectorClassNames2 = new ArrayList<>(); connectorClassNames2.add("myConnector"); cfp2.setParsedConnectorClassNames(connectorClassNames2); List<Map<String, Object>> connectionParameters2 = new ArrayList<>(); Map<String, Object> params2 = new HashMap<>(); params2.put("port", "1"); connectionParameters2.add(params2); cfp2.setParsedConnectionParameters(connectionParameters2); cfp2.setAutoGroup(true); assertFalse(cfp1.equals(cfp2)); } @Test public void testInequality2() throws Exception { ConnectionFactoryProperties cfp1 = new ConnectionFactoryProperties(); List<String> connectorClassNames1 = new ArrayList<>(); connectorClassNames1.add("myConnector"); cfp1.setParsedConnectorClassNames(connectorClassNames1); List<Map<String, Object>> connectionParameters1 = new ArrayList<>(); Map<String, Object> params1 = new HashMap<>(); params1.put("port", "0"); connectionParameters1.add(params1); cfp1.setParsedConnectionParameters(connectionParameters1); cfp1.setAutoGroup(true); ConnectionFactoryProperties cfp2 = new ConnectionFactoryProperties(); List<String> connectorClassNames2 = new ArrayList<>(); connectorClassNames2.add("myConnector2"); cfp2.setParsedConnectorClassNames(connectorClassNames2); List<Map<String, Object>> connectionParameters2 = new ArrayList<>(); Map<String, Object> params2 = new HashMap<>(); params2.put("port", "0"); connectionParameters2.add(params2); cfp2.setParsedConnectionParameters(connectionParameters2); cfp2.setAutoGroup(true); assertFalse(cfp1.equals(cfp2)); } }