Simplified extension point for obtaining descriptor.proto.
diff --git a/com.google.eclipse.protobuf/schema/descriptor-source.exsd b/com.google.eclipse.protobuf/schema/descriptor-source.exsd
index 98b9724..94685c8 100644
--- a/com.google.eclipse.protobuf/schema/descriptor-source.exsd
+++ b/com.google.eclipse.protobuf/schema/descriptor-source.exsd
@@ -49,13 +49,13 @@
<element name="source">
<complexType>
- <attribute name="class" type="string">
+ <attribute name="path" type="string" use="required">
<annotation>
<documentation>
Provides the contents of a descriptor.proto file.
</documentation>
<appInfo>
- <meta.attribute kind="java" basedOn=":com.google.eclipse.protobuf.scoping.IProtoDescriptorSource"/>
+ <meta.attribute kind="resource"/>
</appInfo>
</annotation>
</attribute>
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptorSource.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptorSource.java
deleted file mode 100644
index 319e45b..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptorSource.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2011 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.scoping;
-
-import com.google.inject.ImplementedBy;
-
-import org.eclipse.emf.common.util.URI;
-
-import java.io.*;
-
-/**
- * Provides the contents of <code>{@link ProtoDescriptor}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-@ImplementedBy(OssProtoDescriptorSource.class)
-public interface IProtoDescriptorSource {
-
- /**
- * Returns the URI of the resource containing the descriptor.
- * @return the URI of the resource containing the descriptor.
- */
- URI uri();
-
- /**
- * Returns the contents of the descriptor.
- * @return the contents of the descriptor.
- * @throws IOException if something goes wrong.
- */
- InputStream contents() throws IOException;
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OssProtoDescriptorSource.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OssProtoDescriptorSource.java
deleted file mode 100644
index 01492b4..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OssProtoDescriptorSource.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2011 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.scoping;
-
-import com.google.inject.Singleton;
-
-import org.eclipse.emf.common.util.URI;
-
-import java.io.*;
-import java.net.URL;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-@Singleton
-class OssProtoDescriptorSource implements IProtoDescriptorSource {
-
- private static final String DESCRIPTOR_URL = "platform:/plugin/com.google.eclipse.protobuf/descriptor.proto";
-
- private static final URI DESCRIPTOR_URI = URI.createURI(DESCRIPTOR_URL);
-
- public URI uri() {
- return DESCRIPTOR_URI;
- }
-
- public InputStream contents() throws IOException {
- URL url = new URL(DESCRIPTOR_URL);
- return url.openConnection().getInputStream();
- }
-
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java
index 31c4cf5..37706cf 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java
@@ -21,11 +21,13 @@
import com.google.eclipse.protobuf.util.ModelNodes;
import com.google.inject.Inject;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.resource.XtextResource;
-import java.io.InputStreamReader;
+import java.io.*;
+import java.net.URL;
import java.util.*;
/**
@@ -51,13 +53,13 @@
private final ModelNodes nodes;
- @Inject public ProtoDescriptor(IParser parser, IProtoDescriptorSource source, ModelNodes nodes) {
+ @Inject public ProtoDescriptor(IParser parser, URI descriptorLocation, ModelNodes nodes) {
this.nodes = nodes;
addOptionTypes();
InputStreamReader reader = null;
try {
- XtextResource resource = new XtextResource(source.uri());
- reader = new InputStreamReader(source.contents(), "UTF-8");
+ XtextResource resource = new XtextResource(descriptorLocation);
+ reader = new InputStreamReader(contents(descriptorLocation), "UTF-8");
IParseResult result = parser.parse(reader);
root = (Protobuf) result.getRootASTElement();
resource.getContents().add(root);
@@ -71,6 +73,17 @@
}
}
+ /**
+ * Returns the contents of the descriptor file at the given location.
+ * @param descriptorLocation the location of the descriptor file.
+ * @return the contents of the descriptor file.
+ * @throws IOException if something goes wrong.
+ */
+ protected InputStream contents(URI descriptorLocation) throws IOException {
+ URL url = new URL(descriptorLocation.toString());
+ return url.openConnection().getInputStream();
+ }
+
private void addOptionTypes() {
for (OptionType type : OptionType.values())
optionsByType.put(type, new LinkedHashMap<String, Property>());
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
index f1d8ca5..8cc6b2b 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
@@ -8,11 +8,13 @@
*/
package com.google.eclipse.protobuf.scoping;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
import com.google.eclipse.protobuf.util.ModelNodes;
import com.google.inject.*;
-import org.apache.log4j.Logger;
import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.parser.IParser;
/**
@@ -25,10 +27,7 @@
private static final String EXTENSION_ID = "com.google.eclipse.protobuf.descriptorSource";
- private static Logger logger = Logger.getLogger(ProtoDescriptorProvider.class);
-
@Inject private IParser parser;
- @Inject private IProtoDescriptorSource source;
@Inject private ModelNodes nodes;
@Inject private IExtensionRegistry registry;
@@ -39,24 +38,19 @@
public ProtoDescriptor get() {
synchronized (lock) {
if (descriptor == null) {
- IProtoDescriptorSource actualSource = sourceFromPlugin();
- if (actualSource == null) actualSource = source;
- descriptor = new ProtoDescriptor(parser, actualSource, nodes);
+ descriptor = new ProtoDescriptor(parser, descriptorLocation(), nodes);
}
return descriptor;
}
}
- private IProtoDescriptorSource sourceFromPlugin() {
+ private URI descriptorLocation() {
IConfigurationElement[] config = registry.getConfigurationElementsFor(EXTENSION_ID);
- try {
- for (IConfigurationElement e : config) {
- Object extension = e.createExecutableExtension("class");
- if (extension instanceof IProtoDescriptorSource) return (IProtoDescriptorSource) extension;
- }
- } catch (CoreException t) {
- logger.fatal("Unable to instantiate extension elements", t);
+ for (IConfigurationElement e : config) {
+ String path = e.getAttribute("path");
+ if (isEmpty(path)) continue;
+ return URI.createURI("platform:/plugin/" + e.getContributor().getName() + "/" + path);
}
- return null;
+ return URI.createURI("platform:/plugin/com.google.eclipse.protobuf/descriptor.proto");
}
}