1 package org.argeo.documents.e4.parts;
2
3 import java.nio.file.spi.FileSystemProvider;
4
5 import javax.annotation.PreDestroy;
6 import javax.inject.Inject;
7 import javax.jcr.Node;
8 import javax.jcr.Property;
9 import javax.jcr.Repository;
10 import javax.jcr.RepositoryException;
11 import javax.jcr.Session;
12 import javax.jcr.nodetype.NodeType;
13
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.argeo.cms.ui.CmsEditable;
17 import org.argeo.connect.e4.ConnectE4Constants;
18 import org.argeo.connect.ui.SystemWorkbenchService;
19 import org.argeo.documents.DocumentsException;
20 import org.argeo.documents.DocumentsService;
21 import org.argeo.jcr.JcrUtils;
22 import org.eclipse.e4.ui.di.Focus;
23 import org.eclipse.e4.ui.model.application.ui.basic.MPart;
24 import org.eclipse.rap.rwt.RWT;
25 import org.eclipse.rap.rwt.client.service.BrowserNavigation;
26
27
28
29
30
31 public abstract class AbstractDocumentsEditor implements CmsEditable {
32 private final static Log log = LogFactory.getLog(AbstractDocumentsEditor.class);
33
34
35 @Inject
36 private Repository repository;
37 @Inject
38 private SystemWorkbenchService systemWorkbenchService;
39 @Inject
40 private DocumentsService documentsService;
41 @Inject
42 private FileSystemProvider nodeFileSystemProvider;
43
44 @Inject
45 private MPart mPart;
46
47
48 private Session session;
49 private Node node;
50
51
52 private BrowserNavigation browserNavigation;
53
54 public void init() {
55 String uid = mPart.getPersistedState().get(ConnectE4Constants.ENTITY_ID);
56 try {
57 session = repository.login();
58 node = session.getNodeByIdentifier(uid);
59
60 updatePartName();
61 } catch (RepositoryException e) {
62 throw new DocumentsException("Unable to create new session" + " to use with current editor", e);
63 }
64 browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
65 }
66
67 protected void updatePartName() {
68 try {
69 String name;
70 if (node.isNodeType(NodeType.MIX_TITLE) && node.hasProperty(Property.JCR_TITLE))
71 name = node.getProperty(Property.JCR_TITLE).getString();
72 else
73 name = node.getName();
74 mPart.setLabel(name);
75 updateToolTip(name);
76
77 } catch (RepositoryException e) {
78 throw new DocumentsException("Cannot retrieve name for " + node, e);
79 }
80 }
81
82
83 protected void updateToolTip(String name) {
84
85 }
86
87
88 protected Repository getRepository() {
89 return repository;
90 }
91
92 protected Node getNode() {
93 return node;
94 }
95
96 protected DocumentsService getDocumentsService() {
97 return documentsService;
98 }
99
100 protected SystemWorkbenchService getSystemWorkbenchService() {
101 return systemWorkbenchService;
102 }
103
104 public FileSystemProvider getNodeFileSystemProvider() {
105 return nodeFileSystemProvider;
106 }
107
108
109 @PreDestroy
110 public void dispose() {
111 JcrUtils.logoutQuietly(session);
112 }
113
114 @Focus
115 public void setFocus() {
116 try {
117 browserNavigation.pushState(node.getPath(), mPart.getLabel());
118 } catch (RepositoryException e) {
119 log.error("Cannot set client state", e);
120 }
121 }
122
123
124 @Override
125 public Boolean canEdit() {
126 return true;
127 }
128
129 @Override
130 public Boolean isEditing() {
131 return true;
132 }
133
134 @Override
135 public void startEditing() {
136 }
137
138 @Override
139 public void stopEditing() {
140 }
141
142
143 public void setRepository(Repository repository) {
144 this.repository = repository;
145 }
146
147 public void setDocumentsService(DocumentsService documentsService) {
148 this.documentsService = documentsService;
149 }
150
151 public void setSystemWorkbenchService(SystemWorkbenchService systemWorkbenchService) {
152 this.systemWorkbenchService = systemWorkbenchService;
153 }
154
155 public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
156 this.nodeFileSystemProvider = nodeFileSystemProvider;
157 }
158 }