/*
* Copyright (c) 2012 Google Inc.
*
* 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
*/
package com.google.eclipse.protobuf.junit.core;
import static org.eclipse.emf.common.util.URI.createURI;
import static org.eclipse.emf.ecore.util.EcoreUtil.resolveAll;
import static org.eclipse.xtext.util.CancelIndicator.NullImpl;
import static com.google.eclipse.protobuf.util.SystemProperties.lineSeparator;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.linking.lazy.LazyLinkingResource;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.resource.IResourceFactory;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.util.StringInputStream;
import com.google.inject.Injector;
/**
* @author alruiz@google.com (Alex Ruiz)
*/
public class ProtobufInTestsParser {
private final Injector injector;
public ProtobufInTestsParser(Injector injector) {
this.injector = injector;
}
public IParseResult parseText(String text) {
boolean ignoreSyntaxErrors = shouldIgnoreSyntaxErrorsIn(text);
XtextResource resource = createResourceFrom(new StringInputStream(text));
IParseResult parseResult = resource.getParseResult();
if (ignoreSyntaxErrors || !parseResult.hasSyntaxErrors()) {
return parseResult;
}
StringBuilder builder = new StringBuilder();
builder.append("Syntax errors:");
for (INode error : parseResult.getSyntaxErrors()) {
builder.append(lineSeparator()).append("- ").append(error.getSyntaxErrorMessage());
}
throw new IllegalStateException(builder.toString());
}
private boolean shouldIgnoreSyntaxErrorsIn(String text) {
return text.startsWith("// ignore errors");
}
private XtextResource createResourceFrom(InputStream input) {
return createResourceFrom(input, createURI("file:/usr/local/project/src/protos/mytestmodel.proto"));
}
private XtextResource createResourceFrom(InputStream input, URI uri) {
XtextResourceSet resourceSet = getInstanceOf(XtextResourceSet.class);
resourceSet.setClasspathURIContext(getClass());
XtextResource resource = (XtextResource) getInstanceOf(IResourceFactory.class).createResource(uri);
resourceSet.getResources().add(resource);
try {
resource.load(input, null);
} catch (IOException e) {
throw new RuntimeException(e);
}
if (resource instanceof LazyLinkingResource) {
((LazyLinkingResource) resource).resolveLazyCrossReferences(NullImpl);
return resource;
}
resolveAll(resource);
return resource;
}
private <T> T getInstanceOf(Class<T> type) {
return injector.getInstance(type);
}
}