/****************************************************************************
 * Copyright (c) 2009 Composent, Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/
package org.eclipse.ecf.examples.internal.eventadmin.app;

import java.util.Properties;

import org.eclipse.equinox.app.IApplication;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;

public class EventAdminClientApplication extends AbstractEventAdminApplication {

	private static final String DEFAULT_CONTAINER_TYPE = "ecf.jms.activemq.tcp.client";
	private static final String DEFAULT_TOPIC = EventAdminManagerApplication.DEFAULT_TOPIC;
	private static final String DEFAULT_CONTAINER_TARGET = EventAdminManagerApplication.DEFAULT_CONTAINER_ID;

	private TestSender testSender;
	private ServiceRegistration testEventHandlerRegistration;

	protected Object run() {

		// XXX for testing, setup an event handler
		Properties props = new Properties();
		props.put(EventConstants.EVENT_TOPIC, DEFAULT_TOPIC);
		testEventHandlerRegistration = bundleContext.registerService(
				EventHandler.class.getName(), new TestEventHandler("Client"), props);

		// XXX for testing, setup a test sender
		testSender = new TestSender(eventAdminImpl, topics, container.getID()
				.getName());
		new Thread(testSender).start();

		// Now just wait until we're stopped
		waitForDone();

		return IApplication.EXIT_OK;
	}

	protected void shutdown() {
		if (testSender != null) {
			testSender.stop();
			testSender = null;
		}
		if (testEventHandlerRegistration != null) {
			testEventHandlerRegistration.unregister();
			testEventHandlerRegistration = null;
		}
		super.shutdown();
	}

	protected String usageApplicationId() {
		return "org.eclipse.ecf.examples.eventadmin.app.EventAdminClient";
	}

	protected String usageParameters() {
		StringBuffer buf = new StringBuffer("\n\t-containerType <default:"
				+ DEFAULT_CONTAINER_TYPE + ">");
		buf.append("\n\t-targetId <default:" + DEFAULT_CONTAINER_TARGET + ">");
		buf.append("\n\t-topic <default:" + DEFAULT_TOPIC + ">");
		return buf.toString();
	}

	protected void processArgs(String[] args) {
		containerType = DEFAULT_CONTAINER_TYPE;
		containerId = null;
		targetId = DEFAULT_CONTAINER_TARGET;
		for (int i = 0; i < args.length; i++) {
			if (args[i].equals("-containerType")) {
				containerType = args[i + 1];
				i++;
			} else if (args[i].equals("-targetId")) {
				targetId = args[i + 1];
				i++;
			} else if (args[i].equals("-topic")) {
				topics = new String[] {args[i + 1]};
				i++;
			}
		}
	}
}
