changeset 24:9cbdbfed44f4

fixed sources loading - replaced ':' symbols in teamcity rest api url's written to pdb - added controller which forward sources request to the correct reat api controllers
author Evgeniy.Koshkin
date Mon, 05 Aug 2013 20:57:02 +0400
parents 7bd8a756aa78
children f4e0050e2a2f
files agent/src/jetbrains/buildServer/symbols/SrcSrvStreamProvider.java server/src/META-INF/build-server-plugin-symbol-server.xml server/src/jetbrains/buildServer/symbols/DownloadSourcesController.java server/src/jetbrains/buildServer/symbols/DownloadSymbolFilesController.java server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java
diffstat 5 files changed, 195 insertions(+), 125 deletions(-) [+]
line wrap: on
line diff
--- a/agent/src/jetbrains/buildServer/symbols/SrcSrvStreamProvider.java	Mon Aug 05 14:59:48 2013 +0400
+++ b/agent/src/jetbrains/buildServer/symbols/SrcSrvStreamProvider.java	Mon Aug 05 20:57:02 2013 +0400
@@ -26,7 +26,8 @@
  */
 public class SrcSrvStreamProvider {
 
-  private static final String myRestApiUrl = "http://UNIT-519.Labs.IntelliJ.Net:8111/bs/guestAuth/app/rest";
+  private static final String myRestApiUrl = "http://unit-519.labs.intelliJ.net:8111/bs/guestAuth/app/sources";
+
   private long myBuildId;
   private File mySourcesRootDirectory;
 
@@ -39,19 +40,21 @@
     final FileWriter fileWriter = new FileWriter(targetFile.getPath(), true);
 
     try {
-      fileWriter.write("SRCSRV: ini ------------------------------------------------\n");
-      fileWriter.write(String.format("VERSION=%d\n", 2));
-      fileWriter.write("VERCTRL=http\n");
-      fileWriter.write("SRCSRV: variables ------------------------------------------\n");
-      fileWriter.write("SRCSRVVERCTRL=http\n");
-      fileWriter.write("SRCSRVCMD=cmd.exe\n");
-      fileWriter.write("SRCSRVTRG=%http_extract_target%\n");
-      fileWriter.write(String.format("HTTP_EXTRACT_TARGET=%s/builds/id:%d/sources/files", myRestApiUrl, myBuildId) + "/%var2%\n");
-      fileWriter.write("SRCSRV: source files ------------------------------------------\n");
+      fileWriter.write("SRCSRV: ini ------------------------------------------------\r\n");
+      fileWriter.write("VERSION=3\r\n");
+      fileWriter.write("INDEXVERSION=2\r\n");
+      fileWriter.write("VERCTRL=http\r\n");
+      fileWriter.write("SRCSRV: variables ------------------------------------------\r\n");
+      fileWriter.write("SRCSRVVERCTRL=http\r\n");
+      fileWriter.write(String.format("HTTP_ALIAS=%s/builds/id-%d/sources/files\r\n", myRestApiUrl, myBuildId));
+      fileWriter.write("HTTP_EXTRACT_TARGET=%HTTP_ALIAS%/%var2%\r\n");
+      fileWriter.write("SRCSRVTRG=%HTTP_EXTRACT_TARGET%\r\n");
+      fileWriter.write("SRCSRVCMD=\r\n");
+      fileWriter.write("SRCSRV: source files ------------------------------------------\r\n");
       String sourcesRootDirectoryPath = mySourcesRootDirectory.getCanonicalPath();
       for(File sourceFile : sourceFiles){
         final String sourceFileCanonical = sourceFile.getCanonicalPath();
-        fileWriter.write(String.format("%s*%s\n", sourceFileCanonical, sourceFileCanonical.substring(sourcesRootDirectoryPath.length() + 1).replace(File.separator, "/")));
+        fileWriter.write(String.format("%s*%s\r\n", sourceFileCanonical, sourceFileCanonical.substring(sourcesRootDirectoryPath.length() + 1).replace(File.separator, "/")));
       }
       fileWriter.write("SRCSRV: end ------------------------------------------------");
     }
--- a/server/src/META-INF/build-server-plugin-symbol-server.xml	Mon Aug 05 14:59:48 2013 +0400
+++ b/server/src/META-INF/build-server-plugin-symbol-server.xml	Mon Aug 05 20:57:02 2013 +0400
@@ -8,6 +8,7 @@
 
   <bean class="jetbrains.buildServer.symbols.IndexSymbolsBuildFeature"/>
   <bean class="jetbrains.buildServer.symbols.BuildSymbolsIndexProvider"/>
-  <bean class="jetbrains.buildServer.symbols.DownloadSymbolFilesController"/>
+  <bean class="jetbrains.buildServer.symbols.DownloadSymbolsController"/>
+  <bean class="jetbrains.buildServer.symbols.DownloadSourcesController"/>
 
 </beans>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/jetbrains/buildServer/symbols/DownloadSourcesController.java	Mon Aug 05 20:57:02 2013 +0400
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package jetbrains.buildServer.symbols;
+
+import jetbrains.buildServer.controllers.BaseController;
+import jetbrains.buildServer.serverSide.SBuildServer;
+import jetbrains.buildServer.web.openapi.WebControllerManager;
+import jetbrains.buildServer.web.util.WebUtil;
+import org.apache.log4j.Logger;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author Evgeniy.Koshkin
+ */
+public class DownloadSourcesController extends BaseController {
+  private static final String APP_SOURCES = "/app/sources/";
+  private static final String VALID_URL_PATTERN = ".*/builds/id-\\d*/sources/.*";
+
+  private static final Logger LOG = Logger.getLogger(DownloadSourcesController.class);
+
+  public DownloadSourcesController(@NotNull SBuildServer server, @NotNull WebControllerManager controllerManager) {
+    super(server);
+    controllerManager.registerController(APP_SOURCES + "**", this);
+  }
+
+  @Nullable
+  @Override
+  protected ModelAndView doHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) throws Exception {
+    final String requestURI = request.getRequestURI();
+    if(!requestURI.matches(VALID_URL_PATTERN)){
+      WebUtil.notFound(request, response, "Url is invalid", null);
+      return null;
+    }
+    String restMethodUrl = requestURI.replace("/builds/id-", "/builds/id:").replace("/app/sources/", "/app/rest/");
+    final String contextPath = request.getContextPath();
+    if(restMethodUrl.startsWith(contextPath)){
+      restMethodUrl = restMethodUrl.substring(contextPath.length());
+    }
+    RequestDispatcher dispatcher = request.getRequestDispatcher(restMethodUrl);
+    if (dispatcher != null) {
+      LOG.debug(String.format("Forwarding request. From %s To %s", requestURI, restMethodUrl));
+      dispatcher.forward(request, response);
+    }
+    return null;
+  }
+}
--- a/server/src/jetbrains/buildServer/symbols/DownloadSymbolFilesController.java	Mon Aug 05 14:59:48 2013 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-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.util.FileUtil;
-import jetbrains.buildServer.web.openapi.WebControllerManager;
-import jetbrains.buildServer.web.util.WebUtil;
-import org.apache.log4j.Logger;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.springframework.web.servlet.ModelAndView;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.BufferedOutputStream;
-import java.io.InputStream;
-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)){
-      WebUtil.notFound(request, response, "File not found", null);
-      return null;
-    }
-    if(requestURI.endsWith(FILE_POINTER_FILE_EXTENSION)){
-      WebUtil.notFound(request, response, "File not found", null);
-      return null;
-    }
-
-    final String valuableUriPart = requestURI.substring(requestURI.indexOf(APP_SYMBOLS) + APP_SYMBOLS.length());
-    final int firstDelimiterPosition = valuableUriPart.indexOf('/');
-    final String fileName = valuableUriPart.substring(0, firstDelimiterPosition);
-    final String signature = valuableUriPart.substring(firstDelimiterPosition + 1, valuableUriPart.indexOf('/', firstDelimiterPosition + 1));
-    final String guid = signature.substring(0, signature.length() - 1); //last symbol is PEDebugType
-    LOG.debug(String.format("Symbol file requested. File name: %s. Guid: %s.", fileName, guid));
-
-    final BuildArtifact buildArtifact = findArtifact(guid, fileName);
-    if(buildArtifact == null){
-      WebUtil.notFound(request, response, "Symbol file not found", null);
-      LOG.debug(String.format("Symbol file not found. File name: %s. Guid: %s.", fileName, guid));
-      return null;
-    }
-
-    BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());
-    try {
-      InputStream input = buildArtifact.getInputStream();
-      try {
-        FileUtil.copyStreams(input, output);
-      } finally {
-        FileUtil.close(input);
-      }
-    } finally {
-      FileUtil.close(output);
-    }
-
-    return null;
-  }
-
-  private BuildArtifact findArtifact(String guid, String fileName) {
-    final Iterator<BuildMetadataEntry> entryIterator = myBuildMetadataStorage.getEntriesByKey(BuildSymbolsIndexProvider.PROVIDER_ID, guid);
-    if(!entryIterator.hasNext()){
-      LOG.debug(String.format("No items found in symbol index for guid '%s'", guid));
-      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)){
-      LOG.debug(String.format("File name '%s' stored for guid '%s' differs from requested '%s'.", storedFileName, guid, fileName));
-      return null;
-    }
-    final long buildId = entry.getBuildId();
-    final SBuild build = myServer.findBuildInstanceById(buildId);
-    if(build == null){
-      LOG.debug(String.format("Build not found by id %d.", buildId));
-      return null;
-    }
-    final BuildArtifact buildArtifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).getArtifact(artifactPath);
-    if(buildArtifact == null){
-      LOG.debug(String.format("Artifact not found by path %s for build with id %d.", artifactPath, buildId));
-    }
-    return buildArtifact;
-  }
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java	Mon Aug 05 20:57:02 2013 +0400
@@ -0,0 +1,113 @@
+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.util.FileUtil;
+import jetbrains.buildServer.web.openapi.WebControllerManager;
+import jetbrains.buildServer.web.util.WebUtil;
+import org.apache.log4j.Logger;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
+import java.io.InputStream;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * @author Evgeniy.Koshkin
+ */
+public class DownloadSymbolsController 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(DownloadSymbolsController.class);
+
+  @NotNull private final MetadataStorage myBuildMetadataStorage;
+
+  public DownloadSymbolsController(@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)){
+      WebUtil.notFound(request, response, "File not found", null);
+      return null;
+    }
+    if(requestURI.endsWith(FILE_POINTER_FILE_EXTENSION)){
+      WebUtil.notFound(request, response, "File not found", null);
+      return null;
+    }
+
+    final String valuableUriPart = requestURI.substring(requestURI.indexOf(APP_SYMBOLS) + APP_SYMBOLS.length());
+    final int firstDelimiterPosition = valuableUriPart.indexOf('/');
+    final String fileName = valuableUriPart.substring(0, firstDelimiterPosition);
+    final String signature = valuableUriPart.substring(firstDelimiterPosition + 1, valuableUriPart.indexOf('/', firstDelimiterPosition + 1));
+    final String guid = signature.substring(0, signature.length() - 1); //last symbol is PEDebugType
+    LOG.debug(String.format("Symbol file requested. File name: %s. Guid: %s.", fileName, guid));
+
+    final BuildArtifact buildArtifact = findArtifact(guid, fileName);
+    if(buildArtifact == null){
+      WebUtil.notFound(request, response, "Symbol file not found", null);
+      LOG.debug(String.format("Symbol file not found. File name: %s. Guid: %s.", fileName, guid));
+      return null;
+    }
+
+    BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());
+    try {
+      InputStream input = buildArtifact.getInputStream();
+      try {
+        FileUtil.copyStreams(input, output);
+      } finally {
+        FileUtil.close(input);
+      }
+    } finally {
+      FileUtil.close(output);
+    }
+
+    return null;
+  }
+
+  private BuildArtifact findArtifact(String guid, String fileName) {
+    final Iterator<BuildMetadataEntry> entryIterator = myBuildMetadataStorage.getEntriesByKey(BuildSymbolsIndexProvider.PROVIDER_ID, guid);
+    if(!entryIterator.hasNext()){
+      LOG.debug(String.format("No items found in symbol index for guid '%s'", guid));
+      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)){
+      LOG.debug(String.format("File name '%s' stored for guid '%s' differs from requested '%s'.", storedFileName, guid, fileName));
+      return null;
+    }
+    final long buildId = entry.getBuildId();
+    final SBuild build = myServer.findBuildInstanceById(buildId);
+    if(build == null){
+      LOG.debug(String.format("Build not found by id %d.", buildId));
+      return null;
+    }
+    final BuildArtifact buildArtifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).getArtifact(artifactPath);
+    if(buildArtifact == null){
+      LOG.debug(String.format("Artifact not found by path %s for build with id %d.", artifactPath, buildId));
+    }
+    return buildArtifact;
+  }
+}
\ No newline at end of file