package org.safehaus.penrose.studio.federation.wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.TreeAdapter;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.ui.progress.IProgressService;
import org.eclipse.ui.PlatformUI;
import org.eclipse.core.runtime.IProgressMonitor;
import org.apache.log4j.Logger;
import org.safehaus.penrose.ldap.*;
import org.safehaus.penrose.partition.PartitionClient;
import org.safehaus.penrose.source.SourceClient;
import org.safehaus.penrose.studio.dialog.ErrorDialog;
import java.lang.reflect.InvocationTargetException;
/**
* @author Endi Sukma Dewata
*/
public class BrowserPage extends WizardPage {
Logger log = Logger.getLogger(getClass());
public final static String NAME = "Browser";
Tree tree;
Text dnText;
private DN baseDn;
private PartitionClient partitionClient;
private SourceClient sourceClient;
DN dn;
public BrowserPage() {
super(NAME);
setDescription("Select an entry from the LDAP tree or enter the DN manually.");
}
public void createControl(final Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout());
tree = new Tree(composite, SWT.BORDER);
tree.setLayoutData(new GridData(GridData.FILL_BOTH));
tree.addTreeListener(new TreeAdapter() {
public void treeExpanded(TreeEvent event) {
try {
if (event.item == null) return;
TreeItem parent = (TreeItem)event.item;
expand(parent);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
});
tree.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
if (tree.getSelectionCount() != 1) return;
TreeItem item = tree.getSelection()[0];
DN dn = (DN)item.getData();
dnText.setText(dn.toString());
}
});
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText(baseDn.toString());
item.setData(baseDn);
try {
expand(item);
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e.getMessage(), e);
}
item.setExpanded(true);
dnText = new Text(composite, SWT.BORDER);
dnText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
setControl(composite);
}
public void expand(TreeItem parent) throws Exception {
parent.removeAll();
final DN parentDn = (DN)parent.getData();
final SearchRequest request = new SearchRequest();
request.setDn(parentDn);
request.setScope(SearchRequest.SCOPE_ONE);
request.setAttributes(new String[] { "dn" });
final SearchResponse response = new SearchResponse();
IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
progressService.busyCursorWhile(new IRunnableWithProgress() {
public void run(final IProgressMonitor monitor) throws InvocationTargetException {
try {
monitor.beginTask("Searching "+parentDn+"...", IProgressMonitor.UNKNOWN);
monitor.subTask("Searching "+parentDn+"...");
sourceClient.search(request, response);
monitor.worked(1);
} catch (Exception e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
}
}
});
while (response.hasNext()) {
SearchResult result = response.next();
DN dn = result.getDn();
TreeItem item = new TreeItem(parent, SWT.NONE);
item.setText(dn.getRdn().toString());
item.setData(dn);
new TreeItem(item, SWT.NONE);
}
}
public DN getBaseDn() {
return baseDn;
}
public void setBaseDn(DN baseDn) {
this.baseDn = baseDn;
}
public PartitionClient getPartitionClient() {
return partitionClient;
}
public void setPartitionClient(PartitionClient partitionClient) {
this.partitionClient = partitionClient;
}
public SourceClient getSourceClient() {
return sourceClient;
}
public void setSourceClient(SourceClient sourceClient) {
this.sourceClient = sourceClient;
}
public String getDn() {
return dnText.getText();
}
public void setDn(String dn) {
this.dn = new DN(dn);
}
}