1 package org
.argeo
.slc
.client
.ui
.dist
.wizards
;
6 import javax
.jcr
.NodeIterator
;
7 import javax
.jcr
.Property
;
8 import javax
.jcr
.Repository
;
9 import javax
.jcr
.RepositoryFactory
;
10 import javax
.jcr
.Session
;
11 import javax
.jcr
.SimpleCredentials
;
12 import javax
.jcr
.nodetype
.NodeType
;
14 import org
.argeo
.api
.NodeUtils
;
15 import org
.argeo
.api
.security
.Keyring
;
16 import org
.argeo
.cms
.ArgeoNames
;
17 import org
.argeo
.cms
.ArgeoTypes
;
18 import org
.argeo
.eclipse
.ui
.dialogs
.ErrorFeedback
;
19 import org
.argeo
.jcr
.JcrUtils
;
20 import org
.argeo
.slc
.SlcException
;
21 import org
.argeo
.slc
.repo
.RepoConstants
;
22 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
23 import org
.eclipse
.jface
.resource
.JFaceResources
;
24 import org
.eclipse
.jface
.wizard
.Wizard
;
25 import org
.eclipse
.jface
.wizard
.WizardPage
;
26 import org
.eclipse
.swt
.SWT
;
27 import org
.eclipse
.swt
.events
.SelectionAdapter
;
28 import org
.eclipse
.swt
.events
.SelectionEvent
;
29 import org
.eclipse
.swt
.events
.SelectionListener
;
30 import org
.eclipse
.swt
.layout
.GridData
;
31 import org
.eclipse
.swt
.layout
.GridLayout
;
32 import org
.eclipse
.swt
.widgets
.Button
;
33 import org
.eclipse
.swt
.widgets
.Composite
;
34 import org
.eclipse
.swt
.widgets
.Label
;
35 import org
.eclipse
.swt
.widgets
.Text
;
39 * Registers a new remote repository in the current Node.
42 public class RegisterRepoWizard
extends Wizard
{
45 private Keyring keyring
;
46 private RepositoryFactory repositoryFactory
;
47 private Repository nodeRepository
;
50 private DefineModelPage page
;
52 // Widgets of model page
55 private Text username
;
56 private Text password
;
57 private Button saveInKeyring
;
60 private final static String DEFAULT_NAME
= "Argeo Public Repository";
61 private final static String DEFAULT_URI
= "https://forge.argeo.org/jcr/java";
62 private final static String DEFAULT_USER_NAME
= "anonymous";
63 private final static boolean DEFAULT_ANONYMOUS
= true;
65 public RegisterRepoWizard(Keyring keyring
, RepositoryFactory repositoryFactory
, Repository nodeRepository
) {
67 this.keyring
= keyring
;
68 this.repositoryFactory
= repositoryFactory
;
69 this.nodeRepository
= nodeRepository
;
73 public void addPages() {
75 page
= new DefineModelPage();
77 setWindowTitle("Register a new remote repository");
78 } catch (Exception e
) {
79 throw new SlcException("Cannot add page to wizard ", e
);
84 public boolean performFinish() {
88 Session nodeSession
= null;
90 nodeSession
= nodeRepository
.login();
91 String reposPath
= NodeUtils
.getUserHome(nodeSession
).getPath() + RepoConstants
.REPOSITORIES_BASE_PATH
;
93 Node repos
= nodeSession
.getNode(reposPath
);
94 String repoNodeName
= JcrUtils
.replaceInvalidChars(name
.getText());
95 if (repos
.hasNode(repoNodeName
))
96 throw new SlcException("There is already a remote repository named " + repoNodeName
);
98 // check if the same URI has already been registered
99 NodeIterator ni
= repos
.getNodes();
100 while (ni
.hasNext()) {
101 Node node
= ni
.nextNode();
102 if (node
.isNodeType(ArgeoTypes
.ARGEO_REMOTE_REPOSITORY
) && node
.hasProperty(ArgeoNames
.ARGEO_URI
)
103 && node
.getProperty(ArgeoNames
.ARGEO_URI
).getString().equals(uri
.getText()))
104 throw new SlcException("This URI " + uri
.getText() + " is already registered, "
105 + "for the time being, only one instance of a single "
106 + "repository at a time is implemented.");
109 Node repoNode
= repos
.addNode(repoNodeName
, ArgeoTypes
.ARGEO_REMOTE_REPOSITORY
);
110 repoNode
.setProperty(ArgeoNames
.ARGEO_URI
, uri
.getText());
111 repoNode
.setProperty(ArgeoNames
.ARGEO_USER_ID
, username
.getText());
112 repoNode
.addMixin(NodeType
.MIX_TITLE
);
113 repoNode
.setProperty(Property
.JCR_TITLE
, name
.getText());
115 if (saveInKeyring
.getSelection()) {
116 String pwdPath
= repoNode
.getPath() + '/' + ArgeoNames
.ARGEO_PASSWORD
;
117 keyring
.set(pwdPath
, password
.getText().toCharArray());
120 MessageDialog
.openInformation(getShell(), "Repository Added",
121 "Remote repository " + uri
.getText() + "' added");
122 } catch (Exception e
) {
123 ErrorFeedback
.show("Cannot add remote repository", e
);
125 JcrUtils
.logoutQuietly(nodeSession
);
130 private class DefineModelPage
extends WizardPage
{
131 private static final long serialVersionUID
= 874386824101995060L;
133 public DefineModelPage() {
135 setTitle("Fill information to register a repository");
138 public void createControl(Composite parent
) {
141 Composite composite
= new Composite(parent
, SWT
.NONE
);
142 composite
.setLayout(new GridLayout(2, false));
143 composite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, false));
145 // Create various fields
146 // setMessage("Login to remote repository", IMessageProvider.NONE);
147 name
= createLT(composite
, "Name", DEFAULT_NAME
);
148 uri
= createLT(composite
, "URI", DEFAULT_URI
);
150 final Button anonymousLogin
= createLC(composite
, "Log as anonymous", true);
151 anonymousLogin
.addSelectionListener(new SelectionListener() {
152 private static final long serialVersionUID
= 4874716406036981039L;
154 public void widgetSelected(SelectionEvent e
) {
155 if (anonymousLogin
.getSelection()) {
156 username
.setText(DEFAULT_USER_NAME
);
157 password
.setText("");
158 username
.setEnabled(false);
159 password
.setEnabled(false);
161 username
.setText("");
162 password
.setText("");
163 username
.setEnabled(true);
164 password
.setEnabled(true);
168 public void widgetDefaultSelected(SelectionEvent e
) {
172 username
= createLT(composite
, "User", DEFAULT_USER_NAME
);
173 password
= createLP(composite
, "Password");
174 saveInKeyring
= createLC(composite
, "Remember password", false);
176 if (DEFAULT_ANONYMOUS
) {
177 username
.setEnabled(false);
178 password
.setEnabled(false);
181 Button test
= createButton(composite
, "Test");
182 GridData gd
= new GridData(SWT
.CENTER
, SWT
.CENTER
, false, false, 2, 1);
184 test
.setLayoutData(gd
);
186 test
.addSelectionListener(new SelectionAdapter() {
187 private static final long serialVersionUID
= -4034851916548656293L;
189 public void widgetSelected(SelectionEvent arg0
) {
195 setControl(composite
);
198 /** Creates label and text. */
199 protected Text
createLT(Composite parent
, String label
, String initial
) {
200 new Label(parent
, SWT
.RIGHT
).setText(label
);
201 Text text
= new Text(parent
, SWT
.SINGLE
| SWT
.LEAD
| SWT
.BORDER
);
202 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, true));
203 text
.setText(initial
);
207 /** Creates label and check. */
208 protected Button
createLC(Composite parent
, String label
, Boolean initial
) {
209 new Label(parent
, SWT
.RIGHT
).setText(label
);
210 Button check
= new Button(parent
, SWT
.CHECK
);
211 check
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
212 check
.setSelection(initial
);
216 /** Creates a button with a label. */
217 protected Button
createButton(Composite parent
, String label
) {
218 Button button
= new Button(parent
, SWT
.PUSH
);
219 button
.setText(label
);
220 button
.setFont(JFaceResources
.getDialogFont());
221 setButtonLayoutData(button
);
225 /** Creates label and password field */
226 protected Text
createLP(Composite parent
, String label
) {
227 new Label(parent
, SWT
.NONE
).setText(label
);
228 Text text
= new Text(parent
, SWT
.SINGLE
| SWT
.LEAD
| SWT
.BORDER
| SWT
.PASSWORD
);
229 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
235 void testConnection() {
236 Session session
= null;
238 if (uri
.getText().startsWith("http")) {// http, https
239 URI checkedUri
= new URI(uri
.getText());
240 String checkedUriStr
= checkedUri
.toString();
241 Repository repository
= NodeUtils
.getRepositoryByUri(repositoryFactory
, checkedUriStr
);
242 if (username
.getText().trim().equals("")) {// anonymous
243 session
= repository
.login(RepoConstants
.DEFAULT_DEFAULT_WORKSPACE
);
245 char[] pwd
= password
.getTextChars();
246 SimpleCredentials sc
= new SimpleCredentials(username
.getText(), pwd
);
247 session
= repository
.login(sc
, RepoConstants
.DEFAULT_DEFAULT_WORKSPACE
);
250 Repository repository
= NodeUtils
.getRepositoryByAlias(repositoryFactory
, uri
.getText());
251 session
= repository
.login();
253 MessageDialog
.openInformation(getShell(), "Success", "Connection to '" + uri
.getText() + "' successful");
254 } catch (Exception e
) {
255 ErrorFeedback
.show("Connection test failed for " + uri
.getText(), e
);
257 JcrUtils
.logoutQuietly(session
);