package com.ttv.acs.packageClient;

import com.twc.isa.PackageModule.PackageFactory;
import com.twc.isa.PackageModule.PackageFactoryHelper;
import com.twc.isa.PackageModule.PackageHelper;
import com.twc.isa.PackageModule.TransferException;
import com.twc.isa.PackageModule.VersionException;
import com.twc.isa.PackageModule.XmlProcessingException;
import com.twc.isa.ServerModule.AdministrativeState;
import com.twc.isa.ServerModule.DuplicateServant;
import com.twc.isa.ServerModule.InvalidName;
import com.twc.isa.ServerModule.InvalidStateChange;
import com.twc.isa.ServerModule.OutOfService;
import com.twc.isa.ServerModule.ProvisioningFailed;
import com.twc.isa.ServerModule.ServantBase_impl;
import com.twc.isa.ServerModule.ServantCreateFailed;
import com.twc.isa.ServerModule.UnspecifiedException;

/**
 * 
 * @author <a href="mailto:cbrown@tandbergtv.com">Corey Brown</a>
 *
 */
public class PackageClient {

	//false for old school clients, normally should be try
	public static final boolean TRY_TO_FIND_FIRST = false;

	public static void main(String[] args) {
		
		if (args.length < 2) {
			System.out.println("usage: PackageClient packageName packageURL (nameService)");
		} else {

			String packageName = args[0];
			String strURLName  = args[1];

			try {
				if (args.length > 2) {
					String nameService = args[2];
					provision(packageName, strURLName, nameService);
				} else {
					provision(packageName, strURLName);

				}

			} catch (Exception e) {
				System.out.println("Exception = " + e.getMessage());
				if (e.getCause() != null && e.getCause().getMessage() != null) {
					System.out.println("Cause = " + e.getCause().getMessage());
				}
			}
		}
	}

	public static void provision(String packageName, String strURLName)
		throws
			ProvisioningFailed,
			UnspecifiedException,
			DuplicateServant,
			OutOfService,
			TransferException,
			ServantCreateFailed,
			InvalidName,
			XmlProcessingException,
			VersionException,
			InvalidStateChange {
		provision(packageName, strURLName, null);
	}

	public static void provision(String packageName, String strURLName, String nameService)
		throws
			ProvisioningFailed,
			UnspecifiedException,
			DuplicateServant,
			OutOfService,
			TransferException,
			ServantCreateFailed,
			InvalidName,
			XmlProcessingException,
			VersionException,
			InvalidStateChange {
		
		org.omg.CORBA.ORB orb = null;

		String[] args = null;

		if (nameService == null) {
			System.out.println("NameService is null");
			args = new String[0];
		} else {
			System.out.println("NameService = " + nameService);
			args = new String[2];
			args[0] = "-ORBInitRef";
			args[1] = "NameService=" + nameService;
		}

		System.out.println("Envoking orb_main on ServantBase_impl.");
		orb = ServantBase_impl.orb_main(args);

		String[] strFullPath = { "Factories", "PackageFactory" };

		org.omg.CORBA.Object obj =
			ServantBase_impl.getFactoryObject(orb, strFullPath);
		if (obj == null) {
			throw new NullPointerException("Factory object from ISA is null");
		}

		PackageFactory Packagefactory = PackageFactoryHelper.narrow(obj);
		com.twc.isa.PackageModule.Package package_ = null;

		if (TRY_TO_FIND_FIRST) {
			try {
				package_ = PackageHelper.narrow(Packagefactory.find(packageName));
			} catch (Exception e) {
				System.out.println("Failed to locate existing package, moving on to createServant.");
			}
		}

		//
		// If I didn't find the package or I didn't try, create it....
		//

		if (package_ == null) {
			package_ = PackageHelper.narrow(Packagefactory.createServant(packageName));
		}

		package_.provision(AdministrativeState.as_InService, strURLName);

		System.out.println("Provision Completed.");
	}
}