/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * 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 *******************************************************************************/ package org.ebayopensource.turmeric.eclipse.utils.io; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.ebayopensource.turmeric.eclipse.utils.plugin.WorkspaceUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; /** * The Class PropertiesFileUtil. * * @author smathew */ public class PropertiesFileUtil { /** * Checks if is equal. * * @param firstProperties the first properties * @param secondProperties the second properties * @return assumes that the key/value are all strings can be enhanced later * if required */ public static boolean isEqual(Properties firstProperties, Properties secondProperties) { if (firstProperties.size() == secondProperties.size()) { for (Object key1 : firstProperties.keySet()) { if (key1 instanceof String) { String strKey1 = (String) key1; String value1 = String.valueOf(firstProperties.getProperty(strKey1)); String value2 = String.valueOf(secondProperties.getProperty(strKey1)); if (StringUtils.equals(value1, value2) == false) { return false; } } else { return false; } } return true; } return false; } /** * Write to file. * * @param properties the properties * @param file the file * @param comments the comments * @throws IOException Signals that an I/O exception has occurred. * @throws CoreException the core exception */ public static void writeToFile(Properties properties, IFile file, String comments) throws IOException, CoreException { OutputStream output = null; try { output = new ByteArrayOutputStream(); properties.store(output, comments); WorkspaceUtil.writeToFile(output.toString(), file, null); } finally { IOUtils.closeQuietly(output); } } @SuppressWarnings("unchecked") private static void accessProperty(InputStream input, OutputStream output, String[] keys, PropertyOperation operation, boolean autoclose) throws IOException { List<String> lines = new ArrayList<String>(); List<String> result = new ArrayList<String>(); try { lines = IOUtils.readLines(input); } finally { if (autoclose) { IOUtils.closeQuietly(input); } } try { for (String line : lines) { int offset = line.indexOf("="); if (line.trim().length() > 0 && offset > -1) { String originalKey = line.substring(0, offset).trim(); String originalValue = line.substring(++offset); int index = ArrayUtils.indexOf(keys, originalKey); if (index > -1) { String outputLine = operation.process(line, originalKey, originalValue); if (outputLine != null) { result.add(outputLine); } } else { result.add(line); } } else { result.add(line); } } if (output != null) { IOUtils.writeLines(result, null, output); } } finally { if (autoclose) { IOUtils.closeQuietly(output); } } } /** * Gets the property value by key. * * @param input the input * @param key the key * @return the property value by key * @throws IOException Signals that an I/O exception has occurred. */ public static String getPropertyValueByKey(InputStream input, String key) throws IOException { final StringBuffer buffer = new StringBuffer(); accessProperty(input, null, new String[]{key}, new PropertyOperation() { @Override public String process(String input, String key, String value) { buffer.append(value); return value; } }, false); return buffer.length() > 0 ? buffer.toString() : null; } /** * Removes the property by key. * * @param input the input * @param output the output * @param keys the keys * @throws IOException Signals that an I/O exception has occurred. */ public static void removePropertyByKey(InputStream input, OutputStream output, String[] keys) throws IOException { accessProperty(input, output, keys, new PropertyOperation() { @Override public String process(String input, String key, String value) { return null;//null means remove this line } }, true); } /** * Update property by key. * * @param input the input * @param output the output * @param targetKey the target key * @param targetValue the target value * @throws IOException Signals that an I/O exception has occurred. */ public static void updatePropertyByKey(InputStream input, OutputStream output, String targetKey, final String targetValue) throws IOException { accessProperty(input, output, new String[]{targetKey}, new PropertyOperation() { @Override public String process(String input, String key, String value) { return key + "=" + targetValue; } }, true); } /** * Adds the property. * * @param input the input * @param output the output * @param properties the properties * @throws IOException Signals that an I/O exception has occurred. */ @SuppressWarnings("unchecked") public static void addProperty(InputStream input, OutputStream output, Map<String, String> properties) throws IOException { List<String> sources = new ArrayList<String>(); try { sources = IOUtils.readLines(input); } finally { IOUtils.closeQuietly(input); } try { for (String key : properties.keySet()) { String value = properties.get(key); sources.add(key + "=" + value); } IOUtils.writeLines(sources, null, output); } finally { IOUtils.closeQuietly(output); } } }