[jboss-svn-commits] JBL Code SVN: r20833 - in labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools: META-INF and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 27 17:17:13 EDT 2008


Author: john.graham at jboss.org
Date: 2008-06-27 17:17:13 -0400 (Fri, 27 Jun 2008)
New Revision: 20833

Added:
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/actions/
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/actions/RepositoryElementPropsAction.java
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/GuvnorWorkspaceFilePage.java
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/RepositoryElementPropsDialog.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.properties
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.xml
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/utils/PlatformUtils.java
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvWizardModel.java
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvnorMainConfigPage.java
   labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/NewRepLocationWizard.java
Log:
Break out host, repository location and port fields in "new location" wizard. Add parse handling for paste/drop of complete urls.

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/META-INF/MANIFEST.MF	2008-06-27 21:17:13 UTC (rev 20833)
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin.name
 Bundle-SymbolicName: org.guvnor.tools;singleton:=true
-Bundle-Version: 0.5.0.200806261455
+Bundle-Version: 0.5.0.200806271630
 Bundle-Activator: org.guvnor.tools.Activator
 Bundle-Vendor: %plugin.provider
 Bundle-Localization: plugin

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.properties
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.properties	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.properties	2008-06-27 21:17:13 UTC (rev 20833)
@@ -9,4 +9,7 @@
 wiz.new.repository.location = Guvnor repository location
 wiz.new.repository.location.desc = New Guvnor repository location
 
-persp.name = Guvnor Repository Exploring
\ No newline at end of file
+persp.name = Guvnor Repository Exploring
+
+action.properties = Properties
+action.properties.tooltip = Show properties for the selected element
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.xml
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.xml	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/plugin.xml	2008-06-27 21:17:13 UTC (rev 20833)
@@ -78,4 +78,23 @@
                    class="org.guvnor.tools.perspectives.GuvnorRepExplorerPerspective"
                    id="org.guvnor.tools.perspectives.GuvnorRepExplorerPerspective"/>
   </extension>
+  
+  <extension point="org.eclipse.ui.popupMenus">
+  	<objectContribution objectClass="org.guvnor.tools.views.model.TreeObject"
+                        adaptable="true"
+                        id="org.guvnor.tools.view.model.actions">
+    	<action label="%action.properties"
+                tooltip="%action.properties.tooltip"
+                class="org.guvnor.tools.actions.RepositoryElementPropsAction"
+                menubarPath="additions"
+                id="org.guvnor.tools.view.model.actions.properties">
+         </action>
+  	</objectContribution>
+  </extension>
+  
+  <extension point = "org.eclipse.ui.propertyPages">
+        <page id="org.guvnor.tools.proppage.ifile"
+              name="%category.name"
+	          class="org.guvnor.tools.properties.GuvnorWorkspaceFilePage"/>
+  </extension>
 </plugin>

