package jetbrains.buildserver.sonarplugin.sqrunner;
import jetbrains.buildServer.controllers.BuildDataExtensionUtil;
import jetbrains.buildServer.serverSide.SBuild;
import jetbrains.buildServer.serverSide.SBuildServer;
import jetbrains.buildServer.serverSide.artifacts.BuildArtifact;
import jetbrains.buildServer.serverSide.artifacts.BuildArtifactHolder;
import jetbrains.buildServer.serverSide.artifacts.BuildArtifactsViewMode;
import jetbrains.buildServer.web.openapi.PlaceId;
import jetbrains.buildServer.web.openapi.PluginDescriptor;
import jetbrains.buildServer.web.openapi.SimplePageExtension;
import jetbrains.buildServer.web.openapi.WebControllerManager;
import jetbrains.buildserver.sonarplugin.Constants;
import jetbrains.buildserver.sonarplugin.Util;
import org.jetbrains.annotations.NotNull;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
/**
* Created by Andrey Titov on 4/4/14.
* <p>
* Link to the SonarQube Server on the Build Summary table
* </p>
*/
public class BuildSummaryLinkExtension extends SimplePageExtension {
public static final long ABSOLUTE_FILESIZE_THRESHOLD = 1000L;
@NotNull
private final SBuildServer myServer;
public BuildSummaryLinkExtension(@NotNull final WebControllerManager manager,
@NotNull final PluginDescriptor pluginDescriptor,
@NotNull final SBuildServer server) {
super(manager, PlaceId.BUILD_SUMMARY, pluginDescriptor.getPluginName(), "buildSummary.jsp");
myServer = server;
register();
}
@Override
public void fillModel(@NotNull final Map<String, Object> model,
@NotNull final HttpServletRequest request) {
final SBuild build = BuildDataExtensionUtil.retrieveBuild(request, myServer);
if (build == null) {
return;
}
final BuildArtifact artifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_HIDDEN_ONLY).getArtifact(Constants.SONAR_SERVER_URL_ARTIF_LOCATION_FULL);
if (artifact == null) {
model.put("sonar_noArtifact", Boolean.TRUE);
return;
}
if (artifact.getSize() > ABSOLUTE_FILESIZE_THRESHOLD) {
model.put("sonar_bigUrlFile", artifact.getSize());
} else {
try {
model.put("sonar_url", readUrl(artifact));
} catch (IOException e) {
model.put("sonar_IOException", e);
}
}
super.fillModel(model, request);
}
@NotNull
private String readUrl(BuildArtifact artifact) throws IOException {
String url;InputStream inputStream = null;
try {
inputStream = artifact.getInputStream();
url = readUrlFromStream(inputStream);
} finally {
Util.close(inputStream);
}
return url;
}
@NotNull
protected String readUrlFromStream(@NotNull final InputStream inputStream) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
return reader.readLine();
}
@Override
public boolean isAvailable(@NotNull final HttpServletRequest request) {
final SBuild build = BuildDataExtensionUtil.retrieveBuild(request, myServer);
if (build == null) {
return false;
}
final BuildArtifactHolder artifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_HIDDEN_ONLY).findArtifact(Constants.SONAR_SERVER_URL_ARTIF_LOCATION_FULL);
return artifact.isAvailable();
}
}