Search in sources :

Example 1 with ResolvedSpecId

use of org.jboss.galleon.runtime.ResolvedSpecId in project galleon by wildfly.

the class FeatureContainers method populateFeatureContainer.

private static void populateFeatureContainer(FeatureContainer fp, PmSession session, ProvisioningRuntime runtime, boolean allSpecs) throws ProvisioningException, IOException {
    // Need a Map of FeaturePack to resolve external packages/
    Map<String, FeaturePackRuntime> gavs = new HashMap<>();
    for (FeaturePackRuntime rt : runtime.getFeaturePacks()) {
        gavs.put(Identity.buildOrigin(rt.getFPID().getProducer()), rt);
    }
    List<CliPlugin> cliPlugins = new ArrayList<>();
    FeaturePackPluginVisitor<CliPlugin> visitor = new FeaturePackPluginVisitor<CliPlugin>() {

        @Override
        public void visitPlugin(CliPlugin plugin) throws ProvisioningException {
            cliPlugins.add(plugin);
        }
    };
    runtime.getLayout().visitPlugins(visitor, CliPlugin.class);
    CliPlugin plugin = cliPlugins.isEmpty() ? null : cliPlugins.get(0);
    PackageGroupsBuilder pkgBuilder = new PackageGroupsBuilder();
    FeatureSpecsBuilder specsBuilder = new FeatureSpecsBuilder();
    String optionalOption = runtime.getProvisioningConfig().getOption(ProvisioningOption.OPTIONAL_PACKAGES.getName());
    if (optionalOption == null) {
        optionalOption = Constants.ALL;
    }
    boolean includeOptional = false;
    boolean includePassive = false;
    boolean checkPassive = false;
    if (optionalOption.equals(Constants.ALL)) {
        includePassive = true;
        includeOptional = true;
    } else {
        if (optionalOption.equals(Constants.NONE)) {
            // No optional included.
            includeOptional = false;
            includePassive = false;
        } else {
            if (optionalOption.equals(Constants.PASSIVE)) {
                // Include passives that have dependencies present.
                includeOptional = false;
                includePassive = true;
                checkPassive = true;
            } else {
                if (optionalOption.equals(Constants.PASSIVE_PLUS)) {
                    // Include passives that have dependencies present and optionals
                    includeOptional = true;
                    includePassive = true;
                    checkPassive = true;
                } else {
                    throw new ProvisioningException("Not recognized value for " + Constants.OPTIONAL_PACKAGES);
                }
            }
        }
    }
    boolean includeOptionalF = includeOptional;
    boolean includePassiveF = includePassive;
    Map<String, Map<String, PackageRuntime>> allPackages = new HashMap<>();
    for (FeaturePackRuntime rt : runtime.getFeaturePacks()) {
        fp.addLayers(rt.loadLayers());
        pkgBuilder.resetRoots();
        allPackages.put(rt.getFPID().getProducer().toString(), new HashMap<>());
        for (PackageRuntime pkg : rt.getPackages()) {
            if (checkPassive && pkg.isPassive() && !pkg.isPassiveIncluded()) {
                // exclude passives that don't match.
                continue;
            }
            allPackages.get(rt.getFPID().getProducer().toString()).put(pkg.getName(), pkg);
            pkgBuilder.buildGroups(new PackageInfo(pkg, Identity.fromChannel(rt.getFPID().getProducer(), pkg.getName()), plugin), new PackageGroupsBuilder.PackageInfoBuilder() {

                @Override
                public PackageInfo build(Identity identity, PackageInfo parent) {
                    try {
                        // Packages that have no origin, doesn't mean that they are local.
                        // It depends on the way FP dependencies have an origin or not.
                        // If a FP dependency has no origin, the "local" package could be
                        // located in this dependency.
                        FeaturePackRuntime currentRuntime = parent.getFeaturePackRuntime();
                        Identity resolvedIdentity = null;
                        PackageRuntime p = null;
                        if (identity.getOrigin().equals(Identity.EMPTY)) {
                            // First local to the parent package.
                            p = currentRuntime.getPackage(identity.getName());
                            if (p == null) {
                                // Then lookup dependencies with no origin.
                                for (FeaturePackConfig fpdep : currentRuntime.getSpec().getFeaturePackDeps()) {
                                    if (currentRuntime.getSpec().originOf(fpdep.getLocation().getProducer()) == null) {
                                        FeaturePackRuntime depRuntime = gavs.get(Identity.buildOrigin(fpdep.getLocation().getProducer()));
                                        p = depRuntime.getPackage(identity.getName());
                                        if (p != null) {
                                            resolvedIdentity = Identity.fromChannel(fpdep.getLocation().getProducer(), identity.getName());
                                            break;
                                        }
                                    }
                                }
                            } else {
                                resolvedIdentity = Identity.fromChannel(currentRuntime.getFPID().getProducer(), identity.getName());
                            }
                        } else {
                            // Could be a free text, maps that to ga. Only ga are exposed as origin for now.
                            // XXX JFDENISE, TODO, we could expose actual origin but would require to expose the mapping.
                            FeaturePackRuntime extRt = gavs.get(identity.getOrigin());
                            if (extRt == null) {
                                FeaturePackConfig fpdep = currentRuntime.getSpec().getFeaturePackDep(identity.getOrigin());
                                if (fpdep != null) {
                                    resolvedIdentity = Identity.fromChannel(fpdep.getLocation().getProducer(), identity.getName());
                                    extRt = gavs.get(resolvedIdentity.getOrigin());
                                }
                            } else {
                                resolvedIdentity = identity;
                            }
                            if (extRt != null) {
                                p = extRt.getPackage(identity.getName());
                            }
                        }
                        if (p == null) {
                            // Optional package that has been excluded
                            return null;
                        }
                        return new PackageInfo(p, resolvedIdentity, plugin);
                    } catch (IOException | ProvisioningException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
        }
        fp.setPackagesRoot(Identity.buildOrigin(rt.getFPID().getProducer()), pkgBuilder.getPackagesRoot());
        // Attach the full set, this targets the container dependency that expose them all.
        if (allSpecs) {
            Group specsRoot = specsBuilder.buildTree(runtime.getLayout(), session, rt.getFPID(), fp.getFPID(), pkgBuilder.getPackages(), allSpecs, null);
            fp.setFeatureSpecRoot(Identity.buildOrigin(rt.getFPID().getProducer()), specsRoot);
        }
    }
    fp.setAllPackages(pkgBuilder.getPackages());
    Map<ProducerSpec, Set<ResolvedSpecId>> actualSet = new HashMap<>();
    Map<ResolvedSpecId, List<FeatureInfo>> features = new HashMap<>();
    for (ProvisionedConfig c : runtime.getConfigs()) {
        ConfigInfo config = new ConfigInfo(c.getModel(), c.getName(), c.getLayers());
        fp.addFinalConfig(config);
        FeatureGroupsBuilder grpBuilder = new FeatureGroupsBuilder();
        c.handle(new ProvisionedConfigHandler() {

            @Override
            public void nextFeature(ProvisionedFeature feature) throws ProvisioningException {
                FeaturePackRuntime rt = runtime.getFeaturePack(feature.getSpecId().getProducer());
                FeatureSpec featureSpec = rt.getFeatureSpec(feature.getSpecId().getName());
                ProducerSpec producer = feature.getSpecId().getProducer();
                for (PackageDependencySpec spec : featureSpec.getLocalPackageDeps()) {
                    PackageRuntime pkg = allPackages.get(producer.toString()).get(spec.getName());
                    if (pkg != null) {
                        if (includePassiveF && pkg.isPassive()) {
                            fp.addPassivePackage(producer.toString(), feature.getSpecId().getName(), spec.getName());
                        } else {
                            if (includeOptionalF && pkg.isOptional()) {
                                fp.addOptionalPackage(producer.toString(), feature.getSpecId().getName(), spec.getName());
                            }
                        }
                    }
                }
                if (featureSpec.hasExternalPackageDeps()) {
                    for (String origin : featureSpec.getPackageOrigins()) {
                        for (PackageDependencySpec spec : featureSpec.getExternalPackageDeps(origin)) {
                            PackageRuntime pkg = allPackages.get(origin).get(spec.getName());
                            if (pkg != null) {
                                if (includePassiveF && pkg.isPassive()) {
                                    fp.addPassivePackage(origin, feature.getSpecId().getName(), spec.getName());
                                } else if (includeOptionalF && pkg.isOptional()) {
                                    fp.addOptionalPackage(origin, feature.getSpecId().getName(), spec.getName());
                                }
                            }
                        }
                    }
                }
                Set<ResolvedSpecId> set = actualSet.get(feature.getSpecId().getProducer());
                if (set == null) {
                    set = new HashSet<>();
                    actualSet.put(feature.getSpecId().getProducer(), set);
                }
                set.add(feature.getSpecId());
                String fullSpecName = feature.getSpecId().getName();
                List<String> path = new ArrayList<>();
                Group parent = grpBuilder.buildFeatureGroups(fullSpecName, feature.getId(), path);
                FeatureInfo featInfo = new FeatureInfo(config, feature, path, fp.getFPID());
                List<FeatureInfo> lst = features.get(feature.getSpecId());
                if (lst == null) {
                    lst = new ArrayList<>();
                    features.put(feature.getSpecId(), lst);
                }
                lst.add(featInfo);
                parent.setFeature(featInfo);
                // Specs have already been computed first place.
                if (allSpecs) {
                    FeatureSpecInfo spec = specsBuilder.getAllSpecs().get(feature.getSpecId());
                    featInfo.attachSpecInfo(spec);
                    parent.setFeature(featInfo);
                }
            }
        });
        config.setFeatureGroupRoot(grpBuilder.getRoot());
    }
    // Handle packages that are not directly referenced from a feature.
    for (Entry<String, Map<String, PackageRuntime>> packageEntry : allPackages.entrySet()) {
        String producer = packageEntry.getKey();
        Set<String> allOptionals = new HashSet<>();
        Set<String> allPassives = new HashSet<>();
        Map<String, Set<String>> optionals = fp.getOptionalPackages().get(producer);
        if (optionals != null) {
            for (Set<String> vals : optionals.values()) {
                allOptionals.addAll(vals);
            }
        }
        Map<String, Set<String>> passives = fp.getPassivePackages().get(producer);
        if (passives != null) {
            for (Set<String> vals : passives.values()) {
                allPassives.addAll(vals);
            }
        }
        Map<String, PackageRuntime> packages = packageEntry.getValue();
        for (Entry<String, PackageRuntime> entry : packages.entrySet()) {
            String name = entry.getKey();
            PackageRuntime pkg = entry.getValue();
            if (!allOptionals.contains(name) && !allPassives.contains(name)) {
                if (includePassiveF && pkg.isPassive()) {
                    fp.addOrphanPassivePackage(producer, name);
                } else if (includeOptionalF && pkg.isOptional()) {
                    fp.addOrphanOptionalPackage(producer, name);
                }
            }
        }
    }
    if (!allSpecs) {
        // packages and feature-specs.
        for (Entry<ProducerSpec, Set<ResolvedSpecId>> entry : actualSet.entrySet()) {
            Group specsRoot = specsBuilder.buildTree(runtime.getLayout(), session, entry.getKey().getLocation().getFPID(), fp.getFPID(), pkgBuilder.getPackages(), false, entry.getValue());
            for (ResolvedSpecId rs : entry.getValue()) {
                List<FeatureInfo> lst = features.get(rs);
                for (FeatureInfo fi : lst) {
                    fi.attachSpecInfo(specsBuilder.getAllSpecs().get(rs));
                }
            }
            fp.setFeatureSpecRoot(Identity.buildOrigin(entry.getKey()), specsRoot);
        }
    }
    fp.seAllFeatureSpecs(specsBuilder.getAllSpecs());
    fp.setAllFeatures(features);
}
Also used : FeatureSpec(org.jboss.galleon.spec.FeatureSpec) HashSet(java.util.HashSet) Set(java.util.Set) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) PackageRuntime(org.jboss.galleon.runtime.PackageRuntime) CliPlugin(org.jboss.galleon.plugin.CliPlugin) ProvisionedConfigHandler(org.jboss.galleon.plugin.ProvisionedConfigHandler) ProvisionedFeature(org.jboss.galleon.state.ProvisionedFeature) ResolvedSpecId(org.jboss.galleon.runtime.ResolvedSpecId) ProvisioningException(org.jboss.galleon.ProvisioningException) ArrayList(java.util.ArrayList) List(java.util.List) PackageDependencySpec(org.jboss.galleon.spec.PackageDependencySpec) ProvisionedConfig(org.jboss.galleon.state.ProvisionedConfig) FeaturePackConfig(org.jboss.galleon.config.FeaturePackConfig) HashSet(java.util.HashSet) ProducerSpec(org.jboss.galleon.universe.FeaturePackLocation.ProducerSpec) FeaturePackPluginVisitor(org.jboss.galleon.layout.FeaturePackPluginVisitor) FeaturePackRuntime(org.jboss.galleon.runtime.FeaturePackRuntime) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with ResolvedSpecId

use of org.jboss.galleon.runtime.ResolvedSpecId in project galleon by wildfly.

the class FeatureSpecsBuilder method buildTree.

public Group buildTree(ProvisioningLayout<FeaturePackRuntime> layout, PmSession session, FPID fpid, FPID id, Map<Identity, Group> allPackages, boolean useCache, Set<ResolvedSpecId> wantedSpecs) throws IOException, ProvisioningException {
    // Build the tree of specs located in all feature-packs
    FeatureGroupsBuilder grpBuilder = new FeatureGroupsBuilder();
    Set<FeatureSpecInfo> specs = new HashSet<>();
    for (ResolvedFeatureSpec resolvedSpec : layout.getFeaturePack(fpid.getProducer()).getFeatureSpecs()) {
        ResolvedSpecId resolved = resolvedSpec.getId();
        if (wantedSpecs == null || wantedSpecs.contains(resolved)) {
            FeatureSpecInfo specInfo = allspecs.get(resolved);
            if (specInfo == null) {
                Set<Identity> missingPackages = new HashSet<>();
                FeatureSpec spec = resolvedSpec.getSpec();
                specInfo = new FeatureSpecInfo(resolved, id, spec);
                Identity specId = Identity.fromChannel(resolved.getProducer(), resolved.getName());
                boolean featureEnabled = true;
                for (PackageDependencySpec p : spec.getLocalPackageDeps()) {
                    Identity identity = Identity.fromChannel(resolved.getProducer(), p.getName());
                    Group grp = allPackages.get(identity);
                    // Group can be null if the modules have not been installed.
                    if (grp != null) {
                        specInfo.addPackage(grp.getPackage());
                        attachProvider(specId, grp, new HashSet<>());
                    } else {
                        featureEnabled = false;
                        missingPackages.add(identity);
                    }
                }
                for (String o : spec.getPackageOrigins()) {
                    for (PackageDependencySpec p : spec.getExternalPackageDeps(o)) {
                        Identity identity = Identity.fromString(o, p.getName());
                        Group grp = allPackages.get(identity);
                        if (grp != null) {
                            specInfo.addPackage(grp.getPackage());
                            attachProvider(specId, grp, new HashSet<>());
                        } else {
                            featureEnabled = false;
                            missingPackages.add(identity);
                        }
                    }
                }
                specInfo.setEnabled(featureEnabled);
                specInfo.setMissingPackages(missingPackages);
                allspecs.put(resolved, specInfo);
                specs.add(specInfo);
            }
            String fullSpecName = resolved.getName();
            List<String> path = new ArrayList<>();
            Group parent = grpBuilder.buildFeatureSpecGroups(fullSpecName, specInfo, path);
            parent.setFeatureSpec(specInfo);
        }
    }
    return grpBuilder.getRoot();
}
Also used : ResolvedFeatureSpec(org.jboss.galleon.runtime.ResolvedFeatureSpec) FeatureSpec(org.jboss.galleon.spec.FeatureSpec) ArrayList(java.util.ArrayList) ResolvedSpecId(org.jboss.galleon.runtime.ResolvedSpecId) PackageDependencySpec(org.jboss.galleon.spec.PackageDependencySpec) ResolvedFeatureSpec(org.jboss.galleon.runtime.ResolvedFeatureSpec) HashSet(java.util.HashSet)

Example 3 with ResolvedSpecId

use of org.jboss.galleon.runtime.ResolvedSpecId in project galleon by wildfly.

the class StateSearchCommand method findFeatures.

private Set<ResolvedSpecId> findFeatures(PackageInfo spec, FeatureContainer container) {
    Set<ResolvedSpecId> fspecs = new HashSet<>();
    for (Entry<ResolvedSpecId, FeatureSpecInfo> features : container.getAllSpecs().entrySet()) {
        for (PackageInfo info : features.getValue().getPackages()) {
            Group grp = container.getAllPackages().get(info.getIdentity());
            Set<Identity> identities = new HashSet<>();
            visitPkg(grp, identities);
            if (identities.contains(spec.getIdentity())) {
                fspecs.add(features.getKey());
                break;
            }
        }
    }
    return fspecs;
}
Also used : Group(org.jboss.galleon.cli.model.Group) ResolvedSpecId(org.jboss.galleon.runtime.ResolvedSpecId) PackageInfo(org.jboss.galleon.cli.model.PackageInfo) FeatureSpecInfo(org.jboss.galleon.cli.model.FeatureSpecInfo) Identity(org.jboss.galleon.cli.model.Identity) HashSet(java.util.HashSet)

Example 4 with ResolvedSpecId

use of org.jboss.galleon.runtime.ResolvedSpecId in project galleon by wildfly.

the class ProvisionedConfigBuilder method handle.

@Override
public void handle(ProvisionedConfigHandler handler) throws ProvisioningException {
    if (!hasFeatures()) {
        return;
    }
    handler.prepare(this);
    ResolvedSpecId lastHandledSpecId = null;
    for (ProvisionedFeature feature : features) {
        if (!feature.getSpecId().equals(lastHandledSpecId)) {
            if (lastHandledSpecId == null || !feature.getSpecId().getProducer().equals(lastHandledSpecId.getProducer())) {
                handler.nextFeaturePack(feature.getSpecId().getProducer().getLocation().getFPID());
            }
            // TODO: complete spec isn't available here, but specId is enough for marshalling
            handler.nextSpec(new ResolvedFeatureSpec(feature.getSpecId(), null, FeatureSpec.builder().build()));
            lastHandledSpecId = feature.getSpecId();
        }
        handler.nextFeature(feature);
    }
    handler.done();
}
Also used : ProvisionedFeature(org.jboss.galleon.state.ProvisionedFeature) ResolvedSpecId(org.jboss.galleon.runtime.ResolvedSpecId) ResolvedFeatureSpec(org.jboss.galleon.runtime.ResolvedFeatureSpec)

Example 5 with ResolvedSpecId

use of org.jboss.galleon.runtime.ResolvedSpecId in project galleon by wildfly.

the class OverwriteInitializedChildIdParamWhileNestingTestCase method pmFailure.

@Override
protected void pmFailure(Throwable e) throws ProvisioningDescriptionException {
    Assert.assertEquals(Errors.failedToResolveConfigSpec(null, "main"), e.getMessage());
    e = e.getCause();
    Assert.assertNotNull(e);
    Assert.assertEquals(Errors.failedToProcess(FP_GAV, new FeatureConfig("specA").setParam("id", "a1").addFeatureGroup(FeatureGroup.forGroup("groupC"))), e.getLocalizedMessage());
    e = e.getCause();
    Assert.assertNotNull(e);
    Assert.assertEquals(Errors.failedToProcess(FP_GAV, "groupC"), e.getLocalizedMessage());
    e = e.getCause();
    Assert.assertNotNull(e);
    Assert.assertEquals(Errors.failedToProcess(FP_GAV, new FeatureConfig("specC").setParam("id", "c1").setParam("a", "a2")), e.getLocalizedMessage());
    e = e.getCause();
    Assert.assertNotNull(e);
    final Map<String, String> params = new HashMap<>();
    params.put("id", "c1");
    params.put("a", "a2");
    Assert.assertEquals(Errors.failedToInitializeForeignKeyParams(new ResolvedSpecId(FP_GAV.getProducer(), "specC"), ResolvedFeatureId.create(new ResolvedSpecId(FP_GAV.getProducer(), "specA"), "id", "a1"), params), e.getLocalizedMessage());
    e = e.getCause();
    Assert.assertNotNull(e);
    Assert.assertEquals(Errors.idParamForeignKeyInitConflict(new ResolvedSpecId(FP_GAV.getProducer(), "specC"), "a", "a2", "a1"), e.getLocalizedMessage());
}
Also used : HashMap(java.util.HashMap) ResolvedSpecId(org.jboss.galleon.runtime.ResolvedSpecId) FeatureConfig(org.jboss.galleon.config.FeatureConfig)

Aggregations

ResolvedSpecId (org.jboss.galleon.runtime.ResolvedSpecId)11 ProvisionedFeature (org.jboss.galleon.state.ProvisionedFeature)4 Path (java.nio.file.Path)3 HashSet (java.util.HashSet)3 ProvisionedState (org.jboss.galleon.state.ProvisionedState)3 Test (org.junit.Test)3 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Group (org.jboss.galleon.cli.model.Group)2 PackageInfo (org.jboss.galleon.cli.model.PackageInfo)2 ResolvedFeatureSpec (org.jboss.galleon.runtime.ResolvedFeatureSpec)2 FeatureSpec (org.jboss.galleon.spec.FeatureSpec)2 PackageDependencySpec (org.jboss.galleon.spec.PackageDependencySpec)2 Map (java.util.Map)1 Set (java.util.Set)1 ProvisioningException (org.jboss.galleon.ProvisioningException)1 FeatureInfo (org.jboss.galleon.cli.model.FeatureInfo)1 FeatureSpecInfo (org.jboss.galleon.cli.model.FeatureSpecInfo)1 Identity (org.jboss.galleon.cli.model.Identity)1