private void attach()

in src/main/java/org/apache/sling/feature/maven/mojos/AttachFeaturesMojo.java [91:146]


    private void attach(final Feature feature) throws MojoExecutionException {
        final String classifier = feature.getId().getClassifier();

        boolean changed = false;
        // check for metadata
        if (this.includeBundleMetadata) {
            for (final Artifact bundle : feature.getBundles()) {
                if (bundle.getMetadata().get(Constants.BUNDLE_SYMBOLICNAME) == null) {
                    Map.Entry<String, String> value =
                            METADATA_CACHE.get(bundle.getId().toMvnId());
                    if (value == null) {
                        final org.apache.maven.artifact.Artifact source = ProjectHelper.getOrResolveArtifact(
                                this.project,
                                this.mavenSession,
                                this.artifactHandlerManager,
                                this.repoSystem,
                                bundle.getId());

                        try (final JarFile jarFile = new JarFile(source.getFile())) {
                            final String symbolicName =
                                    jarFile.getManifest().getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
                            final String version =
                                    jarFile.getManifest().getMainAttributes().getValue(Constants.BUNDLE_VERSION);
                            if (symbolicName != null && version != null) {
                                final int idx = symbolicName.indexOf(";");
                                value = new AbstractMap.SimpleImmutableEntry<>(
                                        idx == -1 ? symbolicName : symbolicName.substring(0, idx), version);
                            }
                        } catch (final IOException e) {
                            // we ignore this
                        }
                        if (value == null) {
                            value = NOT_FOUND;
                        }
                        METADATA_CACHE.put(bundle.getId().toMvnId(), value);
                    }
                    if (value != NOT_FOUND) {
                        bundle.getMetadata().put(Constants.BUNDLE_SYMBOLICNAME, value.getKey());
                        bundle.getMetadata().put(Constants.BUNDLE_VERSION, value.getValue());
                        changed = true;
                    }
                }
            }
        }

        // write the feature
        final File outputFile = ProjectHelper.createTmpFeatureFile(project, feature, changed);

        // if this project is a feature, it's the main artifact
        if (project.getPackaging().equals(FeatureConstants.PACKAGING_FEATURE) && classifier == null) {
            project.getArtifact().setFile(outputFile);
        } else {
            // otherwise attach it as an additional artifact
            projectHelper.attachArtifact(project, FeatureConstants.PACKAGING_FEATURE, classifier, outputFile);
        }
    }