/*
* 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.wso2.esb.integration.common.clients.mediation;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.databinding.types.URI;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.event.client.stub.generated.*;
import org.wso2.carbon.event.client.stub.generated.addressing.AttributedURI;
import org.wso2.carbon.event.client.stub.generated.addressing.EndpointReferenceType;
import org.wso2.carbon.event.client.stub.generated.addressing.ReferenceParametersType;
import javax.xml.namespace.QName;
import java.rmi.RemoteException;
public class EventBrokerAdminClient {
private static final Log log = LogFactory.getLog(EventBrokerAdminClient.class);
String backendUrl = null;
String SessionCookie = null;
ConfigurationContext configurationContext = null;
private static final String TOPIC_HEADER_NAME = "topic";
private static final String TOPIC_HEADER_NS = "http://wso2.org/ns/2009/09/eventing/notify";
public static final String WSE_EVENTING_NS = "http://schemas.xmlsoap.org/ws/2004/08/eventing";
public static final String WSE_EN_IDENTIFIER = "Identifier";
private static OMFactory omFactory = OMAbstractFactory.getOMFactory();
public EventBrokerAdminClient(String backendUrl, String sessionCookie,
ConfigurationContext configurationContext) {
this.backendUrl = backendUrl + "EventBrokerService";
this.SessionCookie = sessionCookie;
this.configurationContext = configurationContext;
}
public String subscribe(String topic, String eventSinkUrl) throws RemoteException {
log.debug("Subscribed to "+ topic + " in "+ eventSinkUrl);
try {
// append the topic name at the end of the broker URL
// so that it seems there is a seperate uri each event source
if (!topic.startsWith("/")){
topic = "/" + topic;
}
EventBrokerServiceStub stub = new EventBrokerServiceStub(configurationContext,
backendUrl + topic);
ServiceClient client = stub._getServiceClient();
configureCookie(client);
EndpointReferenceType epr = new EndpointReferenceType();
epr.setAddress(createURI(eventSinkUrl));
DeliveryType deliveryType = new DeliveryType();
EndpointReferenceType eventSink = new EndpointReferenceType();
eventSink.setAddress(createURI(eventSinkUrl));
deliveryType.setNotifyTo(eventSink);
ExpirationType expirationType = null;
FilterType filterType = new FilterType();
filterType.setDialect(new URI("urn:someurl"));
filterType.setString(topic);
SubscribeResponse subscribeResponse = stub.subscribe(epr, deliveryType, expirationType,
filterType, null);
ReferenceParametersType referenceParameters =
subscribeResponse.getSubscriptionManager().getReferenceParameters();
OMElement[] properties = referenceParameters.getExtraElement();
String id = null;
for(OMElement property:properties){
if(property.getLocalName().equals("Identifier")){
id = property.getText();
}
}
return id;
} catch (AxisFault e) {
e.printStackTrace();
} catch (URI.MalformedURIException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
return null;
}
public void publish(String topic, OMElement element) throws AxisFault {
log.debug("published element to "+ topic );
EventBrokerServiceStub service = new EventBrokerServiceStub(configurationContext, backendUrl
+"/publish/"+topic);
configureCookie(service._getServiceClient());
ServiceClient serviceClient = service._getServiceClient();
OMElement header = omFactory.createOMElement(new QName(TOPIC_HEADER_NS, TOPIC_HEADER_NAME));
header.setText(topic);
serviceClient.addHeader(header);
serviceClient.getOptions().setTo(new EndpointReference(backendUrl+"/publish"));
//serviceClient.getOptions().setTo(new EndpointReference(brokerUrl));
serviceClient.getOptions().setAction("urn:publish");
serviceClient.sendRobust(element);
}
public void unsubscribe(String subscriptionID) throws RemoteException {
log.debug("Unsubscribed to "+ subscriptionID);
EventBrokerServiceStub service = new EventBrokerServiceStub(configurationContext, backendUrl);
configureCookie(service._getServiceClient());
ServiceClient serviceClient = service._getServiceClient();
OMElement header = omFactory.createOMElement(new QName(WSE_EVENTING_NS, WSE_EN_IDENTIFIER));
header.setText(subscriptionID);
serviceClient.addHeader(header);
service.unsubscribe(new OMElement[]{});
}
public GetSubscriptionsResponse getAllSubscriptions(int maxRequestCount, String resultFilter, int firstIndex) throws RemoteException {
EventBrokerServiceStub service = new EventBrokerServiceStub(configurationContext, backendUrl);
configureCookie(service._getServiceClient());
return service.getSubscriptions(maxRequestCount, resultFilter, firstIndex);
}
private void configureCookie(ServiceClient client) throws AxisFault {
if(SessionCookie != null){
Options option = client.getOptions();
option.setManageSession(true);
option.setProperty(org.apache.axis2.transport.http.HTTPConstants.COOKIE_STRING, SessionCookie);
}
}
private static AttributedURI createURI(String uriAddress) throws URI.MalformedURIException {
AttributedURI address = new AttributedURI();
address.setAnyURI(new URI(uriAddress));
return address;
}
}