/** * Adds a "Release" or "Snapshot" label to the given maven descriptor * depending on the artifact version type. * * @param descriptor * the descriptor * @param type * the expected descriptor type * @param resolvedArtifact * the resolved artifact * @param lastModified * last modified date (for snapshots only) * @param store * the store * @return the new created resolvedArtifact descriptor */ private <D extends MavenDescriptor> D markReleaseOrSnaphot(D descriptor, Class<? extends D> type, Artifact resolvedArtifact, long lastModified, Store store) { if (resolvedArtifact.isSnapshot()) { MavenSnapshotDescriptor snapshotDescriptor = store.addDescriptorType(descriptor, MavenSnapshotDescriptor.class); snapshotDescriptor.setLastModified(lastModified); return type.cast(snapshotDescriptor); } else { return store.addDescriptorType(descriptor, MavenReleaseDescriptor.class, type); } }
@Override public PackageDescriptor scan(DirectoryResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); DirectoryDescriptor directoryDescriptor = context.getCurrentDescriptor(); PackageDescriptor descriptor = context.getStore().addDescriptorType(directoryDescriptor, PackageDescriptor.class); String packageName = path.substring(1).replaceAll("/", "."); String name; int separatorIndex = packageName.lastIndexOf('.'); if (separatorIndex != -1) { name = packageName.substring(separatorIndex + 1); } else { name = packageName; } descriptor.setName(name); descriptor.setFullQualifiedName(packageName); return descriptor; }
@Override public GZipFileDescriptor scan(final FileResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); Store store = context.getStore(); final FileDescriptor fileDescriptor = context.getCurrentDescriptor(); GZipFileDescriptor gZipFileDescriptor = store.addDescriptorType(fileDescriptor, GZipFileDescriptor.class); String uncompressedPath = path.substring(0, path.toLowerCase().indexOf(".gz")); try (FileResource fileResource = new BufferedFileResource(new AbstractFileResource() { @Override public InputStream createStream() throws IOException { return new GZIPInputStream(item.createStream()); } })) { FileDescriptor entryDescriptor = scanner.scan(fileResource, uncompressedPath, scope); gZipFileDescriptor.getContains().add(entryDescriptor); } return gZipFileDescriptor; } }
@Override public GZipFileDescriptor scan(final FileResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); Store store = context.getStore(); final FileDescriptor fileDescriptor = context.peek(FileDescriptor.class); GZipFileDescriptor gZipFileDescriptor = store.addDescriptorType(fileDescriptor, GZipFileDescriptor.class); String uncompressedPath = path.substring(0, path.toLowerCase().indexOf(".gz")); try (FileResource fileResource = new BufferedFileResource(new AbstractFileResource() { @Override public InputStream createStream() throws IOException { return new GZIPInputStream(item.createStream()); } })) { FileDescriptor entryDescriptor = scanner.scan(fileResource, uncompressedPath, scope); gZipFileDescriptor.getContains().add(entryDescriptor); } return gZipFileDescriptor; } }
@Override public PropertyFileDescriptor scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); Store store = context.getStore(); FileDescriptor fileDescriptor = context.getCurrentDescriptor(); PropertyFileDescriptor propertyFileDescriptor = store.addDescriptorType(fileDescriptor, PropertyFileDescriptor.class); Properties properties = new Properties(); try (InputStream stream = item.createStream()) { properties.load(stream); } catch (IllegalArgumentException e) { LOGGER.warn("Cannot load properties from '" + path + "': " + e.getMessage()); } for (String name : properties.stringPropertyNames()) { String value = properties.getProperty(name); PropertyDescriptor propertyDescriptor = store.create(PropertyDescriptor.class); propertyDescriptor.setName(name); propertyDescriptor.setValue(value); propertyFileDescriptor.getProperties().add(propertyDescriptor); } return propertyFileDescriptor; }
@Override public PropertyFileDescriptor scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); Store store = context.getStore(); FileDescriptor fileDescriptor = context.getCurrentDescriptor(); Class<XmlPropertyFileDescriptor> descriptorType = XmlPropertyFileDescriptor.class; PropertyFileDescriptor propertyFileDescriptor = store.addDescriptorType(fileDescriptor, descriptorType); Properties properties = new Properties(); try (InputStream stream = item.createStream()) { properties.loadFromXML(stream); } catch (IllegalArgumentException e) { LOGGER.warn("Cannot load properties from '" + path + "': " + e.getMessage()); } for (String name : properties.stringPropertyNames()) { String value = properties.getProperty(name); PropertyDescriptor propertyDescriptor = store.create(PropertyDescriptor.class); propertyDescriptor.setName(name); propertyDescriptor.setValue(value); propertyFileDescriptor.getProperties().add(propertyDescriptor); } return propertyFileDescriptor; }
@Override public ServiceLoaderDescriptor scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { Matcher matcher = PATTERN.matcher(path); if (!matcher.matches()) { throw new IOException("Cannot match path name: " + path); } String serviceInterface = matcher.group(2); ScannerContext context = scanner.getContext(); FileDescriptor fileDescriptor = context.getCurrentDescriptor(); ServiceLoaderDescriptor serviceLoaderDescriptor = context.getStore().addDescriptorType(fileDescriptor, ServiceLoaderDescriptor.class); TypeDescriptor interfaceTypeDescriptor = getTypeDescriptor(serviceInterface, context); serviceLoaderDescriptor.setType(interfaceTypeDescriptor); try (InputStream stream = item.createStream()) { BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); String serviceImplementation; while ((serviceImplementation = reader.readLine()) != null) { if (!isEmptyOrComment(serviceImplementation)) { TypeDescriptor implementationTypeDescriptor = getTypeDescriptor(serviceImplementation, context); serviceLoaderDescriptor.getContains().add(implementationTypeDescriptor); } } } return serviceLoaderDescriptor; }
/** {@inheritDoc} */ @Override public JsfFaceletDescriptor scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); Store store = context.getStore(); FileDescriptor fileDescriptor = context.getCurrentDescriptor(); JsfFaceletDescriptor currentDescriptor = store.addDescriptorType(fileDescriptor, JsfFaceletDescriptor.class); try { // read the xml file Document doc = getDocument(item); // find includes NodeList nodeList = (NodeList) getXPath().evaluate("//ui:include", doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); String includeSrc = node.getAttributes().getNamedItem("src").getNodeValue(); JsfFaceletDescriptor includedJsf = findJsfTemplateDescriptor(path, includeSrc, context); if (includedJsf != null) { currentDescriptor.getIncludes().add(includedJsf); } } // find template relationship String templateSrc = (String) getXPath().evaluate("//ui:composition/@template", doc, XPathConstants.STRING); if (StringUtils.isNotBlank(templateSrc)) { currentDescriptor.setTemplate(findJsfTemplateDescriptor(path, templateSrc, context)); } } catch (XPathExpressionException | SAXException e) { throw new IOException(e); } return currentDescriptor; } // end method scan
/** {@inheritDoc} */ @Override public JsfFaceletDescriptor scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { ScannerContext context = scanner.getContext(); Store store = context.getStore(); FileDescriptor fileDescriptor = context.peek(FileDescriptor.class); JsfFaceletDescriptor currentDescriptor = store.addDescriptorType(fileDescriptor, JsfFaceletDescriptor.class); try { // read the xml file Document doc = getDocument(item); // find includes NodeList nodeList = (NodeList) getXPath().evaluate("//ui:include", doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); String includeSrc = node.getAttributes().getNamedItem("src").getNodeValue(); JsfFaceletDescriptor includedJsf = findJsfTemplateDescriptor(path, includeSrc, context); if (includedJsf != null) { currentDescriptor.getIncludes().add(includedJsf); } } // find template relationship String templateSrc = (String) getXPath().evaluate("//ui:composition/@template", doc, XPathConstants.STRING); if (StringUtils.isNotBlank(templateSrc)) { currentDescriptor.setTemplate(findJsfTemplateDescriptor(path, templateSrc, context)); } } catch (XPathExpressionException | SAXException e) { throw new IOException(e); } return currentDescriptor; } // end method scan
/** * Takes an optional descriptor and transforms it to file descriptor. * * @param descriptor * The descriptor, if <code>null</code> a new descriptor is * created. * @param type * The required type. * @param path * The path (to set as file name). * @param context * The scanner context. * @param <D> * The required type. * @return The file descriptor. */ protected <D extends FileDescriptor> D toFileDescriptor(Descriptor descriptor, Class<D> type, String path, ScannerContext context) { D result; if (descriptor == null) { result = context.getStore().create(type); result.setFileName(path); } else if (type.isAssignableFrom(descriptor.getClass())) { result = type.cast(descriptor); } else { result = context.getStore().addDescriptorType(descriptor, type); result.setFileName(path); } return result; }
/** * Takes an optional descriptor and transforms it to file descriptor. * * @param descriptor * The descriptor, if <code>null</code> a new descriptor is * created. * @param type * The required type. * @param path * The path (to set as file name). * @param context * The scanner context. * @param <D> * The required type. * @return The file descriptor. */ protected <D extends FileDescriptor> D toFileDescriptor(Descriptor descriptor, Class<D> type, String path, ScannerContext context) { D result; if (descriptor == null) { result = context.getStore().create(type); result.setFileName(path); } else if (type.isAssignableFrom(descriptor.getClass())) { result = type.cast(descriptor); } else { result = context.getStore().addDescriptorType(descriptor, type); result.setFileName(path); } return result; } }
@Override public <T extends ClassFileDescriptor> CachedType<T> create(String fullQualifiedName, FileDescriptor fileDescriptor, Class<T> descriptorType, ScannerContext context) { T typeDescriptor = context.getStore().addDescriptorType(fileDescriptor, descriptorType); setTypeProperties(typeDescriptor, fullQualifiedName); removeRequiredType(fullQualifiedName, typeDescriptor); addContainedType(fullQualifiedName, typeDescriptor); return getCachedType(fullQualifiedName, typeDescriptor); }
@Override public ManifestFileDescriptor scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { try (InputStream stream = item.createStream()) { Manifest manifest = new Manifest(stream); ScannerContext context = scanner.getContext(); Store store = context.getStore(); FileDescriptor fileDescriptor = context.getCurrentDescriptor(); ManifestFileDescriptor manifestFileDescriptor = store.addDescriptorType(fileDescriptor, ManifestFileDescriptor.class); ManifestSectionDescriptor mainSectionDescriptor = store.create(ManifestSectionDescriptor.class); mainSectionDescriptor.setName(SECTION_MAIN); manifestFileDescriptor.setMainSection(mainSectionDescriptor); readSection(manifest.getMainAttributes(), mainSectionDescriptor, store); for (Map.Entry<String, Attributes> sectionEntry : manifest.getEntries().entrySet()) { ManifestSectionDescriptor sectionDescriptor = store.create(ManifestSectionDescriptor.class); sectionDescriptor.setName(sectionEntry.getKey()); readSection(sectionEntry.getValue(), sectionDescriptor, store); manifestFileDescriptor.getManifestSections().add(sectionDescriptor); } return manifestFileDescriptor; } }
/** * Scan the given directory for classes and add them to an artifact. * * @param projectDescriptor * The maven project. * @param artifactDescriptor * The artifact. * @param directoryName * The name of the directory. * @param scanner * The scanner. */ private void scanClassesDirectory(MavenProjectDirectoryDescriptor projectDescriptor, MavenArtifactDescriptor artifactDescriptor, final String directoryName, Scanner scanner) { File directory = new File(directoryName); if (directory.exists()) { JavaArtifactFileDescriptor javaArtifactFileDescriptor = scanner.getContext().getStore().addDescriptorType(artifactDescriptor, JavaClassesDirectoryDescriptor.class); ScannerContext context = scanner.getContext(); context.push(JavaArtifactFileDescriptor.class, javaArtifactFileDescriptor); TypeResolver typeResolver = new ClasspathScopedTypeResolver(javaArtifactFileDescriptor); context.push(TypeResolver.class, typeResolver); try { scanPath(projectDescriptor, directoryName, CLASSPATH, scanner); } finally { context.pop(TypeResolver.class); context.pop(JavaArtifactFileDescriptor.class); } } }
@Override public D scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { FileDescriptor fileDescriptor = scanner.getContext().getCurrentDescriptor(); Class<D> descriptorType = getDescriptorType(); D xmlFileDescriptor = scanner.getContext().getStore().addDescriptorType(fileDescriptor, descriptorType); scanner.getContext().push(XmlDocumentDescriptor.class, xmlFileDescriptor); try (InputStream stream = item.createStream()) { scanner.scan(new StreamSource(stream), path, scope); } finally { scanner.getContext().pop(XmlDocumentDescriptor.class); } if (!xmlFileDescriptor.isXmlWellFormed()) { LOGGER.warn("XML content is not well-formed for item '{}', skipping.", path); } else { return scan(item, xmlFileDescriptor, path, scope, scanner); } return xmlFileDescriptor; }
@Override public final D scan(FileResource item, String path, Scope scope, Scanner scanner) throws IOException { FileDescriptor fileDescriptor = scanner.getContext().peek(FileDescriptor.class); Class<D> descriptorType = getDescriptorType(); D xmlFileDescriptor = scanner.getContext().getStore().addDescriptorType(fileDescriptor, descriptorType); scanner.getContext().push(XmlDocumentDescriptor.class, xmlFileDescriptor); try (InputStream stream = item.createStream()) { scanner.scan(new StreamSource(stream), path, scope); } finally { scanner.getContext().pop(XmlDocumentDescriptor.class); } if (!xmlFileDescriptor.isXmlWellFormed()) { LOGGER.warn("XML content is not well-formed for item '{}', skipping.", path); } else { return scan(item, xmlFileDescriptor, path, scope, scanner); } return xmlFileDescriptor; }
@Override public D scan(FileResource file, String path, Scope currentScope, Scanner scanner) throws IOException { ScannerContext scannerContext = scanner.getContext(); FileDescriptor fileDescriptor = scannerContext.peek(FileDescriptor.class); D archive = scannerContext.getStore().addDescriptorType(fileDescriptor, getDescriptorType()); scannerContext.push(ZipArchiveDescriptor.class, archive); Scope archiveScope = createScope(currentScope, archive, scannerContext); try (ZipFileResource zipFile = new ZipFileResource(file.getFile())) { scanner.scan(zipFile, path, archiveScope); archive.setValid(true); } catch (ZipException e) { LOGGER.warn("Cannot read ZIP file '" + path + "'.", e); archive.setValid(false); } finally { destroyScope(scannerContext); scannerContext.pop(ZipArchiveDescriptor.class); } return archive; }
@Override public D scan(FileResource file, String path, Scope currentScope, Scanner scanner) throws IOException { ScannerContext scannerContext = scanner.getContext(); FileDescriptor fileDescriptor = scannerContext.getCurrentDescriptor(); D archive = scannerContext.getStore().addDescriptorType(fileDescriptor, getDescriptorType()); scannerContext.push(ZipArchiveDescriptor.class, archive); Scope archiveScope = createScope(currentScope, archive, scannerContext); try (ZipFileResource zipFile = new ZipFileResource(file.getFile())) { scanner.scan(zipFile, path, archiveScope); archive.setValid(true); } catch (ZipException e) { LOGGER.warn("Cannot read ZIP file '" + path + "'.", e); archive.setValid(false); } finally { destroyScope(scannerContext); scannerContext.pop(ZipArchiveDescriptor.class); } return archive; }
@Override public ClassFileDescriptor scan(FileResource file, String path, Scope scope, final Scanner scanner) throws IOException { final FileDescriptor fileDescriptor = scanner.getContext().getCurrentDescriptor(); VisitorHelper visitorHelper = new VisitorHelper(scanner.getContext(), classModelConfiguration); final ClassVisitor visitor = new ClassVisitor(fileDescriptor, visitorHelper); ClassFileDescriptor classFileDescriptor; try (InputStream stream = file.createStream()) { classFileDescriptor = MD5DigestDelegate.getInstance().digest(stream, new MD5DigestDelegate.DigestOperation<ClassFileDescriptor>() { @Override public ClassFileDescriptor execute(InputStream inputStream) throws IOException { new ClassReader(inputStream).accept(visitor, 0); return visitor.getTypeDescriptor(); } }); classFileDescriptor.setValid(true); } catch (RuntimeException e) { LOGGER.warn("Cannot scan class '" + path + "'.", e); classFileDescriptor = visitor.getTypeDescriptor(); if (classFileDescriptor == null) { classFileDescriptor = scanner.getContext().getStore().addDescriptorType(fileDescriptor, ClassFileDescriptor.class); } classFileDescriptor.setValid(false); } return classFileDescriptor; } }
YAMLFileDescriptor yamlFileDescriptor = store.addDescriptorType(fileDescriptor, YAMLFileDescriptor.class);