All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xtext.gradle.idea.tasks.DownloadIdea Maven / Gradle / Ivy

There is a newer version: 2.0.9-alpha.3
Show newest version
package org.xtext.gradle.idea.tasks;

import com.google.common.base.Splitter;
import java.io.File;
import java.io.InputStream;
import java.net.ProxySelector;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.SystemDefaultRoutePlanner;
import org.apache.http.util.EntityUtils;
import org.eclipse.xtend.lib.annotations.Accessors;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.Pure;
import org.gradle.api.Action;
import org.gradle.api.DefaultTask;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.FileCopyDetails;
import org.gradle.api.file.FileTree;
import org.gradle.api.specs.Spec;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.WorkResult;
import org.gradle.internal.os.OperatingSystem;
import org.xtext.gradle.idea.tasks.GradleExtensions;
import org.xtext.gradle.idea.tasks.IdeaBuildInfo;

@Accessors
@SuppressWarnings("all")
public class DownloadIdea extends DefaultTask {
  private final static OperatingSystem os = OperatingSystem.current();
  
  @OutputDirectory
  private File ideaHome;
  
  @Input
  private String ideaVersion;
  
  public DownloadIdea() {
    final Spec _function = new Spec() {
      @Override
      public boolean isSatisfiedBy(final Task it) {
        String[] _elvis = null;
        String[] _list = DownloadIdea.this.ideaHome.list();
        if (_list != null) {
          _elvis = _list;
        } else {
          String[] _newArrayOfSize = new String[0];
          _elvis = _newArrayOfSize;
        }
        int _length = _elvis.length;
        return (_length < 3);
      }
    };
    this.onlyIf(_function);
  }
  
