1
2
3
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
20
21 private static Map classConfigurations = new HashMap();
22 private static List unconfiguredClasses = new ArrayList();
23
24
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
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 }