@Override public void generate(final GenerationContext context) throws Exception { Document doc; try (BufferedInputStream is = new BufferedInputStream(Files.newInputStream(context.getFile()))) { doc = this.xml.parse(is); } final CategoryDefinition def = CategoryXmlParser.parse(doc); final String baseName = context.getArtifactInformation().getName(); final Map<String, Set<ArtifactInformation>> map = new HashMap<>(); for (final ArtifactInformation ai : context.getChannelArtifacts()) { if (Helper.isBundle(ai.getMetaData())) { final String id = ai.getMetaData().get(MK_OSGI_NAME); final Set<String> cats = def.getBundles().get(id); if (cats != null) { for (final String cat : cats) { addMap(map, cat, ai); } } } if (Helper.isFeature(ai.getMetaData())) { final String id = ai.getMetaData().get(MK_OSGI_NAME); final Set<String> cats = def.getFeatures().get(id); if (cats != null) { for (final String cat : cats) { addMap(map, cat, ai); } } } } context.createVirtualArtifact( baseName + "-p2metadata.xml", out -> { Helper.createFragmentFile( out, (units) -> { for (final Category cat : def.getCategories()) { Helper.createCategoryUnit( units, cat.getId(), cat.getLabel(), cat.getDescription(), Helper.makeDefaultVersion(), (unit) -> { final Element reqs = XmlHelper.addElement(unit, "requires"); final Set<String> ctx = new HashSet<>(); final Set<ArtifactInformation> list = map.get(cat.getId()); if (list != null) { for (final ArtifactInformation ai : list) { if (Helper.isFeature(ai.getMetaData())) { Helper.addFeatureRequirement(ctx, reqs, ai); } else if (Helper.isBundle(ai.getMetaData())) { Helper.addBundleRequirement(ctx, reqs, ai); } } } XmlHelper.fixSize(reqs); }); } }); }, null); }