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