/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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.savan.eventing.subscribers;

import org.apache.axis2.addressing.EndpointReference;
import org.apache.savan.eventing.Delivery;
import org.apache.savan.subscribers.CompositeSubscriber;

public class EventingTopicSubscriber extends CompositeSubscriber implements EventingSubscriber {
	
	private EndpointReference endToEPr;
	
	private Delivery delivery;
	
	public Delivery getDelivery() {
		return delivery;
	}

	public EndpointReference getEndToEPr() {
		return endToEPr;
	}

	public void setDelivery(Delivery delivery) {
		this.delivery = delivery;
	}

	public void setEndToEPr(EndpointReference errorReportingEPR) {
		this.endToEPr = errorReportingEPR;
	}
	
	
}
