changeset 110:0d0a3c1aa428

fix TW-45209 - calculate resulting artifacts for published pdb's on agent side
author Evgeniy.Koshkin@unit-519.Labs.IntelliJ.Net
date Wed, 18 May 2016 17:34:21 +0300
parents 06f054af8232
children 204681404aa1
files agent/src/META-INF/build-agent-plugin-symbol-server.xml agent/src/jetbrains/buildServer/symbols/ArtifactPathHelper.java agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java common/src/jetbrains/buildServer/symbols/PdbSignatureIndexEntry.java common/src/jetbrains/buildServer/symbols/PdbSignatureIndexUtil.java server-tests/src/jetbrains/buildServer/symbols/DownloadSymbolsControllerTest.java server-tests/src/jetbrains/buildServer/symbols/MetadataStorageMock.java server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java
diffstat 9 files changed, 100 insertions(+), 70 deletions(-) [+]
line wrap: on
line diff
--- a/agent/src/META-INF/build-agent-plugin-symbol-server.xml	Tue May 17 16:51:36 2016 +0300
+++ b/agent/src/META-INF/build-agent-plugin-symbol-server.xml	Wed May 18 17:34:21 2016 +0300
@@ -8,5 +8,6 @@
 
   <bean class="jetbrains.buildServer.symbols.SymbolsIndexer"/>
   <bean class="jetbrains.buildServer.symbols.WinDbgToolsDetector"/>
+  <bean class="jetbrains.buildServer.symbols.ArtifactPathHelper"/>
 
 </beans>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/agent/src/jetbrains/buildServer/symbols/ArtifactPathHelper.java	Wed May 18 17:34:21 2016 +0300
@@ -0,0 +1,36 @@
+package jetbrains.buildServer.symbols;
+
+import jetbrains.buildServer.ExtensionHolder;
+import jetbrains.buildServer.agent.impl.artifacts.ArchivePreprocessor;
+import jetbrains.buildServer.util.CollectionsUtil;
+import jetbrains.buildServer.util.filters.Filter;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Created by Evgeniy.Koshkin.
+ */
+public class ArtifactPathHelper {
+    private static final String ARCHIVE_DELIMITER = "!";
+    private static final String FOLDER_DELIMITER = "/";
+
+    private final ExtensionHolder myExtensions;
+
+    public ArtifactPathHelper(@NotNull final ExtensionHolder extensions) {
+        myExtensions = extensions;
+    }
+
+    @NotNull
+    String concatenateArtifactPath(String fileNamePrefix, String pdbFileName) {
+        final String delimiter = (isPathToArchive(fileNamePrefix) && !fileNamePrefix.contains(ARCHIVE_DELIMITER)) ? ARCHIVE_DELIMITER : FOLDER_DELIMITER;
+        return fileNamePrefix + delimiter + pdbFileName;
+    }
+
+    private boolean isPathToArchive(@NotNull final String path){
+        return CollectionsUtil.contains(myExtensions.getExtensions(ArchivePreprocessor.class), new Filter<ArchivePreprocessor>() {
+            @Override
+            public boolean accept(@NotNull ArchivePreprocessor data) {
+                return data.shouldProcess(path);
+            }
+        });
+    }
+}
--- a/agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java	Tue May 17 16:51:36 2016 +0300
+++ b/agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java	Wed May 18 17:34:21 2016 +0300
@@ -32,6 +32,8 @@
   private static final String X86_SRCSRV = "\\x86\\srcsrv";
 
   @NotNull private final ArtifactsWatcher myArtifactsWatcher;
+  @NotNull private final ArtifactPathHelper myArtifactPathHelper;
+
   @NotNull private final JetSymbolsExe myJetSymbolsExe;
   @NotNull private final Map<File, String> myFileToArtifactMapToProcess = new ConcurrentHashMap<File, String>();
 
@@ -40,9 +42,13 @@
   @Nullable private File mySrcSrvHomeDir;
   @Nullable private FileUrlProvider myFileUrlProvider;
 
