diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.ip/src/org/eclipse/equinox/internal/ip/storage/file/FileStorage.java')
-rw-r--r-- | bundles/org.eclipse.equinox.ip/src/org/eclipse/equinox/internal/ip/storage/file/FileStorage.java | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.ip/src/org/eclipse/equinox/internal/ip/storage/file/FileStorage.java b/bundles/org.eclipse.equinox.ip/src/org/eclipse/equinox/internal/ip/storage/file/FileStorage.java new file mode 100644 index 000000000..9b4cb64a9 --- /dev/null +++ b/bundles/org.eclipse.equinox.ip/src/org/eclipse/equinox/internal/ip/storage/file/FileStorage.java @@ -0,0 +1,185 @@ +/******************************************************************************* + * Copyright (c) 1997-2007 by ProSyst Software GmbH + * http://www.prosyst.com + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * ProSyst Software GmbH - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.ip.storage.file; + +import java.io.*; +import java.util.*; +import java.util.zip.*; +import org.eclipse.equinox.internal.ip.ProvisioningStorage; +import org.eclipse.equinox.internal.ip.impl.Log; +import org.eclipse.equinox.internal.ip.impl.ProvisioningAgent; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.service.provisioning.ProvisioningService; + +/** + * File Storage. + * + * @author Avgustin Marinov, + * @author Pavlin Dobrev + * @version 1.0 + */ + +public class FileStorage implements ProvisioningStorage, BundleActivator { + + /** Name of data file used for storing configuration. */ + public static final String FILE_NAME = "_storage.zip"; + + /** Bundle context. */ + private BundleContext bc; + + /** + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext bc) throws Exception { + Log.debug = ProvisioningAgent.getBoolean("equinox.provisioning.debug"); + this.bc = bc; + } + + /** + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext bc) throws Exception { + } + + /** + * @see org.eclipse.equinox.internal.ip.ProvisioningStorage#getStoredInfo() + */ + public Dictionary getStoredInfo() { + FileInputStream fis = null; + try { + fis = new FileInputStream(bc.getDataFile(FILE_NAME)); + } catch (Exception e) { + return null; + } + try { + Dictionary toAdd = new Hashtable(); + getInfo(fis, toAdd); + fis.close(); + return toAdd; + } catch (Exception e) { + Log.debug(e); + return null; + } + } + + /** + * @see org.eclipse.equinox.internal.ip.ProvisioningStorage#store(java.util.Dictionary) + */ + public void store(Dictionary dictionary) { + try { + FileOutputStream fos = new FileOutputStream(bc.getDataFile(FILE_NAME)); + saveInfo(fos, dictionary); + fos.close(); + } catch (Exception e) { + Log.debug(e); + } + } + + /** + * Returns string name of storage. + * + * @see java.lang.Object#toString() + */ + public String toString() { + return "File Storage"; + } + + /** + * Decodes data from input stream and loads it in passed dictionary. + * + * @param is + * input stream in specific format. + * @param info + * dictionary. + */ + private void getInfo(InputStream is, Dictionary info) { + if (is != null) { + try { + ZipInputStream zis = new ZipInputStream(is); + ZipEntry ze; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + int read; + byte[] buff = new byte[256]; + while ((ze = zis.getNextEntry()) != null) { + if ("props.txt".equals(ze.getName())) { + BufferedReader reader = new BufferedReader(new InputStreamReader(zis)); + String line; + int index; + while ((line = reader.readLine()) != null) { + if (!(line = line.trim()).startsWith("#")) { + if ((index = line.indexOf("=")) != -1) { + String key = line.substring(0, index); + if (ProvisioningService.PROVISIONING_UPDATE_COUNT.equals(key)) { + int uc = 0; + try { + uc = Integer.parseInt(line.substring(index + 1).trim()); + } catch (Exception _) { + } + info.put(key, new Integer(uc)); + } else { + info.put(key, line.substring(index + 1)); + } + } + } + } + } else { + while ((read = zis.read(buff)) != -1) { + baos.write(buff, 0, read); + } + info.put(ze.getName(), baos.toByteArray()); + baos.reset(); + } + zis.closeEntry(); + } + } catch (Exception e) { + Log.debug(e); + // What is loaded is loaded. + } + } + } + + /** + * Encodes "info" and saves it into an output stream. + * + * @param os + * output stream where to be saved data. + */ + private void saveInfo(OutputStream os, Dictionary info) { + try { + ZipOutputStream zos = new ZipOutputStream(os); + ByteArrayOutputStream strings = new ByteArrayOutputStream(); + Object key; + Object value; + for (Enumeration e = info.keys(); e.hasMoreElements();) { + key = e.nextElement(); + value = info.get(key); + if (value instanceof String || ProvisioningService.PROVISIONING_UPDATE_COUNT.equals(key)) { + strings.write((key + "=" + value + "\r\n").getBytes()); + } else if (value instanceof byte[]) { + ZipEntry ze = new ZipEntry((String) key); + zos.putNextEntry(ze); + zos.write((byte[]) value); + zos.closeEntry(); + } + } + ZipEntry ze = new ZipEntry("props.txt"); + zos.putNextEntry(ze); + zos.write(strings.toByteArray()); + zos.closeEntry(); + zos.close(); + } catch (Exception e) { + Log.debug(e); + // What is load is load. + } + } +} |