From 898fc3ebd6de6c7375f552b665643267c50a7890 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Wed, 21 Feb 2018 14:47:09 -0500 Subject: [PATCH] Initial commit for atom-spring-boot --- atom-extensions/atom-spring-boot/.gitignore | 3 + .../atom-spring-boot/.gitignore-release | 3 + atom-extensions/atom-spring-boot/lib/main.js | 140 ++++++++++++++++++ atom-extensions/atom-spring-boot/package.json | 90 +++++++++++ .../atom-spring-boot/properties.json | 3 + atom-extensions/atom-spring-boot/script.js | 34 +++++ .../atom-spring-boot/styles/boot-icon.png | Bin 0 -> 617 bytes .../styles/hints.atom-text-editor.less | 16 ++ concourse/pipeline.yml | 61 +++++++- 9 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 atom-extensions/atom-spring-boot/.gitignore create mode 100644 atom-extensions/atom-spring-boot/.gitignore-release create mode 100644 atom-extensions/atom-spring-boot/lib/main.js create mode 100644 atom-extensions/atom-spring-boot/package.json create mode 100644 atom-extensions/atom-spring-boot/properties.json create mode 100644 atom-extensions/atom-spring-boot/script.js create mode 100644 atom-extensions/atom-spring-boot/styles/boot-icon.png create mode 100644 atom-extensions/atom-spring-boot/styles/hints.atom-text-editor.less diff --git a/atom-extensions/atom-spring-boot/.gitignore b/atom-extensions/atom-spring-boot/.gitignore new file mode 100644 index 000000000..38d57c0ad --- /dev/null +++ b/atom-extensions/atom-spring-boot/.gitignore @@ -0,0 +1,3 @@ +.idea/ +server/ +node_modules/ diff --git a/atom-extensions/atom-spring-boot/.gitignore-release b/atom-extensions/atom-spring-boot/.gitignore-release new file mode 100644 index 000000000..38d57c0ad --- /dev/null +++ b/atom-extensions/atom-spring-boot/.gitignore-release @@ -0,0 +1,3 @@ +.idea/ +server/ +node_modules/ diff --git a/atom-extensions/atom-spring-boot/lib/main.js b/atom-extensions/atom-spring-boot/lib/main.js new file mode 100644 index 000000000..aebf3dfed --- /dev/null +++ b/atom-extensions/atom-spring-boot/lib/main.js @@ -0,0 +1,140 @@ +const path = require('path'); +const { JavaProcessLanguageClient, StsAdapter } = require('pivotal-atom-languageclient-commons'); +const { Convert } = require('atom-languageclient'); +const PROPERTIES = require('../properties.json'); + +const BOOT_DATA_MARKER_TYPE = 'BootApp-Hint'; +const BOOT_HINT_GUTTER_NAME = 'boot-hint-gutter'; + +class SpringBootLanguageClient extends JavaProcessLanguageClient { + + constructor() { + //noinspection JSAnnotator + super( + PROPERTIES.jarUrl, + path.join(__dirname, '..', 'server'), + 'spring-boot-language-server.jar' + ); + // this.DEBUG = true; + } + + postInitialization(server) { + this.sendConfig(server); + this._disposable.add(atom.config.observe('boot-java', () => this.sendConfig(server))); + } + + sendConfig(server) { + server.connection.didChangeConfiguration({ settings: {'boot-java': atom.config.get('boot-java') }}); + } + + getGrammarScopes() { + return ['source.java']; + } + + getLanguageName() { + return 'spring-boot'; + } + + getServerName() { + return 'Spring Boot'; + } + + activate() { + require('atom-package-deps') + .install('boot-java') + .then(() => console.debug('All dependencies installed, good to go')); + super.activate(); + } + + getOrInstallLauncher() { + return Promise.resolve('org.springframework.boot.loader.JarLauncher'); + } + + launchVmArgs(version) { + return super.getOrInstallLauncher().then(lsJar => { + const toolsJar = this.findJavaFile('lib', 'tools.jar'); + if (version < 9 && !toolsJar) { + // Notify the user that tool.jar is not found + const notification = atom.notifications.addWarning(`"Boot-Java" Package Functionality Limited`, { + dismissable: true, + detail: 'No tools.jar found', + description: 'JAVA_HOME environment variable points either to JRE or JDK missing "lib/tools.jar" hence Boot Hints are unavailable', + buttons: [{ + text: 'OK', + onDidClick: () => { + notification.dismiss() + }, + }], + }); + } + return [ + // '-Xdebug', + // '-agentlib:jdwp=transport=dt_socket,server=y,address=7999,suspend=n', + '-Dorg.slf4j.simpleLogger.logFile=boot-java.log', + '-Dorg.slf4j.simpleLogger.defaultLogLevel=debug', + '-cp', + `${toolsJar ? `${toolsJar}${path.delimiter}` : ''}${lsJar}` + ]; + }); + } + + createStsAdapter() { + return new BootStsAdapter(); + } + + filterChangeWatchedFiles(filePath) { + return filePath.endsWith('.gradle') || filePath.endsWith(path.join('', 'pom.xml')); + } + +} + +class BootStsAdapter extends StsAdapter { + + constructor() { + super(); + } + + onHighlight(params) { + this.findEditors(params.doc.uri).forEach(editor => this.markHintsForEditor(editor, params.ranges)); + } + + markHintsForEditor(editor, ranges) { + editor.findMarkers(BOOT_DATA_MARKER_TYPE).forEach(m => m.destroy()); + if (Array.isArray(ranges)) { + ranges.forEach(range => this.createHintMarker(editor, range)); + } + const gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); + if (gutter) { + if (!ranges || !ranges.length) { + gutter.hide(); + } else if (!gutter.isVisible()) { + gutter.show(); + } + } + } + + createHintMarker(editor, range) { + // Create marker model + const marker = editor.markBufferRange(Convert.lsRangeToAtomRange(range), BOOT_DATA_MARKER_TYPE); + + // Marker around the text in the editor + editor.decorateMarker(marker, { + type: 'highlight', + class: 'boot-hint' + }); + + // Marker in the diagnostic gutter + let gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); + if (!gutter) { + gutter = editor.addGutter({ + name: BOOT_HINT_GUTTER_NAME, + visible: false, + }); + } + const iconElement = document.createElement('span'); + iconElement.setAttribute('class', 'gutter-boot-hint'); + gutter.decorateMarker(marker, {item: iconElement}); + } +} + +module.exports = new SpringBootLanguageClient(); diff --git a/atom-extensions/atom-spring-boot/package.json b/atom-extensions/atom-spring-boot/package.json new file mode 100644 index 000000000..28a6312ac --- /dev/null +++ b/atom-extensions/atom-spring-boot/package.json @@ -0,0 +1,90 @@ +{ + "name": "spring-boot", + "main": "./lib/main", + "version": "0.1.4", + "description": "Spring Boot support for Atom", + "repository": "https://github.com/spring-projects/atom-spring-boot", + "icon": "icon.png", + "license": "MIT", + "engines": { + "atom": ">=1.21.0" + }, + "files": [ + "lib/", + "server/", + "styles/", + "properties.json" + ], + "configSchema": { + "boot-hints.on": { + "type": "boolean", + "default": true, + "description": "Enable/Disable Spring running Boot application live hints decorators in the source code" + } + }, + "dependencies": { + "atom-package-deps": "^4.6.0", + "download": "^6.2.5", + "pivotal-atom-languageclient-commons": "0.0.19" + }, + "devDependencies": { + "coffeelint": "^1.10.1" + }, + "scripts": { + "clean": "rm -fr node_modules", + "postinstall": "node script.js" + }, + "package-deps": [ + "atom-ide-ui", + "ide-java" + ], + "consumedServices": { + "linter-indie": { + "versions": { + "2.0.0": "consumeLinterV2" + } + }, + "datatip": { + "versions": { + "0.1.0": "consumeDatatip" + } + } + }, + "providedServices": { + "autocomplete.provider": { + "versions": { + "2.0.0": "provideAutocomplete" + } + }, + "code-actions": { + "versions": { + "0.1.0": "provideCodeActions" + } + }, + "code-format.range": { + "versions": { + "0.1.0": "provideCodeFormat" + } + }, + "code-highlight": { + "versions": { + "0.1.0": "provideCodeHighlight" + } + }, + "definitions": { + "versions": { + "0.1.0": "provideDefinitions" + } + }, + "find-references": { + "versions": { + "0.1.0": "provideFindReferences" + } + }, + "outline-view": { + "versions": { + "0.1.0": "provideOutlines" + } + } + } +} diff --git a/atom-extensions/atom-spring-boot/properties.json b/atom-extensions/atom-spring-boot/properties.json new file mode 100644 index 000000000..0856b1e4d --- /dev/null +++ b/atom-extensions/atom-spring-boot/properties.json @@ -0,0 +1,3 @@ +{ + "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/boot-java-language-server-0.0.10-201711061741.jar" +} diff --git a/atom-extensions/atom-spring-boot/script.js b/atom-extensions/atom-spring-boot/script.js new file mode 100644 index 000000000..25c8d6dd7 --- /dev/null +++ b/atom-extensions/atom-spring-boot/script.js @@ -0,0 +1,34 @@ +const fs = require('fs'); +const path = require('path'); +const download = require('download'); +const PROPERTIES = require('./properties.json'); + +let fileExists = function(path) { + return new Promise((resolve, reject) => { + fs.access(path, fs.R_OK, error => { + resolve(!error || error.code !== 'ENOENT'); + }) + }); +}; + +const serverDownloadUrl = PROPERTIES.jarUrl; + +const serverHome = path.join(__dirname, 'server'); + +const localFileName = path.join(serverHome, 'spring-boot-language-server.jar'); + +fileExists(localFileName).then(exists => { + if (!exists) { + console.log(`Downloading ${serverDownloadUrl} to ${localFileName}`); + fileExists(serverHome) + .then(doesExist => { if (!doesExist) fs.mkdir(serverHome) }) + .then(() => download(serverDownloadUrl)) + .then(data => fs.writeFileSync(localFileName, data)) + .then(() => fileExists(localFileName)) + .then(doesExist => { if (!doesExist) throw Error(`Failed to install the ${this.getServerName()} language server`) }) + .then(() => console.log(`Successfully downloaded ${serverDownloadUrl}`)); + } +}); + + + diff --git a/atom-extensions/atom-spring-boot/styles/boot-icon.png b/atom-extensions/atom-spring-boot/styles/boot-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..de88ef0d5ceb61e6e6b141349ae5269c9187a59a GIT binary patch literal 617 zcmV-v0+#)WP)|WK~y-6rIWu)TTv9pKj+1~MB|H5O0)AYOXdvzXI;@+8$XypN@4-;fb1CtKd>3s`+DR9R`50! zjx7bnBBCPF3Q#UZz3B7*CXkX0Sz^_U8fP#zNO!oKVP}}kP=?J z(YKumibjni2wS(d7)gvUHZaC$|0tc0z7VOL7s^NnMt+9w*Hc05(2ukQ>hh+g}2I zj7r)^Tc$|Rz_AA$OZ*xvrV%1H*N%;nCo9KG(J>ctk z21d