configurationstore.java

来自「OSGI这是一个中间件,与UPNP齐名,是用于移植到嵌入式平台之上」· Java 代码 · 共 372 行

JAVA
372
字号
/* * Copyright (c) 2003-2004, KNOPFLERFISH project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above copyright *   notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above *   copyright notice, this list of conditions and the following *   disclaimer in the documentation and/or other materials *   provided with the distribution. * * - Neither the name of the KNOPFLERFISH project nor the names of its *   contributors may be used to endorse or promote products derived *   from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */package org.knopflerfish.bundle.cm;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.PushbackReader;import java.util.Dictionary;import java.util.Enumeration;import java.util.Hashtable;import java.util.Properties;import java.util.Vector;import org.knopflerfish.shared.cm.CMDataReader;import org.knopflerfish.shared.cm.CMDataWriter;import org.osgi.framework.Constants;/** * Persistent storage of configuration data *  * @author Per Gustafson * @version $Revision: 1.1.1.1 $ */class ConfigurationStore {    private final static String storeDataFile = "store_data";    private final static String pidDataFile = "pid_to_file";    private final static String factoryPidDataFile = "fpid_to_pids";    private final static String generatedPids = "generated_pids";    private final static String FACTORY_PID = "service.factoryPid";    private final static String SERVICE_PID = Constants.SERVICE_PID;    private final File storeDir;    private Properties storeData;    private Properties pidToFileName;    private Hashtable factoryPidToPids;    private Hashtable cache = new Hashtable();    private CMDataReader cmDataReader = new CMDataReader();    public ConfigurationStore(File storeDir) throws IOException {        this.storeDir = storeDir;        storeDir.mkdirs();        storeData = createAndLoadProperties(storeDataFile);        pidToFileName = createAndLoadProperties(pidDataFile);        factoryPidToPids = loadHashtable(factoryPidDataFile);        if (factoryPidToPids == null) {            factoryPidToPids = new Hashtable();        }    }    public synchronized Enumeration listPids() {        return pidToFileName.keys();    }    public synchronized ConfigurationDictionary load(String pid)            throws IOException {        String fileName = (String) pidToFileName.get(pid);        if (fileName == null) {            return null;        }        return loadConfigurationDictionary(fileName);    }    public synchronized ConfigurationDictionary[] loadAll(String factoryPid)            throws IOException {        Vector v = (Vector) factoryPidToPids.get(factoryPid);        if (v == null) {            return null;        }        Vector loaded = new Vector();        for (int i = 0; i < v.size(); ++i) {            ConfigurationDictionary d = load((String) v.elementAt(i));            if (d != null) {                loaded.addElement(d);            }        }        ConfigurationDictionary[] configurations = new ConfigurationDictionary[loaded                .size()];        loaded.copyInto(configurations);        return configurations;    }    public synchronized void store(String pid, String factoryPid,            Dictionary configuration) throws IOException {        String fileName = fileNameOf(pid, factoryPid);        storeConfigurationDictionary(configuration, fileName);    }    public synchronized ConfigurationDictionary delete(String pid)            throws IOException {        if (pid == null || "".equals(pid)) {            return null;        }        String fileName = (String) pidToFileName.remove(pid);        if (fileName == null || "".equals(fileName)) {            return null;        }        storeProperties(pidToFileName, pidDataFile);        ConfigurationDictionary d = loadConfigurationDictionary(fileName);        uncacheConfigurationDictionary(fileName);        String fpid = (String) d.get(FACTORY_PID);        if (fpid != null) {            Vector v = (Vector) factoryPidToPids.get(fpid);            if (v.removeElement(pid)) {                storeHashtable(factoryPidToPids, factoryPidDataFile);            }        }        File f = new File(storeDir, fileName);        if (f.exists()) {            f.delete();        }        return d;    }    public synchronized void deleteAll(String factoryPid) throws IOException {        Vector v = (Vector) factoryPidToPids.get(factoryPid);        if (v == null) {            return;        }        Enumeration e = v.elements();        while (e.hasMoreElements()) {            delete((String) e.nextElement());        }    }    public synchronized String generatePid(String factoryPid)            throws IOException {        String suffix = null;        Properties p = new Properties();        File pidFile = new File(storeDir, generatedPids);        if (pidFile.exists()) {            InputStream is = new BufferedInputStream(new FileInputStream(                    pidFile));            p.load(is);            if (is != null) {                is.close();            }            suffix = (String) p.get(factoryPid);        }        if (suffix == null) {            suffix = new Long(0).toString();        } else {            long l = Long.parseLong(suffix) + 1;            suffix = new Long(l).toString();        }        p.put(factoryPid, suffix);        FileOutputStream os = new FileOutputStream(pidFile);        p.save(os, "Suffixes used for generating pids");        if (os != null) {            os.close();        }        return factoryPid + "." + suffix;    }    // ////////////////////    private String fileNameOf(String pid, String factoryPid) throws IOException {        if (pid == null) {            return null;        }        String s = (String) pidToFileName.get(pid);        if (s == null) {            s = generateNewFileName(pid, factoryPid);        }        return s;    }    private String generateNewFileName(String pid, String factoryPid)            throws IOException {        final String lastUsedFileNumber = "lastUsedFileNumber";        String fileNumber = (String) storeData.get(lastUsedFileNumber);        if (fileNumber == null) {            fileNumber = new Long(0).toString();        } else {            long l = Long.parseLong(fileNumber) + 1;            fileNumber = new Long(l).toString();        }        storeData.put(lastUsedFileNumber, fileNumber);        storeProperties(storeData, storeDataFile);        if (factoryPid != null) {            Vector v = (Vector) factoryPidToPids.get(factoryPid);            if (v == null) {                v = new Vector();            }            v.addElement(pid);            factoryPidToPids.put(factoryPid, v);            storeHashtable(factoryPidToPids, factoryPidDataFile);        }        pidToFileName.put(pid, fileNumber);        storeProperties(pidToFileName, pidDataFile);        return fileNumber;    }    private Properties createAndLoadProperties(String fileName)            throws IOException {        Properties p = new Properties();        File f = new File(storeDir, fileName);        if (f.exists()) {            InputStream is = new BufferedInputStream(new FileInputStream(f));            p.load(is);            if (is != null) {                is.close();            }        }        return p;    }    private void storeProperties(Properties p, String fileName)            throws IOException {        File f = new File(storeDir, fileName);        OutputStream os = new FileOutputStream(f);        p.save(os, "Private data of the ConfigurationStore");        if (os != null) {            os.close();        }    }    // ////////////////////    private Hashtable loadHashtable(String fileName) throws IOException {        if (fileName == null) {            return null;        }        File f = new File(storeDir, fileName);        if (!f.exists()) {            return null;        }        PushbackReader r = new PushbackReader(new BufferedReader(                new InputStreamReader(new FileInputStream(f),                        CMDataReader.ENCODING), 8192), 8);        Hashtable h = null;        try {            h = cmDataReader.readCMData(r);        } catch (Exception e) {            Activator.log.error("Failed reading file " + f.toString(), e);            h = null;        }        if (r != null) {            r.close();        }        return h;    }    private void storeHashtable(Hashtable h, String fileName)            throws IOException {        File f = new File(storeDir, fileName);        PrintWriter w = new PrintWriter(new OutputStreamWriter(                new FileOutputStream(f), CMDataWriter.ENCODING));        CMDataWriter.writeConfiguration(fileName, h, w);        if (w != null) {            w.close();        }    }    // /////////////    private ConfigurationDictionary getCachedConfigurationDictionary(            String fileName) {        return (ConfigurationDictionary) cache.get(fileName);    }    private void readAndCacheConfigurationDictionary(String fileName)            throws IOException {        Hashtable h = loadHashtable(fileName);        if (h != null) {            cache.put(fileName, new ConfigurationDictionary(h));        }    }    private void uncacheConfigurationDictionary(String fileName) {        cache.remove(fileName);    }    private ConfigurationDictionary loadConfigurationDictionary(String fileName)            throws IOException {        if (fileName == null) {            return null;        }        ConfigurationDictionary d = getCachedConfigurationDictionary(fileName);        if (d == null) {            readAndCacheConfigurationDictionary(fileName);            d = getCachedConfigurationDictionary(fileName);        }        return d;    }    private void storeConfigurationDictionary(Dictionary d, String fileName)            throws IOException {        uncacheConfigurationDictionary(fileName);        File f = new File(storeDir, fileName);        PrintWriter w = new PrintWriter(new OutputStreamWriter(                new FileOutputStream(f), CMDataWriter.ENCODING));        String pid = (String) d.get(SERVICE_PID);        String fpid = (String) d.get(FACTORY_PID);        if (fpid == null) {            CMDataWriter.writeConfiguration(pid, d, w);        } else {            CMDataWriter.writeFactoryConfiguration(fpid, pid, d, w);        }        if (w != null) {            w.close();        }    }}

⌨️ 快捷键说明

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