/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.util.queue; import org.mule.runtime.core.api.MuleContext; import java.io.Serializable; import org.apache.commons.lang.NotImplementedException; /** * Internal queue implementation that will execute operations directly to the queue storage. Stores information about a Queue */ public class DefaultQueueStore implements RecoverableQueueStore { private QueueConfiguration config; private String name; private QueueStoreDelegate delegate; private MuleContext muleContext; public DefaultQueueStore(String name, MuleContext muleContext, QueueConfiguration config) { this.name = name; this.muleContext = muleContext; setConfigAndDelegate(config); } public void setConfig(QueueConfiguration config) { setConfigAndDelegate(config); } private void setConfigAndDelegate(QueueConfiguration newConfig) { if (delegate != null) { return; } this.config = newConfig; if (this.config == null) { this.config = new DefaultQueueConfiguration(); } if (this.config.isPersistent()) { delegate = new DualRandomAccessFileQueueStoreDelegate(this.name, muleContext.getConfiguration().getWorkingDirectory(), muleContext, this.config.getCapacity()); } else { delegate = new DefaultQueueStoreDelegate(this.config.getCapacity()); } } @Override public boolean equals(Object obj) { return (obj instanceof DefaultQueueStore && name.equals(((DefaultQueueStore) obj).name)); } public String getName() { return name; } @Override public int hashCode() { return name.hashCode(); } public void putNow(Serializable o) { delegate.putNow(o); } public boolean offer(Serializable o, int room, long timeout) throws InterruptedException { return delegate.offer(o, room, timeout); } public Serializable poll(long timeout) throws InterruptedException { return delegate.poll(timeout); } public Serializable peek() throws InterruptedException { return delegate.peek(); } public void untake(Serializable item) throws InterruptedException { delegate.untake(item); } public int getSize() { return delegate.getSize(); } public void clear() throws InterruptedException { this.delegate.clear(); } public void dispose() { this.delegate.dispose(); } public int getCapacity() { return config == null ? null : config.getCapacity(); } public void remove(Serializable value) { if (this.delegate instanceof TransactionalQueueStoreDelegate) { ((TransactionalQueueStoreDelegate) delegate).remove(value); } else { throw new NotImplementedException(String.format("Queue of type %s does not support remove", delegate.getClass().getCanonicalName())); } } public boolean contains(Serializable value) { if (this.delegate instanceof TransactionalQueueStoreDelegate) { return ((TransactionalQueueStoreDelegate) delegate).contains(value); } else { throw new NotImplementedException(String.format("Queue of type %s does not support contains", delegate.getClass().getCanonicalName())); } } public void close() { if (this.delegate instanceof TransactionalQueueStoreDelegate) { ((TransactionalQueueStoreDelegate) delegate).close(); } else { throw new NotImplementedException(String.format("Queue of type %s does not support close", delegate.getClass().getCanonicalName())); } } @Override public boolean isPersistent() { return config.isPersistent(); } }