if (!canonicalArchive.getDuplicateArchives().iterator().hasNext()) ArchiveModel rootArchive = canonicalArchive.getRootArchiveModel(); for (DuplicateArchiveModel duplicateArchiveModel : canonicalArchive.getDuplicateArchives()) if (!rootArchive.containsArchive(duplicateArchiveModel)) ArchiveModel canonicalParentArchive = canonicalArchive.getParentArchive(); FileModel canonicalArchiveParentFile = canonicalArchive.getParentFile(); canonicalArchive.setParentFile(null); canonicalArchive.setParentArchive(null); DuplicateArchiveModel duplicateArchive = duplicateArchiveService.create(); duplicateArchive.setCanonicalArchive(canonicalArchive); duplicateArchive.setSHA1Hash(canonicalArchive.getSHA1Hash()); duplicateArchive.setFilePath(canonicalArchive.getFilePath()); duplicateArchive.setArchiveName(canonicalArchive.getArchiveName()); duplicateArchive.setFileName(canonicalArchive.getFileName()); duplicateArchive.setParentArchive(canonicalParentArchive); duplicateArchive.setParentFile(canonicalArchiveParentFile);
/** * This method just attaches the {@link OrganizationModel} to the {@link FileModel}. It will only do so if this link is not already * present. */ public OrganizationModel attachOrganization(OrganizationModel organizationModel, ArchiveModel archiveModel) { for (OrganizationModel existingOrganizationModel : archiveModel.getOrganizationModels()) { if (existingOrganizationModel.equals(organizationModel)) return organizationModel; } organizationModel.addArchiveModel(archiveModel); return organizationModel; }
public void perform(GraphRewrite event, EvaluationContext context, ArchiveModel payload) { final OrganizationService organizationService = new OrganizationService(event.getGraphContext()); LOG.info("Processing Archive: "+payload.getArchiveName()); Set<String> packageSet = new HashSet<>(); Set<String> possibleOrganization = new HashSet<>(); File archiveFile = payload.asFile(); try(ZipFile zipFile = new ZipFile(archiveFile)) { Enumeration<? extends ZipEntry> entries = zipFile.entries(); LOG.warning("Error loading archive: "+payload.getFileName()); LOG.info(" -- Archive: "+payload.getArchiveName()+" organization unknown."); organizationService.attachOrganization(payload, "Unknown"); LOG.warning(" -- Archive: "+payload.getArchiveName()+" has more than one organization: "); for(String organization : possibleOrganization) { LOG.info(" -- Archive: "+payload.getFileName()+" has organization: "+possibleOrganization.iterator().next());
/** * Indicates whether or not the passed in {@link ArchiveModel} is a child or other descendant of the current archive. */ default boolean containsArchive(ArchiveModel archiveModel) { if (this.getElement().equals(archiveModel.getElement())) return true; else if (archiveModel.getParentArchive() != null) return containsArchive(archiveModel.getParentArchive()); else return false; } }
@Override public void perform(GraphRewrite event, EvaluationContext context, ArchiveModel archive) { LOG.info("Deleting archive files: " + archive.getArchiveName()); FileUtils.deleteQuietly(new File(archive.getUnzippedDirectory())); }
private void setArchiveHashes(ArchiveModel payload) { if (payload.getMD5Hash() == null) { try (InputStream is = payload.asInputStream()) { String md5 = DigestUtils.md5Hex(is); payload.setMD5Hash(md5); } catch (IOException e) { throw new WindupException("Failed to read archive file at: " + payload.getFilePath() + " due to: " + e.getMessage(), e); } } if (payload.getSHA1Hash() == null) { try (InputStream is = payload.asInputStream()) { String sha1 = DigestUtils.sha1Hex(is); payload.setSHA1Hash(sha1); } catch (IOException e) { throw new WindupException("Failed to read archive file at: " + payload.getFilePath() + " due to: " + e.getMessage(), e); } } }
private void setParentProject(ArchiveModel archiveModel, MavenProjectModel projectModel) { if (archiveModel == null) return; if (archiveModel.getProjectModel() != null) { String mavenGAV = projectModel.getGroupId() + ":" + projectModel.getArtifactId() + ":" + projectModel.getVersion(); String archivePath = archiveModel.getFilePath(); LOG.info("Setting parent project for: " + mavenGAV + " to: " + archivePath); projectModel.setParentProject(archiveModel.getProjectModel()); } else { setParentProject(archiveModel.getParentArchive(), projectModel); } }
Coordinate coordinate = identifier.getCoordinate(archive.getSHA1Hash()); if (coordinate != null) if (!StringUtils.endsWithIgnoreCase(archive.getFileName(), ".jar")) return; identifiedArchive.setCoordinate(coordinateModel); LOG.info("Identified archive: [" + archive.getFilePath() + "] as [" + coordinate + "] will not be unzipped or analyzed."); IgnoredArchiveModel ignoredArchive = GraphService.addTypeToModel(context, archive, IgnoredArchiveModel.class); ignoredArchive.setIgnoredRegex("Known open-source library"); LOG.info("Archive not identified: " + archive.getFilePath() + " SHA1: " + archive.getSHA1Hash());
fileReference = new File(((ArchiveModel) parentFileModel).getUnzippedDirectory()); else fileReference = parentFileModel.asFile(); newArchiveModel.setParentArchive(archiveModel); newArchiveModel.setArchiveName(newZipFile.getName()); for (FileModel otherMatches : fileService.findAllByProperty(FileModel.SHA1_HASH, newArchiveModel.getSHA1Hash()))
String appArchiveName = archiveModel.getArchiveName(); if (null == appArchiveName) throw new IllegalStateException("Archive model doesn't have an archiveName: " + archiveModel.getFilePath()); archiveModel.setParseError("Cannot unzip the file: " + e.getMessage()); LOG.warning("Cannot unzip the file " + inputZipFile.getPath() + " to " + appArchiveFolder.toString() + ". The ArchiveModel was classified as malformed."); archiveModel.setUnzippedDirectory(appArchiveFolder.toString());
if (parentArchive.getProjectModel() != null) parentArchive = parentArchive.getParentArchive(); projectModel = archiveModel.getProjectModel(); } catch (NoSuchElementException e) { projectModel.setName(archiveModel.getArchiveName()); projectModel.setRootFileModel(archiveModel); projectModel.setDescription("Not available"); if(ZipUtil.endsWithZipExtension(archiveModel.getArchiveName())) if(archiveModel.getArchiveName().endsWith(extension)) projectModel.setProjectType(extension); for (FileModel f : archiveModel.getAllFiles())
String appArchiveName = archiveModel.getArchiveName(); if (null == appArchiveName) throw new IllegalStateException("Archive model doesn't have an archiveName: " + archiveModel.getFilePath()); archiveModel.setUnzippedDirectory(newFileModel); newFileModel.setParentArchive(archiveModel);
for (OrganizationModel org : arch.getOrganizationModels()) LOG.info("Library from 3rd party vendor ("+org.getName()+"), skipping recursive mavenization: " + arch.getFilePath()); return null;
@Override public void vertexPropertyChanged(Vertex vertex, String key, Object oldValue, Object setValue) { if (ArchiveModel.ARCHIVE_NAME.equals(key)) { ArchiveService archiveService = new ArchiveService(event.getGraphContext()); ArchiveModel archive = archiveService.frame(vertex); setArchiveHashes(archive); Coordinate coordinate = IdentifiedArchives.getCoordinateFromSHA1(archive.getSHA1Hash()); if (coordinate != null) { log.info("Identified archive: [" + archive.getFilePath() + "] as [" + coordinate + "] will not be unzipped or analyzed."); IdentifiedArchiveModel identifiedArchive = GraphService .addTypeToModel(event.getGraphContext(), archive, IdentifiedArchiveModel.class); ArchiveCoordinateModel coordinateModel = new GraphService<>(event.getGraphContext(), ArchiveCoordinateModel.class).create(); coordinateModel.setArtifactId(coordinate.getArtifactId()); coordinateModel.setGroupId(coordinate.getGroupId()); coordinateModel.setVersion(coordinate.getVersion()); coordinateModel.setClassifier(coordinate.getClassifier()); identifiedArchive.setCoordinate(coordinateModel); IgnoredArchiveModel ignoredArchive = GraphService.addTypeToModel(event.getGraphContext(), archive, IgnoredArchiveModel.class); ignoredArchive.setIgnoredRegex("Known open-source library"); } else { log.info("Failed to identify archive: " + archive.getFilePath()); } } }
String sha1 = archiveModel.getSHA1Hash(); groupModel.setCanonicalProject(canonicalArchive.getProjectModel()); reportModel.addArchiveGroup(groupModel);
@Override public boolean apply(ProjectModelTraversal input) { FileModel rootFile = input.getCurrent().getRootFileModel(); // This duplicate handling logic only applies to archives, so skip if it is not an archive if (!(rootFile instanceof ArchiveModel)) return true; ArchiveModel archive = (ArchiveModel) rootFile; if (!alreadySeenHashes.contains(archive.getSHA1Hash())) { alreadySeenHashes.add(archive.getSHA1Hash()); return true; } else { return false; } } });
@Override public void perform(GraphRewrite event, EvaluationContext context, ArchiveModel payload) { LOG.info("Unzipping archive: " + payload.toPrettyString()); File zipFile = payload.asFile(); if (zipFile == null || !zipFile.isFile()) { throw new WindupException("Input path doesn't point to a file: " + (zipFile == null ? "null" : zipFile.getAbsolutePath())); } // create a folder for all archive contents WindupConfigurationModel cfg = WindupConfigurationService.getConfigurationModel(event.getGraphContext()); String windupOutputFolder = cfg.getOutputPath().getFilePath(); Path windupTempUnzippedArchiveFolder = Paths.get(windupOutputFolder, ARCHIVES); if (!Files.isDirectory(windupTempUnzippedArchiveFolder)) { try { Files.createDirectories(windupTempUnzippedArchiveFolder); } catch (IOException e) { throw new WindupException("Failed to create temporary folder: " + windupTempUnzippedArchiveFolder + " due to: " + e.getMessage(), e); } } unzipToTempDirectory(event.getGraphContext(), windupTempUnzippedArchiveFolder, zipFile, payload); }
/** * Gets the "root" archive model. The root is defined as the model for which {@link #getParentArchive()} would return null. If the current archive * is the root, then this will return itself. */ default ArchiveModel getRootArchiveModel() { ArchiveModel archiveModel = this; while (archiveModel.getParentArchive() != null) { archiveModel = archiveModel.getParentArchive(); } // reframe it to make sure that we return a proxy // (otherwise, it may return this method handler implementation, which will have some unexpected side effects) return archiveModel; }
public IdentifiedArchiveFileFilter(ArchiveModel archive) { this.archiveName = archive.getArchiveName(); }
boolean exclusivelyKnown = PackageNameMapping.isExclusivelyKnownArchive(event, archive.getFilePath());