blob: 8d625a6c1d358797d6ec756b675bf56c7371ceea [file] [log] [blame]
/*
* 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.core.generator;
import com.google.dart.tools.core.DartCore;
import com.google.dart.tools.core.utilities.io.FileUtilities;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public abstract class AbstractGenerator {
protected final static IWorkspace workspace = ResourcesPlugin.getWorkspace();
/**
* If the passed file name does not have an extension, return the file name appended with given
* extension.
*
* @coverage dart.tools.core.generator
*/
public static String appendIfNoExtension(String fileName, String extension) {
if (fileName == null || fileName.isEmpty()) {
return fileName;
}
int indexOfPeriod = fileName.indexOf('.');
if (indexOfPeriod == -1) {
return fileName + extension;
}
if (indexOfPeriod == fileName.length() - 1) {
return fileName + extension.substring(1);
}
return fileName;
}
protected static boolean containsWhitespace(String str) {
for (int i = 0; i < str.length(); i++) {
if (Character.isWhitespace(str.charAt(i))) {
return true;
}
}
return false;
}
public abstract void execute(IProgressMonitor monitor) throws CoreException;
public abstract IStatus validate();
protected void execute(final String contentPath, final File file,
final HashMap<String, String> substitutions, IProgressMonitor monitor) throws CoreException {
workspace.run(new IWorkspaceRunnable() {
@Override
public void run(IProgressMonitor monitor) throws CoreException {
monitor.beginTask("", 2); //$NON-NLS-1$
String source;
try {
source = readExpectedContent(contentPath, substitutions);
} catch (IOException e) {
throw new CoreException(new Status(
IStatus.ERROR,
DartCore.PLUGIN_ID,
"Failed to generate source",
e));
}
try {
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
FileUtilities.createDirectory(parentFile);
}
FileUtilities.setContents(file, source);
} catch (IOException e) {
DartCore.logError(e);
}
// if (!file.getParent().exists()) {
// IPath path = file.getFullPath().removeLastSegments(1);
// IFolder folder = workspace.getRoot().getFolder(path);
// folder.create(false, true, new SubProgressMonitor(monitor, 1));
// }
// InputStream stream = new ByteArrayInputStream(source.getBytes());
// file.create(stream, false, new SubProgressMonitor(monitor, 1));
// monitor.done();
}
}, monitor);
}
protected void execute(final String contentPath, final File file, IProgressMonitor monitor)
throws CoreException {
execute(contentPath, file, new HashMap<String, String>(), monitor);
}
/**
* Read content from the specified file while performing the specified text substitutions.
* Anyplace in the raw file content where %key% appears will be replaced by a value from the
* substitutions map. All instances of %% will be replaced by %.
*
* @param fileName the path to the file to be read relative to the class
* @param substitutions a mapping of keys that may appear in the raw content to values that should
* be substituted.
* @return the file content after substitution has been performed
*/
protected String readExpectedContent(String fileName, Map<String, String> substitutions)
throws IOException {
// Read content from the specified file
InputStream stream = getClass().getResourceAsStream(fileName);
StringBuilder result = new StringBuilder(2000);
try {
InputStreamReader reader = new InputStreamReader(stream);
while (true) {
int ch = reader.read();
if (ch == -1) {
break;
}
if (ch != '%' || substitutions == null) {
result.append((char) ch);
continue;
}
// If % is detected, the extract the key and perform a substitution
StringBuilder key = new StringBuilder(20);
while (true) {
ch = reader.read();
if (ch == -1) {
throw new RuntimeException("Expected '%' but found EOF in " + fileName);
}
if (ch == '%') {
break;
}
key.append((char) ch);
}
// If %% is detected, then substitute %
// Otherwise lookup the value in the substitutions map
if (key.length() == 0) {
result.append("%"); //$NON-NLS-1$
} else {
String value = substitutions.get(key.toString());
if (value == null) {
throw new RuntimeException("Failed to find value for key " + key + " in " + fileName);
}
result.append(value);
}
}
} finally {
stream.close();
}
return result.toString();
}
}