View Javadoc
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  			// session = repository.login();
47  			session = JcrUtils.loginOrCreateWorkspace(repository, "example");
48  //			Node textNode = JcrUtils.getOrAdd(session.getRootNode(), "article", DocBookTypes.ARTICLE);
49  //			if (textNode.isCheckedOut())
50  //				textNode.addMixin(NodeType.MIX_TITLE);
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 		// CmsEditable cmsEditable = (CmsEditable) o;
105 		mpart.setDirty(isDirty());
106 	}
107 
108 	boolean isDirty() {
109 		return cmsEditable.isEditing();
110 	}
111 
112 }