/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html
*
* 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.
*/
package com.google.dart.tools.update.core.internal.jobs;
import com.google.common.collect.Lists;
import com.google.dart.tools.core.CmdLineOptions;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Merges INI files (handles custom "-vm" arg).
*/
public class INIRewriter {
private static final String VM_FLAG = "-vm";
private static final String AGENT_FLAG = "-XX:-GoogleAgent";
private static final String VM_ARGS_FLAG = "-vmargs";
private static String[] EMPTY = new String[0];
public static void insert(List<String> list, String value) {
list.add(value);
}
public static void insertAfter(List<String> list, String key, List<String> orig) {
int length = getLengthOfFlag(orig, key);
int index = list.indexOf(key);
int origIndex = orig.indexOf(key);
for (int i = 1; i <= length; i++) {
list.add(index + i, orig.get(origIndex + i));
}
}
public static void insertAfter(List<String> list, String key, String value) {
int index = list.indexOf(key);
list.add(index + 1, value);
}
public static void insertBefore(List<String> list, String key, String value) {
int index = list.indexOf(key);
list.add(index, value);
}
public static List<String> merge(List<String> orig, List<String> latest) {
ArrayList<String> merged = Lists.newArrayList(latest);
if (orig.contains(VM_FLAG) && !latest.contains(VM_FLAG)) {
insertBefore(merged, VM_ARGS_FLAG, VM_FLAG);
insertAfter(merged, VM_FLAG, orig.get(orig.indexOf(VM_FLAG) + 1));
}
if (orig.contains(CmdLineOptions.PACKAGE_ROOT) && !latest.contains(CmdLineOptions.PACKAGE_ROOT)) {
mergeFlag(orig, merged, CmdLineOptions.PACKAGE_ROOT);
}
if (orig.contains(CmdLineOptions.PACKAGE_OVERRIDE)
&& !latest.contains(CmdLineOptions.PACKAGE_OVERRIDE)) {
mergeFlag(orig, merged, CmdLineOptions.PACKAGE_OVERRIDE);
}
if (orig.contains(AGENT_FLAG) && !latest.contains(AGENT_FLAG)) {
insert(merged, AGENT_FLAG);
}
return merged;
}
public static String[] merge(String[] orig, String[] latest) {
return merge(Lists.newArrayList(orig), Lists.newArrayList(latest)).toArray(EMPTY);
}
public static void mergeAndWrite(File currentIni, File latestIni) throws IOException {
List<String> latest = INIRewriter.readFile(latestIni);
List<String> current = INIRewriter.readFile(currentIni);
List<String> merged = INIRewriter.merge(current, latest);
if (!current.equals(merged)) {
writeTo(merged, currentIni);
}
}
public static List<String> readFile(File iniFile) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(iniFile));
String line = null;
ArrayList<String> lines = Lists.newArrayList();
while ((line = reader.readLine()) != null) {
lines.add(line.trim());
}
reader.close();
return lines;
}
private static int getLengthOfFlag(List<String> orig, String flag) {
int i = 0;
int index = orig.indexOf(flag) + 1;
while (!orig.get(index).startsWith("-")) {
i++;
index++;
}
return i;
}
private static void mergeFlag(List<String> orig, ArrayList<String> merged, String flag) {
if (merged.contains(VM_FLAG)) {
insertBefore(merged, VM_FLAG, flag);
insertAfter(merged, flag, orig);
} else {
insertBefore(merged, VM_ARGS_FLAG, flag);
insertAfter(merged, flag, orig);
}
}
private static void writeTo(List<String> lines, File file) throws IOException {
BufferedWriter out = new BufferedWriter(new FileWriter(file));
try {
for (String line : lines) {
out.write(line);
out.newLine();
}
} finally {
out.close();
}
}
}