<?php 	
/*******************************************************************************
 * Copyright (c) 2010 Eclipse Foundation 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:
 *   Wayne Beaton - initial API and implementation
 *******************************************************************************/

/*
 * Examples:
 * cat tests/testdata.txt | php scan.php
 * ./findjars.sh /home/data/httpd/download.eclipse.org/woolsey/ | php scan.php --text
 */

/*
 * Future extension to scan bundle manifests as well.
 * Potentially useful code:
 * 
 * for f in *.jar; do echo -e "\nBundle: $f"; unzip -p $f META-INF/MANIFEST.MF | tr '\r\n' '#' | sed 's/## //g' | sed 's/##/\n/g' | grep ^Require\-Bundle\: | sed 's/[ ,]/\n\t/g'; done | less
 */
require_once (dirname(__FILE__) . '/classes/CQ.class.php');
require_once (dirname(__FILE__) . '/classes/common.php');
require_once (dirname(__FILE__) . '/classes/debug.php');
require_once (dirname(__FILE__) . '/classes/functions.php');
trace_file_info(__FILE__);

function findProjectIdFromPath($location) {
	global $_pathsToProjects;
	
	foreach($_pathsToProjects as $path => $id) {
		if (strpos($location, $path) === 0) return $id;
	}
	
	return null;
}

/**
 * Can the bundle just be ignored? Here we deal with some special cases
 * of ".jar" files we know aren't IP.
 * 
 * @param string $bundle
 * @return bool
 */
function isIgnorableBundle($bundle) {
	if ($bundle == "artifacts.jar") return true;
	if ($bundle == "artifacts.jar.pack.gz") return true;
	if ($bundle == "content.jar") return true;
	if ($bundle == "content.jar.pack.gz") return true;
	if ($bundle == "compositeContent.jar") return true;
	if ($bundle == "compositeArtifacts.jar") return true;
	if ($bundle == "pdepublishing-ant.jar") return true;
	if ($bundle == "pdepublishing.jar") return true;
	if (preg_match('/^artifacts-?\d+.jar$/', $bundle)) return true;
	if (preg_match('/^content-?\d+.jar$/', $bundle)) return true;
	if (preg_match('/^compositeArtifacts-?\d+.jar$/', $bundle)) return true;
	if (preg_match('/^compositeContent-?\d+.jar$/', $bundle)) return true;
	if (preg_match('/^com\.mycorp\.examples/', $bundle)) return true;
	return false;
}

/**
 * Given the name of a bundle, determine the Eclipse project that it
 * comes from.
 * 
 * @param string $bundle
 * @return string|null
 */