-  public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) {
+  public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor,
+                        @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher,
+                        @NotNull final ArtifactsWatcher artifactsWatcher,
+                        @NotNull final ArtifactPathHelper artifactPathHelper) {
     myArtifactsWatcher = artifactsWatcher;
     myJetSymbolsExe = new JetSymbolsExe(new File(pluginDescriptor.getPluginRoot(), "bin"));
+    myArtifactPathHelper = artifactPathHelper;
 
     agentDispatcher.addListener(new AgentLifeCycleAdapter() {
       @Override
@@ -86,7 +92,7 @@
               for(PdbSignatureIndexEntry signatureIndexEntry : signatureLocalFilesData){
                 final File targetPdbFile = new File(signatureIndexEntry.getArtifactPath());
                 if(myFileToArtifactMapToProcess.containsKey(targetPdbFile)) {
-                  indexData.add(new PdbSignatureIndexEntry(signatureIndexEntry.getGuid(), myFileToArtifactMapToProcess.get(targetPdbFile)));
+                  indexData.add(new PdbSignatureIndexEntry(signatureIndexEntry.getGuid(), myFileToArtifactMapToProcess.get(targetPdbFile), targetPdbFile.getName()));
                 }
               }
               final File indexDataFile = FileUtil.createTempFile(myBuildTempDirectory, SymbolsConstants.SYMBOL_SIGNATURES_FILE_NAME_PREFIX, ".xml", false);
@@ -126,7 +132,7 @@
       try {
         myProgressLogger.message("Indexing sources appeared in file " + pdbFile.getAbsolutePath());
         pdbFilePatcher.patch(pdbFile, myProgressLogger);
-        myFileToArtifactMapToProcess.put(pdbFile, pdbFiles.get(pdbFile));
+        myFileToArtifactMapToProcess.put(pdbFile, myArtifactPathHelper.concatenateArtifactPath(pdbFiles.get(pdbFile), pdbFile.getName()));
       } catch (Throwable e) {
         LOG.error("Error occurred while patching symbols file " + pdbFile, e);
         myProgressLogger.error("Error occurred while patching symbols file " + pdbFile);
--- a/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexEntry.java	Tue May 17 16:51:36 2016 +0300
+++ b/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexEntry.java	Wed May 18 17:34:21 2016 +0300
@@ -1,17 +1,20 @@
 package jetbrains.buildServer.symbols;
 
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Created by Evgeniy.Koshkin.
  */
 public class PdbSignatureIndexEntry {
     private final String myGuid;
+    private final String myFileName;
     private final String myArtifactPath;
 
-    public PdbSignatureIndexEntry(@NotNull String guid, @NotNull String artifactPath) {
+    public PdbSignatureIndexEntry(@NotNull String guid, @NotNull String filePath, @Nullable String fileName) {
         myGuid = guid;
-        myArtifactPath = artifactPath;
+        myArtifactPath = filePath;
+        myFileName = fileName;
     }
 
     @NotNull
@@ -23,4 +26,9 @@
     public String getArtifactPath() {
         return myArtifactPath;
     }
+
+    @Nullable
+    public String getFileName() {
+        return myFileName;
+    }
 }
--- a/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexUtil.java	Tue May 17 16:51:36 2016 +0300
+++ b/common/src/jetbrains/buildServer/symbols/PdbSignatureIndexUtil.java	Wed May 18 17:34:21 2016 +0300
@@ -16,35 +16,40 @@
  * Created by Evgeniy.Koshkin.
  */
 class PdbSignatureIndexUtil {
-    private static final String SIGN = "sign";
-    private static final String FILE = "file";
-    private static final String FILE_SIGNS = "file-signs";
-    private static final String FILE_SIGN_ENTRY = "file-sign-entry";
+  private static final String SIGN = "sign";
+  private static final String FILE = "file";
+  private static final String FILE_NAME = "file-path";
+  private static final String FILE_SIGNS = "file-signs";
+  private static final String FILE_SIGN_ENTRY = "file-sign-entry";
 
-    @NotNull
-    static Set<PdbSignatureIndexEntry> read(@NotNull final InputStream inputStream) throws JDOMException, IOException {
-        final SAXBuilder builder = new SAXBuilder();
-        final Document document = builder.build(inputStream);
-        final Set<PdbSignatureIndexEntry> result = new HashSet<PdbSignatureIndexEntry>();
-        for (Object signElementObject : document.getRootElement().getChildren()){
-            final Element signElement = (Element) signElementObject;
-            result.add(new PdbSignatureIndexEntry(extractGuid(signElement.getAttributeValue(SIGN)), signElement.getAttributeValue(FILE)));
-        }
-        return result;
+  @NotNull
+  static Set<PdbSignatureIndexEntry> read(@NotNull final InputStream inputStream) throws JDOMException, IOException {
+    final SAXBuilder builder = new SAXBuilder();
+    final Document document = builder.build(inputStream);
+    final Set<PdbSignatureIndexEntry> result = new HashSet<PdbSignatureIndexEntry>();
+    for (Object signElementObject : document.getRootElement().getChildren()){
+      final Element signElement = (Element) signElementObject;
+      result.add(new PdbSignatureIndexEntry(extractGuid(signElement.getAttributeValue(SIGN)), signElement.getAttributeValue(FILE), signElement.getAttributeValue(FILE_NAME)));
     }
+    return result;
+  }
 
-    static void write(@NotNull final OutputStream outputStream, @NotNull final Set<PdbSignatureIndexEntry> indexData) throws IOException {
-        final Element root = new Element(FILE_SIGNS);
-        for (final PdbSignatureIndexEntry indexEntry : indexData){
-            final Element entry = new Element(FILE_SIGN_ENTRY);
-            entry.setAttribute(SIGN, indexEntry.getGuid());
-            entry.setAttribute(FILE, indexEntry.getArtifactPath());
-            root.addContent(root);
-        }
-        XmlUtil.saveDocument(new Document(root), outputStream);
+  static void write(@NotNull final OutputStream outputStream, @NotNull final Set<PdbSignatureIndexEntry> indexData) throws IOException {
+    final Element root = new Element(FILE_SIGNS);
+    for (final PdbSignatureIndexEntry indexEntry : indexData){
+      final Element entry = new Element(FILE_SIGN_ENTRY);
+      entry.setAttribute(SIGN, indexEntry.getGuid());
+      entry.setAttribute(FILE, indexEntry.getArtifactPath());
+      String fileName = indexEntry.getFileName();
+      if(fileName != null){
+        entry.setAttribute(FILE_NAME, fileName);
+      }
+      root.addContent(entry);
     }
+    XmlUtil.saveDocument(new Document(root), outputStream);
+  }
 
-    private static String extractGuid(String sign) {
-        return sign.substring(0, sign.length() - 1).toLowerCase(); //last symbol is PEDebugType
-    }
+  private static String extractGuid(String sign) {
+    return sign.substring(0, sign.length() - 1).toLowerCase(); //last symbol is PEDebugType
+  }
 }
--- a/server-tests/src/jetbrains/buildServer/symbols/DownloadSymbolsControllerTest.java	Tue May 17 16:51:36 2016 +0300
+++ b/server-tests/src/jetbrains/buildServer/symbols/DownloadSymbolsControllerTest.java	Wed May 18 17:34:21 2016 +0300
@@ -119,8 +119,9 @@
     final String fileSignature = "8EF4E863187C45E78F4632152CC82FEB";
     final String guid = "8EF4E863187C45E78F4632152CC82FE";
     final String fileName = "secur32.pdb";
+    final String filePath = "foo/secur32.pdb";
 
-    myBuildMetadataStorage.addEntry(build.getBuildId(), fileName, guid.toLowerCase());
+    myBuildMetadataStorage.addEntry(build.getBuildId(), filePath, guid.toLowerCase());
     myRequest.setRequestURI("mock", String.format("/app/symbols/%s/%s/%s", fileName, fileSignature, fileName));
 
     doGet();
--- a/server-tests/src/jetbrains/buildServer/symbols/MetadataStorageMock.java	Tue May 17 16:51:36 2016 +0300
+++ b/server-tests/src/jetbrains/buildServer/symbols/MetadataStorageMock.java	Wed May 18 17:34:21 2016 +0300
@@ -13,7 +13,7 @@
 
   private List<BuildMetadataEntry> myEntries = new ArrayList<BuildMetadataEntry>();
 
-  public void addEntry(final long buildId, final String fileName, final String fileSignature) {
+  public void addEntry(final long buildId, final String filePath, final String fileSignature) {
     myEntries.add(new BuildMetadataEntry() {
       public long getBuildId() {
         return buildId;
@@ -27,8 +27,7 @@
       @NotNull
       public Map<String, String> getMetadata() {
         HashMap<String, String> map = new HashMap<String, String>();
-        map.put(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY, "foo");
-        map.put(BuildSymbolsIndexProvider.FILE_NAME_KEY, fileName);
+        map.put(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY, filePath);
         return map;
       }
     });
--- a/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java	Tue May 17 16:51:36 2016 +0300
+++ b/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java	Wed May 18 17:34:21 2016 +0300
@@ -2,7 +2,6 @@
 
 import jetbrains.buildServer.serverSide.SBuild;
 import jetbrains.buildServer.serverSide.artifacts.BuildArtifact;
-import jetbrains.buildServer.serverSide.artifacts.BuildArtifacts;
 import jetbrains.buildServer.serverSide.artifacts.BuildArtifactsViewMode;
 import jetbrains.buildServer.serverSide.metadata.BuildMetadataProvider;
 import jetbrains.buildServer.serverSide.metadata.MetadataStorageWriter;
@@ -11,13 +10,11 @@
 import org.apache.log4j.Logger;
 import org.jdom.JDOMException;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * @author Evgeniy.Koshkin
@@ -62,37 +59,13 @@
 
     for (final PdbSignatureIndexEntry indexEntry : indexEntries) {
       final String signature = indexEntry.getGuid();
-      final String artifactPathOrName = indexEntry.getArtifactPath();
-      final String artifactPath = locateArtifact(sBuild, artifactPathOrName);
-      if (artifactPath == null) {
-        LOG.debug(String.format("Failed to find artifact by name %s and build id %d.", artifactPathOrName, buildId));
-        continue;
-      }
+      final String fileName = indexEntry.getFileName();
+      final String artifactPath = indexEntry.getArtifactPath();
       final HashMap<String, String> data = new HashMap<String, String>();
+      data.put(FILE_NAME_KEY, fileName);
       data.put(ARTIFACT_PATH_KEY, artifactPath);
-      data.put(FILE_NAME_KEY, artifactPathOrName);
       metadataStorageWriter.addParameters(signature, data);
-      LOG.debug("Stored symbol file signature " + signature + " for file name " + artifactPathOrName + " build id " + buildId);
+      LOG.debug("Stored symbol file signature " + signature + " for file name " + fileName + " build id " + buildId);
     }
   }
-
-  @Nullable
-  private String locateArtifact(@NotNull SBuild build, final @NotNull String artifactPathOrName) {
-    final BuildArtifacts artifacts = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT);
-    final BuildArtifact artifact = artifacts.getArtifact(artifactPathOrName);
-    if(artifact != null) return artifactPathOrName;
-
-    final AtomicReference<String> locatedArtifactPath = new AtomicReference<String>(null);
-    artifacts.iterateArtifacts(new BuildArtifacts.BuildArtifactsProcessor() {
-      @NotNull
-      public Continuation processBuildArtifact(@NotNull BuildArtifact artifact) {
-        if(artifact.getName().equals(artifactPathOrName)){
-          locatedArtifactPath.set(artifact.getRelativePath());
-          return Continuation.BREAK;
-        }
-        else return Continuation.CONTINUE;
-      }
-    });
-    return locatedArtifactPath.get();
-  }
 }
--- a/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java	Tue May 17 16:51:36 2016 +0300
+++ b/server/src/jetbrains/buildServer/symbols/DownloadSymbolsController.java	Wed May 18 17:34:21 2016 +0300
@@ -139,9 +139,9 @@
       return null;
     }
     final Map<String,String> metadata = entry.getMetadata();
+    final String storedArtifactPath = metadata.get(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY);
     final String storedFileName = metadata.get(BuildSymbolsIndexProvider.FILE_NAME_KEY);
-    final String artifactPath = metadata.get(BuildSymbolsIndexProvider.ARTIFACT_PATH_KEY);
-    if(storedFileName == null || artifactPath == null){
+    if(storedFileName == null || storedArtifactPath == null){
       LOG.debug(String.format("Metadata stored for guid '%s' is invalid.", guid));
       return null;
     }
@@ -149,15 +149,16 @@
       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);
+    final BuildArtifact buildArtifact = build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).getArtifact(storedArtifactPath);
     if(buildArtifact == null){
-      LOG.debug(String.format("Artifact not found by path %s for build with id %d.", artifactPath, buildId));
+      LOG.debug(String.format("Artifact not found by path %s for build with id %d.", storedArtifactPath, buildId));
     }
     return buildArtifact;
   }