1:
31:
32: package ;
33:
34: import ;
35: import ;
36:
37: import ;
38: import ;
39: import ;
40: import ;
41: import ;
42: import ;
43: import ;
44: import ;
45:
46:
52: public class DefaultLayoutControllerFactory implements LayoutControllerFactory
53: {
54: private HashMap registry;
55: private static final String PREFIX = "org.jfree.report.flow.structure.";
56:
57: public DefaultLayoutControllerFactory()
58: {
59: registry = new HashMap();
60:
61: }
62:
63: public void initialize (final ReportJob job)
64: {
65: final Configuration configuration = job.getConfiguration();
66:
67: final Iterator propertyKeys =
68: configuration.findPropertyKeys(DefaultLayoutControllerFactory.PREFIX);
69: while (propertyKeys.hasNext())
70: {
71: final String key = (String) propertyKeys.next();
72: final String nodeClassName = key.substring
73: (DefaultLayoutControllerFactory.PREFIX.length());
74: final String procClassName = configuration.getConfigProperty(key);
75:
76: final Class nodeClass = load(nodeClassName);
77: final Object processor = ObjectUtilities.loadAndInstantiate
78: (procClassName, DefaultLayoutControllerFactory.class, LayoutController.class);
79: if (nodeClass == null || processor == null)
80: {
81:
82: continue;
83: }
84:
85: registry.put(nodeClassName, procClassName);
86: }
87: }
88:
89: private Class load (final String className)
90: {
91: if (className == null)
92: {
93: return null;
94: }
95:
96: final ClassLoader classLoader = ObjectUtilities.getClassLoader
97: (DefaultLayoutControllerFactory.class);
98: try
99: {
100: return classLoader.loadClass(className);
101: }
102: catch (ClassNotFoundException e)
103: {
104: return null;
105: }
106: }
107:
108: public LayoutController create(final FlowController controller,
109: final Object node,
110: final LayoutController parent)
111: throws ReportProcessingException, ReportDataFactoryException, DataSourceException
112: {
113: Class nodeClass = node.getClass();
114: while (Node.class.isAssignableFrom(nodeClass))
115: {
116: final String targetClass = (String) registry.get(nodeClass.getName());
117: if (targetClass != null)
118: {
119: final LayoutController lc = (LayoutController)
120: ObjectUtilities.loadAndInstantiate (targetClass,
121: DefaultLayoutControllerFactory.class, LayoutController.class);
122: if (lc != null)
123: {
124: lc.initialize(node, controller, parent);
125: return lc;
126: }
127: }
128: nodeClass = nodeClass.getSuperclass();
129: }
130:
131: throw new ReportProcessingException("No processor for node " + node);
132: }
133: }