Added: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/actions/RepositoryElementPropsAction.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/actions/RepositoryElementPropsAction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/actions/RepositoryElementPropsAction.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -0,0 +1,52 @@
+package org.guvnor.tools.actions;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.guvnor.tools.Activator;
+import org.guvnor.tools.properties.RepositoryElementPropsDialog;
+import org.guvnor.tools.utils.PlatformUtils;
+import org.guvnor.tools.views.model.TreeObject;
+
+public class RepositoryElementPropsAction implements IViewActionDelegate {
+
+	private TreeObject node;
+	
+	public void init(IViewPart view) { }
+
+	public void run(IAction action) {
+		if (node == null) {
+			return;
+		}
+		
+		Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().
+									getActivePage().getActivePart().getSite().getShell();
+		RepositoryElementPropsDialog diag = new RepositoryElementPropsDialog(shell, node);
+		if (diag.open() == Dialog.OK
+		   && diag.wereSecuritySettingModified()) {
+			// Have to update security settings for this repository
+			try {
+				PlatformUtils.getInstance().
+					updateAuthentication(node.getGuvnorRepository().getLocation(), 
+							            diag.getUsername(), diag.getPassword(), diag.saveAuthenInfo());
+			} catch (Exception e) {
+				Activator.getDefault().writeLog(IStatus.ERROR, e.getMessage(), e);
+			}
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection sel = (IStructuredSelection)selection;
+			if (sel.getFirstElement() instanceof TreeObject) {
+				node = (TreeObject)sel.getFirstElement();
+			}
+		}
+	}
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/GuvnorWorkspaceFilePage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/GuvnorWorkspaceFilePage.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/GuvnorWorkspaceFilePage.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -0,0 +1,97 @@
+package org.guvnor.tools.properties;
+
+import java.util.Properties;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+public class GuvnorWorkspaceFilePage extends PropertyPage implements IWorkbenchPropertyPage {
+
+	public GuvnorWorkspaceFilePage() {
+		
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Composite composite = createComposite(parent, 2);
+		IResource resource = (IResource)super.getElement().getAdapter(IResource.class);
+		if (resource != null) {
+			displayGuvnorProperties(composite, findGuvnorMetadata(resource));
+		} else {
+			indicateNotGuvnorAssociated(composite);
+		}
+		return composite;
+	}
+	
+	private void displayGuvnorProperties(Composite composite, IFile md) {
+		if (md == null) {
+			indicateNotGuvnorAssociated(composite);
+		} else {
+			try {
+				Properties props = new Properties();
+				props.load(md.getContents());
+				addGuvnorProperties(composite, props);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	private void addGuvnorProperties(Composite composite, Properties props) {
+		new Label(composite, SWT.NONE).setText("Local name:");
+		Label l = new Label(composite, SWT.NONE);
+		String val = props.getProperty("filename") != null?props.getProperty("filename"):"";
+		l.setText(val);
+		
+		new Label(composite, SWT.NONE).setText("Repository:");
+		l = new Label(composite, SWT.NONE);
+		val = props.getProperty("repository") != null?props.getProperty("repository"):"";
+		l.setText(val);
+		
+		new Label(composite, SWT.NONE).setText("Repository Path:");
+		l = new Label(composite, SWT.NONE);
+		val = props.getProperty("fullpath") != null?props.getProperty("fullpath"):"";
+		l.setText(val);
+		
+		new Label(composite, SWT.NONE).setText("Repository Version:");
+		l = new Label(composite, SWT.NONE);
+		val = props.getProperty("lastmodified") != null?props.getProperty("lastmodified"):"";
+		l.setText(val);
+	}
+
+	private void indicateNotGuvnorAssociated(Composite composite) {
+		new Label(composite, SWT.NONE).setText("(Not associated with Guvnor)");
+	}
+	
+	private IFile findGuvnorMetadata(IResource resource) {
+		IFile res = null;
+		IPath dir = resource.getFullPath().removeLastSegments(1);
+		IPath mdpath = dir.append(".guvnorinfo").append(resource.getName());
+		IResource mdResource = resource.getWorkspace().getRoot().findMember(mdpath);
+		if (mdResource != null 
+		   && mdResource.exists() 
+		   && mdResource instanceof IFile) {
+			res = (IFile)mdResource;
+		}
+		return res;
+	}
+	
+	private Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		return composite;
+	}
+}

Added: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/RepositoryElementPropsDialog.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/RepositoryElementPropsDialog.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/properties/RepositoryElementPropsDialog.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -0,0 +1,195 @@
+package org.guvnor.tools.properties;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.guvnor.tools.Activator;
+import org.guvnor.tools.views.model.TreeObject;
+
+public class RepositoryElementPropsDialog extends TitleAreaDialog {
+	
+	private static final int INITIAL_WIDTH = 780;
+	private static final int INITIAL_HEIGHT = 400;
+	
+	private TreeObject node;
+	private Text unField;
+	private Text pwField;
+	private Button cbSavePassword;
+	private String username;
+	private String password;
+	private boolean saveInfo;
+	
+	public RepositoryElementPropsDialog(Shell parentShell, TreeObject node) {
+		super(parentShell);
+		super.setShellStyle(getShellStyle() | SWT.RESIZE);
+		this.node = node;
+	}
+	
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		super.setTitle("Guvnor Repository Element");
+		super.setMessage("Properties for element: " + node.getName());
+		super.setTitleImage(Activator.getImageDescriptor(Activator.IMG_GUVREPWIZBAN).createImage());
+		
+		TabFolder folder = new TabFolder(parent, SWT.TOP);
+		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
+		TabItem tab = new TabItem(folder, SWT.NONE);
+		tab.setText("Basic");
+		Composite composite = createComposite(folder, 2);
+		tab.setControl(composite);
+		addElementProperties(composite);
+		
+		tab = new TabItem(folder, SWT.NONE);
+		tab.setText("Security");
+		composite = createComposite(folder, 2);
+		tab.setControl(composite);
+		addSecurityProperties(composite);
+		
+		return super.createDialogArea(parent);
+	}
+	
+	private void addElementProperties(Composite composite) {
+		IPropertySource ps = (IPropertySource)node.getAdapter(IPropertySource.class);
+		if (ps == null) {
+			return;
+		}
+		IPropertyDescriptor[] desc = ps.getPropertyDescriptors();
+		for (int i = 0; i < desc.length; i++) {
+			if (desc[i] instanceof TextPropertyDescriptor) {
+				TextPropertyDescriptor oneDesc = (TextPropertyDescriptor)desc[i];
+				new Label(composite, SWT.NONE).setText(oneDesc.getDisplayName() + ":");
+				String val = ps.getPropertyValue(oneDesc.getId()) != null?
+								(String)ps.getPropertyValue(oneDesc.getId()):"";
+				new Label(composite, SWT.NONE).setText(val);
+			}
+		}
+	}
+	
+	private void addSecurityProperties(Composite composite) {
+		new Label(composite, SWT.NONE).setText("User Name: ");
+		unField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		unField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		unField.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				username = unField.getText();	
+			}
+		});
+		
+		new Label(composite, SWT.NONE).setText("Password: ");
+		pwField = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
+		pwField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		pwField.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				password = pwField.getText();
+			}
+		});
+		
+		new Label(composite, SWT.NONE).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		Composite pwgroup = createComposite(composite, 2);
+		cbSavePassword = new Button(pwgroup, SWT.CHECK);
+		cbSavePassword.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent e) { }
+
+			public void widgetSelected(SelectionEvent e) {
+				saveInfo = cbSavePassword.getSelection();
+			}
+			
+		});
+			
+		new Label(pwgroup, SWT.NONE).setText("Save user name and password");
+		
+		new Label(composite, SWT.NONE).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		new Label(composite, SWT.WRAP).setText("NOTE: Saved passwords are stored on your computer in a file that is difficult, but not impossible, for an intruder to read.");
+		
+		populateSecuritySettings();
+		if (unField.getText().trim().length() == 0) {
+			cbSavePassword.setSelection(false);
+		} else {
+			// WTF? setSelection(true) is not picked up by the control, so we have to set 
+			// this initial value explicitly. After that toggle seems to work...
+			saveInfo = true;
+			cbSavePassword.setSelection(true);
+		}
+	}
+	
+	@SuppressWarnings("unchecked")
+	private void populateSecuritySettings() {
+		try {
+			Map info = Platform.getAuthorizationInfo(
+					new URL(node.getGuvnorRepository().getLocation()), "", "basic");
+			if (info == null) {
+				return;
+			}
+			String un = (String)info.get("username");
+			if (un != null) {
+				unField.setText(un);
+			}
+			String pw = (String)info.get("password");
+			if (pw != null) {
+				pwField.setText(pw);
+			}
+		} catch (MalformedURLException e) {
+			Activator.getDefault().writeLog(IStatus.ERROR, e.getMessage(), e);
+		}
+	}
+	
+	@Override
+	protected Point getInitialSize() {
+		// Try to set a reasonable default size.
+		return new Point(INITIAL_WIDTH, INITIAL_HEIGHT);
+	}
+	
+	private Composite createComposite(Composite parent, int numColumns) {
+		Composite composite = new Composite(parent, SWT.NULL);
+		
+		GridLayout layout = new GridLayout();
+		layout.numColumns = numColumns;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		return composite;
+	}
+
+	public String getUsername() {
+		return username;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public boolean saveAuthenInfo() {
+		return saveInfo;
+	}
+	
+	public boolean wereSecuritySettingModified() {
+		// If username or password is not null,
+		// then the user changed the text in at least
+		// one of those boxes.
+		return username != null || password != null; 
+	}
+}

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/utils/PlatformUtils.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/utils/PlatformUtils.java	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/utils/PlatformUtils.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -18,6 +18,8 @@
 import org.eclipse.ui.PlatformUI;
 import org.guvnor.tools.Activator;
 import org.guvnor.tools.utils.webdav.IWebDavClient;
