1   package com.atlassian.plugins.codegen;
2   
3   import com.atlassian.fugue.Option;
4   
5   import com.google.common.collect.ImmutableList;
6   
7   import static com.atlassian.plugins.codegen.ClassId.fullyQualified;
8   import static com.atlassian.fugue.Option.none;
9   import static com.google.common.base.Preconditions.checkNotNull;
10  
11  /**
12   * Describes a <component-import> element that should be added to the plugin XML file.
13   */
14  public final class ComponentImport implements PluginProjectChange
15  {
16      private final ClassId interfaceClass;
17      private final Option<String> key;
18      private final Option<String> filter;
19      private final ImmutableList<ClassId> alternateInterfaces;
20      
21      public static ComponentImport componentImport(ClassId interfaceClass)
22      {
23          return new ComponentImport(interfaceClass, none(String.class), none(String.class), ImmutableList.<ClassId>of()); 
24      }
25  
26      public static ComponentImport componentImport(String fullyQualifiedInterfaceName)
27      {
28          return new ComponentImport(fullyQualified(fullyQualifiedInterfaceName), none(String.class), none(String.class), ImmutableList.<ClassId>of()); 
29      }
30      
31      private ComponentImport(ClassId interfaceClass, Option<String> key, Option<String> filter, ImmutableList<ClassId> alternateInterfaces)
32      {
33          this.interfaceClass = checkNotNull(interfaceClass, "interfaceClass");
34          this.key = checkNotNull(key, "key");
35          this.filter = checkNotNull(filter, "filter");
36          this.alternateInterfaces = checkNotNull(alternateInterfaces, "alternateInterfaces");
37      }
38      
39      public ComponentImport key(Option<String> key)
40      {
41          return new ComponentImport(this.interfaceClass, key, this.filter, this.alternateInterfaces);
42      }
43  
44      public ComponentImport filter(Option<String> filter)
45      {
46          return new ComponentImport(this.interfaceClass, this.key, filter, this.alternateInterfaces);
47      }
48  
49      public ComponentImport alternateInterfaces(ClassId... interfaceClasses)
50      {
51          return new ComponentImport(this.interfaceClass, this.key, this.filter, ImmutableList.copyOf(interfaceClasses));
52      }
53  
54      public ClassId getInterfaceClass()
55      {
56          return interfaceClass;
57      }
58  
59      public Option<String> getKey()
60      {
61          return key;
62      }
63      
64      public Option<String> getFilter()
65      {
66          return filter;
67      }
68      
69      public Iterable<ClassId> getAlternateInterfaces()
70      {
71          return alternateInterfaces;
72      }
73  
74      @Override
75      public String toString()
76      {
77          return "[component-import: " + interfaceClass + "]";
78      }
79  }