package org.wildfly.swarm.topology.runtime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import javax.enterprise.context.ApplicationScoped;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.DotName;
import org.jboss.jandex.Index;
import org.jboss.shrinkwrap.api.Archive;
import org.wildfly.swarm.spi.api.ArchiveMetadataProcessor;
import org.wildfly.swarm.topology.Advertise;
import org.wildfly.swarm.topology.Advertises;
import org.wildfly.swarm.topology.TopologyArchive;
/**
* @author Bob McWhirter
*/
@ApplicationScoped
public class AdvertisingMetadataProcessor implements ArchiveMetadataProcessor {
@Override
public void processArchive(Archive<?> archive, Index index) {
List<AnnotationInstance> annos = index.getAnnotations(DotName.createSimple(Advertise.class.getName()));
List<AnnotationInstance> repeatingAnnos = index.getAnnotations(DotName.createSimple(Advertises.class.getName()));
Stream.concat(annos.stream(),
repeatingAnnos
.stream()
.flatMap(anno -> Stream.of(anno.value().asNestedArray())))
.forEach(anno -> advertise(archive, anno));
}
private void advertise(Archive<?> archive, AnnotationInstance anno) {
String serviceName = anno.value().asString();
List<String> tags = Optional.ofNullable(anno.value(Advertise.TAGS_ATTRIBUTE_NAME))
.map(AnnotationValue::asStringArray)
.map(Arrays::asList)
.orElse(Collections.emptyList());
TopologyArchive topologyArchive = archive.as(TopologyArchive.class);
topologyArchive.advertise(serviceName, tags);
}
}