1 package org.argeo.connect.e4.parts;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.URL;
6 import java.util.Map;
7 import java.util.Observable;
8 import java.util.Observer;
9
10 import javax.annotation.PostConstruct;
11 import javax.annotation.PreDestroy;
12 import javax.inject.Inject;
13 import javax.jcr.ImportUUIDBehavior;
14 import javax.jcr.Node;
15 import javax.jcr.Repository;
16 import javax.jcr.RepositoryException;
17 import javax.jcr.Session;
18
19 import org.apache.commons.logging.Log;
20 import org.argeo.cms.CmsException;
21 import org.argeo.cms.viewers.JcrVersionCmsEditable;
22 import org.argeo.connect.ui.widgets.DocumentTextEditor;
23 import org.argeo.docbook.jcr.DocBookNames;
24 import org.argeo.docbook.jcr.DocBookTypes;
25 import org.argeo.jcr.JcrUtils;
26 import org.eclipse.e4.ui.di.Persist;
27 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
28 import org.eclipse.swt.SWT;
29 import org.eclipse.swt.layout.GridLayout;
30 import org.eclipse.swt.widgets.Composite;
31
32 public class CmsDocBookEditor implements Observer {
33 @Inject
34 Repository repository;
35
36 @Inject
37 private MPart mpart;
38
39 Session session;
40 JcrVersionCmsEditable cmsEditable;
41
42 @PostConstruct
43 public void createUI(Composite parent) {
44 try {
45 parent.setLayout(new GridLayout());
46
47 session = JcrUtils.loginOrCreateWorkspace(repository, "example");
48
49
50
51
52 String textNodeName = "docbook";
53 if (session.getRootNode().hasNode(textNodeName))
54 session.getRootNode().getNode(textNodeName).remove();
55
56 Node textNode = JcrUtils.getOrAdd(session.getRootNode(), textNodeName, DocBookTypes.BOOK);
57 Map<String, String> properties = mpart.getProperties();
58 String defaultContentUri = properties.get("defaultContentUri");
59 if (textNode.hasNode(DocBookNames.DBK_ARTICLE))
60 textNode.getNode(DocBookNames.DBK_ARTICLE).remove();
61 if (defaultContentUri != null && !textNode.hasNode(DocBookNames.DBK_ARTICLE))
62 try {
63 URL url = new URL(defaultContentUri);
64 try (InputStream in = url.openStream()) {
65 session.importXML(textNode.getPath(), in,
66 ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
67 }
68 Node dbkNode = textNode.getNode(DocBookNames.DBK_ARTICLE);
69 if (dbkNode.isNodeType(DocBookTypes.ARTICLE))
70 System.out.println(dbkNode + " is an article");
71 } catch (IOException e) {
72 e.printStackTrace();
73 }
74
75 cmsEditable = new JcrVersionCmsEditable(textNode);
76 if (session.hasPendingChanges())
77 session.save();
78 cmsEditable.addObserver(this);
79 DocumentTextEditor textEditor = new DocumentTextEditor(parent, SWT.NONE,
80 textNode.getNode(DocBookNames.DBK_ARTICLE), cmsEditable);
81 mpart.setDirty(isDirty());
82 } catch (RepositoryException e) {
83 throw new CmsException("Cannot create text editor", e);
84 }
85 }
86
87 @PreDestroy
88 public void dispose() {
89 JcrUtils.logoutQuietly(session);
90 }
91
92 @Persist
93 public void save() {
94 try {
95 session.save();
96 } catch (RepositoryException e) {
97 throw new CmsException("Cannot save", e);
98 }
99 cmsEditable.stopEditing();
100 }
101
102 @Override
103 public void update(Observable o, Object arg) {
104
105 mpart.setDirty(isDirty());
106 }
107
108 boolean isDirty() {
109 return cmsEditable.isEditing();
110 }
111
112 }