package com.revolsys.swing.tree.node;
import com.revolsys.collection.map.LinkedHashMapEx;
import com.revolsys.collection.map.MapEx;
import com.revolsys.gis.wms.WmsClient;
import com.revolsys.io.PathName;
import com.revolsys.io.connection.ConnectionRegistry;
import com.revolsys.record.io.format.esri.rest.ArcGisRestCatalog;
import com.revolsys.record.io.format.mapguide.MapGuideWebService;
import com.revolsys.swing.Borders;
import com.revolsys.swing.SwingUtil;
import com.revolsys.swing.component.ValueField;
import com.revolsys.swing.field.PasswordField;
import com.revolsys.swing.field.TextField;
import com.revolsys.swing.layout.GroupLayouts;
import com.revolsys.swing.map.layer.LayerGroup;
import com.revolsys.swing.map.layer.Project;
import com.revolsys.swing.menu.MenuFactory;
import com.revolsys.swing.tree.BaseTreeNode;
import com.revolsys.swing.tree.TreeNodes;
import com.revolsys.swing.tree.node.file.FolderConnectionsTrees;
import com.revolsys.util.PasswordUtil;
import com.revolsys.util.Property;
import com.revolsys.util.Strings;
import com.revolsys.webservice.WebService;
import com.revolsys.webservice.WebServiceConnection;
import com.revolsys.webservice.WebServiceConnectionManager;
import com.revolsys.webservice.WebServiceConnectionRegistry;
import com.revolsys.webservice.WebServiceResource;
public class WebServiceConnectionTrees extends ConnectionManagerTrees {
static {
final MenuFactory connectionRegistryMenu = MenuFactory
.getMenu(WebServiceConnectionRegistry.class);
TreeNodes.addMenuItemNodeValue(connectionRegistryMenu, "default", 0,
"Add ArcGIS REST Connection", "world:add", ConnectionRegistry::isEditable,
WebServiceConnectionTrees::addArcGISRestConnection);
TreeNodes.addMenuItemNodeValue(connectionRegistryMenu, "default", 1, "Add OGC WMS Connection",
"world:add", ConnectionRegistry::isEditable, WebServiceConnectionTrees::addOgcWmsConnection);
TreeNodes.addMenuItemNodeValue(connectionRegistryMenu, "default", 2, "Add MapGuide Connection",
"world:add", ConnectionRegistry::isEditable,
WebServiceConnectionTrees::addMapGuideRestConnection);
TreeNodes.addMenuItemNodeValue(connectionRegistryMenu, "default", 3, "Import Connection...",
"world:import", WebServiceConnectionRegistry::isEditable,
FolderConnectionsTrees::importConnection);
// WebServiceConnection
final MenuFactory connectionMenu = MenuFactory.getMenu(WebServiceConnection.class);
TreeNodes.addMenuItemNodeValue(connectionMenu, "default", 0, "Edit Connection", "world:edit",
WebServiceConnection::isEditable, WebServiceConnectionTrees::editConnection);
TreeNodes.<WebServiceConnection> addMenuItemNodeValue(connectionMenu, "default", 1,
"Export Connection", "world:export", ConnectionManagerTrees::exportConnection);
}
private static void addArcGISRestConnection(final WebServiceConnectionRegistry registry) {
addWebServiceConnection(registry, ArcGisRestCatalog.J_TYPE);
}
private static void addMapGuideRestConnection(final WebServiceConnectionRegistry registry) {
addWebServiceConnection(registry, MapGuideWebService.J_TYPE);
}
private static void addOgcWmsConnection(final WebServiceConnectionRegistry registry) {
addWebServiceConnection(registry, WmsClient.J_TYPE);
}
@SuppressWarnings("deprecation")
private static void addWebServiceConnection(final WebServiceConnectionRegistry registry,
final String type) {
final ValueField panel = new ValueField();
panel.setTitle("Add Web Service Connection");
Borders.titled(panel, "Web Service Connection");
SwingUtil.addLabel(panel, "Name");
final TextField nameField = new TextField(20);
panel.add(nameField);
SwingUtil.addLabel(panel, "Service URL");
final TextField urlField = new TextField(50);
panel.add(urlField);
SwingUtil.addLabel(panel, "Username");
final TextField usernameField = new TextField(30);
panel.add(usernameField);
SwingUtil.addLabel(panel, "Password");
final PasswordField passwordField = new PasswordField(30);
panel.add(passwordField);
GroupLayouts.makeColumns(panel, 2, true);
panel.showDialog();
if (panel.isSaved()) {
final String url = urlField.getText();
if (url != null) {
final String name = nameField.getText();
final String username = usernameField.getText();
final String password = passwordField.getText();
final MapEx config = new LinkedHashMapEx();
config.put("j:type", type);
config.put("name", name);
config.put("serviceUrl", url);
config.put("username", username);
config.put("password", PasswordUtil.encrypt(password));
registry.newConnection(config);
}
}
}
@SuppressWarnings("deprecation")
private static void editConnection(final WebServiceConnection connection) {
final WebServiceConnectionRegistry registry = connection.getRegistry();
final ValueField panel = new ValueField();
panel.setTitle("Edit Web Service Connection");
Borders.titled(panel, "Web Service Connection");
SwingUtil.addLabel(panel, "Name");
final MapEx config = connection.getConfig();
final String oldName = connection.getName();
final TextField nameField = new TextField("name", oldName, 20);
panel.add(nameField);
SwingUtil.addLabel(panel, "Service URL");
String serviceUrl = config.getString("serviceUrl");
final TextField urlField = new TextField("serviceUrl", serviceUrl, 50);
panel.add(urlField);
SwingUtil.addLabel(panel, "Username");
String username = config.getString("username");
final TextField usernameField = new TextField("username", username, 30);
panel.add(usernameField);
SwingUtil.addLabel(panel, "Password");
String password = PasswordUtil.decrypt(config.getString("password"));
final PasswordField passwordField = new PasswordField("password", password, 30);
panel.add(passwordField);
GroupLayouts.makeColumns(panel, 2, true);
panel.showDialog();
if (panel.isSaved()) {
serviceUrl = urlField.getText();
if (serviceUrl != null) {
final String name = nameField.getText();
username = usernameField.getText();
password = passwordField.getText();
config.put("name", name);
config.put("serviceUrl", serviceUrl);
config.put("username", username);
config.put("password", PasswordUtil.encrypt(password));
if (Strings.equals(oldName, name)) {
connection.setProperties(config);
} else {
registry.removeConnection(connection);
registry.newConnection(config);
}
}
}
}
public static LayerGroup getLayerGroup(final WebServiceResource webServiceResource) {
LayerGroup layerGroup = Project.get();
if (layerGroup != null) {
final WebService<?> webService = webServiceResource.getWebService();
if (webService != null) {
final String webServiceName = webService.getName();
if (Property.hasValue(webServiceName)) {
layerGroup = layerGroup.addLayerGroup(webServiceName);
}
}
final PathName layerPath = webServiceResource.getPathName();
if (layerPath != null) {
final PathName parent = layerPath.getParent();
if (parent != null) {
for (final String groupName : parent.getElements()) {
layerGroup = layerGroup.addLayerGroup(groupName);
}
}
}
}
return layerGroup;
}
public static BaseTreeNode newWebServiceConnectionsTreeNode() {
final WebServiceConnectionManager webServicesConnectionManager = WebServiceConnectionManager
.get();
final BaseTreeNode webServices = BaseTreeNode.newTreeNode(webServicesConnectionManager);
webServices.setOpen(true);
return webServices;
}
}