/* * Copyright (c) 2013-2015 Josef Hardi <josef.hardi@gmail.com> * * 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 com.obidea.semantika.knowledgebase; import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import com.obidea.semantika.util.Namespaces; import com.obidea.semantika.util.StringUtils; import com.obidea.semantika.util.XmlUtils; public class DefaultPrefixManager implements IPrefixManager { private Map<String, String> mPrefixMap = new HashMap<String, String>(); /** * Creates an empty prefix manager without the default namespace. */ public DefaultPrefixManager() { setupDefaultPrefixes(); } /** * Creates an empty prefix manager with the given default namespace. The * default prefix is presented as an empty string. * * @param defaultNamespace * The default namespace. */ public DefaultPrefixManager(String defaultNamespace) { if (!StringUtils.isEmpty(defaultNamespace)) { setDefaultPrefix(defaultNamespace); } setupDefaultPrefixes(); } /** * Creates a new prefix manager where it copies another prefix manager. * * @param other * Another prefix manager to copy its content. */ public DefaultPrefixManager(IPrefixManager other) { for (String prefixName : other.getPrefixNames()) { String namespace = other.getNamespace(prefixName); if (!StringUtils.isEmpty(namespace)) { setPrefix(prefixName, namespace); } } } private void setupDefaultPrefixes() { setPrefix("owl", Namespaces.OWL.toString()); //$NON-NLS-1$ setPrefix("rdfs", Namespaces.RDFS.toString()); //$NON-NLS-1$ setPrefix("rdf", Namespaces.RDF.toString()); //$NON-NLS-1$ setPrefix("xsd", Namespaces.XSD.toString()); //$NON-NLS-1$ } @Override public void copy(Map<String, String> mapper) { for (String prefix : mapper.keySet()) { setPrefix(prefix, mapper.get(prefix)); } } /** * Sets the default namespace. * * @param defaultNamespace * The namespace to be used as the default namespace. Note that the * value may be <code>null</code> in order to clear the default * namespace. */ public void setDefaultPrefix(String defaultNamespace) { setPrefix("", defaultNamespace); //$NON-NLS-1$ } @Override public String getDefaultNamespace() { return mPrefixMap.get(""); //$NON-NLS-1$ } @Override public boolean containsPrefixMapping(String prefixName) { return mPrefixMap.containsKey(prefixName) && mPrefixMap.get(prefixName) != null; } /** * Adds a prefix name - namespace to prefix mapping. If the prefix name * already exists, it will get replaced by the new namespace. * * @param prefixName * name The prefix name (must not be null) * @param namespace * The namespace * @throws NullPointerException * if the prefix name or prefix is <code>null</code>. * @throws IllegalArgumentException * if the prefix name does not end with a colon. */ public void setPrefix(String prefixName, String namespace) { if (StringUtils.isEmpty(namespace)) { throw new IllegalArgumentException("Namespace must not be null or empty"); //$NON-NLS-1$ } mPrefixMap.put(prefixName, namespace); } public void setAll(Map<String, String> prefixMap) { for (String prefixName : prefixMap.keySet()) { setPrefix(prefixName, prefixMap.get(prefixName)); } } @Override public String getNamespace(String prefixName) { return mPrefixMap.get(prefixName); } @Override public Map<String, String> getPrefixMapper() { return Collections.unmodifiableMap(mPrefixMap); } @Override public Set<String> getPrefixNames() { return mPrefixMap.keySet(); } @Override public URI expand(String qname) { int colonPos = qname.indexOf(":"); //$NON-NLS-1$ if (colonPos != -1) { String prefixName = qname.substring(0, colonPos); if (!containsPrefixMapping(prefixName)) { throw new PrefixNotFoundException(prefixName, this); } String namespace = getNamespace(prefixName); String localName = qname.substring(colonPos + 1); return URI.create(namespace + localName); } else { String localName = qname; String defaultNamespace = getDefaultNamespace(); if (StringUtils.isEmpty(defaultNamespace)) { return URI.create(localName); } else { return URI.create(defaultNamespace + localName); } } } @Override public String shorten(URI uri) { String uriString = uri.toString(); String namespace = XmlUtils.getNCNamePrefix(uriString); for (String prefixName : getPrefixNames()) { String candidateNamespace = getNamespace(prefixName); if (namespace.equals(candidateNamespace)) { return prefixName + ":" + XmlUtils.getNCNameSuffix(uriString); } } throw new NamespaceNotFoundException(namespace, this); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Size: " + getPrefixMapper().size()); //$NON-NLS-1$ sb.append("\n"); //$NON-NLS-1$ for (String prefixName : getPrefixNames()) { if (prefixName.equals("")) { sb.append("[default]"); } else { sb.append(prefixName); } sb.append(" = "); //$NON-NLS-1$ sb.append(getNamespace(prefixName)); sb.append("\n"); //$NON-NLS-1$ } return sb.toString(); } }