Skip to content

Commit eaf29c7

Browse files
Contribute TypeScript repositories via an extension point
The default repository is chosen to be the one with the highest version. All others are treated as archives.
1 parent e6bfd03 commit eaf29c7

File tree

13 files changed

+399
-46
lines changed

13 files changed

+399
-46
lines changed

core/ts.core/src/ts/repository/ITypeScriptRepositoryManager.java

+52
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,70 @@
22

33
import java.io.File;
44

5+
/**
6+
* Manager for keeping track of the available TypeScript repositories. Each
7+
* repository includes a TypeScript installation and additional software, such
8+
* as TSLint.
9+
*
10+
* Each repository is automatically assigned a name according to the included
11+
* TypeScript version. No two repositories may share the same name.
12+
*
13+
* One repository may be marked as the default (see
14+
* {@link #getDefaultRepository()}).
15+
*
16+
*/
517
public interface ITypeScriptRepositoryManager {
618

19+
/**
20+
* Creates and adds a new repository. The new repository is also set as the
21+
* default.
22+
*
23+
* @param baseDir
24+
* base directory of the new repository.
25+
* @return the created repository.
26+
*/
727
ITypeScriptRepository createDefaultRepository(File baseDir) throws TypeScriptRepositoryException;
828

29+
/**
30+
* Creates and adds a new repository.
31+
*
32+
* @param baseDir
33+
* base directory of the new repository.
34+
* @return the created repository.
35+
*/
936
ITypeScriptRepository createRepository(File baseDir) throws TypeScriptRepositoryException;
1037

38+
/**
39+
* Removes a repository. If not present, nothing happens.
40+
*
41+
* @param name
42+
* name of the repository to remove.
43+
* @return the removed repository.
44+
*/
1145
ITypeScriptRepository removeRepository(String name);
1246

47+
/**
48+
* Gets the current default repository.
49+
*
50+
* @return a repository or {@code null} if there is no default.
51+
*/
1352
ITypeScriptRepository getDefaultRepository();
1453

54+
/**
55+
* Gets a managed repository by name.
56+
*
57+
* @param name
58+
* name of the repository to retrieve.
59+
* @return a repository or {@code null} if there is no repository with the
60+
* requested name.
61+
*/
1562
ITypeScriptRepository getRepository(String name);
1663

64+
/**
65+
* Gets all registered repositories.
66+
*
67+
* @return array of repositories.
68+
*/
1769
ITypeScriptRepository[] getRepositories();
1870

1971
}

core/ts.core/src/ts/repository/TypeScriptRepositoryManager.java

+15
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
/**
2+
* Copyright (c) 2015-2016 Angelo ZERR.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Angelo Zerr <[email protected]> - initial API and implementation
10+
* Lorenzo Dalla Vecchia <[email protected]> - protected API for setting default
11+
*/
112
package ts.repository;
213

314
import java.io.File;
@@ -26,6 +37,10 @@ public ITypeScriptRepository createDefaultRepository(File baseDir) throws TypeSc
2637
return this.defaultRepository = createRepository(baseDir);
2738
}
2839

