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

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

package org.xtext.gradle.idea.tasks;

import com.google.common.collect.Iterables;
import groovy.util.XmlSlurper;
import groovy.util.slurpersupport.GPathResult;
import groovy.util.slurpersupport.Node;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.xtend.lib.annotations.Accessors;
import org.eclipse.xtend.lib.annotations.Data;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
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;
import org.eclipse.xtext.xbase.lib.IteratorExtensions;
import org.eclipse.xtext.xbase.lib.Pair;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.Pure;
import org.eclipse.xtext.xbase.lib.util.ToStringBuilder;
import org.gradle.StartParameter;
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.invocation.Gradle;
import org.gradle.api.specs.Spec;
import org.gradle.api.tasks.TaskAction;
import org.xtext.gradle.idea.tasks.GradleExtensions;
import org.xtext.gradle.idea.tasks.IdeaPluginDependencies;
import org.xtext.gradle.idea.tasks.IdeaPluginDependency;
import org.xtext.gradle.idea.tasks.IdeaPluginRepositories;
import org.xtext.gradle.idea.tasks.IdeaPluginRepository;

@Accessors
@SuppressWarnings("all")
public class DownloadIdeaPlugins extends DefaultTask {
  @Data
  private static class PluginRequest {
    private final String id;
    
    private final String version;
    
    public PluginRequest(final String id, final String version) {
      super();
      this.id = id;
      this.version = version;
    }
    
    @Override
    @Pure
    public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + ((this.id== null) ? 0 : this.id.hashCode());
      result = prime * result + ((this.version== null) ? 0 : this.version.hashCode());
      return result;
    }
    
    @Override
    @Pure
    public boolean equals(final Object obj) {
      if (this == obj)
        return true;
      if (obj == null)
        return false;
      if (getClass() != obj.getClass())
        return false;
      DownloadIdeaPlugins.PluginRequest other = (DownloadIdeaPlugins.PluginRequest) obj;
      if (this.id == null) {
        if (other.id != null)
          return false;
      } else if (!this.id.equals(other.id))
        return false;
      if (this.version == null) {
        if (other.version != null)
          return false;
      } else if (!this.version.equals(other.version))
        return false;
      return true;
    }
    
    @Override
    @Pure
    public String toString() {
      ToStringBuilder b = new ToStringBuilder(this);
      b.add("id", this.id);
      b.add("version", this.version);
      return b.toString();
    }
    
    @Pure
    public String getId() {
      return this.id;
    }
    
