/**
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.synapse.message.store.impl.memory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.MessageContext;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.message.MessageConsumer;
import org.apache.synapse.message.MessageProducer;
import org.apache.synapse.message.store.AbstractMessageStore;
import org.apache.synapse.message.store.Constants;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class InMemoryStore extends AbstractMessageStore {
private static final Log logger = LogFactory.getLog(InMemoryStore.class.getName());
private Queue<MessageContext> queue = new ConcurrentLinkedQueue<MessageContext>();
private final Object queueLock = new Object();
public MessageProducer getProducer() {
InMemoryProducer producer = new InMemoryProducer(this);
producer.setId(nextProducerId());
producer.setDestination(queue);
if (logger.isDebugEnabled()) {
logger.debug(nameString() + " created a new In Memory Message Producer.");
}
return producer;
}
public MessageConsumer getConsumer() {
InMemoryConsumer consumer = new InMemoryConsumer(this);
consumer.setId(nextConsumerId());
consumer.setDestination(queue);
if (logger.isDebugEnabled()) {
logger.debug(nameString() + " created a new In Memory Message Consumer.");
}
return consumer;
}
public int getType() {
return Constants.INMEMORY_MS;
}
public int size() {
synchronized (queueLock) {
return queue.size();
}
}
public MessageContext remove() throws NoSuchElementException {
MessageContext message;
synchronized (queueLock) {
message = queue.remove();
}
if (message != null) {
dequeued();
if (logger.isDebugEnabled()) {
logger.debug(nameString() + " removed MessageID:" + message.getMessageID() + " => true");
}
}
return message;
}
public void clear() {
synchronized (queueLock) {
while (!queue.isEmpty()) {
remove();
}
}
if (logger.isDebugEnabled()) {
logger.debug(nameString() + " cleared InMemoryStore...");
}
}
public MessageContext remove(final String messageID) {
MessageContext message = null;
synchronized (queueLock) {
for (MessageContext m : queue) {
if (m.getMessageID().equals(messageID)) {
message = m;
break;
}
}
if (message != null) {
boolean result = queue.remove(message);
if (logger.isDebugEnabled()) {
logger.debug(nameString() + " removed MessageID:" + message.getMessageID() + " => " + result);
}
}
}
return message;
}
public MessageContext get(final int index) {
if (index < 0 || index >= queue.size()) {
return null;
}
MessageContext message = null;
synchronized (queueLock) {
int i = 0;
for (MessageContext m : queue) {
if (i == index) {
message = m;
break;
}
++i;
}
}
return message;
}
public List<MessageContext> getAll() {
List<MessageContext> list = new ArrayList<MessageContext>();
synchronized (queueLock) {
list.addAll(queue);
}
return list;
}
public MessageContext get(String messageId) {
MessageContext message = null;
synchronized (queueLock) {
for (MessageContext m : queue) {
if (m.getMessageID().equals(messageId)) {
message = m;
break;
}
}
}
return message;
}
public void init(SynapseEnvironment se) {
if (se == null) {
logger.error("Cannot initialize store.");
return;
}
super.init(se);
logger.info("Initialized " + nameString() + "...");
}
public void destroy() {
// do whatever...
if (logger.isDebugEnabled()) {
logger.debug("Destroying " + nameString() + "...");
}
super.destroy();
}
public Object getQLock() {
return queueLock;
}
private String nameString() {
return "Store [" + getName() + "]";
}
}