+import org.guvnor.tools.utils.webdav.WebDavClientFactory;
+import org.guvnor.tools.utils.webdav.WebDavServerCache;
 import org.guvnor.tools.utils.webdav.WebDavSessionAuthenticator;
 
 /**
@@ -83,6 +85,28 @@
 		}
 	}
 	
+	public void updateAuthentication(String server, String username, 
+			                        String password, boolean saveInfo) throws Exception {
+		Map<String, String> info = new HashMap<String, String>();
+		info.put("username", username);
+		info.put("password", password);
+		URL serverUrl = new URL(server);
+		IWebDavClient client = WebDavServerCache.getWebDavClient(server);
+		if (client == null) {
+			client = WebDavClientFactory.createClient(serverUrl);
+			WebDavServerCache.cacheWebDavClient(server, client);
+		}
+		if (saveInfo) {
+			Platform.flushAuthorizationInfo(serverUrl, "", "basic");
+			Platform.addAuthorizationInfo(serverUrl, "", "basic", info);
+		} else {
+			WebDavSessionAuthenticator authen = new WebDavSessionAuthenticator();
+			authen.addAuthenticationInfo(new URL(server), "", "basic", info);
+			client.setSessionAuthenticator(authen);
+			client.setSessionAuthentication(true);
+		}
+	}
+	
 	/**
 	 * Convenience method for reporting log in failure
 	 */

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvWizardModel.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvWizardModel.java	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvWizardModel.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -7,6 +7,7 @@
 	private String username;
 	private String password;
 	private boolean createNewRep;
