filebasednamespacemappings.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 219 行

JAVA
219
字号
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.jackrabbit.core.query.lucene;import org.apache.jackrabbit.name.IllegalNameException;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.NoPrefixDeclaredException;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.UnknownPrefixException;import org.apache.jackrabbit.name.AbstractNamespaceResolver;import org.apache.jackrabbit.name.NameFormat;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.jcr.NamespaceException;import java.io.BufferedOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Properties;/** * The class <code>NamespaceMappings</code> implements a {@link * org.apache.jackrabbit.core.NamespaceResolver} that holds a namespace * mapping that is used internally in the search index. Storing paths with the * full uri of a namespace would require too much space in the search index. * <p/> * Whenever a yet unknown namespace uri to prefix mapping is requested, a new * prefix is created on the fly and associated with the namespace. Known * namespace mappings are stored in a properties file. */public class FileBasedNamespaceMappings        extends AbstractNamespaceResolver        implements NamespaceMappings {    /**     * Default logger instance for this class     */    private static Logger log = LoggerFactory.getLogger(NamespaceMappings.class);    /**     * Location of the file that persists the uri / prefix mappings     */    private final File storage;    /**     * Map of uris indexed by prefixes     */    private Map prefixToURI = new HashMap();    /**     * Map of prefixes indexed by uris     */    private Map uriToPrefix = new HashMap();    /**     * Current prefix count.     */    private int prefixCount;    /**     * Creates <code>NamespaceMappings</code> instance. Initial mappings are     * loaded from <code>file</code>.     *     * @param file the <code>File</code> to load initial mappings.     * @throws IOException if an error occurs while reading initial namespace     *                     mappings from <code>file</code>.     */    public FileBasedNamespaceMappings(File file) throws IOException {        storage = file;        load();    }    /**     * Returns a namespace uri for a <code>prefix</code>.     *     * @param prefix the namespace prefix.     * @return the namespace uri.     * @throws NamespaceException if no namespace uri is registered for     *                            <code>prefix</code>.     */    public synchronized String getURI(String prefix) throws NamespaceException {        if (!prefixToURI.containsKey(prefix)) {            throw new NamespaceException(prefix + ": is not a registered namespace prefix.");        }        return (String) prefixToURI.get(prefix);    }    /**     * Returns a prefix for the namespace <code>uri</code>. If a namespace     * mapping exists, the already known prefix is returned; otherwise a new     * prefix is created and assigned to the namespace uri.     *     * @param uri the namespace uri.     * @return the prefix for the namespace uri.     * @throws NamespaceException if an yet unknown namespace uri / prefix     *                            mapping could not be stored.     */    public synchronized String getPrefix(String uri) throws NamespaceException {        String prefix = (String) uriToPrefix.get(uri);        if (prefix == null) {            // make sure prefix is not taken            while (prefixToURI.get(String.valueOf(prefixCount)) != null) {                prefixCount++;            }            prefix = String.valueOf(prefixCount);            prefixToURI.put(prefix, uri);            uriToPrefix.put(uri, prefix);            log.debug("adding new namespace mapping: " + prefix + " -> " + uri);            try {                store();            } catch (IOException e) {                throw new NamespaceException("Could not obtain a prefix for uri: " + uri, e);            }        }        return prefix;    }    //----------------------------< NamespaceMappings >-------------------------    /**     * Translates a property name from a session local namespace mapping     * into a search index private namespace mapping.     *     * @param name     the property name to translate     * @param resolver the <code>NamespaceResolver</code> of the local session.     * @return the translated property name     */    public String translatePropertyName(String name, NamespaceResolver resolver)            throws IllegalNameException, UnknownPrefixException {        QName qName = NameFormat.parse(name, resolver);        try {            return NameFormat.format(qName, this);        } catch (NoPrefixDeclaredException e) {            // should never happen actually, because we create yet unknown            // uri mappings on the fly.            throw new IllegalNameException("Internal error.", e);        }    }    //-----------------------< internal >---------------------------------------    /**     * Loads currently known mappings from a .properties file.     *     * @throws IOException if an error occurs while reading from the file.     */    private void load() throws IOException {        if (storage.exists()) {            InputStream in = new FileInputStream(storage);            try {                Properties props = new Properties();                log.debug("loading namespace mappings...");                props.load(in);                // read mappings from properties                Iterator iter = props.keySet().iterator();                while (iter.hasNext()) {                    String prefix = (String) iter.next();                    String uri = props.getProperty(prefix);                    log.debug(prefix + " -> " + uri);                    prefixToURI.put(prefix, uri);                    uriToPrefix.put(uri, prefix);                }                prefixCount = props.size();                log.debug("namespace mappings loaded.");            } finally {                in.close();            }        }    }    /**     * Writes the currently known mappings into a .properties file.     *     * @throws IOException if an error occurs while writing the file.     */    private void store() throws IOException {        Properties props = new Properties();        // store mappings in properties        Iterator iter = prefixToURI.keySet().iterator();        while (iter.hasNext()) {            String prefix = (String) iter.next();            String uri = (String) prefixToURI.get(prefix);            props.setProperty(prefix, uri);        }        OutputStream out = new FileOutputStream(storage);        try {            out = new BufferedOutputStream(out);            props.store(out, null);        } finally {            // make sure stream is closed            out.close();        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?