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.pages.app.field;
35
36 import info.magnolia.cms.i18n.Messages;
37 import info.magnolia.cms.i18n.MessagesManager;
38 import info.magnolia.jcr.util.NodeTypes;
39 import info.magnolia.objectfactory.Components;
40 import info.magnolia.rendering.template.TemplateDefinition;
41 import info.magnolia.rendering.template.assignment.TemplateDefinitionAssignment;
42 import info.magnolia.ui.form.field.definition.SelectFieldOptionDefinition;
43 import info.magnolia.ui.form.field.factory.SelectFieldFactory;
44 import info.magnolia.ui.vaadin.integration.jcr.JcrNewNodeAdapter;
45 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
46
47 import java.util.ArrayList;
48 import java.util.Collection;
49 import java.util.Collections;
50 import java.util.List;
51
52 import javax.inject.Inject;
53 import javax.jcr.Node;
54 import javax.jcr.RepositoryException;
55
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59 import com.vaadin.data.Item;
60
61
62
63
64
65
66 public class TemplateSelectorFieldFactory extends SelectFieldFactory<TemplateSelectorDefinition> {
67
68 private static final Logger log = LoggerFactory.getLogger(TemplateSelectorFieldFactory.class);
69 private TemplateDefinitionAssignment templateAssignment;
70
71
72
73
74 @Deprecated
75 public TemplateSelectorFieldFactory(TemplateSelectorDefinition definition, Item relatedFieldItem) {
76 this(definition, relatedFieldItem, Components.getComponent(TemplateDefinitionAssignment.class));
77 }
78
79 @Inject
80 public TemplateSelectorFieldFactory(TemplateSelectorDefinition definition, Item relatedFieldItem, TemplateDefinitionAssignment templateDefinitionAssignment) {
81 super(definition, relatedFieldItem);
82 this.templateAssignment = templateDefinitionAssignment;
83 }
84
85
86
87
88 @Override
89 public List<SelectFieldOptionDefinition> getSelectFieldOptionDefinition() {
90 List<SelectFieldOptionDefinition> res = new ArrayList<SelectFieldOptionDefinition>();
91
92 if (item instanceof JcrNodeAdapter) {
93 Node associatedNode = ((JcrNodeAdapter) item).getJcrItem();
94
95 Collection<TemplateDefinition> templates = Collections.EMPTY_SET;
96
97 if (item instanceof JcrNewNodeAdapter) {
98
99
100 try {
101 Node tempNode = associatedNode.addNode("temp", NodeTypes.Page.NAME);
102 templates = templateAssignment.getAvailableTemplates(tempNode);
103 associatedNode.getSession().removeItem(tempNode.getPath());
104 } catch (RepositoryException e) {
105 log.error("Could not create temporary node to get available templates.", e);
106 }
107 }
108
109 else {
110 templates = templateAssignment.getAvailableTemplates(associatedNode);
111 }
112
113 for (TemplateDefinition templateDefinition : templates) {
114 SelectFieldOptionDefinition option = new SelectFieldOptionDefinition();
115 option.setValue(templateDefinition.getId());
116 option.setLabel(getI18nTitle(templateDefinition));
117 res.add(option);
118 }
119 }
120 return res;
121 }
122
123 @Override
124 protected Class<?> getDefaultFieldType() {
125 return String.class;
126 }
127
128
129
130
131
132 public static synchronized String getI18nTitle(TemplateDefinition templateDefinition) {
133 Messages messages = MessagesManager.getMessages(templateDefinition.getI18nBasename());
134 return messages.getWithDefault(templateDefinition.getTitle(), templateDefinition.getTitle());
135 }
136 }