package com.revolsys.swing.map.symbol; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.revolsys.collection.map.MapEx; import com.revolsys.io.map.MapObjectFactory; import com.revolsys.io.map.MapObjectFactoryRegistry; import com.revolsys.logging.Logs; import com.revolsys.spring.resource.Resource; import com.revolsys.swing.map.layer.record.style.marker.Marker; import com.revolsys.swing.map.layer.record.style.marker.ShapeMarker; import com.revolsys.util.Property; public class SymbolLibrary extends SymbolGroup { private static final Map<String, SymbolLibrary> SYMBOL_LIBRARIES = new LinkedHashMap<>(); public static void addSymbolLibrary(final SymbolLibrary symbolLibrary) { final String name = symbolLibrary.getName(); synchronized (SYMBOL_LIBRARIES) { SYMBOL_LIBRARIES.put(name, symbolLibrary); } } public static Symbol findSymbol(final String name) { for (final SymbolLibrary symbolLibrary : SYMBOL_LIBRARIES.values()) { final Symbol symbol = symbolLibrary.getSymbol(name); if (symbol != null) { return symbol; } } return null; } public static List<Marker> getAllMarkers() { final List<Marker> markers = new ArrayList<>(); for (final Symbol symbol : getAllSymbols()) { try { final Marker marker = symbol.newMarker(); markers.add(marker); } catch (final Throwable e) { Logs.debug(SymbolLibrary.class, "Symbol not found", e); } } return markers; } public static List<Symbol> getAllSymbols() { final List<Symbol> symbols = new ArrayList<>(); for (final SymbolLibrary symbolLibrary : SYMBOL_LIBRARIES.values()) { symbolLibrary.addSymbolsToList(symbols); } return symbols; } public static Map<String, SymbolLibrary> getSymbolLibraries() { return SYMBOL_LIBRARIES; } public static SymbolLibrary getSymbolLibrary(final String name) { return SYMBOL_LIBRARIES.get(name); } public static void mapObjectFactoryInit() { MapObjectFactoryRegistry.newFactory("symbolLibrary", SymbolLibrary::new); MapObjectFactoryRegistry.newFactory("symbolGroup", SymbolGroup::new); MapObjectFactoryRegistry.newFactory("symbolShape", ShapeSymbol::new); MapObjectFactoryRegistry.newFactory("symbolSvg", SvgSymbol::new); } public static void mapObjectFactoryPostInit() { ShapeMarker.init(); try { final ClassLoader classLoader = MapObjectFactoryRegistry.class.getClassLoader(); final String resourceName = "META-INF/" + SymbolLibrary.class.getName() + ".json"; final Enumeration<URL> resources = classLoader.getResources(resourceName); while (resources.hasMoreElements()) { final URL url = resources.nextElement(); try { final Resource resource = Resource.getResource(url); final SymbolLibrary symbolLibrary = MapObjectFactory.toObject(resource); addSymbolLibrary(symbolLibrary); } catch (final Throwable e) { Logs.error(MapObjectFactoryRegistry.class, "Unable to read resource" + url, e); } } } catch (final Throwable e) { Logs.error(MapObjectFactoryRegistry.class, "Unable to read resources", e); } } public static Marker newMarker(final String markerType) { if (Property.hasValue(markerType)) { final Symbol symbol = findSymbol(markerType); if (symbol != null) { return symbol.newMarker(); } } return null; } public static SymbolLibrary newSymbolLibrary(final String name, final String title) { synchronized (SYMBOL_LIBRARIES) { SymbolLibrary symbolLibrary = SYMBOL_LIBRARIES.get(name); if (symbolLibrary == null) { symbolLibrary = new SymbolLibrary(name, title); addSymbolLibrary(symbolLibrary); } return symbolLibrary; } } public SymbolLibrary() { } public SymbolLibrary(final Map<String, ? extends Object> properties) { setProperties(properties); } public SymbolLibrary(final String name, final String title) { super(name, title); } @Override public SymbolLibrary getSymbolLibrary() { return this; } @Override public String getTypeName() { return "symbolLibrary"; } @Override public MapEx toMap() { final MapEx map = super.toMap(); return map; } }