01: /*
02: * Created on May 6, 2006
03: */
04: package uk.org.ponder.rsf.content;
05:
06: import java.util.List;
07: import java.util.Map;
08:
09: import uk.org.ponder.reflect.ReflectiveCache;
10: import uk.org.ponder.rsf.viewstate.ViewParameters;
11: import uk.org.ponder.util.UniversalRuntimeException;
12:
13: /**
14: * Responsible for determining the ContentTypeInfo and RenderSystem in effect
15: * for the current render request. An application-scope bean returning a
16: * request-scope result.
17: *
18: * @author Antranig Basman (antranig@caret.cam.ac.uk)
19: *
20: */
21:
22: public class ContentTypeInfoFactory implements ContentTypeReceiver,
23: ContentTypeReporter, ContentTypeResolver {
24: private List resolvers;
25: private ViewParameters viewparamsproxy;
26: private Map typeinfomap;
27:
28: private Map viewmap;
29:
30: public void setContentTypeResolvers(List resolvers) {
31: this .resolvers = resolvers;
32: }
33:
34: public void setContentTypeInfoMap(Map typeinfomap) {
35: this .typeinfomap = typeinfomap;
36: }
37:
38: public void setViewParameters(ViewParameters viewparamsproxy) {
39: this .viewparamsproxy = viewparamsproxy;
40: }
41:
42: public void setReflectiveCache(ReflectiveCache reflectivecache) {
43: viewmap = reflectivecache.getConcurrentMap(1);
44: }
45:
46: public String resolveContentType(ViewParameters viewparams) {
47: // For redirect or other "exotic" views, viewID may be null.
48: String fromview = viewparams.viewID == null ? null
49: : (String) viewmap.get(viewparams.viewID);
50: if (fromview == null) {
51: for (int i = 0; i < resolvers.size(); ++i) {
52: fromview = ((ContentTypeResolver) resolvers.get(i))
53: .resolveContentType(viewparams);
54: if (fromview != null)
55: return fromview;
56: }
57: }
58: return fromview;
59: }
60:
61: public String getContentType() {
62: ViewParameters viewparams = (ViewParameters) viewparamsproxy
63: .get();
64: return resolveContentType(viewparams);
65: }
66:
67: public ContentTypeInfo getContentTypeInfo() {
68: String contenttype = getContentType();
69: ContentTypeInfo togo = (ContentTypeInfo) typeinfomap
70: .get(contenttype);
71: if (togo == null) {
72: throw UniversalRuntimeException.accumulate(
73: new IllegalArgumentException(),
74: "Content type name " + contenttype
75: + " has no ContentTypeInfo registered");
76: }
77: return togo;
78: }
79:
80: public void setContentType(String viewid, String contenttype) {
81: viewmap.put(viewid, contenttype);
82: }
83: }
|