changeset 8:3be628a8ec52

added DownloadSymbolFilesController
author Evgeniy.Koshkin
date Thu, 25 Jul 2013 14:27:48 +0400
parents 74f725356087
children bf930a206bff
files server/src/META-INF/build-server-plugin-symbol-server.xml server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java server/src/jetbrains/buildServer/symbols/DownloadSymbolFilesController.java
diffstat 3 files changed, 113 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 
   <bean class="jetbrains.buildServer.symbols.IndexSymbolsBuildFeature"/>
   <bean class="jetbrains.buildServer.symbols.BuildSymbolsIndexProvider"/>
+  <bean class="jetbrains.buildServer.symbols.DownloadSymbolFilesController"/>
 
 </beans>
--- 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<String, String> data = new HashMap<String, String>();
-        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);
       }
     }
--- /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<BuildMetadataEntry> entryIterator = myBuildMetadataStorage.getEntriesByKey(BuildSymbolsIndexProvider.PROVIDER_ID, guid);
+    if(!entryIterator.hasNext()){
+      //TODO
+      return null;
+    }
+    final BuildMetadataEntry entry = entryIterator.next();
+    final Map<String,String> 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