View Javadoc
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   * Base Editor for a Documents entity. Centralise methods to ease business
29   * specific development
30   */
31  public abstract class AbstractDocumentsEditor implements CmsEditable {
32  	private final static Log log = LogFactory.getLog(AbstractDocumentsEditor.class);
33  
34  	/* DEPENDENCY INJECTION */
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  	// Context
48  	private Session session;
49  	private Node node;
50  
51  	// FIXME RAP specific
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  			// Set a default part name and tooltip
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  	/** Overwrite to provide a specific part tooltip */
83  	protected void updateToolTip(String name) {
84  //		((NodeEditorInput) getEditorInput()).setTooltipText("Display and edit " + name);
85  	}
86  
87  	// Exposes
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 	// Editor life cycle
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 	// CmsEditable LIFE CYCLE
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 	/* DEPENDENCY INJECTION */
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 }