/*
* 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.synapse.eventing.managers;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.axis2.context.MessageContext;
import org.apache.synapse.SynapseException;
import org.apache.synapse.eventing.SynapseEventingConstants;
import org.apache.synapse.eventing.filters.TopicBasedEventFilter;
import org.apache.synapse.util.xpath.SynapseXPath;
import org.jaxen.JaxenException;
import org.wso2.eventing.*;
import org.wso2.eventing.exceptions.EventException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
*
*/
public class DefaultInMemorySubscriptionManager implements SubscriptionManager<MessageContext> {
private final Map<String, Subscription> store =
new ConcurrentHashMap<String, Subscription>();
private String topicHeaderName;
private String topicHeaderNS;
private SynapseXPath topicXPath;
private final Map<String, String> properties = new HashMap<String, String>();
private static final Log log = LogFactory.getLog(DefaultInMemorySubscriptionManager.class);
public List<Subscription> getStaticSubscriptions() {
LinkedList<Subscription> list = new LinkedList<Subscription>();
for (Subscription storeSubscription : store.values()) {
if (storeSubscription.isStaticEntry()) {
list.add(storeSubscription);
}
}
return list;
}
public String subscribe(Subscription subscription) throws EventException {
if (subscription.getId() == null) {
subscription.setId(org.apache.axiom.om.util.UUIDGenerator.getUUID());
}
store.put(subscription.getId(), subscription);
return subscription.getId();
}
public boolean unsubscribe(String id) throws EventException {
if (store.containsKey(id)) {
store.remove(id);
return true;
} else {
return false;
}
}
public boolean renew(Subscription subscription) throws EventException {
Subscription subscriptionOld = getSubscription(subscription.getId());
if (subscriptionOld != null) {
subscriptionOld.setExpires(subscription.getExpires());
return true;
} else {
return false;
}
}
public List<Subscription> getSubscriptions() throws EventException {
LinkedList<Subscription> list = new LinkedList<Subscription>();
for (Map.Entry<String, Subscription> stringSubscriptionEntry : store.entrySet()) {
list.add(stringSubscriptionEntry.getValue());
}
return list;
}
public List<Subscription> getAllSubscriptions() throws EventException {
LinkedList<Subscription> list = new LinkedList<Subscription>();
for (Map.Entry<String, Subscription> stringSubscriptionEntry : store.entrySet()) {
list.add(stringSubscriptionEntry.getValue());
}
return list;
}
public List<Subscription> getMatchingSubscriptions(Event<MessageContext> event)
throws EventException {
final LinkedList<Subscription> list = new LinkedList<Subscription>();
for (Map.Entry<String, Subscription> stringSubscriptionEntry : store.entrySet()) {
//TODO : pick the filter based on the dialect
//XPathBasedEventFilter filter = new XPathBasedEventFilter();
TopicBasedEventFilter filter = new TopicBasedEventFilter();
if (filter != null) {
filter.setResultValue(stringSubscriptionEntry.getValue().getFilterValue());
filter.setSourceXpath(topicXPath);
//evaluatedValue = topicXPath.stringValueOf(mc);
}
if (filter == null || filter.match(event)) {
Subscription subscription = stringSubscriptionEntry.getValue();
Calendar current = Calendar.getInstance(); //Get current date and time
if (subscription.getExpires() != null) {
if (current.before(subscription.getExpires())) {
// add only valid subscriptions by checking the expiration
list.add(subscription);
}
} else {
// If a expiration dosen't exisits treat it as a never expire subscription, valid till unsubscribe
list.add(subscription);
}
}
}
return list;
}
public Subscription getSubscription(String id) {
return store.get(id);
}
public Subscription getStatus(String s) throws EventException {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public void init() {
try {
//TODO: pick values from the constants
topicHeaderName = getPropertyValue("topicHeaderName");
if(topicHeaderName==null){
handleException("Unable to create topic header topic header name is null");
}
topicHeaderNS = getPropertyValue("topicHeaderNS");
if(topicHeaderNS==null){
handleException("Unable to create topic header topic header namespace is null");
}
topicXPath = new SynapseXPath(
"s11:Header/ns:" + topicHeaderName + " | s12:Header/ns:" + topicHeaderName);
topicXPath.addNamespace("s11", "http://schemas.xmlsoap.org/soap/envelope/");
topicXPath.addNamespace("s12", "http://www.w3.org/2003/05/soap-envelope");
topicXPath.addNamespace("ns", topicHeaderNS);
} catch (JaxenException e) {
handleException("Unable to create the topic header XPath", e);
}
}
public void addProperty(String name, String value) {
properties.put(name, value);
}
public Collection<String> getPropertyNames() {
return properties.keySet();
}
public String getPropertyValue(String name) {
return properties.get(name);
}
private void handleException(String message) {
log.error(message);
throw new SynapseException(message);
}
private void handleException(String message, Exception e) {
log.error(message, e);
throw new SynapseException(message, e);
}
}