1   package com.atlassian.plugin.osgi.factory.transform.stage;
2   
3   import com.atlassian.plugin.osgi.factory.transform.PluginTransformationException;
4   import com.atlassian.plugin.osgi.factory.transform.TransformContext;
5   import com.atlassian.plugin.osgi.factory.transform.TransformStage;
6   import com.atlassian.plugin.osgi.factory.transform.model.ComponentImport;
7   import com.atlassian.plugin.util.PluginUtils;
8   import org.dom4j.Document;
9   import org.dom4j.Element;
10  
11  /**
12   * Transforms component imports into a Spring XML file
13   *
14   * @since 2.2.0
15   */
16  public class ComponentImportSpringStage implements TransformStage
17  {
18      /** Path of generated Spring XML file */
19      private static final String SPRING_XML = "META-INF/spring/atlassian-plugins-component-imports.xml";
20  
21      public void execute(TransformContext context) throws PluginTransformationException
22      {
23          if (SpringHelper.shouldGenerateFile(context, SPRING_XML))
24          {
25              Document springDoc = SpringHelper.createSpringDocument();
26              Element root = springDoc.getRootElement();
27  
28              for (ComponentImport comp: context.getComponentImports().values())
29              {
30                  if (!PluginUtils.doesModuleElementApplyToApplication(comp.getSource(), context.getApplicationKeys()))
31                  {
32                      continue;
33                  }
34                  Element osgiReference = root.addElement("osgi:reference");
35                  osgiReference.addAttribute("id", comp.getKey());
36  
37                  if (comp.getFilter() != null)
38                  {
39                      osgiReference.addAttribute("filter", comp.getFilter());
40                  }
41  
42                  Element interfaces = osgiReference.addElement("osgi:interfaces");
43                  for (String infName : comp.getInterfaces())
44                  {
45                      context.getExtraImports().add(infName.substring(0, infName.lastIndexOf('.')));
46                      Element e = interfaces.addElement("beans:value");
47                      e.setText(infName);
48                  }
49              }
50              if (root.elements().size() > 0)
51              {
52                  context.setShouldRequireSpring(true);
53                  context.getFileOverrides().put(SPRING_XML, SpringHelper.documentToBytes(springDoc));
54              }
55          }
56      }
57  }