package org.safehaus.penrose.studio.federation.nis.editor;
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.IManagedForm;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
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.federation.*;
import org.safehaus.penrose.studio.federation.nis.ownership.NISHostDialog;
import org.safehaus.penrose.studio.federation.nis.ownership.NISFilesEditor;
import org.safehaus.penrose.studio.nis.dialog.NISUserDialog;
import org.safehaus.penrose.studio.server.Server;
import org.safehaus.penrose.studio.dialog.ErrorDialog;
import org.safehaus.penrose.module.ModuleClient;
import org.safehaus.penrose.module.ModuleManagerClient;
import org.safehaus.penrose.source.SourceClient;
import org.safehaus.penrose.source.SourceManagerClient;
import org.safehaus.penrose.partition.PartitionClient;
import org.safehaus.penrose.partition.PartitionManagerClient;
import org.safehaus.penrose.client.PenroseClient;
import java.util.Date;
import java.util.Collection;
import java.util.ArrayList;
import java.rmi.registry.Registry;
/**
* @author Endi S. Dewata
*/
public class NISHostsPage extends FormPage {
Logger log = Logger.getLogger(getClass());
FormToolkit toolkit;
NISFilesEditor editor;
Server server;
NISRepositoryClient nisFederation;
FederationRepositoryConfig domain;
Table hostsTable;
public NISHostsPage(NISFilesEditor editor) {
super(editor, "HOSTS", " Hosts ");
this.editor = editor;
this.server = editor.getServer();
this.nisFederation = editor.getNisTool();
this.domain = editor.getDomain();
}
public void createFormContent(IManagedForm managedForm) {
toolkit = managedForm.getToolkit();
ScrolledForm form = managedForm.getForm();
form.setText("NIS Hosts");
Composite body = form.getBody();
body.setLayout(new GridLayout());
Section section = toolkit.createSection(body, Section.TITLE_BAR | Section.EXPANDED);
section.setText("Hosts");
section.setLayoutData(new GridData(GridData.FILL_BOTH));
Control sourcesSection = createHostsSection(section);
section.setClient(sourcesSection);
refresh();
}
public void setActive(boolean b) {
super.setActive(b);
if (b) refresh();
}
public void refresh() {
try {
int indices[] = hostsTable.getSelectionIndices();
hostsTable.removeAll();
SearchRequest request = new SearchRequest();
request.setFilter("(domain="+domain.getName()+")");
SearchResponse response = new SearchResponse() {
public void add(SearchResult result) {
Attributes attributes = result.getAttributes();
String name = (String) attributes.getValue("name");
Integer port = (Integer) attributes.getValue("port");
String paths = (String) attributes.getValue("paths");
Integer files = (Integer) attributes.getValue("files");
Date lastUpdated = (Date) attributes.getValue("lastUpdated");
String status = (String) attributes.getValue("status");
TableItem ti = new TableItem(hostsTable, SWT.NONE);
ti.setText(0, name);
ti.setText(1, port == null ? ""+Registry.REGISTRY_PORT : ""+port);
ti.setText(2, paths == null ? "" : paths);
ti.setText(3, files == null ? "" : ""+files);
ti.setText(4, status == null ? (lastUpdated == null ? "" : ""+lastUpdated) : status);
ti.setData(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);
hostsTable.select(indices);
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
}
public Composite createHostsSection(Composite parent) {
Composite composite = toolkit.createComposite(parent);
composite.setLayout(new GridLayout(2, false));
hostsTable = new Table(composite, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
hostsTable.setLayoutData(new GridData(GridData.FILL_BOTH));
hostsTable.setHeaderVisible(true);
hostsTable.setLinesVisible(true);
TableColumn tc = new TableColumn(hostsTable, SWT.NONE);
tc.setWidth(150);
tc.setText("Hostname");
tc = new TableColumn(hostsTable, SWT.NONE);
tc.setWidth(50);
tc.setText("Port");
tc = new TableColumn(hostsTable, SWT.NONE);
tc.setWidth(120);
tc.setText("Paths");
tc = new TableColumn(hostsTable, SWT.NONE);
tc.setWidth(80);
tc.setText("Files");
tc = new TableColumn(hostsTable, SWT.NONE);
tc.setWidth(130);
tc.setText("Last Updated");
Composite buttons = toolkit.createComposite(composite);
buttons.setLayout(new GridLayout());
GridData gd = new GridData(GridData.FILL_VERTICAL);
gd.widthHint = 120;
buttons.setLayoutData(gd);
Button addButton = new Button(buttons, SWT.PUSH);
addButton.setText("Add");
addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
addButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
try {
add();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
refresh();
}
});
Button editButton = new Button(buttons, SWT.PUSH);
editButton.setText("Edit");
editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
editButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
try {
edit();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
refresh();
}
});
Button removeButton = new Button(buttons, SWT.PUSH);
removeButton.setText("Remove");
removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
removeButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
try {
remove();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
refresh();
}
});
new Label(buttons, SWT.NONE);
Button updateButton = new Button(buttons, SWT.PUSH);
updateButton.setText("Update Files");
updateButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
updateButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
try {
updateFiles();
} catch (Exception e) {
log.error(e.getMessage(), e);
ErrorDialog.open(e);
}
refresh();
}
});
new Label(buttons, SWT.NONE);
Button refreshButton = new Button(buttons, SWT.PUSH);
refreshButton.setText("Refresh");
refreshButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
refreshButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
refresh();
}
});
return composite;
}
public void add() throws Exception {
NISHostDialog dialog = new NISHostDialog(getSite().getShell(), SWT.NONE);
dialog.open();
int action = dialog.getAction();
if (action == NISUserDialog.CANCEL) return;
RDNBuilder rb = new RDNBuilder();
rb.set("domain", domain.getName());
rb.set("name", dialog.getName());
DN dn = new DN(rb.toRdn());
Attributes attributes = new Attributes();
attributes.setValue("domain", domain.getName());
attributes.setValue("name", dialog.getName());
attributes.setValue("port", dialog.getPort());
attributes.setValue("paths", dialog.getPaths());
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.add(dn, attributes);
//nisFederation.getHosts().add(dn, attributes);
}
public void edit() throws Exception {
if (hostsTable.getSelectionCount() == 0) return;
TableItem ti = hostsTable.getSelection()[0];
SearchResult result = (SearchResult) ti.getData();
DN dn = result.getDn();
Attributes attributes = result.getAttributes();
NISHostDialog dialog = new NISHostDialog(getSite().getShell(), SWT.NONE);
dialog.setName((String) attributes.getValue("name"));
dialog.setPort((Integer) attributes.getValue("port"));
dialog.setPaths((String) attributes.getValue("paths"));
dialog.open();
int action = dialog.getAction();
if (action == NISUserDialog.CANCEL) return;
RDNBuilder rb = new RDNBuilder();
rb.set("domain", domain.getName());
rb.set("name", dialog.getName());
RDN newRdn = rb.toRdn();
PenroseClient client = server.getClient();
PartitionManagerClient partitionManagerClient = client.getPartitionManagerClient();
PartitionClient partitionClient = partitionManagerClient.getPartitionClient(Federation.FEDERATION);
SourceManagerClient sourceManagerClient = partitionClient.getSourceManagerClient();
SourceClient sourceClient = sourceManagerClient.getSourceClient("penrose_hosts");
if (!dn.getRdn().equals(newRdn)) {
sourceClient.modrdn(dn, newRdn, true);
//nisFederation.getHosts().modrdn(dn, newRdn, true);
}
DNBuilder db = new DNBuilder();
db.append(newRdn);
db.append(dn.getParentDn());
DN newDn = db.toDn();
Collection<Modification> modifications = new ArrayList<Modification>();
modifications.add(new Modification(
Modification.REPLACE,
new Attribute("port", dialog.getPort())
));
modifications.add(new Modification(
Modification.REPLACE,
new Attribute("paths", dialog.getPaths())
));
sourceClient.modify(newDn, modifications);
//nisFederation.getHosts().modify(newDn, modifications);
}
public void remove() throws Exception {
if (hostsTable.getSelectionCount() == 0) return;
PenroseClient client = server.getClient();
PartitionManagerClient partitionManagerClient = client.getPartitionManagerClient();
PartitionClient partitionClient = partitionManagerClient.getPartitionClient(Federation.FEDERATION);
SourceManagerClient sourceManagerClient = partitionClient.getSourceManagerClient();
SourceClient sourceClient = sourceManagerClient.getSourceClient("penrose_hosts");
TableItem items[] = hostsTable.getSelection();
for (TableItem ti : items) {
SearchResult result = (SearchResult) ti.getData();
DN dn = result.getDn();
sourceClient.delete(dn);
//nisFederation.getHosts().delete(dn);
}
}
public void updateFiles() throws Exception {
if (hostsTable.getSelectionCount() == 0) return;
PenroseClient client = server.getClient();
PartitionManagerClient partitionManagerClient = client.getPartitionManagerClient();
PartitionClient domainClient = partitionManagerClient.getPartitionClient(domain.getName()+"_"+ NISDomain.YP);
ModuleManagerClient moduleManagerClient = domainClient.getModuleManagerClient();
ModuleClient moduleClient = moduleManagerClient.getModuleClient("NISModule");
PartitionClient partitionClient = partitionManagerClient.getPartitionClient(Federation.FEDERATION);
SourceManagerClient sourceManagerClient = partitionClient.getSourceManagerClient();
SourceClient sourceClient = sourceManagerClient.getSourceClient("penrose_hosts");
TableItem items[] = hostsTable.getSelection();
for (final TableItem ti : items) {
SearchResult result = (SearchResult) ti.getData();
Collection<Modification> modifications = new ArrayList<Modification>();
modifications.add(new Modification(
Modification.DELETE,
new Attribute("files")
));
modifications.add(new Modification(
Modification.REPLACE,
new Attribute("status", "UPDATING")
));
sourceClient.modify(result.getDn(), modifications);
Attributes attributes = result.getAttributes();
String hostname = (String)attributes.getValue("name");
String[] paths = ((String)attributes.getValue("paths")).split(",");
moduleClient.invoke(
"scan",
new Object[] { hostname, paths },
new String[] { String.class.getName(), String[].class.getName() }
);
}
refresh();
}
}