function findEclipseProjectId($bundle) {
	// Hack to handle special cases...
	// FIXME This has gotten way out of hand. Rework. Refactor.
	if (preg_match('/^org\.eclipse\.fx/', $bundle)) return 'technology.efxclipse';
	if (preg_match("/^ch\\.ethz\\.iks\\.slp/", $bundle)) return 'rt.ecf';
	if (preg_match("/^eclipselink/", $bundle)) return 'rt.eclipselink';
	if (preg_match("/^org\\.eclipse\\.persistence/", $bundle)) return 'rt.eclipselink';
	if (preg_match("/^javax\\.persistence/", $bundle)) return 'rt.eclipselink';
	
	if (preg_match("/^aspectj/", $bundle)) return 'tools.aspectj';
	
	if (preg_match("/^org\\.eclipse\\.osgi/", $bundle)) return 'rt.equinox';
	if (preg_match("/^master-equinox/", $bundle)) return 'rt.equinox';

	if (preg_match("/^jetty-6/", $bundle)) return null;
	if (preg_match("/^jetty-/", $bundle)) return 'rt.jetty';
	
	if (preg_match("/^org\\.eclipse\\.soda/", $bundle)) return 'technology.ohf';
	
	if (preg_match("/^org\\.eclipse\\.php/", $bundle)) return 'tools.pdt';
	
	if (preg_match("/^org\\.eclipse\\.draw2d/", $bundle)) return 'tools.gef';
	
	if (preg_match('/^org\.eclipse\.net4j/', $bundle)) return 'modeling.emf.cdo';
	
	if (preg_match('/^org\.eclipse\.gmf\.notation/', $bundle)) return 'modeling.gmp.gmf-notation';
	if (preg_match('/^org\.eclipse\.gmf\.runtime/', $bundle)) return 'modeling.gmp.gmf-runtime';
	if (preg_match('/^org\.eclipse\.gmf\.tooling/', $bundle)) return 'modeling.gmp.gmf-tooling';
	if (preg_match('/^org\.eclipse\.gmf/', $bundle)) return 'modeling.gmp.gmf-runtime';
	
	// Eclipse Platform Project
	$segments = array('platform', 'test', 'releng', 'webdav', 'externaltools', 'rcp', 'core', 'debug', 'help', 'ui', 'sdk', 'team', 'text', 'epp', 'ltk', 'osgi', 'search', 'compare', 'update', 'ant', 'jface', 'swt', 'jsch', 'cvs', 'tomcat', 'target', 'ftp', 'license');
	foreach($segments as $segment)
		if (preg_match("/^org\\.eclipse\\.$segment/", $bundle)) return 'eclipse.platform';
	if (preg_match('/^ecj-.*\.jar$/', $bundle)) return 'eclipse.jdt';
	
	if (preg_match('/^org\.eclipse\.wtp/', $bundle)) return 'webtools';
	if (preg_match('/^org\.eclipse\.jpt/', $bundle)) return 'webtools.dali';
	if (preg_match('/^org\.eclipse\.jst\.ws/', $bundle)) return 'webtools.webservices';
	if (preg_match('/^org\.eclipse\.wst\.ws/', $bundle)) return 'webtools.webservices';
	if (preg_match('/^org\.eclipse\.wst\.command/', $bundle)) return 'webtools.webservices';
		
	if (preg_match("/^org\\.eclipse\\.jst\\.server/", $bundle)) return 'webtools.servertools';
	if (preg_match("/^org\\.eclipse\\.jem/", $bundle)) return 'webtools.jeetools';
	if (preg_match("/^org\\.eclipse\\.jem/", $bundle)) return 'webtools.jeetools';
	if (preg_match("/^org\\.eclipse\\.wtp\\.jee\\.capabilities/", $bundle)) return 'webtools.jeetools';
	if (preg_match("/^org\\.eclipse\\.jst\\.servlet\\.ui/", $bundle)) return 'webtools.jeetools';
	
	if (preg_match('/^org\.eclipse\.jst\.common/', $bundle)) return 'webtools.common';
	if (preg_match('/^org\.eclipse\.wst\.internet\.cache/', $bundle)) return 'webtools.common';
	if (preg_match('/^org\.eclipse\.jem\.util/', $bundle)) return 'webtools.common';
	if (preg_match('/^org\.eclipse\.wst\.common/', $bundle)) return 'webtools.common';
	
	if (preg_match('/^org\.eclipse\.jst\.j2ee/', $bundle)) return 'webtools.jeetools';
	if (preg_match('/^org\.eclipse\.jst\.ejb/', $bundle)) return 'webtools.ejbtools';
	if (preg_match('/^org\.eclipse\.jem\.ejb/', $bundle)) return 'webtools.jeetools';
	
	if (preg_match('/^org\.eclipse\.jst\.jsp/', $bundle)) return 'webtools.sourceediting';
	
	if (preg_match("/^org\\.eclipse\\.wst/", $bundle)) return 'webtools.jeetools';
	if (preg_match("/^org\\.eclipse\\.jst/", $bundle)) return 'webtools.releng';
	
	if (preg_match("/^org\\.eclipse\\.wb/", $bundle)) return 'tools.windowbuilder';
		
	if (preg_match('/^objectteams-.*\.jar$/', $bundle)) return 'tools.objectteams';
	if (preg_match('/^ecotj-.*\.jar$/', $bundle)) return 'tools.objectteams';
	
	if (preg_match("/^org\\.eclipse\\.xtend/", $bundle)) return 'modeling.tmf.xtext';
	if (preg_match("/^org\\.eclipse\\.zest/", $bundle)) return 'tools.gef';
	
	if (preg_match("/^org\\.eclipse\\.rwt/", $bundle)) return 'rt.riena';
	if (preg_match('/^org\.eclipse\.rse/', $bundle)) return 'tools.tm';
	if (preg_match('/^org\.eclipse\.dstore/', $bundle)) return 'tools.tm';
	
	if (preg_match('/^org\.eclipse\.draw3d/', $bundle)) return 'technology.gef3d';
	
	if (preg_match('/^org\.eclipse\.rephraserengine/', $bundle)) return 'tools.ptp';
	if (preg_match('/^org\.gastro/', $bundle)) return 'modeling.emf.cdo';
	
	if (preg_match('/^org\.eclipse\.emf\.ocl/', $bundle)) return 'modeling.mdt.ocl';
	
	if (preg_match('/^org\.aspectj/', $bundle)) return 'tools.aspectj';
	
	if (preg_match('/^com\.ibm\.uml2\.articles_2\.0\.0\./', $bundle)) return 'modeling.mdt.uml2';
	if (preg_match('/^uml2\.articles\.jar/', $bundle)) return 'modeling.mdt.uml2';
	if (preg_match('/^org\.eclipse\.m2m\.atl/', $bundle)) return 'modeling.mmt.atl';
	if (preg_match('/^org\.eclipse\.emf\.compare/', $bundle)) return 'modeling.emfcompare';
		
	// Try to guess based on the namespaces we've assembled from the projects.
	global $_namespaceToProjects;
	
	foreach ($_namespaceToProjects as $namespace => $id) {
		if (preg_match("/^$namespace/", $bundle)) return $id;
	}

	return null;
}

