package org.geoserver.web.proxy;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.model.IModel;
import org.geoserver.proxy.ProxyConfig;
import org.geoserver.web.GeoServerSecuredPage;
import org.geoserver.web.wicket.GeoServerTablePanel;
import org.geoserver.web.wicket.GeoServerDataProvider.Property;
public class ProxyAdminPage extends GeoServerSecuredPage {
/*NOTE & DANGER:
* There is nothing here that will guarantee any form of consistency in case of multiple people
* editing the proxy's configuration. Probably don't do that.
*/
GeoServerTablePanel<String> hostnameFilterTable;
GeoServerTablePanel<String> mimetypeFilterTable;
HostRemovalLink hostRemoval;
MimetypeRemovalLink mimetypeRemoval;
@SuppressWarnings("serial")
/*
* Provides a webpage for editing proxy settings
*/
public ProxyAdminPage() {
//Grab configuration data
HostnameProvider hostnameProvider = new HostnameProvider();
MimetypeProvider mimetypeProvider = new MimetypeProvider();
//
//HOSTNAME
//
//Put together a table for editing what hostnames can go through the proxy
hostnameFilterTable =
new GeoServerTablePanel<String>("hostnameTable", hostnameProvider, true) {
@Override
protected Component getComponentForProperty(String id, IModel itemModel,
Property<String> property) {
return new Label(id, property.getModel(itemModel));
}
//tell the table to enable the remove button when items are selected
@Override
protected void onSelectionUpdate(AjaxRequestTarget target) {
hostRemoval.setEnabled(hostnameFilterTable.getSelection().size() > 0);
target.addComponent(hostRemoval);
}
};
hostnameFilterTable.setOutputMarkupId(true);
add(hostnameFilterTable);
// the add button
add(new BookmarkablePageLink("addNewHost", HostnameNewPage.class));
// the removal button
hostRemoval = new HostRemovalLink("removeSelectedHost", hostnameFilterTable);
add(hostRemoval);
hostRemoval.setOutputMarkupId(true);
hostRemoval.setEnabled(false);
//
//MIMETYPE
//
//Put together a table for editing what MIMETypes can go through the proxy
mimetypeFilterTable =
new GeoServerTablePanel<String>("mimetypeTable", mimetypeProvider, true) {
@Override
protected Component getComponentForProperty(String id, IModel itemModel,
Property<String> property) {
return new Label(id, property.getModel(itemModel));
}
//tell the table to enable the remove button when items are selected
@Override
protected void onSelectionUpdate(AjaxRequestTarget target) {
mimetypeRemoval.setEnabled(mimetypeFilterTable.getSelection().size() > 0);
target.addComponent(mimetypeRemoval);
}
};
mimetypeFilterTable.setOutputMarkupId(true);
add(mimetypeFilterTable);
// the add button
add(new BookmarkablePageLink("addNewMimetype", MimetypeNewPage.class));
// the removal button
mimetypeRemoval = new MimetypeRemovalLink("removeSelectedMimetype", mimetypeFilterTable);
add(mimetypeRemoval);
mimetypeRemoval.setOutputMarkupId(true);
mimetypeRemoval.setEnabled(false);
}
/*unneeded*/
// @SuppressWarnings("serial")
// public final class ProxyForm extends Form{
// public ProxyForm(final String componentName)
// {
// super(componentName);
// }
//
// public void onSubmit()
// {
// // TODO: Add a submit button, and make it somehow call this vvv.
//
// //ProxyConfig.writeConfigToDisk(config);
// }
// }
/*
* An AJAX link to get rid of hostnames
* @param id A Wicket id
* @param tableObjects a GeoServerTablePanel to remove hostnames from
*/
@SuppressWarnings("serial")
private class HostRemovalLink extends AjaxLink {
GeoServerTablePanel<String> tableObjects;
public HostRemovalLink(String id, GeoServerTablePanel<String> tableObjects) {
super(id);
this.tableObjects = tableObjects;
}
@Override
public void onClick(AjaxRequestTarget target) {
// see if the user selected anything
ProxyConfig config = ProxyConfig.loadConfFromDisk();
final List<String> selection = tableObjects.getSelection();
if(selection.size() == 0)
return;
//remove selected hostnames from list
for (String hostname : selection) {
config.hostnameWhitelist.remove(hostname);
}
//write changes to disk
ProxyConfig.writeConfigToDisk(config);
//disable the removal link, since nothing is selected any more
setEnabled(false);
target.addComponent(HostRemovalLink.this);
target.addComponent(tableObjects);
}
}
@SuppressWarnings("serial")
private class MimetypeRemovalLink extends AjaxLink {
GeoServerTablePanel<String> tableObjects;
/*
* An AJAX link to get rid of hostnames
* @param id A Wicket id
* @param tableObjects a GeoServerTablePanel to remove hostnames from
*/
public MimetypeRemovalLink(String id, GeoServerTablePanel<String> tableObjects) {
super(id);
this.tableObjects = tableObjects;
}
@Override
public void onClick(AjaxRequestTarget target) {
// see if the user selected anything
ProxyConfig config = ProxyConfig.loadConfFromDisk();
final List<String> selection = tableObjects.getSelection();
if(selection.size() == 0)
return;
//remove selected hostnames from list
for (String hostname : selection) {
config.mimetypeWhitelist.remove(hostname);
}
//write changes to disk
ProxyConfig.writeConfigToDisk(config);
//disable the removal link, since nothing is selected any more
setEnabled(false);
target.addComponent(MimetypeRemovalLink.this);
target.addComponent(tableObjects);
}
}
}