]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/argeo-commons/org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/jcr/commands/AddRemoteRepository.java
Remove old license headers
[gpl/argeo-slc.git] / legacy / argeo-commons / org.argeo.cms.ui.workbench / src / org / argeo / cms / ui / workbench / internal / jcr / commands / AddRemoteRepository.java
1 package org.argeo.cms.ui.workbench.internal.jcr.commands;
2
3 import java.net.URI;
4 import java.util.Hashtable;
5
6 import javax.jcr.Node;
7 import javax.jcr.Repository;
8 import javax.jcr.RepositoryFactory;
9 import javax.jcr.Session;
10 import javax.jcr.SimpleCredentials;
11
12 import org.argeo.api.NodeConstants;
13 import org.argeo.api.NodeUtils;
14 import org.argeo.api.security.Keyring;
15 import org.argeo.cms.ArgeoNames;
16 import org.argeo.cms.ArgeoTypes;
17 import org.argeo.cms.ui.workbench.internal.WorkbenchConstants;
18 import org.argeo.cms.ui.workbench.util.CommandUtils;
19 import org.argeo.eclipse.ui.EclipseUiException;
20 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
21 import org.argeo.jcr.JcrUtils;
22 import org.eclipse.core.commands.AbstractHandler;
23 import org.eclipse.core.commands.ExecutionEvent;
24 import org.eclipse.core.commands.ExecutionException;
25 import org.eclipse.jface.dialogs.Dialog;
26 import org.eclipse.jface.dialogs.IMessageProvider;
27 import org.eclipse.jface.dialogs.MessageDialog;
28 import org.eclipse.jface.dialogs.TitleAreaDialog;
29 import org.eclipse.swt.SWT;
30 import org.eclipse.swt.events.SelectionAdapter;
31 import org.eclipse.swt.events.SelectionEvent;
32 import org.eclipse.swt.graphics.Point;
33 import org.eclipse.swt.layout.GridData;
34 import org.eclipse.swt.layout.GridLayout;
35 import org.eclipse.swt.widgets.Button;
36 import org.eclipse.swt.widgets.Composite;
37 import org.eclipse.swt.widgets.Control;
38 import org.eclipse.swt.widgets.Display;
39 import org.eclipse.swt.widgets.Label;
40 import org.eclipse.swt.widgets.Shell;
41 import org.eclipse.swt.widgets.Text;
42
43 /**
44 * Connect to a remote repository and, if successful publish it as an OSGi
45 * service.
46 */
47 public class AddRemoteRepository extends AbstractHandler implements WorkbenchConstants, ArgeoNames {
48
49 private RepositoryFactory repositoryFactory;
50 private Repository nodeRepository;
51 private Keyring keyring;
52
53 public Object execute(ExecutionEvent event) throws ExecutionException {
54 RemoteRepositoryLoginDialog dlg = new RemoteRepositoryLoginDialog(Display.getDefault().getActiveShell());
55 if (dlg.open() == Dialog.OK) {
56 CommandUtils.callCommand(Refresh.ID);
57 }
58 return null;
59 }
60
61 public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
62 this.repositoryFactory = repositoryFactory;
63 }
64
65 public void setKeyring(Keyring keyring) {
66 this.keyring = keyring;
67 }
68
69 public void setNodeRepository(Repository nodeRepository) {
70 this.nodeRepository = nodeRepository;
71 }
72
73 class RemoteRepositoryLoginDialog extends TitleAreaDialog {
74 private static final long serialVersionUID = 2234006887750103399L;
75 private Text name;
76 private Text uri;
77 private Text username;
78 private Text password;
79 private Button saveInKeyring;
80
81 public RemoteRepositoryLoginDialog(Shell parentShell) {
82 super(parentShell);
83 }
84
85 protected Point getInitialSize() {
86 return new Point(600, 400);
87 }
88
89 protected Control createDialogArea(Composite parent) {
90 Composite dialogarea = (Composite) super.createDialogArea(parent);
91 dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
92 Composite composite = new Composite(dialogarea, SWT.NONE);
93 composite.setLayout(new GridLayout(2, false));
94 composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
95 setMessage("Login to remote repository", IMessageProvider.NONE);
96 name = createLT(composite, "Name", "remoteRepository");
97 uri = createLT(composite, "URI", "http://localhost:7070/jcr/node");
98 username = createLT(composite, "User", "");
99 password = createLP(composite, "Password");
100
101 saveInKeyring = createLC(composite, "Remember password", false);
102 parent.pack();
103 return composite;
104 }
105
106 @Override
107 protected void createButtonsForButtonBar(Composite parent) {
108 super.createButtonsForButtonBar(parent);
109 Button test = createButton(parent, 2, "Test", false);
110 test.addSelectionListener(new SelectionAdapter() {
111 private static final long serialVersionUID = -1829962269440419560L;
112
113 public void widgetSelected(SelectionEvent arg0) {
114 testConnection();
115 }
116 });
117 }
118
119 void testConnection() {
120 Session session = null;
121 try {
122 URI checkedUri = new URI(uri.getText());
123 String checkedUriStr = checkedUri.toString();
124
125 Hashtable<String, String> params = new Hashtable<String, String>();
126 params.put(NodeConstants.LABELED_URI, checkedUriStr);
127 Repository repository = repositoryFactory.getRepository(params);
128 if (username.getText().trim().equals("")) {// anonymous
129 // FIXME make it more generic
130 session = repository.login("main");
131 } else {
132 // FIXME use getTextChars() when upgrading to 3.7
133 // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=297412
134 char[] pwd = password.getText().toCharArray();
135 SimpleCredentials sc = new SimpleCredentials(username.getText(), pwd);
136 session = repository.login(sc, "main");
137 MessageDialog.openInformation(getParentShell(), "Success",
138 "Connection to '" + uri.getText() + "' successful");
139 }
140 } catch (Exception e) {
141 ErrorFeedback.show("Connection test failed for " + uri.getText(), e);
142 } finally {
143 JcrUtils.logoutQuietly(session);
144 }
145 }
146
147 @Override
148 protected void okPressed() {
149 Session nodeSession = null;
150 try {
151 nodeSession = nodeRepository.login();
152 Node home = NodeUtils.getUserHome(nodeSession);
153
154 Node remote = home.hasNode(ARGEO_REMOTE) ? home.getNode(ARGEO_REMOTE) : home.addNode(ARGEO_REMOTE);
155 if (remote.hasNode(name.getText()))
156 throw new EclipseUiException("There is already a remote repository named " + name.getText());
157 Node remoteRepository = remote.addNode(name.getText(), ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
158 remoteRepository.setProperty(ARGEO_URI, uri.getText());
159 remoteRepository.setProperty(ARGEO_USER_ID, username.getText());
160 nodeSession.save();
161 if (saveInKeyring.getSelection()) {
162 String pwdPath = remoteRepository.getPath() + '/' + ARGEO_PASSWORD;
163 keyring.set(pwdPath, password.getText().toCharArray());
164 }
165 nodeSession.save();
166 MessageDialog.openInformation(getParentShell(), "Repository Added",
167 "Remote repository '" + username.getText() + "@" + uri.getText() + "' added");
168
169 super.okPressed();
170 } catch (Exception e) {
171 ErrorFeedback.show("Cannot add remote repository", e);
172 } finally {
173 JcrUtils.logoutQuietly(nodeSession);
174 }
175 }
176
177 /** Creates label and text. */
178 protected Text createLT(Composite parent, String label, String initial) {
179 new Label(parent, SWT.NONE).setText(label);
180 Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
181 text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
182 text.setText(initial);
183 return text;
184 }
185
186 /** Creates label and check. */
187 protected Button createLC(Composite parent, String label, Boolean initial) {
188 new Label(parent, SWT.NONE).setText(label);
189 Button check = new Button(parent, SWT.CHECK);
190 check.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
191 check.setSelection(initial);
192 return check;
193 }
194
195 protected Text createLP(Composite parent, String label) {
196 new Label(parent, SWT.NONE).setText(label);
197 Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER | SWT.PASSWORD);
198 text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
199 return text;
200 }
201 }
202 }