Mercurial > hg > tc-symbol-server
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