+	private boolean saveAuthInfo;
 	
 	private String targetProject;
 	private boolean createNewProj;
@@ -21,13 +22,13 @@
 		this.repLocation = repLocation;
 	}
 	public String getUsername() {
-		return username;
+		return username != null?username:"";
 	}
 	public void setUsername(String username) {
 		this.username = username;
 	}
 	public String getPassword() {
-		return password;
+		return password != null?password:"";
 	}
 	public void setPassword(String password) {
 		this.password = password;
@@ -47,9 +48,15 @@
 	public boolean isCreateNewProj() {
 		return createNewProj;
 	}
+	public boolean shouldSaveAuthInfo() {
+		return saveAuthInfo;
+	}
 	public void setCreateNewProj(boolean createNewProj) {
 		this.createNewProj = createNewProj;
 	}
+	public void setSaveAuthInfo(boolean saveAuthInfo) {
+		this.saveAuthInfo = saveAuthInfo;
+	}
 	public List<String> getResources() {
 		return resources;
 	}

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvnorMainConfigPage.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvnorMainConfigPage.java	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/GuvnorMainConfigPage.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -1,22 +1,41 @@
 package org.guvnor.tools.wizards;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.wizard.WizardPage;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
+import org.guvnor.tools.Activator;
 
 public class GuvnorMainConfigPage extends WizardPage {
 	
-	private Text locationField;
+	private Text serverField;
+	private Text portField;
+	private Text replocField;
 	private Text unField;
 	private Text pwField;
 	
+	private Button cbSavePassword;
+	private boolean saveAuthInfo;
+	
 	public GuvnorMainConfigPage(String pageName) {
 		super(pageName);
 	}
@@ -29,21 +48,33 @@
 		
 		Composite composite = createComposite(parent, 2);
 		new Label(composite, SWT.NONE).setText("Location: ");
-		locationField = new Text(composite, SWT.SINGLE | SWT.BORDER);
-		locationField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		locationField.addModifyListener(new ModifyListener() {
-
+		serverField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		serverField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		serverField.addModifyListener(new ModifyListener() {
 			public void modifyText(ModifyEvent e) {
-				if (locationField.getText().trim().length() > 0) {
-					GuvnorMainConfigPage.super.setPageComplete(true);
-				} else {
-					GuvnorMainConfigPage.super.setPageComplete(false);
-				}
 				updateModel();
 			}
-			
 		});
+		addDropSupport(serverField);
 		
+		new Label(composite, SWT.NONE).setText("Port: ");
+		portField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		portField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		portField.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				updateModel();
+			}
+		});
+		
+		new Label(composite, SWT.NONE).setText("Repository: ");
+		replocField = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		replocField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		replocField.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				updateModel();
+			}
+		});
+		
 		new Label(composite, SWT.NONE).setText("User Name: ");
 		unField = new Text(composite, SWT.SINGLE | SWT.BORDER);
 		unField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@@ -63,11 +94,84 @@
 		});
 
 		new Label(composite, SWT.NONE).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		
