[eclipse/xtext#1569] Refactor Xtend to Java

Replaced usage of Xtend in project org.eclipse.xtext.util, except for
active annotations.

Performed refactorings see
https://github.com/eclipse/xtext/wiki/DevGuide_RefactorXtend2Java

Added test case for UriExtensions#withEmptyAuthority().

Signed-off-by: Karsten Thoms <karsten.thoms@itemis.de>
This commit is contained in:
Karsten Thoms 2019-11-21 09:00:46 +01:00
parent 05237a9798
commit f12d7540ef
22 changed files with 481 additions and 875 deletions

View file

@ -276,6 +276,20 @@ class UriExtensionsTest {
var uri = createFileURI(directory.absolutePath + "/").toUriString.toUri
assertTrue(uri.isPrefix)
}
@Test
def void test_withEmptyAuthority () {
val uriWithoutAuthority = org.eclipse.emf.common.util.URI.createURI("file:/path/to/resource/")
assertNull(uriWithoutAuthority.authority)
val uriWithEmptyAuthority = uriWithoutAuthority.withEmptyAuthority
assertNotSame(uriWithoutAuthority, uriWithEmptyAuthority)
assertEquals("Returned URI is expected to have an empty instead of null authority", "", uriWithEmptyAuthority.authority)
val uriWithAuthority = org.eclipse.emf.common.util.URI.createURI("https://xtext.org/path/to/resource/")
assertNotNull(uriWithAuthority.authority)
assertEquals("xtext.org", uriWithAuthority.authority)
assertSame(uriWithAuthority, uriWithAuthority.withEmptyAuthority)
}
private def createTempDir(String prefix) {
return Files.createTempDirectory(tempDirPath, prefix);

View file

@ -260,6 +260,19 @@ public class UriExtensionsTest {
Assert.assertTrue(uri.isPrefix());
}
@Test
public void test_withEmptyAuthority() {
final URI uriWithoutAuthority = URI.createURI("file:/path/to/resource/");
Assert.assertNull(uriWithoutAuthority.authority());
final URI uriWithEmptyAuthority = this._uriExtensions.withEmptyAuthority(uriWithoutAuthority);
Assert.assertNotSame(uriWithoutAuthority, uriWithEmptyAuthority);
Assert.assertEquals("Returned URI is expected to have an empty instead of null authority", "", uriWithEmptyAuthority.authority());
final URI uriWithAuthority = URI.createURI("https://xtext.org/path/to/resource/");
Assert.assertNotNull(uriWithAuthority.authority());
Assert.assertEquals("xtext.org", uriWithAuthority.authority());
Assert.assertSame(uriWithAuthority, this._uriExtensions.withEmptyAuthority(uriWithAuthority));
}
private Path createTempDir(final String prefix) {
try {
return Files.createTempDirectory(this.getTempDirPath(), prefix);

View file

@ -0,0 +1,33 @@
/**
* Copyright (c) 2016, 2019 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util;
import java.util.ArrayList;
import java.util.List;
import com.google.inject.Singleton;
/**
* A compound disposable that serves as a registry. Call this one at the end of
* the lifecycle of your injector.
*/
@Singleton
public class DisposableRegistry implements IDisposable {
private final List<IDisposable> disposables = new ArrayList<>();
public void register(IDisposable disposable) {
disposables.add(disposable);
}
@Override
public void dispose() {
for (IDisposable d : disposables) {
d.dispose();
}
}
}

View file

@ -1,31 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util
import com.google.inject.Singleton
import java.util.List
/**
* A compound disposable that serves as a registry. Call this one at the end of the lifecycle of your injector.
*/
@Singleton
class DisposableRegistry implements IDisposable {
val List<IDisposable> disposables = newArrayList
def void register(IDisposable disposable) {
disposables += disposable
}
override dispose() {
for (d : disposables) {
d.dispose()
}
}
}

View file

@ -1,5 +1,5 @@
/**
* Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others.
* Copyright (c) 2016, 2019 TypeFox GmbH (http://www.typefox.io) and others.
* 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
@ -10,7 +10,6 @@ package org.eclipse.xtext.util;
/**
* Interface for things that can be disposed.
*/
@SuppressWarnings("all")
public interface IDisposable {
public abstract void dispose();
void dispose();
}

View file

@ -1,17 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util
/**
* Interface for things that can be disposed.
*/
interface IDisposable {
def void dispose()
}

View file

@ -0,0 +1,54 @@
/**
* Copyright (c) 2016, 2019 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.emf.common.util.URI;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
/**
* @author Sven Efftinge - Initial contribution and API
* @since 2.11
*/
@ImplementedBy(IFileSystemScanner.JavaIoFileSystemScanner.class)
public interface IFileSystemScanner {
public static class JavaIoFileSystemScanner implements IFileSystemScanner {
@Inject
private UriExtensions uriExtensions;
@Override
public void scan(URI root, IAcceptor<URI> acceptor) {
File file = new File(root.toFileString());
scanRec(file, acceptor);
}
public void scanRec(File file, IAcceptor<URI> acceptor) {
// we need to convert the given file to a decoded emf file uri
// e.g. file:///Users/x/y/z
// or file:///C:/x/y/z
Path path = Paths.get(file.getAbsoluteFile().toURI());
URI uri = uriExtensions.toEmfUri(path.toUri());
acceptor.accept(uri);
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
scanRec(f, acceptor);
}
}
}
}
}
void scan(URI root, IAcceptor<URI> acceptor);
}

View file

@ -1,53 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016, 2017 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util
import com.google.inject.ImplementedBy
import com.google.inject.Inject
import java.io.File
import java.nio.file.Paths
import org.eclipse.emf.common.util.URI
/**
* @author Sven Efftinge - Initial contribution and API
* @since 2.11
*/
@ImplementedBy(JavaIoFileSystemScanner)
interface IFileSystemScanner {
def void scan(URI root, IAcceptor<URI> acceptor)
static class JavaIoFileSystemScanner implements IFileSystemScanner {
@Inject extension UriExtensions
override scan(URI root, IAcceptor<URI> acceptor) {
val file = new File(root.toFileString)
scanRec(file, acceptor)
}
def void scanRec(File file, IAcceptor<URI> acceptor) {
// we need to convert the given file to a decoded emf file uri
// e.g. file:///Users/x/y/z
// or file:///C:/x/y/z
val path = Paths.get(file.absoluteFile.toURI)
val uri = path.toUri.toEmfUri
acceptor.accept(uri)
if (file.isDirectory) {
val files = file.listFiles
if (files !== null) {
for (f : files) {
scanRec(f, acceptor)
}
}
}
}
}
}

View file

@ -0,0 +1,87 @@
/**
* Copyright (c) 2015, 2019 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util;
import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
/**
* A simple record with line and column information. The line number is
* one-based, e.g. the first line in the document has the line number 1. The
* column number is one based, too, e.g the first column in a line has the index
* 1.
*
* Line breaks are part of the line itself, e.g. the first line break in the
* document still has line number one.
*
* @author Sebastian Zarnekow - Initial contribution and API
* @since 2.9
*/
public class LineAndColumn {
private final int line;
private final int column;
public static LineAndColumn from(int line, int column) {
LineAndColumn result = new LineAndColumn(line, column);
if (line <= 0 || column <= 0) {
throw new IllegalArgumentException(result.toString());
}
return result;
}
private LineAndColumn(int line, int column) {
this.line = line;
this.column = column;
}
public int getLine() {
return line;
}
public int getColumn() {
return column;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.line;
return prime * result + this.column;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
LineAndColumn other = (LineAndColumn) obj;
if (other.line != line) {
return false;
}
if (other.column != column) {
return false;
}
return true;
}
@Override
public String toString() {
ToStringBuilder b = new ToStringBuilder(this);
b.add("line", line);
b.add("column", column);
return b.toString();
}
}

View file

@ -1,42 +0,0 @@
/*******************************************************************************
* Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util
import org.eclipse.xtend.lib.annotations.Data
/**
* A simple record with line and column information.
* The line number is one-based, e.g. the first line in the document
* has the line number 1.
* The column number is one based, too, e.g the first column in a line
* has the index 1.
*
* Line breaks are part of the line itself, e.g. the first line break
* in the document still has line number one.
*
* @author Sebastian Zarnekow - Initial contribution and API
* @since 2.9
*/
@Data
class LineAndColumn {
int line
int column
static def from(int line, int column) {
val result = new LineAndColumn(line, column)
if (line <= 0 || column <= 0) {
throw new IllegalArgumentException(result.toString)
}
return result
}
private new(int line, int column) {
this.line = line
this.column = column
}
}

View file

@ -0,0 +1,63 @@
/**
* Copyright (c) 2017, 2019 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util;
import java.net.URISyntaxException;
import org.eclipse.emf.common.util.URI;
/**
* @author Christian Dietrich - Initial contribution and API
* @since 2.14
*/
public class UriExtensions {
/**
* Returns an URI with empty authority, if authority is absent (null) and has file scheme.
*/
public URI toUri(String stringUri) {
try {
java.net.URI netUri = new java.net.URI(stringUri);
return toEmfUri(netUri);
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
/**
* Returns an URI with empty authority, if authority is absent (null) and has file scheme.
*/
public URI toEmfUri(java.net.URI netUri) {
String decoded = toDecodedString(netUri);
URI uri = URI.createURI(decoded, false);
URI result = withEmptyAuthority(uri);
return result;
}
/**
* Converts a java.net.URI to a decoded string
*/
public String toDecodedString(java.net.URI uri) {
String scheme = uri.getScheme();
String part = uri.getSchemeSpecificPart();
if (scheme == null) {
return part;
}
return scheme + ":" + part;
}
/**
* Converts the file URIs with an absent (null) authority to one with an empty ("") authority
*/
public URI withEmptyAuthority(URI uri) {
if (uri.isFile() && uri.authority() == null) {
return URI.createHierarchicalURI(uri.scheme(), "", uri.device(), uri.segments(), uri.query(),
uri.fragment());
}
return uri;
}
}

View file

@ -1,59 +0,0 @@
/*******************************************************************************
* Copyright (c) 2017 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util
import org.eclipse.emf.common.util.URI
/**
* @author Christian Dietrich - Initial contribution and API
* @since 2.14
*/
class UriExtensions {
/**
* returns a URI with empty authority, if absent and has file scheme.
*/
def URI toUri(String stringUri) {
val netUri = new java.net.URI(stringUri)
return netUri.toEmfUri
}
/**
* returns a URI with empty authority, if absent and has file scheme.
*/
def URI toEmfUri(java.net.URI netUri) {
val decoded = netUri.toDecodedString
val uri = URI.createURI(decoded, false);
val result = uri.withEmptyAuthority
result
}
/**
* converts a java.net.URI to a decoded string
*/
def String toDecodedString(java.net.URI uri) {
val scheme = uri.getScheme();
val part = uri.getSchemeSpecificPart();
if (scheme === null) {
return part
}
return scheme + ':' + part;
}
/**
* converts the file URIs with an absent authority to one with an empty
*/
def URI withEmptyAuthority(URI uri) {
if (uri.isFile && uri.authority === null) {
URI.createHierarchicalURI(uri.scheme, "", uri.device, uri.segments, uri.query, uri.fragment)
} else {
uri
}
}
}

View file

@ -0,0 +1,144 @@
/**
* Copyright (c) 2015, 2019 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.jar.Manifest;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.util.ResourceLocator;
/**
* @since 2.9
*/
public class XtextVersion {
private static class Plugin extends EMFPlugin {
public static final XtextVersion.Plugin INSTANCE = new XtextVersion.Plugin();
private Plugin() {
super(new ResourceLocator[] {});
}
@Override
public ResourceLocator getPluginResourceLocator() {
return null;
}
}
private final String version;
public XtextVersion(String version) {
this.version = version;
}
public static XtextVersion getCurrent() {
String versionFromManifest = XtextVersion.readVersionFromManifest();
return new XtextVersion(versionFromManifest != null ? versionFromManifest : "unknown");
}
public String getXtextGradlePluginVersion() {
return "2.0.8";
}
/**
* @noreference
*/
public String getMweVersion() {
return "2.11.1";
}
public String getAntlrGeneratorVersion() {
return "2.1.1";
}
public String getXtendGradlePluginVersion() {
return getXtextGradlePluginVersion();
}
/**
* @noreference
*/
public String getXtendAndroidGradlePluginVersion() {
return getXtendGradlePluginVersion();
}
/**
* @return <code>true</code> if the current version ends with '-SNAPSHOT'
*/
public boolean isSnapshot() {
return version.endsWith("-SNAPSHOT");
}
/**
* @return <code>true</code> if the current version is not a snapshot and
* not a release<br>
* Release builds must match a following pattern: N.N(.N)+<br>
* (N is a digit)<br>
* For example 2.9.2 is a release, 2.9.2.beta3 is stable.
*/
public boolean isStable() {
return !isSnapshot() && !version.matches("\\d+\\.\\d+(\\.\\d+)+");
}
@Override
public String toString() {
return version;
}
private static String readVersionFromManifest() {
URL baseURL = XtextVersion.Plugin.INSTANCE.getBaseURL();
try (InputStream is = new URL (baseURL + "META-INF/MANIFEST.MF").openStream()) {
Manifest manifest = new Manifest(is);
String version = manifest.getMainAttributes().getValue("Maven-Version");
if ("unspecified".equals(version)) {
version = manifest.getMainAttributes().getValue("Bundle-Version");
if (version.endsWith(".qualifier")) {
return version.replace(".qualifier", "-SNAPSHOT");
} else {
return version.substring(0, version.lastIndexOf("."));
}
}
return version;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public int hashCode() {
return 31 * 1 + ((this.version== null) ? 0 : this.version.hashCode());
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
XtextVersion other = (XtextVersion) obj;
if (version == null) {
if (other.version != null) {
return false;
}
} else if (!version.equals(other.version)) {
return false;
}
return true;
}
public String getVersion() {
return version;
}
}

View file

@ -1,118 +0,0 @@
/*******************************************************************************
* Copyright (c) 2015, 2019 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util
import java.io.IOException
import java.io.InputStream
import java.net.URL
import java.util.jar.Manifest
import org.eclipse.emf.common.EMFPlugin
import org.eclipse.xtend.lib.annotations.Data
/**
* @since 2.9
*/
@Data
class XtextVersion {
String version
static def getCurrent() {
new XtextVersion(readVersionFromManifest ?: 'unknown')
}
def getXtextGradlePluginVersion() {
'2.0.8'
}
/**
* @noreference
*/
def getMweVersion() {
'2.11.1'
}
def getAntlrGeneratorVersion() {
'2.1.1'
}
def getXtendGradlePluginVersion() {
xtextGradlePluginVersion
}
/**
* @noreference
*/
def getXtendAndroidGradlePluginVersion() {
xtendGradlePluginVersion
}
/**
* @return <code>true</code> if the current version ends with '-SNAPSHOT'
*/
def isSnapshot() {
version.endsWith("-SNAPSHOT")
}
/**
* @return <code>true</code> if the current version is not a snapshot and not a release<br>
* Release builds must match a following pattern: N.N(.N)+<br>
* (N is a digit)<br>
* For example 2.9.2 is a release, 2.9.2.beta3 is stable.
*/
def isStable() {
return !isSnapshot && !version.matches("\\d+\\.\\d+(\\.\\d+)+")
}
override toString() {
version
}
private static def readVersionFromManifest() {
var InputStream is
try {
val url = new URL(Plugin.INSTANCE.baseURL + 'META-INF/MANIFEST.MF')
is = url.openStream()
val manifest = new Manifest(is)
var version = manifest.getMainAttributes().getValue('Maven-Version')
// in dev mode, Maven-Version has the static value 'unspecified'
// during a Gradle build that version gets replaced
if ('unspecified' == version) {
version = manifest.getMainAttributes().getValue('Bundle-Version')
if (version.endsWith(".qualifier")) {
return version.replace(".qualifier","-SNAPSHOT")
} else {
// strip off build qualifier
return version.substring(0, version.lastIndexOf('.'))
}
}
return version
} catch (Exception e) {
return null;
} finally {
if (is !== null) {
try {
is.close()
} catch (IOException e) {
}
}
}
}
private static class Plugin extends EMFPlugin {
public static final Plugin INSTANCE = new Plugin
private new() {
super(#[]);
}
override getPluginResourceLocator() {
}
}
}

View file

@ -0,0 +1,71 @@
/**
* Copyright (c) 2014, 2019 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util.internal;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import com.google.common.collect.Lists;
public class AlternateJdkLoader extends URLClassLoader {
private final ConcurrentMap<String, Object> locks = new ConcurrentHashMap<>();
public AlternateJdkLoader(Iterable<File> files) {
super(mapToURLs(files));
}
private static URL[] mapToURLs (Iterable<File> files) {
ArrayList<File> fileList = Lists.newArrayList(files);
URL[] result = new URL[fileList.size()];
for (int i = 0; i < fileList.size(); i++) {
try {
result[i] = fileList.get(i).toURI().toURL();
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
return result;
}
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLockJdk5(name)) {
Class<?> c = findLoadedClass(name);
if (c == null) {
c = findClass(name);
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
@Override
public URL getResource(String name) {
return findResource(name);
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
return findResources(name);
}
private Object getClassLoadingLockJdk5(String className) {
Object newLock = new Object();
Object existingLock = locks.putIfAbsent(className, newLock);
return existingLock != null ? existingLock : newLock;
}
}

View file

@ -1,46 +0,0 @@
/*******************************************************************************
* Copyright (c) 2014 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util.internal
import com.google.common.collect.Maps
import java.io.File
import java.io.IOException
import java.net.URLClassLoader
import java.util.concurrent.ConcurrentMap
class AlternateJdkLoader extends URLClassLoader {
final ConcurrentMap<String, Object> locks = Maps.newConcurrentMap;
new(Iterable<File> files) {
super(files.map[toURI.toURL])
}
override protected loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLockJdk5(name)) {
val c = findLoadedClass(name) ?: findClass(name)
if (resolve) {
resolveClass(c)
}
c
}
}
override getResource(String name) {
findResource(name)
}
override getResources(String name) throws IOException {
findResources(name)
}
private def Object getClassLoadingLockJdk5(String className) {
val newLock = new Object
val existingLock = locks.putIfAbsent(className, newLock)
return existingLock ?: newLock
}
}

View file

@ -1,33 +0,0 @@
/**
* Copyright (c) 2016 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.xtext.util.IDisposable;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
/**
* A compound disposable that serves as a registry. Call this one at the end of the lifecycle of your injector.
*/
@Singleton
@SuppressWarnings("all")
public class DisposableRegistry implements IDisposable {
private final List<IDisposable> disposables = CollectionLiterals.<IDisposable>newArrayList();
public void register(final IDisposable disposable) {
this.disposables.add(disposable);
}
@Override
public void dispose() {
for (final IDisposable d : this.disposables) {
d.dispose();
}
}
}

View file

@ -1,56 +0,0 @@
/**
* Copyright (c) 2016, 2017 TypeFox GmbH (http://www.typefox.io) and others.
* 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 org.eclipse.xtext.util;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.util.IAcceptor;
import org.eclipse.xtext.util.UriExtensions;
import org.eclipse.xtext.xbase.lib.Extension;
/**
* @author Sven Efftinge - Initial contribution and API
* @since 2.11
*/
@ImplementedBy(IFileSystemScanner.JavaIoFileSystemScanner.class)
@SuppressWarnings("all")
public interface IFileSystemScanner {
public static class JavaIoFileSystemScanner implements IFileSystemScanner {
@Inject
@Extension
private UriExtensions _uriExtensions;
@Override
public void scan(final URI root, final IAcceptor<URI> acceptor) {
String _fileString = root.toFileString();
final File file = new File(_fileString);
this.scanRec(file, acceptor);
}
public void scanRec(final File file, final IAcceptor<URI> acceptor) {
final Path path = Paths.get(file.getAbsoluteFile().toURI());
final URI uri = this._uriExtensions.toEmfUri(path.toUri());
acceptor.accept(uri);
boolean _isDirectory = file.isDirectory();
if (_isDirectory) {
final File[] files = file.listFiles();
if ((files != null)) {
for (final File f : files) {
this.scanRec(f, acceptor);
}
}
}
}
}
public abstract void scan(final URI root, final IAcceptor<URI> acceptor);
}

View file

@ -1,92 +0,0 @@
/**
* Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util;
import org.eclipse.xtend.lib.annotations.Data;
import org.eclipse.xtext.xbase.lib.Pure;
import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
/**
* A simple record with line and column information.
* The line number is one-based, e.g. the first line in the document
* has the line number 1.
* The column number is one based, too, e.g the first column in a line
* has the index 1.
*
* Line breaks are part of the line itself, e.g. the first line break
* in the document still has line number one.
*
* @author Sebastian Zarnekow - Initial contribution and API
* @since 2.9
*/
@Data
@SuppressWarnings("all")
public class LineAndColumn {
private final int line;
private final int column;
public static LineAndColumn from(final int line, final int column) {
final LineAndColumn result = new LineAndColumn(line, column);
if (((line <= 0) || (column <= 0))) {
String _string = result.toString();
throw new IllegalArgumentException(_string);
}
return result;
}
private LineAndColumn(final int line, final int column) {
this.line = line;
this.column = column;
}
@Override
@Pure
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.line;
return prime * result + this.column;
}
@Override
@Pure
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
LineAndColumn other = (LineAndColumn) obj;
if (other.line != this.line)
return false;
if (other.column != this.column)
return false;
return true;
}
@Override
@Pure
public String toString() {
ToStringBuilder b = new ToStringBuilder(this);
b.add("line", this.line);
b.add("column", this.column);
return b.toString();
}
@Pure
public int getLine() {
return this.line;
}
@Pure
public int getColumn() {
return this.column;
}
}

View file

@ -1,69 +0,0 @@
/**
* Copyright (c) 2017 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util;
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.xbase.lib.Exceptions;
/**
* @author Christian Dietrich - Initial contribution and API
* @since 2.14
*/
@SuppressWarnings("all")
public class UriExtensions {
/**
* returns a URI with empty authority, if absent and has file scheme.
*/
public URI toUri(final String stringUri) {
try {
final java.net.URI netUri = new java.net.URI(stringUri);
return this.toEmfUri(netUri);
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
/**
* returns a URI with empty authority, if absent and has file scheme.
*/
public URI toEmfUri(final java.net.URI netUri) {
URI _xblockexpression = null;
{
final String decoded = this.toDecodedString(netUri);
final URI uri = URI.createURI(decoded, false);
final URI result = this.withEmptyAuthority(uri);
_xblockexpression = result;
}
return _xblockexpression;
}
/**
* converts a java.net.URI to a decoded string
*/
public String toDecodedString(final java.net.URI uri) {
final String scheme = uri.getScheme();
final String part = uri.getSchemeSpecificPart();
if ((scheme == null)) {
return part;
}
return ((scheme + ":") + part);
}
/**
* converts the file URIs with an absent authority to one with an empty
*/
public URI withEmptyAuthority(final URI uri) {
URI _xifexpression = null;
if ((uri.isFile() && (uri.authority() == null))) {
_xifexpression = URI.createHierarchicalURI(uri.scheme(), "", uri.device(), uri.segments(), uri.query(), uri.fragment());
} else {
_xifexpression = uri;
}
return _xifexpression;
}
}

View file

@ -1,174 +0,0 @@
/**
* Copyright (c) 2015, 2019 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util;
import com.google.common.base.Objects;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.jar.Manifest;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.xtend.lib.annotations.Data;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Pure;
/**
* @since 2.9
*/
@Data
@SuppressWarnings("all")
public class XtextVersion {
private static class Plugin extends EMFPlugin {
public static final XtextVersion.Plugin INSTANCE = new XtextVersion.Plugin();
private Plugin() {
super(new ResourceLocator[] {});
}
@Override
public ResourceLocator getPluginResourceLocator() {
return null;
}
}
private final String version;
public static XtextVersion getCurrent() {
String _elvis = null;
String _readVersionFromManifest = XtextVersion.readVersionFromManifest();
if (_readVersionFromManifest != null) {
_elvis = _readVersionFromManifest;
} else {
_elvis = "unknown";
}
return new XtextVersion(_elvis);
}
public String getXtextGradlePluginVersion() {
return "2.0.8";
}
/**
* @noreference
*/
public String getMweVersion() {
return "2.11.1";
}
public String getAntlrGeneratorVersion() {
return "2.1.1";
}
public String getXtendGradlePluginVersion() {
return this.getXtextGradlePluginVersion();
}
/**
* @noreference
*/
public String getXtendAndroidGradlePluginVersion() {
return this.getXtendGradlePluginVersion();
}
/**
* @return <code>true</code> if the current version ends with '-SNAPSHOT'
*/
public boolean isSnapshot() {
return this.version.endsWith("-SNAPSHOT");
}
/**
* @return <code>true</code> if the current version is not a snapshot and not a release<br>
* Release builds must match a following pattern: N.N(.N)+<br>
* (N is a digit)<br>
* For example 2.9.2 is a release, 2.9.2.beta3 is stable.
*/
public boolean isStable() {
return ((!this.isSnapshot()) && (!this.version.matches("\\d+\\.\\d+(\\.\\d+)+")));
}
@Override
public String toString() {
return this.version;
}
private static String readVersionFromManifest() {
InputStream is = null;
try {
URL _baseURL = XtextVersion.Plugin.INSTANCE.getBaseURL();
String _plus = (_baseURL + "META-INF/MANIFEST.MF");
final URL url = new URL(_plus);
is = url.openStream();
final Manifest manifest = new Manifest(is);
String version = manifest.getMainAttributes().getValue("Maven-Version");
boolean _equals = Objects.equal("unspecified", version);
if (_equals) {
version = manifest.getMainAttributes().getValue("Bundle-Version");
boolean _endsWith = version.endsWith(".qualifier");
if (_endsWith) {
return version.replace(".qualifier", "-SNAPSHOT");
} else {
return version.substring(0, version.lastIndexOf("."));
}
}
return version;
} catch (final Throwable _t) {
if (_t instanceof Exception) {
return null;
} else {
throw Exceptions.sneakyThrow(_t);
}
} finally {
if ((is != null)) {
try {
is.close();
} catch (final Throwable _t_1) {
if (_t_1 instanceof IOException) {
} else {
throw Exceptions.sneakyThrow(_t_1);
}
}
}
}
}
public XtextVersion(final String version) {
super();
this.version = version;
}
@Override
@Pure
public int hashCode() {
return 31 * 1 + ((this.version== null) ? 0 : this.version.hashCode());
}
@Override
@Pure
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
XtextVersion other = (XtextVersion) obj;
if (this.version == null) {
if (other.version != null)
return false;
} else if (!this.version.equals(other.version))
return false;
return true;
}
@Pure
public String getVersion() {
return this.version;
}
}

View file

@ -1,82 +0,0 @@
/**
* Copyright (c) 2014 itemis AG (http://www.itemis.eu) and others.
* 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 org.eclipse.xtext.util.internal;
import com.google.common.collect.Maps;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.concurrent.ConcurrentMap;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
@SuppressWarnings("all")
public class AlternateJdkLoader extends URLClassLoader {
private final ConcurrentMap<String, Object> locks = Maps.<String, Object>newConcurrentMap();
public AlternateJdkLoader(final Iterable<File> files) {
super(((URL[])Conversions.unwrapArray(IterableExtensions.<File, URL>map(files, ((Function1<File, URL>) (File it) -> {
try {
return it.toURI().toURL();
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
})), URL.class)));
}
@Override
protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
Class<?> _xsynchronizedexpression = null;
synchronized (this.getClassLoadingLockJdk5(name)) {
Class<?> _xblockexpression = null;
{
Class<?> _elvis = null;
Class<?> _findLoadedClass = this.findLoadedClass(name);
if (_findLoadedClass != null) {
_elvis = _findLoadedClass;
} else {
Class<?> _findClass = this.findClass(name);
_elvis = _findClass;
}
final Class<?> c = _elvis;
if (resolve) {
this.resolveClass(c);
}
_xblockexpression = c;
}
_xsynchronizedexpression = _xblockexpression;
}
return _xsynchronizedexpression;
}
@Override
public URL getResource(final String name) {
return this.findResource(name);
}
@Override
public Enumeration<URL> getResources(final String name) throws IOException {
return this.findResources(name);
}
private Object getClassLoadingLockJdk5(final String className) {
final Object newLock = new Object();
final Object existingLock = this.locks.putIfAbsent(className, newLock);
Object _elvis = null;
if (existingLock != null) {
_elvis = existingLock;
} else {
_elvis = newLock;
}
return _elvis;
}
}