/*******************************************************************************
 * Copyright (c) 2008 IBM Corporation 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:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.server.discovery.internal;

import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.p2.updatesite.metadata.UpdateSiteMetadataRepositoryFactory;
import org.eclipse.equinox.internal.provisional.p2.director.*;
import org.eclipse.equinox.internal.provisional.p2.engine.*;
import org.eclipse.equinox.internal.provisional.p2.metadata.*;
import org.eclipse.equinox.internal.provisional.p2.metadata.query.InstallableUnitQuery;
import org.eclipse.equinox.internal.provisional.p2.metadata.repository.IMetadataRepository;
import org.eclipse.equinox.internal.provisional.p2.query.Collector;
import org.eclipse.equinox.internal.provisional.p2.query.Query;
import org.osgi.framework.BundleContext;

public class P2Test {

	public static void test() {
		try {
			System.out.println("---p2---");
			//SimpleMetadataRepositoryFactory mrf = new SimpleMetadataRepositoryFactory();
			UpdateSiteMetadataRepositoryFactory mrf = new UpdateSiteMetadataRepositoryFactory();
			URI uri = new URI("http://www.apache.org/dist/geronimo/eclipse/updates/");
			IMetadataRepository repo = mrf.load(uri, null);
			System.out.println("Repo: " + repo);
			//Query query = new InstallableUnitQuery(null);
			Query query = new InstallableUnitQuery("org.eclipse.wst.server.core.serverAdapter");
			Collector collector = new Collector(); 
			repo.query(query, collector, null);
			
			listCollector(collector);
			
			List<IInstallableUnit> list = new ArrayList<IInstallableUnit>();
			Iterator iter = collector.iterator();
			while (iter.hasNext()) {
				IInstallableUnit iu = (IInstallableUnit) iter.next();
				RequiredCapability[] req = iu.getRequiredCapabilities();
				if (req != null) {
					for (RequiredCapability rc : req) {
						query = new InstallableUnitQuery(rc.getName(), rc.getRange());
						Collector collector2 = new Collector();
						repo.query(query, collector2, null);
						
						Iterator iter2 = collector2.iterator();
						while (iter2.hasNext()) {
							IInstallableUnit iu2 = (IInstallableUnit) iter2.next();
							if (!list.contains(iu2))
								list.add(iu2);
						}
					}
				}
			}
			
			IInstallableUnit install = null;
			iter = list.iterator();
			while (iter.hasNext()) {
				IInstallableUnit iu = (IInstallableUnit) iter.next();
				if (install == null || install.getVersion().compareTo(iu.getVersion()) < 0)
					install = iu;
				
				System.out.println(iu.getId() + " " + iu.getVersion() + " " + iu.getProperty(IInstallableUnit.PROP_NAME) + " " + iu.getProperty(IInstallableUnit.PROP_DESCRIPTION));
			}
			
			//if (true)
			//	return;
			
			//IInstallableUnit install = iu;
			
			IProgressMonitor monitor = new NullProgressMonitor();
			
			BundleContext bundleContext = Activator.getDefault().getBundle().getBundleContext();
			IPlanner planner = (IPlanner) ServiceHelper.getService(bundleContext, IPlanner.class.getName());
			
			IProfileRegistry profileRegistry = (IProfileRegistry) ServiceHelper.getService(bundleContext, IProfileRegistry.class.getName());
			IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF);
			ProfileChangeRequest pcr = new ProfileChangeRequest(profile);
			pcr.addInstallableUnits(new IInstallableUnit[] { install } );
			ProvisioningContext provContext = new ProvisioningContext();
			ProvisioningPlan plan = planner.getProvisioningPlan(pcr, provContext, monitor);
			System.out.println("plan: " + plan.getStatus());
			//if (!plan.getStatus().isOK())
			//	return plan.getStatus();
			
			IEngine engine = (IEngine) ServiceHelper.getService(bundleContext, IEngine.SERVICE_NAME);
			IStatus status = engine.perform(profile, new DefaultPhaseSet(), plan.getOperands(), provContext, monitor);
			System.out.println("install: " + status);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void listCollector(Collector collector) {
		Iterator iter = collector.iterator();
		while (iter.hasNext()) {
			IInstallableUnit iu = (IInstallableUnit) iter.next();
			System.out.println("  " + iu + " " + iu.getVersion());
			Map map = iu.getProperties();
			if (map != null) {
				Iterator iter2 = map.keySet().iterator();
				while (iter2.hasNext()) {
					Object obj = iter2.next();
					String s = map.get(obj) + "";
					if (s.contains("\n"))
						s = s.substring(0, s.indexOf("\n"));
					//if (s.length() > 20)
					//	s = s.substring(0, 20);
					System.out.println("     prop: " + obj + " = " + s);
				}
			}
			RequiredCapability[] req = iu.getRequiredCapabilities();
			if (req != null) {
				for (RequiredCapability rc : req) {
					System.out.println("     req: " + rc.getName() + " " + rc.getRange() + " " + rc.getNamespace());
				}
			}
			ProvidedCapability[] pro = iu.getProvidedCapabilities();
			if (pro != null) {
				for (ProvidedCapability pc : pro) {
					System.out.println("     pro: " + pc.getName());
				}
			}
		}
	}
}