40+
protected final void setDefaultRepository(ITypeScriptRepository repository) {
41+
this.defaultRepository = repository;
42+
}
43+
2944
@Override
3045
public ITypeScriptRepository createRepository(File baseDir) throws TypeScriptRepositoryException {
3146
synchronized (repositories) {

core/ts.repository/META-INF/MANIFEST.MF

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ Bundle-ManifestVersion: 2
33
Bundle-Name: %pluginName
44
Bundle-Vendor: %providerName
55
Bundle-Localization: plugin
6-
Bundle-SymbolicName: ts.repository
6+
Bundle-SymbolicName: ts.repository;singleton:=true
77
Bundle-Version: 1.2.0.qualifier
88
Eclipse-BundleShape: dir
99
Import-Package: org.osgi.framework
1010
Bundle-Activator: ts.Activator
1111
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
12+
Require-Bundle: ts.eclipse.ide.core

core/ts.repository/build.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ output.. = bin/
33
bin.includes = META-INF/,\
44
.,\
55
plugin.properties,\
6-
node_modules/
6+
node_modules/,\
7+
plugin.xml

core/ts.repository/plugin.xml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<?eclipse version="3.4"?>
3+
<plugin>
4+
<extension
5+
point="ts.eclipse.ide.core.typeScriptRepositories">
6+
<repository
7+
baseDir="archives/1.8.10">
8+
</repository>
9+
<repository
10+
baseDir="archives/2.0.10">
11+
</repository>
12+
<repository
13+
baseDir=".">
14+
</repository>
15+
</extension>
16+
17+
</plugin>

eclipse/ts.eclipse.ide.core/META-INF/MANIFEST.MF

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ Bundle-Version: 1.2.0.qualifier
88
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
99
Require-Bundle: org.eclipse.core.runtime,
1010
org.eclipse.core.resources,
11-
ts.repository,
1211
ts.core,
1312
ts.eclipse,
1413
org.eclipse.jface.text,

eclipse/ts.eclipse.ide.core/plugin.properties

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ TypeScriptBuilder.name=TypeScript Builder
2525
# Extension Points
2626
nodeJSInstallsContribution.name=Node.js Installations
2727
typeScriptConsoleConnectors.name=TypeScript Console Connector Extension Points
28+
typeScriptRepositoriesContribution.name=TypeScript Repositories
2829

2930
# Launch
3031
TypeScriptCompilerLaunchConfigurationDelegate.label=TypeScript Compile

eclipse/ts.eclipse.ide.core/plugin.xml

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<extension-point id="nodeJSInstalls"
2121
name="%nodeJSInstallsContribution.name"
2222
schema="schema/nodeJSInstalls.exsd" />
23+
<extension-point id="typeScriptRepositories" name="%typeScriptRepositoriesContribution.name" schema="schema/typeScriptRepositories.exsd"/>
2324

2425
<extension point="org.eclipse.core.runtime.contentTypes">
2526
<content-type
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<!-- Schema file written by PDE -->
3+
<schema targetNamespace="ts.eclipse.ide.core" xmlns="http://www.w3.org/2001/XMLSchema">
4+
<annotation>
5+
<appInfo>
6+
<meta.schema plugin="ts.eclipse.ide.core" id="typescriptRepositories" name="Embed TypeScript Repository"/>
7+
</appInfo>
8+
<documentation>
9+
Extension point to provided embedded TypeScript Repositories.
10+
</documentation>
11+
</annotation>
12+
13+
<element name="extension">
14+
<annotation>
15+
<appInfo>
16+
<meta.element />
17+
</appInfo>
18+
</annotation>
19+
<complexType>
20+
<sequence minOccurs="1" maxOccurs="unbounded">
21+
<element ref="repository"/>
22+
</sequence>
23+
<attribute name="point" type="string" use="required">
24+
<annotation>
25+
<documentation>
26+
27+
</documentation>
28+
</annotation>
29+
</attribute>
30+
<attribute name="id" type="string">
31+
<annotation>
32+
<documentation>
33+
34+
</documentation>
35+
</annotation>
36+
</attribute>
37+
<attribute name="name" type="string">
38+
<annotation>
39+
<documentation>
40+
41+
</documentation>
42+
<appInfo>
43+
<meta.attribute translatable="true"/>
44+
</appInfo>
45+
</annotation>
46+
</attribute>
47+
</complexType>
48+
</element>
49+
50+
<element name="repository">
51+
<annotation>
52+
<documentation>
53+
This extension point allows developers to supply a repository containing a TypeScript installation as well as the TSLint tool.
54+
&lt;p&gt;
55+
A repository is represented by a root directory containing a &lt;i&gt;node_modules&lt;/i&gt; directory, itself containing the &lt;i&gt;typescript&lt;/i&gt; and &lt;i&gt;tslit&lt;/i&gt; packages.
56+
&lt;p&gt;
57+
The version of TypeScript embedded in the repository directory is detected automatically. On first startup, the repository containing the most recent version is selected as active repository. The user is always free to change the active repository.
58+
</documentation>
59+
</annotation>
60+
<complexType>
61+
<attribute name="baseDir" type="string" use="required">
62+
<annotation>
63+
<documentation>
64+
The base directory of the repository inside the contributing bundle.
65+
</documentation>
66+
</annotation>
67+
</attribute>
68+
</complexType>
69+
</element>
70+
71+
<annotation>
72+
<appInfo>
73+
<meta.section type="since"/>
74+
</appInfo>
75+
<documentation>
76+
2.0
77+
</documentation>
78+
</annotation>
79+
80+
81+
82+
<annotation>
83+
<appInfo>
84+
<meta.section type="implementation"/>
85+
</appInfo>
86+
<documentation>
87+
This plugin itself does not have any predefined repositories
88+
</documentation>
89+
</annotation>
90+
91+
92+
</schema>

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/core/TypeScriptCorePlugin.java

-15
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@
1010
*/
1111
package ts.eclipse.ide.core;
1212

13-
import java.io.File;
14-
import java.io.IOException;
15-
16-
import org.eclipse.core.runtime.FileLocator;
1713
import org.eclipse.core.runtime.IStatus;
18-
import org.eclipse.core.runtime.Platform;
1914
import org.eclipse.core.runtime.Plugin;
2015
import org.eclipse.core.runtime.Status;
2116
import org.osgi.framework.BundleContext;
@@ -57,16 +52,6 @@ public void start(BundleContext context) throws Exception {
5752
resourceManager.setTypeScriptResourcesManagerDelegate(IDEResourcesManager.getInstance());
5853
}
5954

60-
/**
61-
* Returns the TypeScript repository base directory.
62-
*
63-
* @return the TypeScript repository base directory.
64-
* @throws IOException
65-
*/
66-
public static File getTypeScriptRepositoryBaseDir() throws IOException {
67-
return FileLocator.getBundleFile(Platform.getBundle("ts.repository"));
68-
}
69-
7055
@Override
7156
public void stop(BundleContext context) throws Exception {
7257
ResourcesWatcher.getInstance().dispose();

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/core/repository/IIDETypeScriptRepositoryManager.java

+7
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66

77
import ts.repository.ITypeScriptRepositoryManager;
88

9+
/**
10+
* TypeScript repository manager for use in the Eclipse IDE.
11+
*
12+
* In addition to the repositories registered manually, this manager will also
13+
* pick up any repository contributed to the {@code typeScriptRepositories}
14+
* extension point.
15+
*/
916
public interface IIDETypeScriptRepositoryManager extends ITypeScriptRepositoryManager {
1017

1118
String generateFileName(IResource resource, IProject project);

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/internal/core/preferences/TypeScriptCorePreferenceInitializer.java

+15-27
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@
1010
*/
1111
package ts.eclipse.ide.internal.core.preferences;
1212

13-
import java.io.File;
14-
15-
import org.eclipse.core.runtime.FileLocator;
16-
import org.eclipse.core.runtime.Platform;
1713
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
1814
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
1915
import org.osgi.service.prefs.BackingStoreException;
@@ -45,26 +41,10 @@ public void initializeDefaultPreferences() {
4541
initializeNodejsPreferences(node);
4642

4743
try {
48-
File tsRepositoryBaseDir = FileLocator.getBundleFile(Platform.getBundle("ts.repository"));
4944
ITypeScriptRepository defaultRepository = TypeScriptCorePlugin.getTypeScriptRepositoryManager()
50-
.createDefaultRepository(tsRepositoryBaseDir);
51-
52-
// Loop for archives of TypeScript (1.8.10, etc)
53-
File archivesDir = new File(tsRepositoryBaseDir, "archives");
54-
if (archivesDir.exists()) {
55-
File[] oldRepostoryBaseDirs = archivesDir.listFiles();
56-
File oldRepostoryBaseDir = null;
57-
for (int i = 0; i < oldRepostoryBaseDirs.length; i++) {
58-
oldRepostoryBaseDir = oldRepostoryBaseDirs[i];
59-
if (oldRepostoryBaseDir.isDirectory()) {
60-
try {
61-
TypeScriptCorePlugin.getTypeScriptRepositoryManager().createRepository(oldRepostoryBaseDir);
62-
} catch (Exception e) {
63-
Trace.trace(Trace.SEVERE, "Error while getting an archived TypeScript repository", e);
64-
}
65-
}
66-
}
67-
45+
.getDefaultRepository();
46+
if (defaultRepository == null) {
47+
Trace.trace(Trace.WARNING, "No default TypeScript repository is available");
6848
}
6949

7050
// Initialize TypeScript runtime preferences
@@ -126,8 +106,12 @@ private static boolean useBundledNodeJsEmbedded(IEclipsePreferences node) {
126106

127107
private void initializeTypeScriptRuntimePreferences(IEclipsePreferences node,
128108
ITypeScriptRepository defaultRepository) {
129-
node.put(TypeScriptCorePreferenceConstants.EMBEDDED_TYPESCRIPT_ID, defaultRepository.getName());
130-
node.putBoolean(TypeScriptCorePreferenceConstants.USE_EMBEDDED_TYPESCRIPT, true);
109+
if (defaultRepository != null) {
110+
node.put(TypeScriptCorePreferenceConstants.EMBEDDED_TYPESCRIPT_ID, defaultRepository.getName());
111+
node.putBoolean(TypeScriptCorePreferenceConstants.USE_EMBEDDED_TYPESCRIPT, true);
112+
} else {
113+
node.putBoolean(TypeScriptCorePreferenceConstants.USE_EMBEDDED_TYPESCRIPT, false);
114+
}
131115
node.put(TypeScriptCorePreferenceConstants.INSTALLED_TYPESCRIPT_PATH, "");
132116
}
133117

@@ -152,8 +136,12 @@ private void initializeTypeScriptBuildPath(IEclipsePreferences node) {
152136
private void initializeTslintPreferences(IEclipsePreferences node, ITypeScriptRepository defaultRepository) {
153137
node.put(TypeScriptCorePreferenceConstants.TSLINT_STRATEGY, TslintSettingsStrategy.DisableTslint.name());
154138
node.put(TypeScriptCorePreferenceConstants.TSLINT_USE_CUSTOM_TSLINTJSON_FILE, "");
155-
node.put(TypeScriptCorePreferenceConstants.TSLINT_EMBEDDED_TYPESCRIPT_ID, defaultRepository.getName());
156-
node.putBoolean(TypeScriptCorePreferenceConstants.TSLINT_USE_EMBEDDED_TYPESCRIPT, true);
139+
if (defaultRepository != null) {
140+
node.put(TypeScriptCorePreferenceConstants.TSLINT_EMBEDDED_TYPESCRIPT_ID, defaultRepository.getName());
141+
node.putBoolean(TypeScriptCorePreferenceConstants.TSLINT_USE_EMBEDDED_TYPESCRIPT, true);
142+
} else {
143+
node.putBoolean(TypeScriptCorePreferenceConstants.TSLINT_USE_EMBEDDED_TYPESCRIPT, false);
144+
}
157145
node.put(TypeScriptCorePreferenceConstants.TSLINT_INSTALLED_TYPESCRIPT_PATH, "");
158146
}
159147

0 commit comments

Comments
 (0)