package de.codesourcery.jasm16.ide; /** * Copyright 2012 Tobias Gierke <tobias.gierke@code-sourcery.de> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; /** * Workspace configuration. * * @author tobias.gierke@code-sourcery.de */ public class WorkspaceConfig { private static final Logger LOG = Logger.getLogger(WorkspaceConfig.class); public static final String FILE_NAME = ".workspace.properties"; private static final String KEY_PROJECT = "project."; private static final String KEY_SUFFIX_PROJECT_STATE = ".state"; private static final String KEY_SUFFIX_PROJECT_BASEDIR = ".basedir"; private final File configFile; private final Map<String,String> configProperties = new HashMap<String,String>(); public WorkspaceConfig(File configFile) throws IOException { if (configFile == null) { throw new IllegalArgumentException("configFile must not be NULL"); } this.configFile = configFile; loadConfig(); } public List<File> getProjectsBaseDirectories() { List<File> result = new ArrayList<File> (); for ( String key : configProperties.keySet() ) { if ( key.startsWith( KEY_PROJECT ) && key.endsWith( KEY_SUFFIX_PROJECT_BASEDIR ) ) { result.add( new File( configProperties.get( key ) ) ); } } return result; } public void projectAdded(IAssemblyProject project) { final String key = KEY_PROJECT+project.getName()+KEY_SUFFIX_PROJECT_BASEDIR; configProperties.put( key , project.getConfiguration().getBaseDirectory().getAbsolutePath() ); } public void projectDeleted(IAssemblyProject project) { final String prefix = KEY_PROJECT+project.getName(); for ( String key : new ArrayList<String>( configProperties.keySet() ) ) { if ( key.startsWith( prefix ) ) { configProperties.remove( key ); } } } public void projectOpened(IAssemblyProject project) { configProperties.put( createProjectStateKey( project ) , Boolean.toString( true ) ); } public void projectClosed(IAssemblyProject project) { configProperties.put( createProjectStateKey( project ) , Boolean.toString( false ) ); } private static String createProjectStateKey(IAssemblyProject project) { return createProjectStateKey( project.getName() ); } private static String createProjectStateKey(String projectName) { return KEY_PROJECT+projectName+KEY_SUFFIX_PROJECT_STATE; } public boolean isProjectOpen(String projectName) { final String key = createProjectStateKey( projectName ); String value = configProperties.get( key ); if ( StringUtils.isBlank( value ) ) { value = Boolean.toString(true); } return Boolean.parseBoolean( value ); } protected void loadConfig() throws IOException { boolean success = false; if ( configFile.exists() ) { try { final Properties props = loadPropertiesFile( configFile ); for ( String key : props.stringPropertyNames() ) { configProperties.put( key , props.getProperty( key ) ); } success = true; } catch (IOException e) { LOG.error("loadConfiguration(): Failed to load workspace configuration"); } } if ( ! success ) { configProperties.clear(); configProperties.putAll( createDefaultConfiguration() ); saveConfiguration(); } } protected Properties loadPropertiesFile(File configFIle) throws IOException { final Properties props = new Properties(); final InputStream in = new FileInputStream( configFile ); try { props.load( in ); return props; } finally { IOUtils.closeQuietly( in ); } } protected Map<String,String> createDefaultConfiguration() throws IOException { final Map<String,String> result = new HashMap<String,String> (); return result; } public void saveConfiguration() throws IOException { final Properties props = new Properties(); for ( Map.Entry<String,String> keyValue : configProperties.entrySet() ) { props.put( keyValue.getKey() , keyValue.getValue() ); } final String comments = "jASM16 workspace configuration -- automatically generated, do NOT edit"; try { final FileOutputStream out = new FileOutputStream( configFile ); try { props.store( out , comments ); } finally { IOUtils.closeQuietly( out ); } } catch (IOException e) { LOG.fatal("createDefaultConfiguration(): Failed to save configuration to "+ configFile.getAbsolutePath(),e); throw e; } } }