package org.safehaus.penrose.studio.federation.nis.ownership; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.swt.widgets.*; import org.eclipse.swt.widgets.List; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.apache.log4j.Logger; import org.safehaus.penrose.ldap.*; import org.safehaus.penrose.filter.OrFilter; import org.safehaus.penrose.filter.SimpleFilter; import org.safehaus.penrose.filter.AndFilter; import org.safehaus.penrose.federation.NISRepositoryClient; import org.safehaus.penrose.federation.FederationRepositoryConfig; import org.safehaus.penrose.federation.Federation; import org.safehaus.penrose.studio.dialog.ErrorDialog; import org.safehaus.penrose.studio.server.Server; import org.safehaus.penrose.client.PenroseClient; import org.safehaus.penrose.partition.PartitionClient; import org.safehaus.penrose.source.SourceClient; import org.safehaus.penrose.source.SourceManagerClient; import org.safehaus.penrose.partition.PartitionManagerClient; /** * @author Endi S. Dewata */ public class NISFilesPage extends FormPage implements Runnable { Logger log = Logger.getLogger(getClass()); FormToolkit toolkit; protected Text uidText; protected Text gidText; protected List hostsList; Label messageLabel; Table table; NISFilesEditor editor; Server server; NISRepositoryClient nisFederation; FederationRepositoryConfig domain; public NISFilesPage(NISFilesEditor editor) { super(editor, "FILES", " Files "); this.editor = editor; this.server = editor.server; this.domain = editor.getDomain(); this.nisFederation = editor.getNisTool(); } public void createFormContent(IManagedForm managedForm) { toolkit = managedForm.getToolkit(); ScrolledForm form = managedForm.getForm(); form.setText("NIS Files"); Composite body = form.getBody(); body.setLayout(new GridLayout()); Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.EXPANDED); section.setText("Search"); section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Control sourcesSection = createActionSection(section); section.setClient(sourcesSection); section = toolkit.createSection(body, Section.TITLE_BAR | Section.EXPANDED); section.setText("Results"); section.setLayoutData(new GridData(GridData.FILL_BOTH)); Control resultsSection = createResultsSection(section); section.setClient(resultsSection); init(); } public void init() { try { SearchRequest request = new SearchRequest(); request.setFilter("(domain="+domain.getName()+")"); SearchResponse response = new SearchResponse() { public void add(SearchResult result) throws Exception { Attributes attributes = result.getAttributes(); String name = (String)attributes.getValue("name"); String paths = (String)attributes.getValue("paths"); String host = name+":"+paths; hostsList.add(host); hostsList.setData(host, result); } }; PenroseClient client = server.getClient(); PartitionManagerClient partitionManagerClient = client.getPartitionManagerClient(); PartitionClient partitionClient = partitionManagerClient.getPartitionClient(Federation.FEDERATION); SourceManagerClient sourceManagerClient = partitionClient.getSourceManagerClient(); SourceClient sourceClient = sourceManagerClient.getSourceClient("penrose_hosts"); sourceClient.search(request, response); //nisFederation.getHosts().search(request, response); hostsList.selectAll(); } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } } public Composite createActionSection(Composite parent) { Composite composite = toolkit.createComposite(parent); composite.setLayout(new GridLayout(3, false)); Label uidLabel = toolkit.createLabel(composite, "UID:"); GridData gd = new GridData(); gd.widthHint = 100; uidLabel.setLayoutData(gd); uidText = toolkit.createText(composite, "", SWT.BORDER); gd = new GridData(); gd.horizontalSpan = 2; gd.widthHint = 100; uidText.setLayoutData(gd); Label gidLabel = toolkit.createLabel(composite, "GID:"); gidLabel.setLayoutData(new GridData()); gidText = toolkit.createText(composite, "", SWT.BORDER); gd = new GridData(); gd.horizontalSpan = 2; gd.widthHint = 100; gidText.setLayoutData(gd); Label hostLabel = toolkit.createLabel(composite, "Hosts:"); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; hostLabel.setLayoutData(gd); hostsList = new List(composite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.heightHint = 80; hostsList.setLayoutData(gd); new Label(composite, SWT.NONE); Composite links = toolkit.createComposite(composite); links.setLayout(new RowLayout()); links.setLayoutData(new GridData(GridData.FILL_VERTICAL)); Hyperlink selectAllLink = toolkit.createHyperlink(links, "Select All", SWT.NONE); selectAllLink.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent event) { hostsList.selectAll(); } }); Hyperlink selectNoneLink = toolkit.createHyperlink(links, "Select None", SWT.NONE); selectNoneLink.addHyperlinkListener(new HyperlinkAdapter() { public void linkActivated(HyperlinkEvent event) { hostsList.deselectAll(); } }); Button runButton = new Button(composite, SWT.PUSH); runButton.setText(" Search "); gd = new GridData(); gd.horizontalAlignment = GridData.END; gd.widthHint = 80; runButton.setLayoutData(gd); final Runnable runnable = this; runButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { Display display = editor.getSite().getShell().getDisplay(); display.asyncExec(runnable); } }); return composite; } public Composite createResultsSection(Composite parent) { Composite composite = toolkit.createComposite(parent); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); composite.setLayout(new GridLayout()); messageLabel = toolkit.createLabel(composite, ""); messageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); table = new Table(composite, SWT.BORDER | SWT.FULL_SELECTION); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn tc = new TableColumn(table, SWT.NONE); tc.setText("Hostname"); tc.setWidth(150); tc = new TableColumn(table, SWT.NONE); tc.setText("File"); tc.setWidth(400); tc = new TableColumn(table, SWT.NONE); tc.setText("UID"); tc.setWidth(50); tc = new TableColumn(table, SWT.NONE); tc.setText("GID"); tc.setWidth(50); return composite; } public void run() { try { runImpl(); } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } } public void runImpl() throws Exception { table.removeAll(); if (hostsList.getSelectionCount() == 0) return; long counter = 0; AndFilter filter = new AndFilter(); OrFilter hostnameFilter = new OrFilter(); for (String host : hostsList.getSelection()) { SearchResult result = (SearchResult) hostsList.getData(host); Attributes attributes = result.getAttributes(); final String hostname = (String)attributes.getValue("name"); hostnameFilter.addFilter(new SimpleFilter("hostname", "=", hostname)); } filter.addFilter(hostnameFilter); if (!"".equals(uidText.getText())) { filter.addFilter(new SimpleFilter("uidNumber", "=", new Integer(uidText.getText()))); } if (!"".equals(gidText.getText())) { filter.addFilter(new SimpleFilter("gidNumber", "=", new Integer(gidText.getText()))); } SearchRequest request = new SearchRequest(); request.setFilter(filter); request.setSizeLimit(100); SearchResponse response = new SearchResponse() { public void add(SearchResult result) { Attributes attributes = result.getAttributes(); String hostname = (String)attributes.getValue("hostname"); String path = (String)attributes.getValue("path"); Integer uidNumber = (Integer)attributes.getValue("uidNumber"); Integer gidNumber = (Integer)attributes.getValue("gidNumber"); TableItem ti = new TableItem(table, SWT.NONE); ti.setText(0, hostname); ti.setText(1, path); ti.setText(2, ""+uidNumber); ti.setText(3, ""+gidNumber); totalCount++; } }; PenroseClient client = server.getClient(); PartitionManagerClient partitionManagerClient = client.getPartitionManagerClient(); PartitionClient partitionClient = partitionManagerClient.getPartitionClient(Federation.FEDERATION); SourceManagerClient sourceManagerClient = partitionClient.getSourceManagerClient(); SourceClient sourceClient = sourceManagerClient.getSourceClient("penrose_files"); sourceClient.search(request, response); //nisFederation.getFiles().search(request, response); counter += response.getTotalCount(); messageLabel.setText("Found "+counter+" file(s)."); } public List getHostsList() { return hostsList; } public void setHostsList(List hostsList) { this.hostsList = hostsList; } public Text getUidText() { return uidText; } public void setUidText(Text uidText) { this.uidText = uidText; } public Text getGidText() { return gidText; } public void setGidText(Text gidText) { this.gidText = gidText; } }