View Javadoc
1   package org.argeo.slc.client.ui.dist.controllers;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import javax.jcr.Node;
7   import javax.jcr.NodeIterator;
8   import javax.jcr.Property;
9   import javax.jcr.Repository;
10  import javax.jcr.RepositoryException;
11  import javax.jcr.RepositoryFactory;
12  import javax.jcr.Session;
13  import javax.jcr.nodetype.NodeType;
14  
15  import org.argeo.cms.ArgeoNames;
16  import org.argeo.cms.ArgeoTypes;
17  import org.argeo.eclipse.ui.TreeParent;
18  import org.argeo.jcr.JcrUtils;
19  import org.argeo.node.NodeUtils;
20  import org.argeo.node.security.Keyring;
21  import org.argeo.slc.SlcException;
22  import org.argeo.slc.client.ui.dist.model.RepoElem;
23  import org.argeo.slc.repo.RepoConstants;
24  import org.eclipse.jface.viewers.ITreeContentProvider;
25  import org.eclipse.jface.viewers.Viewer;
26  
27  /**
28   * Enables browsing in local and remote SLC software repositories. Keyring and
29   * repository factory must be injected
30   */
31  public class DistTreeContentProvider implements ITreeContentProvider {
32  	private static final long serialVersionUID = -7640840211717811421L;
33  
34  	/* DEPENDENCY INJECTION */
35  	private RepositoryFactory repositoryFactory;
36  	private Keyring keyring;
37  
38  	// Context
39  	private Session nodeSession;
40  	List<RepoElem> repositories = new ArrayList<RepoElem>();
41  
42  	public Object[] getElements(Object input) {
43  		Repository nodeRepository = (Repository) input;
44  		try {
45  			if (nodeSession != null)
46  				dispose();
47  			nodeSession = nodeRepository.login();
48  
49  			String reposPath = NodeUtils.getUserHome(nodeSession).getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
50  
51  			if (!nodeSession.itemExists(reposPath))
52  				initializeModel(nodeSession);
53  
54  			NodeIterator repos = nodeSession.getNode(reposPath).getNodes();
55  			while (repos.hasNext()) {
56  				Node repoNode = repos.nextNode();
57  				if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
58  					String label = repoNode.isNodeType(NodeType.MIX_TITLE)
59  							? repoNode.getProperty(Property.JCR_TITLE).getString() : repoNode.getName();
60  					repositories.add(new RepoElem(repositoryFactory, keyring, repoNode, label));
61  				}
62  			}
63  		} catch (RepositoryException e) {
64  			throw new SlcException("Cannot get base elements", e);
65  		}
66  		return repositories.toArray();
67  	}
68  
69  	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
70  	}
71  
72  	// @Override
73  	public Object[] getChildren(Object parentElement) {
74  		if (parentElement instanceof TreeParent)
75  			return ((TreeParent) parentElement).getChildren();
76  		else
77  			return null;
78  	}
79  
80  	// @Override
81  	public Object getParent(Object element) {
82  		if (element instanceof TreeParent)
83  			return ((TreeParent) element).getParent();
84  		return null;
85  	}
86  
87  	// @Override
88  	public boolean hasChildren(Object element) {
89  		if (element instanceof TreeParent)
90  			return ((TreeParent) element).hasChildren();
91  		else
92  			return false;
93  	}
94  
95  	public void dispose() {
96  		for (RepoElem repoElem : repositories)
97  			repoElem.dispose();
98  		repositories = new ArrayList<RepoElem>();
99  		JcrUtils.logoutQuietly(nodeSession);
100 	}
101 
102 	private void initializeModel(Session nodeSession) {
103 		try {
104 			Node homeNode = NodeUtils.getUserHome(nodeSession);
105 			if (homeNode == null) // anonymous
106 				throw new SlcException("User must be authenticated.");
107 
108 			// make sure base directory is available
109 			Node repos = JcrUtils.mkdirs(homeNode, RepoConstants.REPOSITORIES_BASE_PATH,null);
110 			if (nodeSession.hasPendingChanges())
111 				nodeSession.save();
112 
113 			// register default local java repository
114 			String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS;
115 			Repository javaRepository = NodeUtils.getRepositoryByAlias(repositoryFactory, alias);
116 			if (javaRepository != null) {
117 				if (!repos.hasNode(alias)) {
118 					Node repoNode = repos.addNode(alias, ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
119 					repoNode.setProperty(ArgeoNames.ARGEO_URI, "vm:///" + alias);
120 					repoNode.addMixin(NodeType.MIX_TITLE);
121 					repoNode.setProperty(Property.JCR_TITLE, RepoConstants.DEFAULT_JAVA_REPOSITORY_LABEL);
122 					nodeSession.save();
123 				}
124 			}
125 		} catch (RepositoryException e) {
126 			throw new SlcException("Cannot initialize model", e);
127 		}
128 	}
129 
130 	/* DEPENDENCY INJECTION */
131 	public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
132 		this.repositoryFactory = repositoryFactory;
133 	}
134 
135 	public void setKeyring(Keyring keyring) {
136 		this.keyring = keyring;
137 	}
138 }