private void guess( Map<String, DefaultCoreExtension> extensions, DefaultCoreExtensionRepository repository) { Set<ExtensionDependency> dependencies = new HashSet<ExtensionDependency>(); for (DefaultCoreExtension coreExtension : extensions.values()) { for (ExtensionDependency dependency : coreExtension.getDependencies()) { dependencies.add(dependency); } } // Normalize and guess Map<String, Object[]> fileNames = new HashMap<String, Object[]>(); Map<String, Object[]> guessedArtefacts = new HashMap<String, Object[]>(); Set<URL> urls = ClasspathHelper.forClassLoader(); for (URL url : urls) { try { String path = url.toURI().getPath(); String filename = path.substring(path.lastIndexOf('/') + 1); String type = null; int extIndex = filename.lastIndexOf('.'); if (extIndex != -1) { type = filename.substring(extIndex + 1); filename = filename.substring(0, extIndex); } int index; if (!filename.endsWith(SNAPSHOTSUFFIX)) { index = filename.lastIndexOf('-'); } else { index = filename.lastIndexOf('-', filename.length() - SNAPSHOTSUFFIX.length()); } if (index != -1) { fileNames.put(filename, new Object[] {url}); String artefactname = filename.substring(0, index); String version = filename.substring(index + 1); guessedArtefacts.put(artefactname, new Object[] {version, url, type}); } } catch (Exception e) { this.logger.warn("Failed to parse resource name [" + url + "]", e); } } // Try to resolve version no easy to find from the pom.xml try { for (DefaultCoreExtension coreExtension : extensions.values()) { String artifactId = getArtifactId(coreExtension); Object[] artefact = guessedArtefacts.get(artifactId); if (artefact != null) { if (coreExtension.getId().getVersion().getValue().charAt(0) == '$') { coreExtension.setId( new ExtensionId(coreExtension.getId().getId(), (String) artefact[0])); coreExtension.setGuessed(true); } if (coreExtension.getType().charAt(0) == '$') { coreExtension.setType((String) artefact[2]); coreExtension.setGuessed(true); } } } // Add dependencies that does not provide proper pom.xml resource and can't be found in the // classpath for (ExtensionDependency extensionDependency : dependencies) { Dependency dependency = (Dependency) extensionDependency.getProperty(MavenCoreExtensionDependency.PKEY_MAVEN_DEPENDENCY); if (dependency == null) { dependency = toDependency( extensionDependency.getId(), extensionDependency.getVersionConstraint().getValue(), null); } String dependencyId = dependency.getGroupId() + ':' + dependency.getArtifactId(); DefaultCoreExtension coreExtension = extensions.get(dependencyId); if (coreExtension == null) { String dependencyFileName = dependency.getArtifactId() + '-' + dependency.getVersion(); if (dependency.getClassifier() != null) { dependencyFileName += '-' + dependency.getClassifier(); dependencyId += ':' + dependency.getClassifier(); } Object[] filenameArtifact = fileNames.get(dependencyFileName); Object[] guessedArtefact = guessedArtefacts.get(dependency.getArtifactId()); if (filenameArtifact != null) { coreExtension = new DefaultCoreExtension( repository, (URL) filenameArtifact[0], new ExtensionId(dependencyId, dependency.getVersion()), packagingToType(dependency.getType())); coreExtension.setGuessed(true); } else if (guessedArtefact != null) { coreExtension = new DefaultCoreExtension( repository, (URL) guessedArtefact[1], new ExtensionId(dependencyId, (String) guessedArtefact[0]), packagingToType(dependency.getType())); coreExtension.setGuessed(true); } if (coreExtension != null) { extensions.put(dependencyId, coreExtension); } } } } catch (Exception e) { this.logger.warn("Failed to guess extra information about some extensions", e); } }