| /******************************************************************************* |
| * Copyright (c) 1997, 2008 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. |
| } |
| } |
| } |