+		Composite pwgroup = createComposite(composite, 2);
+		cbSavePassword = new Button(pwgroup, SWT.CHECK);
+		cbSavePassword.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) { }
+
+			public void widgetSelected(SelectionEvent e) {
+				saveAuthInfo = cbSavePassword.getSelection();
+				updateModel();
+			}
+			
+		});
+		// WTF? setSelection(true) is not picked up by the control, so we have to set 
+		// this initial value explicitly. After that toggle seems to work...
+		saveAuthInfo = true;
+		cbSavePassword.setSelection(true);
+		
+		new Label(pwgroup, SWT.NONE).setText("Save user name and password");
+		new Label(composite, SWT.NONE).setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
 		new Label(composite, SWT.WRAP).setText("NOTE: Saved passwords are stored on your computer in a file that is difficult, but not impossible, for an intruder to read.");
 		
 		super.setControl(composite);
 	}
 
+	private void addDropSupport(Text field) {
+		int operations = DND.DROP_COPY | DND.DROP_DEFAULT;
+		DropTarget target = new DropTarget(field, operations);
+		final TextTransfer textTransfer = TextTransfer.getInstance();
+		Transfer[] types = new Transfer[] { textTransfer };
+		target.setTransfer(types);
+		target.addDropListener(new DropTargetListener() {
+			public void dragEnter(DropTargetEvent event) {
+				if (event.detail == DND.DROP_DEFAULT) {
+					if ((event.operations & DND.DROP_COPY) != 0) {
+						event.detail = DND.DROP_COPY;
+					} else {
+						event.detail = DND.DROP_NONE;
+					}
+				}
+			}
+
+			public void dragLeave(DropTargetEvent event) { }
+
+			public void dragOperationChanged(DropTargetEvent event) {
+				if (event.detail == DND.DROP_DEFAULT) {
+					if ((event.operations & DND.DROP_COPY) != 0) {
+						event.detail = DND.DROP_COPY;
+					} else {
+						event.detail = DND.DROP_NONE;
+					}
+				}
+			}
+
+			public void dragOver(DropTargetEvent event) {
+				event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
+			}
+
+			public void drop(DropTargetEvent event) {
+				if (textTransfer.isSupportedType(event.currentDataType)) {
+					parseCandidateUrl((String)event.data);
+				}
+			}
+
+			public void dropAccept(DropTargetEvent event) { }
+		});
+	}
+	
+	private void parseCandidateUrl(String dropped) {
+		try {
+			URL server = new URL(dropped);
+			serverField.setText(server.getHost());
+			portField.setText(String.valueOf(server.getPort()));
+			replocField.setText(server.getFile());
+		} catch (MalformedURLException e) {
+			Activator.getDefault().writeLog(IStatus.ERROR, e.getMessage(), e);
+		}
+	}
+	
 	private Composite createComposite(Composite parent, int numColumns) {
 		Composite composite = new Composite(parent, SWT.NULL);
 		
@@ -80,9 +184,55 @@
 	
 	private void updateModel() {
 		GuvWizardModel model = ((IGuvnorWizard)super.getWizard()).getModel();
-		model.setRepLocation(locationField.getText());
-		model.setUsername(unField.getText());
-		model.setPassword(pwField.getText());
-		model.setCreateNewRep(true);
+		try {
+			URL server = validateUrl();
+			model.setRepLocation(server.toString());
+			model.setUsername(unField.getText());
+			model.setPassword(pwField.getText());
+			model.setSaveAuthInfo(saveAuthInfo);
+			model.setCreateNewRep(true);
+			GuvnorMainConfigPage.super.setPageComplete(true);
+		} catch (Exception e) {
+			GuvnorMainConfigPage.super.setPageComplete(false);
+		}
 	}
+
+	private URL validateUrl() throws Exception {
+		// First we'll test if the server text box is a complete
+		// URL in itself. If so, we'll parse it out into the other
+		// fields and leave early
+		URL res = testCompleteField();
+		if (res != null) {
+			return res;
+		}
+		// Try to construct a valid URL from the text boxes
+		String repPath = null;
+		if (replocField.getText().trim().length() > 0) {
+			if (replocField.getText().startsWith("/")) {
+				repPath = replocField.getText();
+			} else {
+				repPath = "/" + replocField.getText();
+			}
+		} else {
+			repPath = "";
+		}
+		if (portField.getText().trim().length() > 0) {
+			int port = Integer.parseInt(portField.getText());
+			res = new URL("http", serverField.getText(), port, repPath);
+		} else {
+			res = new URL("http", serverField.getText(), repPath);
+		}
+		return res;
+	}
+	
+	private URL testCompleteField() {
+		URL res = null;
+		try {
+			res = new URL(serverField.getText());
+			parseCandidateUrl(res.toString());
+		} catch (MalformedURLException e) {
+			// If it is not a valid URL, we just move along...
+		}
+		return res;
+	}
 }