    @Pure
    public String getVersion() {
      return this.version;
    }
  }
  
  private File destinationDir;
  
  private IdeaPluginRepositories pluginRepositories;
  
  private IdeaPluginDependencies pluginDependencies;
  
  public DownloadIdeaPlugins() {
    final Spec _function = new Spec() {
      @Override
      public boolean isSatisfiedBy(final Task it) {
        Iterable _pluginsToBeDownloaded = DownloadIdeaPlugins.this.pluginsToBeDownloaded();
        final Function1 _function = new Function1() {
          @Override
          public Boolean apply(final DownloadIdeaPlugins.PluginRequest it) {
            return Boolean.valueOf(DownloadIdeaPlugins.this.needsRedownload(it));
          }
        };
        return IterableExtensions.exists(_pluginsToBeDownloaded, _function);
      }
    };
    this.onlyIf(_function);
  }
  
  @TaskAction
  public void download() {
    final HashMap urlsByPluginId = this.collectUrlsByPluginId();
    Iterable _pluginsToBeDownloaded = this.pluginsToBeDownloaded();
    final Function1 _function = new Function1() {
      @Override
      public Boolean apply(final DownloadIdeaPlugins.PluginRequest it) {
        return Boolean.valueOf(DownloadIdeaPlugins.this.needsRedownload(it));
      }
    };
    Iterable _filter = IterableExtensions.filter(_pluginsToBeDownloaded, _function);
    final Procedure1 _function_1 = new Procedure1() {
      @Override
      public void apply(final DownloadIdeaPlugins.PluginRequest it) {
        String _get = urlsByPluginId.get(it);
        DownloadIdeaPlugins.this.download(it, _get);
      }
    };
    IterableExtensions.forEach(_filter, _function_1);
  }
  
  public void download(final DownloadIdeaPlugins.PluginRequest plugin, final String downloadUrl) {
    final Procedure1 _function = new Procedure1() {
      @Override
      public void apply(final File tmp) {
        try {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append(plugin.id, "");
          _builder.append(".zip");
          final File targetFile = GradleExtensions.operator_divide(tmp, _builder.toString());
          URL _uRL = new URL(downloadUrl);
          InputStream _openStream = _uRL.openStream();
          Path _path = targetFile.toPath();
          Files.copy(_openStream, _path);
          File _divide = GradleExtensions.operator_divide(DownloadIdeaPlugins.this.destinationDir, plugin.id);
          final File pluginFolder = GradleExtensions.operator_divide(_divide, plugin.version);
          Project _project = DownloadIdeaPlugins.this.getProject();
          _project.delete(pluginFolder);
          Project _project_1 = DownloadIdeaPlugins.this.getProject();
          final Action _function = new Action() {
            @Override
            public void execute(final CopySpec it) {
              it.into(pluginFolder);
              Project _project = DownloadIdeaPlugins.this.getProject();
              FileTree _zipTree = _project.zipTree(targetFile);
              it.from(_zipTree);
              final Action _function = new Action() {
                @Override
                public void execute(final FileCopyDetails it) {
                  GradleExtensions.cutDirs(it, 1);
                }
              };
              it.eachFile(_function);
              it.setIncludeEmptyDirs(false);
            }
          };
          _project_1.copy(_function);
          Date _date = new Date();
          DownloadIdeaPlugins.this.setLastDownloaded(plugin, _date);
        } catch (Throwable _e) {
          throw Exceptions.sneakyThrow(_e);
        }
      }
    };
    GradleExtensions.usingTmpDir(_function);
  }
  
  public HashMap collectUrlsByPluginId() {
    final Function1>> _function = new Function1>>() {
      @Override
      public Iterable> apply(final IdeaPluginRepository it) {
        try {
          Iterable> _xblockexpression = null;
          {
            XmlSlurper _xmlSlurper = new XmlSlurper();
            String _url = it.getUrl();
            final GPathResult result = _xmlSlurper.parse(_url);
            Iterator _childNodes = result.childNodes();
            Iterable _iterable = IteratorExtensions.toIterable(_childNodes);
            Iterable _filter = Iterables.filter(_iterable, Node.class);
            final Function1> _function = new Function1>() {
              @Override
              public Pair apply(final Node it) {
                Map _attributes = it.attributes();
                Object _get = _attributes.get("id");
                Map _attributes_1 = it.attributes();
                Object _get_1 = _attributes_1.get("version");
                DownloadIdeaPlugins.PluginRequest _pluginRequest = new DownloadIdeaPlugins.PluginRequest(((String) _get), ((String) _get_1));
                Map _attributes_2 = it.attributes();
                Object _get_2 = _attributes_2.get("url");
                return Pair.of(_pluginRequest, ((String) _get_2));
              }
            };
            _xblockexpression = IterableExtensions.>map(_filter, _function);
          }
          return _xblockexpression;
        } catch (Throwable _e) {
          throw Exceptions.sneakyThrow(_e);
        }
      }
    };
    Iterable>> _map = IterableExtensions.>>map(this.pluginRepositories, _function);
    Iterable> _flatten = Iterables.>concat(_map);
    return CollectionLiterals.newHashMap(((Pair[])Conversions.unwrapArray(_flatten, Pair.class)));
  }
  
  private Iterable pluginsToBeDownloaded() {
    Iterable _externalDependencies = this.pluginDependencies.getExternalDependencies();
    final Function1 _function = new Function1() {
      @Override
      public DownloadIdeaPlugins.PluginRequest apply(final IdeaPluginDependency it) {
        String _id = it.getId();
        String _version = it.getVersion();
        return new DownloadIdeaPlugins.PluginRequest(_id, _version);
      }
    };
    return IterableExtensions.map(_externalDependencies, _function);
  }
  
  private File pluginFolder(final DownloadIdeaPlugins.PluginRequest plugin) {
    File _divide = GradleExtensions.operator_divide(
      this.destinationDir, plugin.id);
    return GradleExtensions.operator_divide(_divide, plugin.version);
  }
  
  private File lastDownloadedFile(final DownloadIdeaPlugins.PluginRequest plugin) {
    File _pluginFolder = this.pluginFolder(plugin);
    return GradleExtensions.operator_divide(_pluginFolder, ".lastDownloaded");
  }
  
  private long getLastDownloaded(final DownloadIdeaPlugins.PluginRequest plugin) {
    File _lastDownloadedFile = this.lastDownloadedFile(plugin);
    return _lastDownloadedFile.lastModified();
  }
  
  private boolean setLastDownloaded(final DownloadIdeaPlugins.PluginRequest plugin, final Date lastModified) {
    try {
      boolean _xblockexpression = false;
      {
        final File file = this.lastDownloadedFile(plugin);
        file.createNewFile();
        long _time = lastModified.getTime();
        _xblockexpression = file.setLastModified(_time);
      }
      return _xblockexpression;
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private boolean isSnapshot(final DownloadIdeaPlugins.PluginRequest plugin) {
    return plugin.version.endsWith("-SNAPSHOT");
  }
  
  private boolean needsRedownload(final DownloadIdeaPlugins.PluginRequest plugin) {
    boolean _or = false;
    boolean _or_1 = false;
    Project _project = this.getProject();
    Gradle _gradle = _project.getGradle();
    StartParameter _startParameter = _gradle.getStartParameter();
    boolean _isRefreshDependencies = _startParameter.isRefreshDependencies();
    if (_isRefreshDependencies) {
      _or_1 = true;
    } else {
      long _lastDownloaded = this.getLastDownloaded(plugin);
      boolean _equals = (_lastDownloaded == 0);
      _or_1 = _equals;
    }
    if (_or_1) {
      _or = true;
    } else {
      boolean _and = false;
      boolean _isSnapshot = this.isSnapshot(plugin);
      if (!_isSnapshot) {
        _and = false;
      } else {
        long _lastDownloaded_1 = this.getLastDownloaded(plugin);
        Date _date = new Date();
        long _time = _date.getTime();
        long _minus = (_time - (((1000 * 60) * 60) * 24));
        boolean _lessThan = (_lastDownloaded_1 < _minus);
        _and = _lessThan;
      }
      _or = _and;
    }
    return _or;
  }
  
  @Pure
  public File getDestinationDir() {
    return this.destinationDir;
  }
  
  public void setDestinationDir(final File destinationDir) {
    this.destinationDir = destinationDir;
  }
  
  @Pure
  public IdeaPluginRepositories getPluginRepositories() {
    return this.pluginRepositories;
  }
  
  public void setPluginRepositories(final IdeaPluginRepositories pluginRepositories) {
    this.pluginRepositories = pluginRepositories;
  }
  
  @Pure
  public IdeaPluginDependencies getPluginDependencies() {
    return this.pluginDependencies;
  }
  
  public void setPluginDependencies(final IdeaPluginDependencies pluginDependencies) {
    this.pluginDependencies = pluginDependencies;
  }
}