/* * 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.core.server.impl.fakes; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.apache.activemq.artemis.core.filter.Filter; import org.apache.activemq.artemis.core.server.Consumer; import org.apache.activemq.artemis.core.server.HandleStatus; import org.apache.activemq.artemis.core.server.MessageReference; public class FakeConsumer implements Consumer { private HandleStatus statusToReturn = HandleStatus.HANDLED; private HandleStatus newStatus; private int delayCountdown = 0; private final LinkedList<MessageReference> references = new LinkedList<>(); private final Filter filter; public FakeConsumer() { filter = null; } public FakeConsumer(final Filter filter) { this.filter = filter; } @Override public Filter getFilter() { return filter; } @Override public String debug() { return toString(); } public synchronized MessageReference waitForNextReference(long timeout) { while (references.isEmpty() && timeout > 0) { long start = System.currentTimeMillis(); try { wait(); } catch (InterruptedException e) { } timeout -= System.currentTimeMillis() - start; } if (timeout <= 0) { throw new IllegalStateException("Timed out waiting for reference"); } return references.removeFirst(); } public synchronized void setStatusImmediate(final HandleStatus newStatus) { statusToReturn = newStatus; } public synchronized void setStatusDelayed(final HandleStatus newStatus, final int numReferences) { this.newStatus = newStatus; delayCountdown = numReferences; } @Override public long sequentialID() { return 0; } public synchronized List<MessageReference> getReferences() { return references; } public synchronized void clearReferences() { references.clear(); } @Override public synchronized HandleStatus handle(final MessageReference reference) { try { if (statusToReturn == HandleStatus.BUSY) { return HandleStatus.BUSY; } if (filter != null) { if (filter.match(reference.getMessage())) { references.addLast(reference); reference.getQueue().referenceHandled(); notify(); return HandleStatus.HANDLED; } else { return HandleStatus.NO_MATCH; } } if (newStatus != null) { if (delayCountdown == 0) { statusToReturn = newStatus; newStatus = null; } else { delayCountdown--; } } if (statusToReturn == HandleStatus.HANDLED) { reference.getQueue().referenceHandled(); references.addLast(reference); notify(); } return statusToReturn; } catch (Exception e) { e.printStackTrace(); throw new IllegalStateException(e.getMessage(), e); } } @Override public void proceedDeliver(MessageReference ref) throws Exception { // no op } @Override public String toManagementString() { return toString(); } @Override public void disconnect() { //To change body of implemented methods use File | Settings | File Templates. } @Override public List<MessageReference> getDeliveringMessages() { return Collections.emptyList(); } }