/*
 * 
 */
function getBundlePattern($bundle) {
	// FIXME There is redundancy with CQ.class.php
	preg_match('/^([a-zA-Z0-9\.\-_]+[_-](\d+\.){3})(.*\.)?jar/', $bundle, $matches);
	if (count($matches) > 0) {
		$pattern = $matches[1];
		return "$pattern*.jar";
	} else {
		return $bundle;
	}
}

class ProjectInfo {
	var $id;
	var $included = array();
	var $bundles = array();
	
	function __construct($id) {
		$this->id = $id;
	}
	
	function addProject($id, $bundle) {
		if ($id == $this->id) return;
		if ($id == 'tools.orbit') return; // Orbit doesn't count
		$this->included[$id][$bundle] = true;
	}
	
	function addBundle($bundle, $location) {
		$pattern = getBundlePattern($bundle);
		if (!isset($this->bundles[$pattern])) $this->bundles[$pattern] = new BundleInfo($this, $pattern);
		$this->bundles[$pattern]->addLocation($location);
	}
	
	function findCQs($bundle, &$cqs) {
		$cq = findCQ($bundle, $this->id, true, true);
		if ($cq) {
			//echo "Found $cq->id\n";
			$cqs[] = $cq;
			return;
		}

		foreach ($this->included as $included => $ignored) {
			//echo "Checking $included\n";
			$cq = findCQ($bundle, $included, true, true);
			if ($cq) $cqs[] = $cq;
		}
	}
}

function findCQ($bundle, $projectid, $check_parents, $check_children) {
	if ($cq = find_cq_for_bundle($bundle, $projectid, $check_parents, $check_children)) return $cq;
	if (preg_match('/^com\.springsource\.(.+)$/', $bundle, $matches)) {
		$cq = find_cq_for_bundle($matches[1], $projectid, $check_parents, $check_children);
		return $cq;
	}
}

class BundleInfo {
	var $project;
	var $name;
	var $locations = array();
	var $cqs;
	
	function __construct(&$project, &$name) {
		$this->project = $project;
		$this->name = $name;
	}
	
