package org.jboss.windup.reporting.service; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.graph.GraphContext; import org.jboss.windup.graph.service.GraphService; import org.jboss.windup.reporting.model.TagSetModel; import com.tinkerpop.blueprints.Vertex; /** * Contains methods for getting tag set models as well as maintaining a cache. * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> */ public class TagSetService extends GraphService<TagSetModel> { private static final String TAG_CACHE_KEY = TagSetService.class.getCanonicalName() + "_Cache"; public TagSetService(GraphContext context) { super(context, TagSetModel.class); } private Map<Set<String>, Vertex> getCache(GraphRewrite event) { @SuppressWarnings("unchecked") Map<Set<String>, Vertex> result = (Map<Set<String>, Vertex>) event.getRewriteContext().get(TAG_CACHE_KEY); if (result == null) { result = new HashMap<>(); event.getRewriteContext().put(TAG_CACHE_KEY, result); } return result; } /** * This essentially ensures that we only store a single Vertex for each unique "Set" of tags. */ public TagSetModel getOrCreate(GraphRewrite event, Set<String> tags) { Map<Set<String>, Vertex> cache = getCache(event); Vertex vertex = cache.get(tags); if (vertex == null) { TagSetModel model = create(); model.setTags(tags); cache.put(tags, model.asVertex()); return model; } else { return frame(vertex); } } }