changeset 6:b05ccf999e54

implemented symbols index data storage on server
author Evgeniy.Koshkin
date Wed, 24 Jul 2013 21:06:19 +0400
parents f7602ee7e8b1
children 74f725356087
files server/server.iml server/src/META-INF/build-server-plugin-symbol-server.xml server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java
diffstat 3 files changed, 97 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/server/server.iml	Wed Jul 24 19:16:16 2013 +0400
+++ b/server/server.iml	Wed Jul 24 21:06:19 2013 +0400
@@ -45,6 +45,7 @@
     <orderEntry type="library" name="Servlet Api" level="project" />
     <orderEntry type="library" name="spring" level="project" />
     <orderEntry type="module" module-name="common" />
+    <orderEntry type="library" name="TeamCity server runtime" level="project" />
   </component>
 </module>
 
--- a/server/src/META-INF/build-server-plugin-symbol-server.xml	Wed Jul 24 19:16:16 2013 +0400
+++ b/server/src/META-INF/build-server-plugin-symbol-server.xml	Wed Jul 24 21:06:19 2013 +0400
@@ -7,5 +7,6 @@
         >
 
   <bean class="jetbrains.buildServer.symbols.IndexSymbolsBuildFeature"/>
+  <bean class="jetbrains.buildServer.symbols.BuildSymbolsIndexProvider"/>
 
 </beans>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/jetbrains/buildServer/symbols/BuildSymbolsIndexProvider.java	Wed Jul 24 21:06:19 2013 +0400
@@ -0,0 +1,95 @@
+package jetbrains.buildServer.symbols;
+
+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;
+import org.apache.log4j.Logger;
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @author Evgeniy.Koshkin
+ */
+public class BuildSymbolsIndexProvider implements BuildMetadataProvider {
+
+  private static final Logger LOG = Logger.getLogger(BuildSymbolsIndexProvider.class);
+  private static final String ID = "symbols-index-provider";
+
+  @NotNull
+  public String getProviderId() {
+    return ID;
+  }
+
+  public void generateMedatadata(@NotNull SBuild sBuild, @NotNull MetadataStorageWriter metadataStorageWriter) {
+    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.");
+      return;
+    }
+    for(BuildArtifact childArtifact : symbols.getChildren()){
+      if (!childArtifact.getName().startsWith("symbol-signatures")) continue;
+      Map<String, String> indexData = Collections.emptyMap();
+      try {
+        indexData = readIndex(childArtifact.getInputStream());
+      } catch (IOException e) {
+        LOG.debug("Failed to read symbols index data from artifact " + childArtifact.getRelativePath(), e);
+      }
+      for (String sign : indexData.keySet()){
+        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));
+          continue;
+        }
+        final HashMap<String, String> data = new HashMap<String, String>();
+        data.put("file-name", fileName);
+        data.put("artifact-path", artifactPath);
+        metadataStorageWriter.addParameters(sign, data);
+      }
+    }
+  }
+
+  private Map<String, String> readIndex(InputStream inputStream) throws IOException {
+    SAXBuilder builder = new SAXBuilder();
+    try {
+      Document document = builder.build(inputStream);
+      Map<String, String> result = new HashMap<String, String>();
+      for (Object signElementObject : document.getRootElement().getChildren()){
+        final Element signElement = (Element) signElementObject;
+        result.put(signElement.getAttributeValue("sign"), signElement.getAttributeValue("file"));
+      }
+      return result;
+    } catch (JDOMException e) {
+      LOG.debug(e);
+      return null;
+    }
+  }
+
+  private String locateArtifact(SBuild build, final String fileName) {
+    final AtomicReference<String> locatedArtifactPath = new AtomicReference<String>(null);
+    build.getArtifacts(BuildArtifactsViewMode.VIEW_DEFAULT_WITH_ARCHIVES_CONTENT).iterateArtifacts(new BuildArtifacts.BuildArtifactsProcessor() {
+      @NotNull
+      public Continuation processBuildArtifact(@NotNull BuildArtifact artifact) {
+        if(artifact.getName().equals(fileName)){
+          locatedArtifactPath.set(artifact.getRelativePath());
+          return Continuation.BREAK;
+        }
+        else return Continuation.CONTINUE;
+      }
+    });
+    return locatedArtifactPath.get();
+  }
+}