	function addLocation(&$location) {
		if (in_array($location, $this->locations)) return;
		$this->locations[] = $location;
	}
	
	function getCQs() {
		if ($this->cqs === null) {
			$this->cqs = array();
			$this->project->findCQs($this->name, $this->cqs);
		}
		return $this->cqs;
	}
}

function dumpAsXml($projects) {
	echo "<downloads>\n";
	foreach($projects as $project) {
		echo "\t<project id=\"$project->id\">\n";
		foreach ($project->included as $included => $bundles) {
			echo "\t\t<includes id=\"$included\"/>\n";
// 			echo "\t\t<includes id=\"$included\">\n";
// 			foreach($bundles as $bundle => $ignore) 	
// 				echo "\t\t\t<bundle id=\"$bundle\">\n";
// 			echo "\t\t</includes>\n";
		}
		foreach ($project->bundles as $bundle) {
			$name = $bundle->name;
			echo "\t\t<bundle name=\"$name\">\n";
			foreach ($bundle->locations as $path) {
				echo "\t\t\t<location path=\"$path\"/>\n";
			}
			foreach ($bundle->getCQs() as $cq) {
				echo "\t\t\t<cq id=\"$cq->id\" project=\"$cq->project\"/>\n";
			}
			echo "\t\t</bundle>\n";
		}
		echo "\t</project>\n";
	}
	echo get_trace_xml();
	echo "</downloads>\n";
}

function dumpAsList($projects, $showLocations = true) {
	foreach($projects as $project) {
		echo "Project: $project->id\n";
		foreach ($project->included as $included => $ignore) {
			echo "\tIncludes: $included\n";
		}
	
		echo "\tHave CQ:\n";
		foreach ($project->bundles as $bundle) {
			if (!$bundle->getCQs()) continue;
			echo "\t\t$bundle->name ";
			foreach ($bundle->getCQs() as $cq) {
				echo "CQ$cq->id ";
			}
			echo "\n";
		}
		
		echo "\tNo CQ:\n";
		foreach ($project->bundles as $bundle) {
			if ($bundle->getCQs()) continue;
			$name = $bundle->name;
			echo "\t\t$name\n";
			if ($showLocations) {
				foreach ($bundle->locations as $path) {
					echo "\t\t\t$path\n";
				}
			}
		}
	}
	echo get_trace_text();
}

load_cqs_from_server();
$skipThingsThatDontLookLikeBundles = hasCommandLineArgument('--skip');
bootstrap();
$projects = array();
while (!feof(STDIN)) {
	$line = fgets(STDIN);
	$matches = array();
	if (!preg_match('/^(.*)\/([^\/]*\.jar(\.pack(\.gz)?)?)$/', $line, $matches)) continue;
	$location = $matches[1];
	$bundle = $matches[2];
	
	trace("Found bundle $bundle in $location");
	
	if ($skipThingsThatDontLookLikeBundles) {
		if (!preg_match('/^([a-zA-Z0-9\.\-_]+[_-](\d+\.){3})(.*\.)?jar/', $bundle)) continue;;
	}
	
	if (isIgnorableBundle($bundle)) continue;
	
	$projectId = findProjectIdFromPath($location);
	if (!$projectId) {
		trace("Can't map path $location to a project");
		continue; // TODO Handle missing paths
	}

	if (!isset($projects[$projectId])) $projects[$projectId] = new ProjectInfo($projectId);
	$info = $projects[$projectId];
	
	$eclipseProjectId = findEclipseProjectId($bundle);
	if ($eclipseProjectId) {
		trace("Bundle $bundle is from Eclipse project $eclipseProjectId");
		$info->addProject($eclipseProjectId, $bundle);
		continue;
	}
	
	if ($skipThingsThatDontLookLikeBundles) {
		if (preg_match('/^org\.eclipse\./', $bundle)) continue;
	}
	
	$info->addBundle($bundle, $location);
}

if (hasCommandLineArgument('--text')) {
	dumpAsList($projects);
} else {
	dumpAsXml($projects);
}


?>