/**
* 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.camel.component.ironmq;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.UUID;
import io.iron.ironmq.Client;
import io.iron.ironmq.EmptyQueueException;
import io.iron.ironmq.HTTPException;
import io.iron.ironmq.Ids;
import io.iron.ironmq.Message;
import io.iron.ironmq.MessageOptions;
import io.iron.ironmq.Messages;
import io.iron.ironmq.Queue;
public class MockQueue extends Queue {
private Map<String, Message> messages = new LinkedHashMap<String, Message>();
public MockQueue(Client client, String name) {
super(client, name);
}
@Override
public String push(String msg, long delay) throws IOException {
String randint = new BigInteger(24 * 8, new Random()).toString(16);
Message message = new Message();
message.setBody(msg);
message.setDelay(delay);
message.setId(randint);
message.setReservationId(UUID.randomUUID().toString());
messages.put(randint, message);
return randint;
}
@Override
public Ids pushMessages(String[] msg, long delay) throws IOException {
for (String messageName : msg) {
Message message = new Message();
message.setBody(messageName);
message.setDelay(delay);
String randint = new BigInteger(24 * 8, new Random()).toString(16);
message.setId(randint);
message.setReservationId(UUID.randomUUID().toString());
messages.put(randint, message);
}
Ids ids = null;
try {
Constructor<Ids> constructor = Ids.class.getDeclaredConstructor(Messages.class);
constructor.setAccessible(true);
Messages messageList = new Messages(new ArrayList<Message>(messages.values()));
ids = constructor.newInstance(messageList);
} catch (Exception e) {
}
return ids;
}
@Override
public void deleteMessage(String id, String reservationId) throws IOException {
if (messages.containsKey(id)) {
messages.remove(id);
} else {
throw new HTTPException(404, "not found");
}
}
@Override
public void deleteMessages(Messages messages) throws IOException {
MessageOptions[] messageOptions = messages.toMessageOptions();
for (MessageOptions messageOption : messageOptions) {
deleteMessage(messageOption.getId(), messageOption.getReservationId());
}
}
@Override
public Message peek() throws IOException {
if (messages.size() > 0) {
return messages.entrySet().iterator().next().getValue();
}
throw new EmptyQueueException();
}
@Override
public Message reserve() throws IOException {
if (messages.size() > 0) {
Entry<String, Message> next = messages.entrySet().iterator().next();
return next.getValue();
}
throw new EmptyQueueException();
}
@Override
public Messages reserve(int numberOfMessages) throws IOException {
return reserve(numberOfMessages, 120);
}
@Override
public Messages reserve(int numberOfMessages, int timeout, int wait) throws IOException {
if (messages.size() > 0) {
Iterator<Entry<String, Message>> iterator = messages.entrySet().iterator();
int i = 0;
List<Message> list = new ArrayList<Message>();
while (iterator.hasNext() && i < numberOfMessages) {
Entry<String, Message> next = iterator.next();
list.add(next.getValue());
i++;
}
Messages messages = new Messages(list.toArray(new Message[list.size()]));
return messages;
}
throw new EmptyQueueException();
}
void add(Message message) {
messages.put(message.getId(), message);
}
}