/*******************************************************************************
* Copyright (c) 2010, 2013 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.beans.core.metadata.internal.model;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.springframework.ide.eclipse.beans.core.metadata.BeansMetadataPlugin;
import org.springframework.ide.eclipse.beans.core.metadata.model.IBeanMetadata;
/**
* Stores and loads the {@link IBeanMetadata}s from the persisted file.
* @author Christian Dupuis
* @author Martin Lippert
* @since 2.0.5
*/
public class BeanMetadataPersistence {
private static final String STATE_FILE_NAME = ".state";
private static final String METADATA_FOLDER_NAME = "/metadata/";
private static final String BEANPROPERTIES_FOLDER_NAME = "/properties/";
public static void storeMetadata(Map<String, BeanMetadataHolder> metaData) {
File file = BeansMetadataPlugin.getDefault().getStateLocation().append(METADATA_FOLDER_NAME + STATE_FILE_NAME)
.toFile();
store(metaData, file);
}
public static void storeProperties(Map<String, BeanPropertyDataHolder> properties) {
File file = BeansMetadataPlugin.getDefault().getStateLocation()
.append(BEANPROPERTIES_FOLDER_NAME + STATE_FILE_NAME).toFile();
store(properties, file);
}
private static void store(Object obj, File file) {
ObjectOutputStream out = null;
try {
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(obj);
}
catch (IOException e) {
BeansMetadataPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, BeansMetadataPlugin.PLUGIN_ID,
"Exception saving meta data model for class " + obj.getClass(), e));
}
finally {
try {
if (out != null)
out.close();
}
catch (IOException e) {
}
}
}
@SuppressWarnings("unchecked")
public static Map<String, BeanMetadataHolder> loadMetadata() {
File f = BeansMetadataPlugin.getDefault().getStateLocation().append(METADATA_FOLDER_NAME + STATE_FILE_NAME)
.toFile();
Map<String, BeanMetadataHolder> metaData = load(f, Map.class);
if (metaData != null && metaData.size() > 0) {
return metaData;
}
// create new empty model
return new ConcurrentHashMap<String, BeanMetadataHolder>();
}
@SuppressWarnings("unchecked")
public static Map<String, BeanPropertyDataHolder> loadProperties() {
File f = BeansMetadataPlugin.getDefault().getStateLocation().append(BEANPROPERTIES_FOLDER_NAME + STATE_FILE_NAME)
.toFile();
Map<String, BeanPropertyDataHolder> metaData = load(f, Map.class);
if (metaData != null && metaData.size() > 0) {
return metaData;
}
// create new empty model
return new ConcurrentHashMap<String, BeanPropertyDataHolder>();
}
public static <T> T load(File file, Class<T> clazz) {
ObjectInputStream in = null;
try {
if (file.exists()) {
in = new ObjectInputStream(new FileInputStream(file));
return (T) in.readObject();
}
}
catch (Exception e) {
BeansMetadataPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, BeansMetadataPlugin.PLUGIN_ID,
"Exception restoring meta data model for class " + clazz, e));
}
finally {
try {
if (in != null)
in.close();
}
catch (IOException e) {
}
}
return null;
}
}