|  | <?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; | 
|  | if (preg_match('/^\._/', $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'; | 
|  |  | 
|  | if (preg_match('/^org\.eclipse\.remote/', $bundle)) return 'tools.ptp'; | 
|  |  | 
|  | if (preg_match('/^carnot-/', $bundle)) return 'soa.stardust'; | 
|  | if (preg_match('/^ipp-/', $bundle)) return 'soa.stardust'; | 
|  | if (preg_match('/^stardust-/', $bundle)) return 'soa.stardust'; | 
|  | if (preg_match('/-eclipse01.jar$/', $bundle)) return 'soa.stardust'; | 
|  |  | 
|  | if (preg_match('/^org\.eclipse\.gymnast/', $bundle)) return 'modeling.emft.emfatic'; | 
|  |  | 
|  | // 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); | 
|  | } | 
|  |  | 
|  |  | 
|  | ?> |