source: ComponentRegistry/trunk/ComponentRegistry/src/main/java/clarin/cmdi/componentregistry/frontend/AdminHomePage.java @ 4098

Last change on this file since 4098 was 4098, checked in by George.Georgovassilis@mpi.nl, 10 years ago

#360, #431, #432: JPA and unified component entities

File size: 10.2 KB
Line 
1package clarin.cmdi.componentregistry.frontend;
2
3import java.security.Principal;
4import java.util.List;
5
6import javax.swing.tree.DefaultMutableTreeNode;
7import javax.swing.tree.DefaultTreeModel;
8import javax.swing.tree.TreeModel;
9
10import org.apache.wicket.PageParameters;
11import org.apache.wicket.ajax.AjaxRequestTarget;
12import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
13import org.apache.wicket.markup.html.basic.Label;
14import org.apache.wicket.markup.html.form.Button;
15import org.apache.wicket.markup.html.form.CheckBox;
16import org.apache.wicket.markup.html.form.Form;
17import org.apache.wicket.markup.html.form.TextArea;
18import org.apache.wicket.markup.html.link.Link;
19import org.apache.wicket.markup.html.panel.FeedbackPanel;
20import org.apache.wicket.markup.html.tree.BaseTree;
21import org.apache.wicket.markup.html.tree.ITreeState;
22import org.apache.wicket.markup.html.tree.LinkTree;
23import org.apache.wicket.model.CompoundPropertyModel;
24import org.apache.wicket.spring.injection.annot.SpringBean;
25import org.slf4j.Logger;
26import org.slf4j.LoggerFactory;
27
28import clarin.cmdi.componentregistry.ComponentRegistry;
29import clarin.cmdi.componentregistry.ComponentRegistryException;
30import clarin.cmdi.componentregistry.ComponentRegistryFactory;
31import clarin.cmdi.componentregistry.ComponentStatus;
32import clarin.cmdi.componentregistry.MDMarshaller;
33import clarin.cmdi.componentregistry.impl.database.AdminRegistry;
34import clarin.cmdi.componentregistry.model.BaseDescription;
35import clarin.cmdi.componentregistry.model.ComponentDescription;
36import clarin.cmdi.componentregistry.model.ProfileDescription;
37import clarin.cmdi.componentregistry.persistence.ComponentDao;
38
39@SuppressWarnings("serial")
40public class AdminHomePage extends SecureAdminWebPage {
41
42    private static final long serialVersionUID = 1L;
43    private final static Logger LOG = LoggerFactory.getLogger(AdminHomePage.class);
44    private final CMDItemInfo info;
45    private final LinkTree tree;
46    private transient AdminRegistry adminRegistry = new AdminRegistry();
47    @SpringBean(name = "componentRegistryFactory")
48    private ComponentRegistryFactory componentRegistryFactory;
49    @SpringBean
50    private ComponentDao componentDao;
51    @SpringBean
52    private MDMarshaller marshaller;
53
54    public AdminHomePage(final PageParameters parameters) throws ComponentRegistryException {
55        super(parameters);
56        adminRegistry.setComponentRegistryFactory(componentRegistryFactory);
57        adminRegistry.setComponentDao(componentDao);
58        adminRegistry.setMarshaller(marshaller);
59        info = new CMDItemInfo(marshaller);
60        addLinks();
61        final FeedbackPanel feedback = new FeedbackPanel("feedback");
62        feedback.setOutputMarkupId(true);
63        add(feedback);
64        Form form = new ItemEditForm("form");
65        add(form);
66
67        Button deleteButton = new AjaxFallbackButton("delete", form) {
68
69            @Override
70            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
71                CMDItemInfo info = (CMDItemInfo) form.getModelObject();
72                info("deleting:" + info.getName());
73                Principal userPrincipal = getWebRequest().getHttpServletRequest().getUserPrincipal();
74                try {
75                    adminRegistry.delete(info, userPrincipal);
76                    info("Item deleted.");
77                    reloadTreeModel(info);
78                } catch (SubmitFailedException e) {
79                    LOG.error("Admin: ", e);
80                    error("Cannot delete: " + info.getName() + "\n error=" + e);
81                }
82                if (target != null) {
83                    target.addComponent(form);
84                    target.addComponent(tree);
85                    target.addComponent(feedback);
86                }
87            }
88
89            @Override
90            public boolean isEnabled() {
91                return info.isDeletable();
92
93            }
94        ;
95        };
96        form.add(deleteButton);
97
98        Button undeleteButton = new AjaxFallbackButton("undelete", form) {
99
100            @Override
101            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
102                CMDItemInfo info = (CMDItemInfo) form.getModelObject();
103                info("undeleting:" + info.getName());
104                try {
105                    adminRegistry.undelete(info);
106                    info("Item put back.");
107                    reloadTreeModel(info);
108                } catch (SubmitFailedException e) {
109                    LOG.error("Admin: ", e);
110                    error("Cannot undelete: " + info.getName() + "\n error=" + e);
111                }
112                if (target != null) {
113                    target.addComponent(form);
114                    target.addComponent(tree);
115                    target.addComponent(feedback);
116                }
117            }
118
119            @Override
120            public boolean isEnabled() {
121                return info.isUndeletable();
122            }
123        };
124        form.add(undeleteButton);
125
126        CheckBox forceUpdateCheck = new CheckBox("forceUpdate");
127        form.add(forceUpdateCheck);
128
129        Button submitButton = new AjaxFallbackButton("submit", form) {
130
131            @Override
132            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
133                CMDItemInfo info = (CMDItemInfo) form.getModelObject();
134                Principal userPrincipal = getWebRequest().getHttpServletRequest().getUserPrincipal();
135                info("submitting:" + info.getName() + " id=(" + info.getDataNode().getDescription().getId() + ")");
136                try {
137                    adminRegistry.submitFile(info, userPrincipal);
138                    info("submitting done.");
139                    reloadTreeModel(info);
140                } catch (SubmitFailedException e) {
141                    LOG.error("Admin: ", e);
142                    error("Cannot submit: " + info.getName() + "\n error=" + e);
143                }
144                if (target != null) {
145                    target.addComponent(form);
146                    target.addComponent(tree);
147                    target.addComponent(feedback);
148                }
149            }
150
151            @Override
152            public boolean isEnabled() {
153                return info.isEditable();
154            }
155        };
156        form.add(submitButton);
157
158        tree = createTree("tree", form, createDBTreeModel());
159        add(tree);
160        add(new Link("expandAll") {
161
162            @Override
163            public void onClick() {
164                tree.getTreeState().expandAll();
165            }
166        });
167
168        add(new Link("collapseAll") {
169
170            @Override
171            public void onClick() {
172                tree.getTreeState().collapseAll();
173            }
174        });
175
176    }
177
178    private void reloadTreeModel(CMDItemInfo info) {
179        try {
180            tree.setModelObject(createDBTreeModel());
181        } catch (ComponentRegistryException e) {
182            LOG.error("Admin: ", e);
183            error("Cannot reload tree: " + info.getName() + "\n error=" + e);
184        }
185    }
186
187    private void addLinks() {
188        add(new Label("linksMessage", "Browse the data below or choose on of the following options:"));
189        add(new Link("massMigrate") {
190
191            @Override
192            public void onClick() {
193                setResponsePage(MassMigratePage.class);
194            }
195        });
196        add(new Link("log") {
197
198            @Override
199            public void onClick() {
200                setResponsePage(ViewLogPage.class);
201            }
202        });
203        add(new Link("statistics") {
204
205            @Override
206            public void onClick() {
207                setResponsePage(StatisticsPage.class);
208            }
209        });
210    }
211
212    private LinkTree createTree(String id, final Form form, TreeModel treeModel) {
213        final LinkTree adminTree = new LinkTree(id, treeModel) {
214
215            @Override
216            protected void onNodeLinkClicked(Object node, BaseTree tree, AjaxRequestTarget target) {
217                super.onNodeLinkClicked(node, tree, target);
218                ITreeState treeState = tree.getTreeState();
219                if (treeState.isNodeExpanded(node)) {
220                    treeState.collapseNode(node);
221                } else {
222                    treeState.expandNode(node);
223                }
224                DisplayDataNode dn = (DisplayDataNode) ((DefaultMutableTreeNode) node).getUserObject();
225                info.setDataNode(dn);
226                BaseDescription desc = dn.getDescription();
227                if (desc != null) {
228                    String content = componentDao.getContent(dn.isDeleted(), desc.getId());
229                    info.setContent(content);
230                }
231                if (target != null) {
232                    target.addComponent(form);
233                }
234            }
235        };
236        return adminTree;
237    }
238
239    private class ItemEditForm extends Form<CMDItemInfo> {
240
241        public ItemEditForm(String name) {
242            super(name);
243            CompoundPropertyModel model = new CompoundPropertyModel(info);
244            setModel(model);
245
246            TextArea descriptionArea = new TextArea("description");
247            descriptionArea.setOutputMarkupId(true);
248            add(descriptionArea);
249            TextArea contentArea = new TextArea("content");
250            contentArea.setOutputMarkupId(true);
251            add(contentArea);
252        }
253    }
254
255    private TreeModel createDBTreeModel() throws ComponentRegistryException {
256        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(new DisplayDataNode("ComponentRegistry", false));
257        DefaultMutableTreeNode publicNode = new DefaultMutableTreeNode(new DisplayDataNode("Public", false));
258        rootNode.add(publicNode);
259        ComponentRegistry publicRegistry = componentRegistryFactory.getPublicRegistry();
260        add(publicNode, publicRegistry);
261        List<ComponentRegistry> userRegistries = componentRegistryFactory.getAllUserRegistries();
262        for (ComponentRegistry registry : userRegistries) {
263            DefaultMutableTreeNode userNode = new DefaultMutableTreeNode(new DisplayDataNode(registry.getName(), false));
264            rootNode.add(userNode);
265            add(userNode, registry);
266        }
267        TreeModel model = new DefaultTreeModel(rootNode);
268        return model;
269    }
270
271    private void add(DefaultMutableTreeNode parent, ComponentRegistry registry) throws ComponentRegistryException {
272        DefaultMutableTreeNode componentsNode = new DefaultMutableTreeNode(new DisplayDataNode("Components", false));
273        parent.add(componentsNode);
274        add(componentsNode, registry.getComponentDescriptions(), false, registry.getStatus());
275
276        DefaultMutableTreeNode profilesNode = new DefaultMutableTreeNode(new DisplayDataNode("Profiles", false));
277        parent.add(profilesNode);
278        add(profilesNode, registry.getProfileDescriptions(), false, registry.getStatus());
279
280        DefaultMutableTreeNode deletedCompNode = new DefaultMutableTreeNode(new DisplayDataNode("Deleted Components", true));
281        parent.add(deletedCompNode);
282
283        List<ComponentDescription> deletedComponentDescriptions = registry.getDeletedComponentDescriptions();
284        add(deletedCompNode, deletedComponentDescriptions, true, registry.getStatus());
285
286        DefaultMutableTreeNode deletedProfNode = new DefaultMutableTreeNode(new DisplayDataNode("Deleted Profiles", true));
287        parent.add(deletedProfNode);
288        List<ProfileDescription> deletedProfileDescriptions = registry.getDeletedProfileDescriptions();
289        add(deletedProfNode, deletedProfileDescriptions, true, registry.getStatus());
290    }
291
292    private void add(DefaultMutableTreeNode parent, List<? extends BaseDescription> descs, boolean isDeleted, ComponentStatus status) {
293        for (BaseDescription desc : descs) {
294            DefaultMutableTreeNode child = new DefaultMutableTreeNode(new DisplayDataNode(desc.getName(), isDeleted, desc, status));
295            parent.add(child);
296        }
297    }
298}
Note: See TracBrowser for help on using the repository browser.