  @TaskAction
  public WorkResult download() {
    try {
      WorkResult _xblockexpression = null;
      {
        final IdeaBuildInfo buildInfo = this.queryBuildInfo();
        String _archiveName = buildInfo.getArchiveName();
        final File archiveFile = new File(this.ideaHome, _archiveName);
        boolean _exists = archiveFile.exists();
        boolean _not = (!_exists);
        if (_not) {
          String _archiveUrl = buildInfo.getArchiveUrl();
          URL _uRL = new URL(_archiveUrl);
          InputStream _openStream = _uRL.openStream();
          Path _path = archiveFile.toPath();
          Files.copy(_openStream, _path);
        }
        String _sourceArchiveName = buildInfo.getSourceArchiveName();
        final File sourceArchiveFile = new File(this.ideaHome, _sourceArchiveName);
        boolean _exists_1 = sourceArchiveFile.exists();
        boolean _not_1 = (!_exists_1);
        if (_not_1) {
          String _sourceArchiveUrl = buildInfo.getSourceArchiveUrl();
          URL _uRL_1 = new URL(_sourceArchiveUrl);
          InputStream _openStream_1 = _uRL_1.openStream();
          Path _path_1 = sourceArchiveFile.toPath();
          Files.copy(_openStream_1, _path_1);
        }
        Project _project = this.getProject();
        final Procedure1 _function = new Procedure1() {
          @Override
          public void apply(final CopySpec it) {
            it.into(DownloadIdea.this.ideaHome);
            boolean _isLinux = DownloadIdea.os.isLinux();
            if (_isLinux) {
              Project _project = DownloadIdea.this.getProject();
              FileTree _tarTree = _project.tarTree(archiveFile);
              it.from(_tarTree);
              final Action _function = new Action() {
                @Override
                public void execute(final FileCopyDetails it) {
                  DownloadIdea.this.cutDirs(it, 1);
                }
              };
              it.eachFile(_function);
            } else {
              Project _project_1 = DownloadIdea.this.getProject();
              FileTree _zipTree = _project_1.zipTree(archiveFile);
              it.from(_zipTree);
              boolean _isMacOsX = DownloadIdea.os.isMacOsX();
              if (_isMacOsX) {
                final Action _function_1 = new Action() {
                  @Override
                  public void execute(final FileCopyDetails it) {
                    DownloadIdea.this.cutDirs(it, 2);
                  }
                };
                it.eachFile(_function_1);
              }
            }
          }
        };
        _xblockexpression = GradleExtensions.copy(_project, _function);
      }
      return _xblockexpression;
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  public IdeaBuildInfo queryBuildInfo() {
    IdeaBuildInfo _xblockexpression = null;
    {
      final String buildApiUrl = "https://teamcity.jetbrains.com/guestAuth/app/rest/builds";
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("buildType:bt410,status:SUCCESS,branch:idea/");
      _builder.append(this.ideaVersion, "");
      final String buildLocator = _builder.toString();
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append(buildApiUrl, "");
      _builder_1.append("/?locator=");
      _builder_1.append(buildLocator, "");
      final String buildIdRequestUrl = _builder_1.toString();
      final Function1 _function = new Function1() {
        @Override
        public String apply(final String response) {
          String _xblockexpression = null;
          {
            final Pattern pattern = Pattern.compile("^(.*)\\sid=\"(\\d+)\"(.*)$");
            final Matcher matcher = pattern.matcher(response);
            matcher.find();
            _xblockexpression = matcher.group(2);
          }
          return _xblockexpression;
        }
      };
      final String buildId = this.httpGet(buildIdRequestUrl, _function);
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append(buildApiUrl, "");
      _builder_2.append("/id:");
      _builder_2.append(buildId, "");
      final String buildUrl = _builder_2.toString();
      StringConcatenation _builder_3 = new StringConcatenation();
      _builder_3.append(buildUrl, "");
      _builder_3.append("/artifacts/children");
      final String buildNumberRequestUrl = _builder_3.toString();
      final Function1 _function_1 = new Function1() {
        @Override
        public String apply(final String response) {
          String _xblockexpression = null;
          {
            final Pattern pattern = Pattern.compile("^(.*)ideaIC-([\\w\\.]+)\\.win\\.zip(.*)$");
            final Matcher matcher = pattern.matcher(response);
            matcher.find();
            _xblockexpression = matcher.group(2);
          }
          return _xblockexpression;
        }
      };
      final String buildNumber = this.httpGet(buildNumberRequestUrl, _function_1);
      StringConcatenation _builder_4 = new StringConcatenation();
      _builder_4.append("ideaIC-");
      _builder_4.append(buildNumber, "");
      _builder_4.append(".");
      String _archiveExtension = this.archiveExtension(DownloadIdea.os);
      _builder_4.append(_archiveExtension, "");
      final String archiveName = _builder_4.toString();
      StringConcatenation _builder_5 = new StringConcatenation();
      _builder_5.append(buildUrl, "");
      _builder_5.append("/artifacts/content");
      final String contentBaseUrl = _builder_5.toString();
      _xblockexpression = new IdeaBuildInfo(this.ideaVersion, buildId, buildUrl, buildNumber, contentBaseUrl, archiveName);
    }
    return _xblockexpression;
  }
  
  public String httpGet(final String url, final Function1 responseHandler) {
    try {
      String _xblockexpression = null;
      {
        ProxySelector _default = ProxySelector.getDefault();
        final SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(_default);
        HttpClientBuilder _custom = HttpClients.custom();
        HttpClientBuilder _setRoutePlanner = _custom.setRoutePlanner(routePlanner);
        final CloseableHttpClient client = _setRoutePlanner.build();
        final HttpGet request = new HttpGet(url);
        String _xtrycatchfinallyexpression = null;
        try {
          String _xblockexpression_1 = null;
          {
            CloseableHttpResponse _execute = client.execute(request);
            HttpEntity _entity = _execute.getEntity();
            final String response = EntityUtils.toString(_entity);
            _xblockexpression_1 = responseHandler.apply(response);
          }
          _xtrycatchfinallyexpression = _xblockexpression_1;
        } finally {
          request.releaseConnection();
        }
        final String result = _xtrycatchfinallyexpression;
        _xblockexpression = result;
      }
      return _xblockexpression;
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  public String archiveExtension(final OperatingSystem os) {
    String _xifexpression = null;
    boolean _isWindows = os.isWindows();
    if (_isWindows) {
      _xifexpression = "win.zip";
    } else {
      String _xifexpression_1 = null;
      boolean _isMacOsX = os.isMacOsX();
      if (_isMacOsX) {
        _xifexpression_1 = "mac.zip";
      } else {
        _xifexpression_1 = "tar.gz";
      }
      _xifexpression = _xifexpression_1;
    }
    return _xifexpression;
  }
  
  public void cutDirs(final FileCopyDetails file, final int levels) {
    Splitter _on = Splitter.on("/");
    Splitter _omitEmptyStrings = _on.omitEmptyStrings();
    String _path = file.getPath();
    final Iterable segments = _omitEmptyStrings.split(_path);
    Iterable _drop = IterableExtensions.drop(segments, levels);
    String _join = IterableExtensions.join(_drop, "/");
    file.setPath(_join);
  }
  
  @Pure
  public File getIdeaHome() {
    return this.ideaHome;
  }
  
  public void setIdeaHome(final File ideaHome) {
    this.ideaHome = ideaHome;
  }
  
  @Pure
  public String getIdeaVersion() {
    return this.ideaVersion;
  }
  
  public void setIdeaVersion(final String ideaVersion) {
    this.ideaVersion = ideaVersion;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy