1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.content2bean.impl;
35
36 import info.magnolia.cms.util.ClasspathResourcesUtil;
37 import info.magnolia.content2bean.TypeDescriptor;
38
39 import java.io.File;
40 import java.io.IOException;
41 import java.io.InputStream;
42 import java.util.Properties;
43
44 import info.magnolia.objectfactory.ClassFactory;
45 import info.magnolia.objectfactory.Classes;
46 import org.apache.commons.io.IOUtils;
47 import org.apache.commons.lang.StringUtils;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51
52
53
54
55
56
57 public class DescriptorFileBasedTypeMapping extends TypeMappingImpl {
58
59 private static Logger log = LoggerFactory.getLogger(DescriptorFileBasedTypeMapping.class);
60
61 public DescriptorFileBasedTypeMapping() {
62 String[] fileNames = ClasspathResourcesUtil.findResources(new ClasspathResourcesUtil.Filter(){
63 public boolean accept(String name) {
64 return name.endsWith(".content2bean");
65 }
66 });
67
68 for (int i = 0; i < fileNames.length; i++) {
69 String fileName = fileNames[i];
70 processFile(fileName);
71 }
72 }
73
74 protected void processFile(String fileName) {
75 Properties props = new Properties();
76 InputStream stream = null;
77 try {
78 stream = ClasspathResourcesUtil.getStream(fileName);
79 props.load(stream);
80
81 }
82 catch (IOException e) {
83 log.error("can't read collection to bean information " + fileName, e);
84 }
85 IOUtils.closeQuietly(stream);
86
87 String className = StringUtils.replaceChars(fileName, File.separatorChar, '.');
88 className = StringUtils.removeStart(className, ".");
89 className = StringUtils.removeEnd(className, ".content2bean");
90 try {
91 Class<?> typeClass = Classes.getClassFactory().forName(className);
92
93 TypeDescriptor typeDescriptor = processProperties(typeClass, props);
94 addTypeDescriptor(typeClass, typeDescriptor);
95 } catch (Exception e) {
96 log.error("can't instantiate type descriptor for " + className, e);
97 }
98 }
99
100 protected TypeDescriptor processProperties(Class<?> className, Properties props) throws Exception {
101 String descriptorClassName = StringUtils.defaultIfEmpty(props.getProperty("descriptorClass"), PropertiesBasedTypeDescriptor.class.getName());
102 final ClassFactory cl = Classes.getClassFactory();
103 Class<? extends TypeDescriptor> descriptorClass = cl.forName(descriptorClassName);
104 return cl.newInstance(descriptorClass, props);
105 }
106 }