]> git.argeo.org Git - gpl/argeo-slc.git/blob - cms/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/wizards/RegisterRepoWizard.java
3cebd6862d936a1164c89e9b39187cd8265345ca
[gpl/argeo-slc.git] / cms / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / wizards / RegisterRepoWizard.java
1 package org.argeo.slc.client.ui.dist.wizards;
2
3 import java.net.URI;
4
5 import javax.jcr.Node;
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;
13
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;
36
37 /**
38 *
39 * Registers a new remote repository in the current Node.
40 *
41 */
42 public class RegisterRepoWizard extends Wizard {
43
44 // Business objects
45 private Keyring keyring;
46 private RepositoryFactory repositoryFactory;
47 private Repository nodeRepository;
48
49 // Pages
50 private DefineModelPage page;
51
52 // Widgets of model page
53 private Text name;
54 private Text uri;
55 private Text username;
56 private Text password;
57 private Button saveInKeyring;
58
59 // Default values
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;
64
65 public RegisterRepoWizard(Keyring keyring, RepositoryFactory repositoryFactory, Repository nodeRepository) {
66 super();
67 this.keyring = keyring;
68 this.repositoryFactory = repositoryFactory;
69 this.nodeRepository = nodeRepository;
70 }
71
72 @Override
73 public void addPages() {
74 try {
75 page = new DefineModelPage();
76 addPage(page);
77 setWindowTitle("Register a new remote repository");
78 } catch (Exception e) {
79 throw new SlcException("Cannot add page to wizard ", e);
80 }
81 }
82
83 @Override
84 public boolean performFinish() {
85 if (!canFinish())
86 return false;
87
88 Session nodeSession = null;
89 try {
90 nodeSession = nodeRepository.login();
91 String reposPath = NodeUtils.getUserHome(nodeSession).getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
92
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);
97
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.");
107 }
108
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());
114 nodeSession.save();
115 if (saveInKeyring.getSelection()) {
116 String pwdPath = repoNode.getPath() + '/' + ArgeoNames.ARGEO_PASSWORD;
117 keyring.set(pwdPath, password.getText().toCharArray());
118 nodeSession.save();
119 }
120 MessageDialog.openInformation(getShell(), "Repository Added",
121 "Remote repository " + uri.getText() + "' added");
122 } catch (Exception e) {
123 ErrorFeedback.show("Cannot add remote repository", e);
124 } finally {
125 JcrUtils.logoutQuietly(nodeSession);
126 }
127 return true;
128 }
129
130 private class DefineModelPage extends WizardPage {
131 private static final long serialVersionUID = 874386824101995060L;
132
133 public DefineModelPage() {
134 super("Main");
135 setTitle("Fill information to register a repository");
136 }
137
138 public void createControl(Composite parent) {
139
140 // main layout
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));
144
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);
149
150 final Button anonymousLogin = createLC(composite, "Log as anonymous", true);
151 anonymousLogin.addSelectionListener(new SelectionListener() {
152 private static final long serialVersionUID = 4874716406036981039L;
153
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);
160 } else {
161 username.setText("");
162 password.setText("");
163 username.setEnabled(true);
164 password.setEnabled(true);
165 }
166 }
167
168 public void widgetDefaultSelected(SelectionEvent e) {
169 }
170 });
171
172 username = createLT(composite, "User", DEFAULT_USER_NAME);
173 password = createLP(composite, "Password");
174 saveInKeyring = createLC(composite, "Remember password", false);
175
176 if (DEFAULT_ANONYMOUS) {
177 username.setEnabled(false);
178 password.setEnabled(false);
179 }
180
181 Button test = createButton(composite, "Test");
182 GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false, 2, 1);
183 gd.widthHint = 140;
184 test.setLayoutData(gd);
185
186 test.addSelectionListener(new SelectionAdapter() {
187 private static final long serialVersionUID = -4034851916548656293L;
188
189 public void widgetSelected(SelectionEvent arg0) {
190 testConnection();
191 }
192 });
193
194 // Compulsory
195 setControl(composite);
196 }
197
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);
204 return text;
205 }
206
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);
213 return check;
214 }
215
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);
222 return button;
223 }
224
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));
230 return text;
231 }
232
233 }
234
235 void testConnection() {
236 Session session = null;
237 try {
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);
244 } else {
245 char[] pwd = password.getTextChars();
246 SimpleCredentials sc = new SimpleCredentials(username.getText(), pwd);
247 session = repository.login(sc, RepoConstants.DEFAULT_DEFAULT_WORKSPACE);
248 }
249 } else {// alias
250 Repository repository = NodeUtils.getRepositoryByAlias(repositoryFactory, uri.getText());
251 session = repository.login();
252 }
253 MessageDialog.openInformation(getShell(), "Success", "Connection to '" + uri.getText() + "' successful");
254 } catch (Exception e) {
255 ErrorFeedback.show("Connection test failed for " + uri.getText(), e);
256 } finally {
257 JcrUtils.logoutQuietly(session);
258 }
259 }
260 }