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