/* * 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.core.server.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.core.server.Queue; import org.apache.activemq.artemis.core.server.RouteContextList; import org.apache.activemq.artemis.core.server.RoutingContext; import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.core.transaction.Transaction; public final class RoutingContextImpl implements RoutingContext { // The pair here is Durable and NonDurable private final Map<SimpleString, RouteContextList> map = new HashMap<>(); private Transaction transaction; private int queueCount; private SimpleString address; private RoutingType routingType; public RoutingContextImpl(final Transaction transaction) { this.transaction = transaction; } @Override public void clear() { transaction = null; map.clear(); queueCount = 0; } @Override public void addQueue(final SimpleString address, final Queue queue) { RouteContextList listing = getContextListing(address); if (queue.isDurable()) { listing.getDurableQueues().add(queue); } else { listing.getNonDurableQueues().add(queue); } queueCount++; } @Override public void addQueueWithAck(SimpleString address, Queue queue) { addQueue(address, queue); RouteContextList listing = getContextListing(address); listing.addAckedQueue(queue); } @Override public boolean isAlreadyAcked(SimpleString address, Queue queue) { RouteContextList listing = map.get(address); return listing == null ? false : listing.isAlreadyAcked(queue); } @Override public void setAddress(SimpleString address) { this.address = address; } @Override public void setRoutingType(RoutingType routingType) { this.routingType = routingType; } @Override public SimpleString getAddress() { return address; } @Override public RoutingType getRoutingType() { return routingType; } @Override public RouteContextList getContextListing(SimpleString address) { RouteContextList listing = map.get(address); if (listing == null) { listing = new ContextListing(); map.put(address, listing); } return listing; } @Override public Transaction getTransaction() { return transaction; } @Override public void setTransaction(final Transaction tx) { transaction = tx; } @Override public List<Queue> getNonDurableQueues(SimpleString address) { return getContextListing(address).getNonDurableQueues(); } @Override public List<Queue> getDurableQueues(SimpleString address) { return getContextListing(address).getDurableQueues(); } @Override public int getQueueCount() { return queueCount; } @Override public Map<SimpleString, RouteContextList> getContexListing() { return this.map; } private static class ContextListing implements RouteContextList { private final List<Queue> durableQueue = new ArrayList<>(1); private final List<Queue> nonDurableQueue = new ArrayList<>(1); private final List<Queue> ackedQueues = new ArrayList<>(); @Override public int getNumberOfDurableQueues() { return durableQueue.size(); } @Override public int getNumberOfNonDurableQueues() { return nonDurableQueue.size(); } @Override public List<Queue> getDurableQueues() { return durableQueue; } @Override public List<Queue> getNonDurableQueues() { return nonDurableQueue; } @Override public void addAckedQueue(Queue queue) { ackedQueues.add(queue); } @Override public boolean isAlreadyAcked(Queue queue) { return ackedQueues.contains(queue); } } }