package org.jfrog.hudson.maven3; import hudson.EnvVars; import hudson.Extension; import hudson.Launcher; import hudson.maven.MavenModuleSet; import hudson.maven.MavenModuleSetBuild; import hudson.model.*; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import hudson.util.ListBoxModel; import hudson.util.XStream2; import net.sf.json.JSONObject; import org.jfrog.hudson.*; import org.jfrog.hudson.action.ActionableHelper; import org.jfrog.hudson.util.*; import org.jfrog.hudson.util.converters.DeployerResolverOverriderConverter; import org.jfrog.hudson.util.plugins.PluginsUtils; import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.bind.JavaScriptMethod; import java.io.IOException; import java.io.PrintStream; import java.util.Collection; import java.util.Collections; import java.util.List; /** * A wrapper that takes over artifacts resolution and using the configured repository for resolution.<p/> * The {@link org.jfrog.hudson.maven3.Maven3ExtractorListener} is doing the heavy lifting. This class now just holds * the configuration. * * @author Tomer Cohen */ public class ArtifactoryMaven3NativeConfigurator extends BuildWrapper implements ResolverOverrider { private final ServerDetails details; /** * @deprecated: Use org.jfrog.hudson.maven3.ArtifactoryMaven3NativeConfigurator#getResolverCredentialsId()() */ @Deprecated private Credentials overridingResolverCredentials; private final CredentialsConfig resolverCredentialsConfig; @DataBoundConstructor public ArtifactoryMaven3NativeConfigurator(ServerDetails details, CredentialsConfig resolverCredentialsConfig) { this.details = details; this.resolverCredentialsConfig = resolverCredentialsConfig; } public ServerDetails getdetails() { return details; } public ServerDetails getResolverDetails() { return getdetails(); } public String getDownloadReleaseRepositoryKey() { return details != null ? details.getResolveReleaseRepository().getRepoKey() : null; } public String getDownloadSnapshotRepositoryKey() { return details != null ? details.getResolveSnapshotRepositoryKey() : null; } public String getArtifactoryName() { return details != null ? details.artifactoryName : null; } @Override public Collection<? extends Action> getProjectActions(AbstractProject project) { return Collections.emptyList(); } public boolean isOverridingDefaultResolver() { return resolverCredentialsConfig != null && resolverCredentialsConfig.isCredentialsProvided(); } public Credentials getOverridingResolverCredentials() { return overridingResolverCredentials; } public CredentialsConfig getResolverCredentialsConfig() { return resolverCredentialsConfig; } @Override public Environment setUp(final AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { if (!(build instanceof MavenModuleSetBuild)) { return new Environment() { }; } PrintStream log = listener.getLogger(); log.println("Jenkins Artifactory Plugin version: " + ActionableHelper.getArtifactoryPluginVersion()); EnvVars envVars = build.getEnvironment(listener); boolean supportedMavenVersion = MavenVersionHelper.isAtLeastResolutionCapableVersion((MavenModuleSetBuild) build, envVars, listener); if (!supportedMavenVersion) { log.println("Artifactory resolution is not active. Maven 3.0.2 or higher is required to " + "force resolution from Artifactory."); return new Environment() { }; } /** * {@link org.jfrog.hudson.maven3.Maven3ExtractorListener} will populate the resolver context * */ return new Environment() { }; } public ArtifactoryServer getArtifactoryServer() { List<ArtifactoryServer> servers = getDescriptor().getArtifactoryServers(); for (ArtifactoryServer server : servers) { if (server.getName().equals(getArtifactoryName())) { return server; } } return null; } public List<VirtualRepository> getVirtualRepositoryList() { String releaseRepoKey = details.getResolveReleaseRepository().getKeyFromSelect(); String snapshotRepoKey = details.getResolveSnapshotRepository().getKeyFromSelect(); // Add the releases repo to the reposities list, in case it is not there: List<VirtualRepository> repos = RepositoriesUtils.collectVirtualRepositories(null, releaseRepoKey); // Add the snapshots repo to the reposities list, in case it is not there: return RepositoriesUtils.collectVirtualRepositories(repos, snapshotRepoKey); } @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl) super.getDescriptor(); } private boolean isExtractorUsed(EnvVars env) { return Boolean.parseBoolean(env.get(ExtractorUtils.EXTRACTOR_USED)); } @Extension public static class DescriptorImpl extends BuildWrapperDescriptor { private AbstractProject<?, ?> item; public DescriptorImpl() { super(ArtifactoryMaven3NativeConfigurator.class); load(); } @Override public boolean isApplicable(AbstractProject<?, ?> item) { this.item = item; return MavenModuleSet.class.equals(item.getClass()); } private List<VirtualRepository> refreshVirtualRepositories(ArtifactoryServer artifactoryServer, CredentialsConfig credentialsConfig) throws IOException { List<VirtualRepository> virtualRepositoryKeys = RepositoriesUtils.getVirtualRepositoryKeys(artifactoryServer.getUrl(), credentialsConfig, artifactoryServer, item); Collections.sort(virtualRepositoryKeys); return virtualRepositoryKeys; } /** * This method triggered from the client side by Ajax call. * The Element that trig is the "Refresh Repositories" button. * * @param url Artifactory url * @param credentialsId credentials Id if using Credentials plugin * @param username credentials legacy mode username * @param password credentials legacy mode password * @param overrideCredentials credentials legacy mode overridden * @return {@link org.jfrog.hudson.util.RefreshServerResponse} object that represents the response of the repositories */ @JavaScriptMethod public RefreshServerResponse refreshResolversFromArtifactory(String url, String credentialsId, String username, String password, boolean overrideCredentials) { RefreshServerResponse response = new RefreshServerResponse(); CredentialsConfig credentialsConfig = new CredentialsConfig(username, password, credentialsId, overrideCredentials); ArtifactoryServer artifactoryServer = RepositoriesUtils.getArtifactoryServer(url, getArtifactoryServers()); try { List<VirtualRepository> virtualRepositoryKeys = refreshVirtualRepositories(artifactoryServer, credentialsConfig); response.setVirtualRepositories(virtualRepositoryKeys); response.setSuccess(true); return response; } catch (Exception e) { response.setResponseMessage(e.getMessage()); response.setSuccess(false); } /* * In case of Exception, we write the error in the Javascript scope! * */ return response; } @SuppressWarnings("unused") public ListBoxModel doFillCredentialsIdItems(@AncestorInPath Item project) { return PluginsUtils.fillPluginCredentials(project); } @Override public String getDisplayName() { return "Resolve artifacts from Artifactory"; } @Override public String getHelpFile() { return "/plugin/artifactory/help/ArtifactoryMaven3NativeConfigurator/help.html"; } @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { req.bindParameters(this, "maven"); save(); return true; } /** * Returns the list of {@link org.jfrog.hudson.ArtifactoryServer} configured. * * @return can be empty but never null. */ public List<ArtifactoryServer> getArtifactoryServers() { return RepositoriesUtils.getArtifactoryServers(); } public boolean isUseCredentialsPlugin() { return PluginsUtils.isUseCredentialsPlugin(); } } /** * Page Converter */ public static final class ConverterImpl extends DeployerResolverOverriderConverter { public ConverterImpl(XStream2 xstream) { super(xstream); } } }