# HG changeset patch
# User Evgeniy.Koshkin
# Date 1374748068 -14400
# Node ID 3be628a8ec52d88264f33da236e9c42578894a31
# Parent 74f7253560873e5ce9e93418cd51ab4d61af91fa
added DownloadSymbolFilesController
diff -r 74f725356087 -r 3be628a8ec52 server/src/META-INF/build-server-plugin-symbol-server.xml
--- a/server/src/META-INF/build-server-plugin-symbol-server.xml Wed Jul 24 21:06:37 2013 +0400
+++ b/server/src/META-INF/build-server-plugin-symbol-server.xml Thu Jul 25 14:27:48 2013 +0400
@@ -8,5 +8,6 @@
+
diff -r 74f725356087 -r 3be628a8ec52 server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java
--- a/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java Wed Jul 24 21:06:37 2013 +0400
+++ b/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java Thu Jul 25 14:27:48 2013 +0400
@@ -25,18 +25,22 @@
*/
public class BuildSymbolsIndexProvider implements BuildMetadataProvider {
+ public static final String PROVIDER_ID = "symbols-index-provider";
+ public static final String FILE_NAME_KEY = "file-name";
+ public static final String ARTIFACT_PATH_KEY = "artifact-path";
+
private static final Logger LOG = Logger.getLogger(BuildSymbolsIndexProvider.class);
- private static final String ID = "symbols-index-provider";
@NotNull
public String getProviderId() {
- return ID;
+ return PROVIDER_ID;
}
public void generateMedatadata(@NotNull SBuild sBuild, @NotNull MetadataStorageWriter metadataStorageWriter) {
+ final long buildId = sBuild.getBuildId();
final BuildArtifact symbols = sBuild.getArtifacts(BuildArtifactsViewMode.VIEW_HIDDEN_ONLY).getArtifact(".teamcity/symbols");
if(symbols == null){
- LOG.debug("Build with id " + sBuild.getBuildId() + " doesn't provide symbols index data.");
+ LOG.debug("Build with id " + buildId + " doesn't provide symbols index data.");
return;
}
for(BuildArtifact childArtifact : symbols.getChildren()){
@@ -51,12 +55,12 @@
final String fileName = indexData.get(sign);
final String artifactPath = locateArtifact(sBuild, fileName);
if(artifactPath == null){
- LOG.debug(String.format("Failed to find artifact by name. BuildId - %d. Artifact name - %s.", sBuild.getBuildId(), fileName));
+ LOG.debug(String.format("Failed to find artifact by name. BuildId - %d. Artifact name - %s.", buildId, fileName));
continue;
}
final HashMap data = new HashMap();
- data.put("file-name", fileName);
- data.put("artifact-path", artifactPath);
+ data.put(ARTIFACT_PATH_KEY, artifactPath);
+ data.put(FILE_NAME_KEY, fileName);
metadataStorageWriter.addParameters(sign, data);
}
}
diff -r 74f725356087 -r 3be628a8ec52 server/src/jetbrains/buildServer/symbols/DownloadSymbolFilesController.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/jetbrains/buildServer/symbols/DownloadSymbolFilesController.java Thu Jul 25 14:27:48 2013 +0400
@@ -0,0 +1,102 @@
+package jetbrains.buildServer.symbols;
+
+import jetbrains.buildServer.controllers.BaseController;
+import jetbrains.buildServer.serverSide.SBuild;
+import jetbrains.buildServer.serverSide.SBuildServer;
+import jetbrains.buildServer.serverSide.artifacts.BuildArtifact;
+import jetbrains.buildServer.serverSide.artifacts.BuildArtifactsViewMode;
+import jetbrains.buildServer.serverSide.metadata.BuildMetadataEntry;
+import jetbrains.buildServer.serverSide.metadata.MetadataStorage;
+import jetbrains.buildServer.web.openapi.WebControllerManager;
+import jetbrains.buildServer.web.util.WebUtil;
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
+import org.apache.log4j.Logger;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * @author Evgeniy.Koshkin
+ */
+public class DownloadSymbolFilesController extends BaseController {
+
+ public static final String APP_SYMBOLS = "/app/symbols/";
+
+ private static final String COMPRESSED_FILE_EXTENSION = "pd_";
+ private static final String FILE_POINTER_FILE_EXTENSION = "ptr";
+
+ private static final Logger LOG = Logger.getLogger(DownloadSymbolFilesController.class);
+
+ @NotNull private final MetadataStorage myBuildMetadataStorage;
+
+ public DownloadSymbolFilesController(@NotNull SBuildServer server, @NotNull WebControllerManager controllerManager, @NotNull MetadataStorage buildMetadataStorage) {
+ super(server);
+ myBuildMetadataStorage = buildMetadataStorage;
+ controllerManager.registerController(APP_SYMBOLS + "**", this);
+ }
+
+ @Nullable
+ @Override
+ protected ModelAndView doHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception {
+ final String requestURI = request.getRequestURI();
+ if(requestURI.endsWith(COMPRESSED_FILE_EXTENSION)){
+ //TODO
+ return null;
+ }
+ if(requestURI.endsWith(FILE_POINTER_FILE_EXTENSION)){
+ //TODO
+ return null;
+ }
+ final int valuableUriPartBeginIndex = requestURI.indexOf(APP_SYMBOLS);
+ if(valuableUriPartBeginIndex == -1){
+ //TODO
+ return null;
+ }
+ final String valuableUriPart = requestURI.substring(valuableUriPartBeginIndex + APP_SYMBOLS.length());
+ final int firstDelimiterPosition = valuableUriPart.indexOf('/');
+ final String fileName = valuableUriPart.substring(0, firstDelimiterPosition);
+ final String guid = valuableUriPart.substring(firstDelimiterPosition + 1, valuableUriPart.indexOf('/', firstDelimiterPosition + 1));
+ //TODO: log filename and guid
+
+ final BuildArtifact buildArtifact = findArtifact(guid, fileName);
+ if(buildArtifact == null){
+ WebUtil.notFound(request, response, "Symbol file not found", null);
+ return null;
+ }
+ final ServletOutputStream out = response.getOutputStream();
+ final ZipArchiveOutputStream output = new ZipArchiveOutputStream(new BufferedOutputStream(out));
+ output.setEncoding(null);
+
+
+ return null;
+ }
+
+ private BuildArtifact findArtifact(String guid, String fileName) {
+ final Iterator entryIterator = myBuildMetadataStorage.getEntriesByKey(BuildSymbolsIndexProvider.PROVIDER_ID, guid);
+ if(!entryIterator.hasNext()){
+ //TODO
+ return null;
+ }
+ final BuildMetadataEntry entry = entryIterator.next();
+ final Map metadata = entry.getMetadata();
+ final String storedFileName = metadata.get(BuildSymbolsIndexProvider.FILE_NAME_KEY);
+ final String artifactPath = metadata.get(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY);
+ if(!storedFileName.equals(fileName)){
+ //TODO
+ return null;
+ }
+ final SBuild build = myServer.findBuildInstanceById(entry.getBuildId());
+ if(build == null){
+ //TODO
+ return null;
+ }
+ return build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).getArtifact(artifactPath);
+ }
+}
\ No newline at end of file