/* * Copyright 2013 Serdar. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.fub.maps.project.xmlcatalog; import de.fub.utilsmodule.icons.IconRegister; import java.awt.Image; import java.beans.PropertyChangeListener; import java.io.IOException; import java.net.URL; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.netbeans.modules.xml.catalog.spi.CatalogDescriptor; import org.netbeans.modules.xml.catalog.spi.CatalogListener; import org.netbeans.modules.xml.catalog.spi.CatalogReader; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * This class collects all xml schema files, that are registered under the path * <code>MapsForge/Catalog/</code>. To register a xml schema file every file * entry should have the structure: * * <file name="device.xsd" url="<resource path>"> <attr name="schemaId" * stringvalue="<example namespace>"/> <attr name="resource" * stringvalue="nbres:<resource path>"/> </file> * * @author Serdar */ @NbBundle.Messages({"CLT_Catalog_Name=MapsForge Xml Catalog", "CLT_Catalog_Description=Provides all registered xml schema files that are associated with the MapsForge project."}) public class MapsCatalogProvider implements CatalogReader, CatalogDescriptor, EntityResolver { public static final String MAPSFORGE_XML_CATALOG_PATH = "MapsForge/Catalog"; public static final String ATTRIBUTE_SCHEMA_ID = "schemaId"; public static final String ATTRIBUTE_RESOURCE = "resource"; private static final String SCHEMA_PREFIX = "SCHEMA:"; private final Map<String, FileObject> schemaFiles = new HashMap<String, FileObject>(); /** * Creates a new instance of RegisterCatalog */ public MapsCatalogProvider() { } private Map<String, FileObject> getSchemaFiles() { schemaFiles.clear(); FileObject configObject = FileUtil.getConfigRoot().getFileObject(MAPSFORGE_XML_CATALOG_PATH); if (configObject != null) { FileObject[] children = configObject.getChildren(); for (FileObject file : children) { Object attribute = file.getAttribute(ATTRIBUTE_SCHEMA_ID); if (attribute instanceof String) { schemaFiles.put(MessageFormat.format("{1}", SCHEMA_PREFIX, attribute), file); } } } return schemaFiles; } @Override public Iterator<String> getPublicIDs() { List<String> list = new ArrayList<String>(getSchemaFiles().keySet()); return list.listIterator(); } @Override public void refresh() { } @Override public String getSystemID(String publicId) { FileObject file = getSchemaFiles().get(publicId); if (file != null) { Object attribute = file.getAttribute(ATTRIBUTE_RESOURCE); if (attribute instanceof String) { return (String) attribute; } } return null; } @Override public String resolveURI(String string) { return string; } @Override public String resolvePublic(String string) { return null; } @Override public void addCatalogListener(CatalogListener catalogListener) { } @Override public void removeCatalogListener(CatalogListener catalogListener) { } @Override public Image getIcon(int i) { return IconRegister.findRegisteredIcon("mapsforgeIcon16.png"); } @Override public String getDisplayName() { return Bundle.CLT_Catalog_Name(); } @Override public String getShortDescription() { return Bundle.CLT_Catalog_Name(); } @Override public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) { } @Override public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener) { } @Override public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { FileObject fileObject = getSchemaFiles().get(systemId); if (fileObject != null) { URL urL = new URL((String) fileObject.getAttribute(ATTRIBUTE_RESOURCE)); return new org.xml.sax.InputSource(urL.openStream()); } fileObject = getSchemaFiles().get(publicId); if (fileObject != null) { URL urL = new URL((String) fileObject.getAttribute(ATTRIBUTE_RESOURCE)); return new org.xml.sax.InputSource(urL.openStream()); } return null; } }