Modified: labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/NewRepLocationWizard.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/NewRepLocationWizard.java	2008-06-27 16:11:00 UTC (rev 20832)
+++ labs/jbossrules/trunk/drools-eclipse/org.guvnor.tools/src/org/guvnor/tools/wizards/NewRepLocationWizard.java	2008-06-27 21:17:13 UTC (rev 20833)
@@ -12,6 +12,10 @@
 import org.eclipse.ui.IWorkbench;
 import org.guvnor.tools.Activator;
 import org.guvnor.tools.GuvnorRepository;
+import org.guvnor.tools.utils.webdav.IWebDavClient;
+import org.guvnor.tools.utils.webdav.WebDavClientFactory;
+import org.guvnor.tools.utils.webdav.WebDavServerCache;
+import org.guvnor.tools.utils.webdav.WebDavSessionAuthenticator;
 
 public class NewRepLocationWizard extends Wizard implements INewWizard, IGuvnorWizard {
 	
@@ -28,6 +32,7 @@
 	public void addPages() {
 		mainPage = new GuvnorMainConfigPage("config_page", "New Guvnor location", 
 										Activator.getImageDescriptor(Activator.IMG_GUVLOCADD));
+		mainPage.setDescription("Create a new Guvnor repository connection");
 		super.addPage(mainPage);
 		super.addPages();
 	}
@@ -40,11 +45,20 @@
 	public boolean performFinish() {
 		try {
 			Activator.getLocationManager().addRepository(new GuvnorRepository(model.getRepLocation()));
+			URL serverUrl = new URL(model.getRepLocation());
 			Map<String, String> info = new HashMap<String, String>();
-			//TODO: Deal with case where un or password are not specified
 			info.put("username", model.getUsername());
 			info.put("password", model.getPassword());
-			Platform.addAuthorizationInfo(new URL(model.getRepLocation()), "", "basic", info);
+			if (model.shouldSaveAuthInfo()) {
+				Platform.addAuthorizationInfo(serverUrl, "", "basic", info);	
+			} else {
+				IWebDavClient client = WebDavClientFactory.createClient(serverUrl);
+				WebDavServerCache.cacheWebDavClient(serverUrl.toString(), client);
+				WebDavSessionAuthenticator authen = new WebDavSessionAuthenticator();
+				authen.addAuthenticationInfo(serverUrl, "", "basic", info);
+				client.setSessionAuthenticator(authen);
+				client.setSessionAuthentication(true);
+			}
 		} catch (Exception e) {
 			Activator.getDefault().writeLog(IStatus.ERROR, e.getMessage(), e);
 		}




More information about the jboss-svn-commits mailing list