View Javadoc

1   /*
2    * Copyright (c) 2003 by Atlassian Software Systems Pty. Ltd.
3    * All rights reserved.
4    */
5   package com.atlassian.bonnie.search.extractor;
6   
7   import org.dom4j.io.SAXReader;
8   import org.dom4j.*;
9   import org.apache.log4j.Category;
10  
11  import java.io.InputStream;
12  import java.util.*;
13  
14  import com.atlassian.bonnie.LuceneException;
15  
16  final class XmlClassConfigurations
17  {
18      public static final Category log = Category.getInstance(XmlClassConfigurations.class);
19      //~ Static variables/initializers ----------------------------------------------------------------------------------
20  
21      private static Map classConfigurations = new HashMap();
22      private static List unconfiguredClasses = new ArrayList();
23  
24      //~ Methods --------------------------------------------------------------------------------------------------------
25  
26      private static void addClassConfiguration(Class clazz, ClassConfiguration classConfiguration)
27      {
28          classConfigurations.put(clazz.getName(), classConfiguration);
29      }
30  
31      private static ClassConfiguration loadClassConfiguration(Class clazz)
32      {
33          InputStream configXml = loadConfigFile(clazz);
34  
35          if (configXml == null)
36          {
37              unconfiguredClasses.add(clazz);
38              log.debug("Lucene configuration file not found for class: " + clazz.toString());
39              return null;
40          }
41  
42          ClassConfiguration newClassConfig = new ClassConfiguration();
43  
44          try
45          {
46              SAXReader reader = new SAXReader();
47              Document doc = reader.read(configXml);
48              XPath mapXPath = DocumentHelper.createXPath("/configuration/field");
49              List mappings = mapXPath.selectNodes(doc);
50              for (Iterator it = mappings.iterator(); it.hasNext();)
51              {
52                  Element mappingNode = (Element) it.next();
53                  FieldConfiguration mapping = new FieldConfiguration();
54                  mapping.setType(safeStringAttributeGet(mappingNode, "type"));
55                  mapping.setFieldName(safeStringAttributeGet(mappingNode, "fieldName"));
56                  mapping.setAttributeName(safeStringAttributeGet(mappingNode, "attributeName"));
57                  newClassConfig.addFieldConfiguration(mapping);
58              }
59  
60              addClassConfiguration(clazz, newClassConfig);
61  
62              return newClassConfig;
63          }
64           catch (Exception e)
65          {
66              throw new LuceneException("Couldn't load lucene config file successfully, file="+clazz, e);
67          }
68      }
69  
70      private static String safeStringAttributeGet(Element mappingNode, String attributeName)
71      {
72          Attribute attribute = mappingNode.attribute(attributeName);
73          if (attribute != null && attribute.getValue() != null && !"".equals(attribute.getValue()))
74              return attribute.getValue();
75          else
76              return null;
77      }
78  
79      private static InputStream loadConfigFile(Class clazz)
80      {
81          String configFileName = clazz.getName().replace('.', '/')+".lucene.xml";
82          return Thread.currentThread().getContextClassLoader().getResourceAsStream(configFileName);
83      }
84  
85      public static ClassConfiguration getClassConfiguration(Class clazz)
86      {
87          ClassConfiguration classConfig;
88  
89          synchronized (classConfigurations)
90          {
91              classConfig = (ClassConfiguration)classConfigurations.get(clazz.getName());
92  
93              if (classConfig == null && !unconfiguredClasses.contains(clazz))
94                  classConfig = loadClassConfiguration(clazz);
95          }
96  
97          return classConfig;
98      }
99  
100     //~ Classes --------------------------------------------------------------------------------------------------------
101 
102     public static final class ClassConfiguration
103     {
104         private List fieldConfigurations = new ArrayList();
105 
106         public void addFieldConfiguration(FieldConfiguration fieldConfiguration)
107         {
108             fieldConfigurations.add(fieldConfiguration);
109         }
110 
111         public List getFieldConfigurations()
112         {
113             return fieldConfigurations;
114         }
115     }
116 
117     public static final class FieldConfiguration
118     {
119         public static final String TYPE_TEXT = "Text";
120         public static final String TYPE_KEYWORD = "Keyword";
121         public static final String TYPE_UNINDEXED = "UnIndexed";
122         public static final String TYPE_UNSTORED = "UnStored";
123         private String type;
124         private String fieldName;
125         private String attributeName;
126 
127         public String getType()
128         {
129             return type;
130         }
131 
132         public void setType(String type)
133         {
134             this.type = type;
135         }
136 
137         public String getFieldName()
138         {
139             return fieldName;
140         }
141 
142         public void setFieldName(String fieldName)
143         {
144             this.fieldName = fieldName;
145         }
146 
147         public String getAttributeName()
148         {
149             return attributeName;
150         }
151 
152         public void setAttributeName(String attributeName)
153         {
154             this.attributeName = attributeName;
155         }
156     }
157 }