/******************************************************************************* * Copyright (c) 2006 Sybase, Inc. and others. * * 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.common.ui.internal.utils; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import org.eclipse.core.runtime.IPath; import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin; import org.eclipse.jst.jsf.common.ui.internal.logging.Logger; import org.eclipse.ui.IMemento; import org.eclipse.ui.XMLMemento; import org.eclipse.ui.plugin.AbstractUIPlugin; /** * This provides a means to store common properties for pages. * * Holds a <code>List</code> of <code>Properties</code> which can be * manipulated by the user. * * @author mengbo */ public class FavoriteConfigurations { private static Logger _log = JSFUICommonPlugin .getLogger(FavoriteConfigurations.class); private final static String FAV_EXTENSIONS = ".xml"; //$NON-NLS-1$ private final static String ELEMENT_ROOT = "favorite"; //$NON-NLS-1$ private final static String ELEMENT_CONFIG = "config"; //$NON-NLS-1$ private final static String ELEMENT_NAME = "name"; //$NON-NLS-1$ private final static String ELEMENT_PROPERTY = "property"; //$NON-NLS-1$ private final static String ELEMENT_VALUE = "value"; //$NON-NLS-1$ private Map _favorites; private IPath _favoriteFile; private String _favoriteName; /** * Constructor * * @param plugin * used for location of favorite file. * @param favoriteName * used for name of file and for mapping the properties of this * favorite. */ public FavoriteConfigurations(AbstractUIPlugin plugin, String favoriteName) { super(); _favoriteFile = plugin.getStateLocation().append( scanFileName(favoriteName) + FAV_EXTENSIONS); readFavorites(); } /** * Returns the favorite entry that is mapped under the given name. * * @param name * the favorite * @return <code>Properties</code> config entry for the favorite. */ public Properties getFavorite(String name) { return (Properties) _favorites.get(name); } /** * Stores the Favorites into the plugin directory. */ public void saveFavorites() { FileWriter fw = null; try { XMLMemento memento = XMLMemento.createWriteRoot(ELEMENT_ROOT); for (Iterator it = _favorites.keySet().iterator(); it.hasNext();) { String favName = (String) it.next(); Map props = new HashMap((Properties) _favorites.get(favName)); IMemento config = memento.createChild(ELEMENT_CONFIG); config.putString(ELEMENT_NAME, favName); for (Iterator it1 = props.keySet().iterator(); it1.hasNext();) { IMemento entry = config.createChild(ELEMENT_PROPERTY); String name = (String) it1.next(); entry.putString(ELEMENT_NAME, name); entry.putString(ELEMENT_VALUE, (String) props.get(name)); } } fw = new FileWriter(_favoriteFile.toFile()); memento.save(fw); } catch (Exception ee) { // log.FavoriteConfigurations.save.error=Failed to save {0} // favorites. File={1} _log.info("log.FavoriteConfigurations.save.error", _favoriteName, //$NON-NLS-1$ _favoriteFile.toOSString(), ee); } finally { if (fw != null) { try { fw.close(); } catch (IOException ee)// NOPMD { // nothing to do when IOException throwed in closing files. } } } } /** * Add the favorite into the internal structure but don't save until * saveFavorites() is called. * * @param name * @param config */ public void addFavorite(String name, Properties config) { _favorites.put(name, config); } /** * Removes the Favorite that is mapped under the given name. * * @param name * the name of the configuration */ public void removeFavorite(String name) { _favorites.remove(name); } /** * Read the favorites from the disk into the memory structure. */ protected void readFavorites() { _favorites = new HashMap(); FileReader fr = null; try { try { fr = new FileReader(_favoriteFile.toFile()); } catch (FileNotFoundException ee)// NOPMD { // no error here since they don't have to have a favorites... } if (fr != null) { XMLMemento memento = XMLMemento.createReadRoot(fr); IMemento[] children = memento.getChildren(ELEMENT_CONFIG); for (int ii = 0; ii < children.length; ii++) { Properties props = new Properties(); IMemento config = children[ii]; String name = config.getString(ELEMENT_NAME); IMemento[] configProperties = config .getChildren(ELEMENT_PROPERTY); for (int jj = 0; jj < configProperties.length; jj++) { IMemento entry = configProperties[jj]; setProperty(props, entry.getString(ELEMENT_NAME), entry .getString(ELEMENT_VALUE)); } _favorites.put(name, props); } } } catch (Exception ee) { // log.FavoriteConfigurations.read.error=Failed to save {0} // favorites. File={1} _log.error("log.FavoriteConfigurations.read.error", _favoriteName, //$NON-NLS-1$ _favoriteFile.toOSString(), ee); } finally { if (fr != null) { try { fr.close(); } catch (IOException ee)// NOPMD { // nothing to do when IOException throwed in closing files. } } } } /** * Set the value in the properties object. * * @param props * @param name * @param value */ private void setProperty(Properties props, String name, String value) { if (name != null && value != null) { props.setProperty(name, value); } } /** * Get a list of all the favorites stored in this file. * * @return list of favorites */ public String[] getFavoritesList() { Object[] objs = _favorites.keySet().toArray(); String[] names = new String[objs.length]; for (int ii = 0; ii < objs.length; ii++) { names[ii] = (String) objs[ii]; } Arrays.sort(names); return names; } /** * scan the file name for any bad character that would fail when trying to * create the file. We replace bad characters with '_' */ private static String scanFileName(String filename) { StringBuffer strBuf = new StringBuffer(); char[] chars = filename.toCharArray(); for (int ii = 0; ii < chars.length; ii++) { switch (chars[ii]) { case '&': case '\\': case '/': case ' ': case '\t': case ':': case '.': case '\"': case '\'': case '@': strBuf.append('_'); break; default: strBuf.append(chars[ii]); break; } } return strBuf.toString(); } }