<?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;
	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 ($d == '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);
}


?>