@Test public void testWildCardAddressRemovalDifferentWildcard() throws Exception { final WildcardConfiguration configuration = new WildcardConfiguration(); configuration.setAnyWords('>'); WildcardAddressManager ad = new WildcardAddressManager(new BindingFactoryFake(), configuration, null); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.>"), RoutingType.MULTICAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.test"), RoutingType.MULTICAST)); ad.addBinding(new BindingFake("Topic1.>", "one")); assertEquals(1, ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.>")).getBindings().size()); assertEquals(1, ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.test")).getBindings().size()); assertEquals(0, ad.getDirectBindings(SimpleString.toSimpleString("Topic1.test")).getBindings().size()); assertEquals(1, ad.getDirectBindings(SimpleString.toSimpleString("Topic1.>")).getBindings().size()); //Remove the address ad.removeAddressInfo(SimpleString.toSimpleString("Topic1.test")); //should still have 1 address and binding assertEquals(1, ad.getAddresses().size()); assertEquals(1, ad.getBindings().size()); ad.removeBinding(SimpleString.toSimpleString("one"), null); ad.removeAddressInfo(SimpleString.toSimpleString("Topic1.>")); assertEquals(0, ad.getAddresses().size()); assertEquals(0, ad.getBindings().size()); }
private synchronized Address addAndUpdateAddressMap(final SimpleString address) { Address add = new AddressImpl(address, wildcardConfiguration); Address actualAddress; if (add.containsWildCard()) { actualAddress = wildCardAddresses.get(address); } else { actualAddress = addresses.get(address); } if (actualAddress == null) { actualAddress = add; addAddress(address, actualAddress); } if (actualAddress.containsWildCard()) { for (Address destAdd : addresses.values()) { if (destAdd.matches(actualAddress)) { destAdd.addLinkedAddress(actualAddress); actualAddress.addLinkedAddress(destAdd); } } } else { for (Address destAdd : wildCardAddresses.values()) { if (actualAddress.matches(destAdd)) { destAdd.addLinkedAddress(actualAddress); actualAddress.addLinkedAddress(destAdd); } } } return actualAddress; }
/** * If the address is a wild card then the binding will be removed from the actual mappings for any linked address. * otherwise it will be removed as normal. * * @param uniqueName the name of the binding to remove * @return true if this was the last mapping for a specific address */ @Override public Binding removeBinding(final SimpleString uniqueName, Transaction tx) throws Exception { Binding binding = super.removeBinding(uniqueName, tx); if (binding != null) { Address add = getAddress(binding.getAddress()); if (add.containsWildCard()) { for (Address theAddress : add.getLinkedAddresses()) { super.removeBindingInternal(theAddress.getAddress(), uniqueName); } } removeAndUpdateAddressMap(add); } return binding; }
@Test public void testUnitOnWildCardFailingScenarioFQQN() throws Exception { int errors = 0; WildcardAddressManager ad = new WildcardAddressManager(new BindingFactoryFake(), null); ad.addBinding(new BindingFake("Topic1", "Topic1")); ad.addBinding(new BindingFake("Topic1", "one")); ad.addBinding(new BindingFake("*", "two")); ad.removeBinding(SimpleString.toSimpleString("Topic1::one"), null); try { ad.removeBinding(SimpleString.toSimpleString("*::two"), null); } catch (Throwable e) { // We are not failing the test here as this test is replicating the exact scenario // that was happening under https://issues.jboss.org/browse/HORNETQ-988 // In which this would be ignored errors++; e.printStackTrace(); } try { ad.addBinding(new BindingFake("Topic1", "three")); } catch (Throwable e) { // We are not failing the test here as this test is replicating the exact scenario // that was happening under https://issues.jboss.org/browse/HORNETQ-988 // In which this would be ignored errors++; e.printStackTrace(); } assertEquals("Exception happened during the process", 0, errors); }
/** * Test for ARTEMIS-1610 * @throws Exception */ @SuppressWarnings("unchecked") @Test public void testWildCardAddressRemoval() throws Exception { WildcardAddressManager ad = new WildcardAddressManager(new BindingFactoryFake(), null); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Queue1.#"), RoutingType.ANYCAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.#"), RoutingType.MULTICAST)); ad.addBinding(new BindingFake("Topic1.topic", "two")); ad.addBinding(new BindingFake("Queue1.#", "one")); Field wildcardAddressField = WildcardAddressManager.class.getDeclaredField("wildCardAddresses"); wildcardAddressField.setAccessible(true); Map<SimpleString, Address> wildcardAddresses = (Map<SimpleString, Address>)wildcardAddressField.get(ad); //Calling this method will trigger the wildcard to be added to the wildcard map internal //to WildcardAddressManager ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.#")); //Remove the address ad.removeAddressInfo(SimpleString.toSimpleString("Topic1.#")); //Verify the address was cleaned up properly assertEquals(1, wildcardAddresses.size()); assertNull(ad.getAddressInfo(SimpleString.toSimpleString("Topic1.#"))); assertNull(wildcardAddresses.get(SimpleString.toSimpleString("Topic1.#"))); }
@Test public void testWildCardAddressDirectBindings() throws Exception { final WildcardConfiguration configuration = new WildcardConfiguration(); configuration.setAnyWords('>'); WildcardAddressManager ad = new WildcardAddressManager(new BindingFactoryFake(), configuration, null); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.>"), RoutingType.MULTICAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.test"), RoutingType.MULTICAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.test.test1"), RoutingType.MULTICAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic1.test.test2"), RoutingType.MULTICAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic2.>"), RoutingType.MULTICAST)); ad.addAddressInfo(new AddressInfo(SimpleString.toSimpleString("Topic2.test"), RoutingType.MULTICAST)); ad.addBinding(new BindingFake("Topic1.>", "one")); ad.addBinding(new BindingFake("Topic1.test", "two")); ad.addBinding(new BindingFake("Topic2.test", "three")); assertEquals(1, ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.>")).getBindings().size()); assertEquals(2, ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.test")).getBindings().size()); assertEquals(1, ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.test.test1")).getBindings().size()); assertEquals(1, ad.getBindingsForRoutingAddress(SimpleString.toSimpleString("Topic1.test.test2")).getBindings().size()); assertEquals(1, ad.getDirectBindings(SimpleString.toSimpleString("Topic1.>")).getBindings().size()); assertEquals(1, ad.getDirectBindings(SimpleString.toSimpleString("Topic1.test")).getBindings().size()); assertEquals(0, ad.getDirectBindings(SimpleString.toSimpleString("Topic1.test1")).getBindings().size()); assertEquals(0, ad.getDirectBindings(SimpleString.toSimpleString("Topic1.test2")).getBindings().size()); assertEquals(0, ad.getDirectBindings(SimpleString.toSimpleString("Topic2.>")).getBindings().size()); assertEquals(1, ad.getDirectBindings(SimpleString.toSimpleString("Topic2.test")).getBindings().size()); }
@Override public void updateMessageLoadBalancingTypeForAddress(SimpleString address, MessageLoadBalancingType messageLoadBalancingType) throws Exception { Address add = addAndUpdateAddressMap(address); Bindings bindingsForRoutingAddress = super.getBindingsForRoutingAddress(address); if (bindingsForRoutingAddress != null) { bindingsForRoutingAddress.setMessageLoadBalancingType(messageLoadBalancingType); } if (add.containsWildCard()) { for (Address destAdd : add.getLinkedAddresses()) { getBindingsForRoutingAddress(destAdd.getAddress()).setMessageLoadBalancingType(messageLoadBalancingType); } } else { for (Address destAdd : add.getLinkedAddresses()) { super.getBindingsForRoutingAddress(destAdd.getAddress()).setMessageLoadBalancingType(messageLoadBalancingType); } } }
public PostOfficeImpl(final ActiveMQServer server, final StorageManager storageManager, final PagingManager pagingManager, final QueueFactory bindableFactory, final ManagementService managementService, final long expiryReaperPeriod, final long addressQueueReaperPeriod, final WildcardConfiguration wildcardConfiguration, final int idCacheSize, final boolean persistIDCache, final HierarchicalRepository<AddressSettings> addressSettingsRepository) { this.storageManager = storageManager; queueFactory = bindableFactory; this.managementService = managementService; this.pagingManager = pagingManager; this.expiryReaperPeriod = expiryReaperPeriod; this.addressQueueReaperPeriod = addressQueueReaperPeriod; if (wildcardConfiguration.isRoutingEnabled()) { addressManager = new WildcardAddressManager(this, wildcardConfiguration, storageManager); } else { addressManager = new SimpleAddressManager(this, wildcardConfiguration, storageManager); } this.idCacheSize = idCacheSize; this.persistIDCache = persistIDCache; this.addressSettingsRepository = addressSettingsRepository; this.server = server; }
@Override public Bindings getBindingsForRoutingAddress(final SimpleString address) throws Exception { Bindings bindings = super.getBindingsForRoutingAddress(address); // this should only happen if we're routing to an address that has no mappings when we're running checkAllowable if (bindings == null && !wildCardAddresses.isEmpty()) { Address add = addAndUpdateAddressMap(address); if (!add.containsWildCard()) { for (Address destAdd : add.getLinkedAddresses()) { Bindings b = super.getBindingsForRoutingAddress(destAdd.getAddress()); if (b != null) { Collection<Binding> theBindings = b.getBindings(); for (Binding theBinding : theBindings) { super.addMappingInternal(address, theBinding); } super.getBindingsForRoutingAddress(address).setMessageLoadBalancingType(b.getMessageLoadBalancingType()); } } } bindings = super.getBindingsForRoutingAddress(address); } return bindings; }
@Test public void testUnitOnWildCardFailingScenario() throws Exception { int errors = 0; WildcardAddressManager ad = new WildcardAddressManager(new BindingFactoryFake(), null); ad.addBinding(new BindingFake("Topic1", "Topic1")); ad.addBinding(new BindingFake("Topic1", "one")); ad.addBinding(new BindingFake("*", "two")); ad.removeBinding(SimpleString.toSimpleString("one"), null); try { ad.removeBinding(SimpleString.toSimpleString("two"), null); } catch (Throwable e) { // We are not failing the test here as this test is replicating the exact scenario // that was happening under https://issues.jboss.org/browse/HORNETQ-988 // In which this would be ignored errors++; e.printStackTrace(); } try { ad.addBinding(new BindingFake("Topic1", "three")); } catch (Throwable e) { // We are not failing the test here as this test is replicating the exact scenario // that was happening under https://issues.jboss.org/browse/HORNETQ-988 // In which this would be ignored errors++; e.printStackTrace(); } assertEquals("Exception happened during the process", 0, errors); }
/** * If the address to add the binding to contains a wildcard then a copy of the binding (with the same underlying queue) * will be added to the actual mappings. Otherwise the binding is added as normal. * * @param binding the binding to add * @return true if the address was a new mapping */ @Override public boolean addBinding(final Binding binding) throws Exception { boolean exists = super.addBinding(binding); if (!exists) { Address add = addAndUpdateAddressMap(binding.getAddress()); if (add.containsWildCard()) { for (Address destAdd : add.getLinkedAddresses()) { super.addMappingInternal(destAdd.getAddress(), binding); } } else { for (Address destAdd : add.getLinkedAddresses()) { Bindings bindings = super.getBindingsForRoutingAddress(destAdd.getAddress()); if (bindings != null) { for (Binding b : bindings.getBindings()) { super.addMappingInternal(binding.getAddress(), b); } } } } } return exists; }