| <?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); |
| } |
| |
| |
| ?> |