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
.NodeConstants
;
15 import org
.argeo
.api
.NodeUtils
;
16 import org
.argeo
.api
.security
.Keyring
;
17 import org
.argeo
.cms
.ArgeoNames
;
18 import org
.argeo
.cms
.ArgeoTypes
;
19 import org
.argeo
.eclipse
.ui
.dialogs
.ErrorFeedback
;
20 import org
.argeo
.jcr
.JcrUtils
;
21 import org
.argeo
.slc
.SlcException
;
22 import org
.argeo
.slc
.repo
.RepoConstants
;
23 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
24 import org
.eclipse
.jface
.resource
.JFaceResources
;
25 import org
.eclipse
.jface
.wizard
.Wizard
;
26 import org
.eclipse
.jface
.wizard
.WizardPage
;
27 import org
.eclipse
.swt
.SWT
;
28 import org
.eclipse
.swt
.events
.SelectionAdapter
;
29 import org
.eclipse
.swt
.events
.SelectionEvent
;
30 import org
.eclipse
.swt
.events
.SelectionListener
;
31 import org
.eclipse
.swt
.layout
.GridData
;
32 import org
.eclipse
.swt
.layout
.GridLayout
;
33 import org
.eclipse
.swt
.widgets
.Button
;
34 import org
.eclipse
.swt
.widgets
.Composite
;
35 import org
.eclipse
.swt
.widgets
.Label
;
36 import org
.eclipse
.swt
.widgets
.Text
;
40 * Registers a new remote repository in the current Node.
43 public class RegisterRepoWizard
extends Wizard
{
46 private Keyring keyring
;
47 private RepositoryFactory repositoryFactory
;
48 private Repository nodeRepository
;
51 private DefineModelPage page
;
53 // Widgets of model page
56 private Text username
;
57 private Text password
;
58 private Button saveInKeyring
;
61 private final static String DEFAULT_NAME
= "Argeo Public Repository";
62 private final static String DEFAULT_URI
= "https://forge.argeo.org/jcr/java";
63 private final static String DEFAULT_USER_NAME
= "anonymous";
64 private final static boolean DEFAULT_ANONYMOUS
= true;
66 public RegisterRepoWizard(Keyring keyring
, RepositoryFactory repositoryFactory
, Repository nodeRepository
) {
68 this.keyring
= keyring
;
69 this.repositoryFactory
= repositoryFactory
;
70 this.nodeRepository
= nodeRepository
;
74 public void addPages() {
76 page
= new DefineModelPage();
78 setWindowTitle("Register a new remote repository");
79 } catch (Exception e
) {
80 throw new SlcException("Cannot add page to wizard ", e
);
85 public boolean performFinish() {
89 Session nodeSession
= null;
91 nodeSession
= nodeRepository
.login(NodeConstants
.HOME_WORKSPACE
);
92 String reposPath
= NodeUtils
.getUserHome(nodeSession
).getPath() + RepoConstants
.REPOSITORIES_BASE_PATH
;
94 Node repos
= nodeSession
.getNode(reposPath
);
95 String repoNodeName
= JcrUtils
.replaceInvalidChars(name
.getText());
96 if (repos
.hasNode(repoNodeName
))
97 throw new SlcException("There is already a remote repository named " + repoNodeName
);
99 // check if the same URI has already been registered
100 NodeIterator ni
= repos
.getNodes();
101 while (ni
.hasNext()) {
102 Node node
= ni
.nextNode();
103 if (node
.isNodeType(ArgeoTypes
.ARGEO_REMOTE_REPOSITORY
) && node
.hasProperty(ArgeoNames
.ARGEO_URI
)
104 && node
.getProperty(ArgeoNames
.ARGEO_URI
).getString().equals(uri
.getText()))
105 throw new SlcException("This URI " + uri
.getText() + " is already registered, "
106 + "for the time being, only one instance of a single "
107 + "repository at a time is implemented.");
110 Node repoNode
= repos
.addNode(repoNodeName
, ArgeoTypes
.ARGEO_REMOTE_REPOSITORY
);
111 repoNode
.setProperty(ArgeoNames
.ARGEO_URI
, uri
.getText());
112 repoNode
.setProperty(ArgeoNames
.ARGEO_USER_ID
, username
.getText());
113 repoNode
.addMixin(NodeType
.MIX_TITLE
);
114 repoNode
.setProperty(Property
.JCR_TITLE
, name
.getText());
116 if (saveInKeyring
.getSelection()) {
117 String pwdPath
= repoNode
.getPath() + '/' + ArgeoNames
.ARGEO_PASSWORD
;
118 keyring
.set(pwdPath
, password
.getText().toCharArray());
121 MessageDialog
.openInformation(getShell(), "Repository Added",
122 "Remote repository " + uri
.getText() + "' added");
123 } catch (Exception e
) {
124 ErrorFeedback
.show("Cannot add remote repository", e
);
126 JcrUtils
.logoutQuietly(nodeSession
);
131 private class DefineModelPage
extends WizardPage
{
132 private static final long serialVersionUID
= 874386824101995060L;
134 public DefineModelPage() {
136 setTitle("Fill information to register a repository");
139 public void createControl(Composite parent
) {
142 Composite composite
= new Composite(parent
, SWT
.NONE
);
143 composite
.setLayout(new GridLayout(2, false));
144 composite
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, false));
146 // Create various fields
147 // setMessage("Login to remote repository", IMessageProvider.NONE);
148 name
= createLT(composite
, "Name", DEFAULT_NAME
);
149 uri
= createLT(composite
, "URI", DEFAULT_URI
);
151 final Button anonymousLogin
= createLC(composite
, "Log as anonymous", true);
152 anonymousLogin
.addSelectionListener(new SelectionListener() {
153 private static final long serialVersionUID
= 4874716406036981039L;
155 public void widgetSelected(SelectionEvent e
) {
156 if (anonymousLogin
.getSelection()) {
157 username
.setText(DEFAULT_USER_NAME
);
158 password
.setText("");
159 username
.setEnabled(false);
160 password
.setEnabled(false);
162 username
.setText("");
163 password
.setText("");
164 username
.setEnabled(true);
165 password
.setEnabled(true);
169 public void widgetDefaultSelected(SelectionEvent e
) {
173 username
= createLT(composite
, "User", DEFAULT_USER_NAME
);
174 password
= createLP(composite
, "Password");
175 saveInKeyring
= createLC(composite
, "Remember password", false);
177 if (DEFAULT_ANONYMOUS
) {
178 username
.setEnabled(false);
179 password
.setEnabled(false);
182 Button test
= createButton(composite
, "Test");
183 GridData gd
= new GridData(SWT
.CENTER
, SWT
.CENTER
, false, false, 2, 1);
185 test
.setLayoutData(gd
);
187 test
.addSelectionListener(new SelectionAdapter() {
188 private static final long serialVersionUID
= -4034851916548656293L;
190 public void widgetSelected(SelectionEvent arg0
) {
196 setControl(composite
);
199 /** Creates label and text. */
200 protected Text
createLT(Composite parent
, String label
, String initial
) {
201 new Label(parent
, SWT
.RIGHT
).setText(label
);
202 Text text
= new Text(parent
, SWT
.SINGLE
| SWT
.LEAD
| SWT
.BORDER
);
203 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.TOP
, true, true));
204 text
.setText(initial
);
208 /** Creates label and check. */
209 protected Button
createLC(Composite parent
, String label
, Boolean initial
) {
210 new Label(parent
, SWT
.RIGHT
).setText(label
);
211 Button check
= new Button(parent
, SWT
.CHECK
);
212 check
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
213 check
.setSelection(initial
);
217 /** Creates a button with a label. */
218 protected Button
createButton(Composite parent
, String label
) {
219 Button button
= new Button(parent
, SWT
.PUSH
);
220 button
.setText(label
);
221 button
.setFont(JFaceResources
.getDialogFont());
222 setButtonLayoutData(button
);
226 /** Creates label and password field */
227 protected Text
createLP(Composite parent
, String label
) {
228 new Label(parent
, SWT
.NONE
).setText(label
);
229 Text text
= new Text(parent
, SWT
.SINGLE
| SWT
.LEAD
| SWT
.BORDER
| SWT
.PASSWORD
);
230 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
236 void testConnection() {
237 Session session
= null;
239 if (uri
.getText().startsWith("http")) {// http, https
240 URI checkedUri
= new URI(uri
.getText());
241 String checkedUriStr
= checkedUri
.toString();
242 Repository repository
= NodeUtils
.getRepositoryByUri(repositoryFactory
, checkedUriStr
);
243 if (username
.getText().trim().equals("")) {// anonymous
244 session
= repository
.login(RepoConstants
.DEFAULT_DEFAULT_WORKSPACE
);
246 char[] pwd
= password
.getTextChars();
247 SimpleCredentials sc
= new SimpleCredentials(username
.getText(), pwd
);
248 session
= repository
.login(sc
, RepoConstants
.DEFAULT_DEFAULT_WORKSPACE
);
251 Repository repository
= NodeUtils
.getRepositoryByAlias(repositoryFactory
, uri
.getText());
252 session
= repository
.login();
254 MessageDialog
.openInformation(getShell(), "Success", "Connection to '" + uri
.getText() + "' successful");
255 } catch (Exception e
) {
256 ErrorFeedback
.show("Connection test failed for " + uri
.getText(), e
);
258 JcrUtils
.logoutQuietly(session
);