package org.jboss.windup.rules.files; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Logger; import org.jboss.windup.config.GraphRewrite; import org.jboss.windup.graph.model.WindupVertexFrame; import org.jboss.windup.graph.model.resource.FileModel; import org.jboss.windup.graph.service.FileService; import org.jboss.windup.graph.service.GraphService; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.util.wrappers.event.listener.GraphChangedListener; /** * Listens to changes to the "filePath" graph node property, * and if it finds it matching some of patterns, attaches the respective types to the vertex. * E.g. .*\.tld$ >> XmlFileModel * * @see FileMappingHandler: <file-mapping from=".*\.tld$" to="XmlFileModel" /> */ public class FileMappingGraphChangedListener implements GraphChangedListener { private static final Logger LOG = Logger.getLogger(FileMappingGraphChangedListener.class.getSimpleName()); private final GraphRewrite event; public FileMappingGraphChangedListener(GraphRewrite event) { this.event = event; } @Override public void vertexPropertyChanged(Vertex vertex, String key, Object oldValue, Object setValue) { if ( ! FileModel.FILE_PATH.equals(key)) return; FileService fileService = new FileService(event.getGraphContext()); FileModel model = fileService.frame(vertex); if ( model.isDirectory()) return; Map<String, List<Class<? extends WindupVertexFrame>>> mappings = FileMapping.getMappings(event); // Compare the value being set to "fileType" against file mapping patterns. // If it matches, add the vertex types to this vertex. for (Entry<String, List<Class<? extends WindupVertexFrame>>> entry : mappings.entrySet()) { String pattern = entry.getKey(); List<Class<? extends WindupVertexFrame>> types = entry.getValue(); if (((String) setValue).matches(pattern)) { for (Class<? extends WindupVertexFrame> type : types) { GraphService.addTypeToModel(event.getGraphContext(), model, type); } LOG.fine("Mapped file [" + model.getFilePath() + "] matching pattern [" + pattern + "] " + "to the following [" + types.size() + "] types: " + types); } } } @Override public void vertexPropertyRemoved(Vertex vertex, String key, Object removedValue) { } @Override public void vertexAdded(Vertex vertex) { } @Override public void vertexRemoved(Vertex vertex, Map<String, Object> props) { } @Override public void edgeAdded(Edge edge) { } @Override public void edgePropertyChanged(Edge edge, String key, Object oldValue, Object setValue) { } @Override public void edgePropertyRemoved(Edge edge, String key, Object removedValue) { } @Override public void edgeRemoved(Edge edge, Map<String, Object> props) { } }