package com.revolsys.swing.tree.node.record;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
import com.revolsys.io.FileUtil;
import com.revolsys.io.PathName;
import com.revolsys.io.map.MapObjectFactory;
import com.revolsys.record.io.RecordStoreConnection;
import com.revolsys.record.io.RecordStoreConnectionManager;
import com.revolsys.record.io.RecordStoreConnectionRegistry;
import com.revolsys.record.schema.RecordDefinitionImpl;
import com.revolsys.record.schema.RecordStore;
import com.revolsys.record.schema.RecordStoreSchema;
import com.revolsys.record.schema.RecordStoreSchemaElement;
import com.revolsys.swing.map.form.RecordStoreConnectionForm;
import com.revolsys.swing.map.layer.AbstractLayer;
import com.revolsys.swing.map.layer.LayerGroup;
import com.revolsys.swing.map.layer.Project;
import com.revolsys.swing.map.layer.record.RecordStoreLayer;
import com.revolsys.swing.menu.MenuFactory;
import com.revolsys.swing.tree.BaseTree;
import com.revolsys.swing.tree.BaseTreeNode;
import com.revolsys.swing.tree.TreeNodes;
import com.revolsys.swing.tree.node.ConnectionManagerTrees;
import com.revolsys.swing.tree.node.LazyLoadTreeNode;
import com.revolsys.swing.tree.node.file.PathTreeNode;
import com.revolsys.util.OS;
public class RecordStoreConnectionTrees extends ConnectionManagerTrees {
static {
// RecordStoreConnectionRegistry
final MenuFactory connectionRegistryMenu = MenuFactory
.getMenu(RecordStoreConnectionRegistry.class);
TreeNodes.addMenuItemNodeValue(connectionRegistryMenu, "default", 0, "Add Connection",
"database_add", RecordStoreConnectionRegistry::isEditable,
RecordStoreConnectionTrees::addConnection);
TreeNodes.addMenuItemNodeValue(connectionRegistryMenu, "default", 1, "Import Connection...",
"database:import", RecordStoreConnectionRegistry::isEditable,
RecordStoreConnectionTrees::importConnection);
// RecordStoreConnection
final MenuFactory connectionMenu = MenuFactory.getMenu(RecordStoreConnection.class);
TreeNodes.addMenuItemNodeValue(connectionMenu, "default", 0, "Edit Connection", "database_edit",
RecordStoreConnection::isEditable, RecordStoreConnectionTrees::editConnection);
final MenuFactory recordStoreSchemaMenu = MenuFactory.getMenu(RecordStoreSchema.class);
LazyLoadTreeNode.addRefreshMenuItem(recordStoreSchemaMenu);
TreeNodes.<RecordStoreConnection> addMenuItemNodeValue(connectionMenu, "default", 1,
"Export Connection", "database:export", ConnectionManagerTrees::exportConnection);
final MenuFactory recordDefinitionMenu = MenuFactory.getMenu(RecordDefinitionImpl.class);
TreeNodes.addMenuItemNodeValue(recordDefinitionMenu, "default", "Add Layer", "map_add",
RecordStoreConnectionTrees::addLayer);
LazyLoadTreeNode.addRefreshMenuItem(recordDefinitionMenu);
}
private static void addConnection(final RecordStoreConnectionRegistry registry) {
final RecordStoreConnectionForm form = new RecordStoreConnectionForm(registry);
form.showDialog();
}
private static void addLayer(final RecordDefinitionImpl recordDefinition) {
final PathName typePath = recordDefinition.getPathName();
final RecordStore recordStore = recordDefinition.getRecordStore();
final Map<String, Object> connection = recordStore.getConnectionProperties();
final Map<String, Object> layerConfig = new LinkedHashMap<>();
MapObjectFactory.setType(layerConfig, "recordStoreLayer");
layerConfig.put("name", recordDefinition.getName());
layerConfig.put("connection", connection);
layerConfig.put("typePath", typePath);
layerConfig.put("showTableView", OS.getPreferenceBoolean("com.revolsys.gis",
AbstractLayer.PREFERENCE_PATH, AbstractLayer.PREFERENCE_NEW_LAYERS_SHOW_TABLE_VIEW, false));
final LinkedList<String> path = new LinkedList<>();
{
BaseTreeNode node = BaseTree.getMenuNode();
node = node.getParent();
while (node != null) {
final Object nodeValue = node.getUserObject();
String nodeName = node.getName();
if (node instanceof PathTreeNode) {
nodeName = FileUtil.getBaseName(nodeName);
}
if (nodeValue instanceof RecordStoreSchemaElement) {
path.addFirst(nodeName);
node = node.getParent();
} else {
path.addFirst(nodeName);
node = null;
}
}
}
final AbstractLayer layer = new RecordStoreLayer(layerConfig);
LayerGroup layerGroup = Project.get();
for (final String name : path) {
try {
layerGroup = layerGroup.addLayerGroup(name);
} catch (final IllegalArgumentException e) {
int i = 1;
while (layerGroup.hasLayerWithSameName(null, name + i)) {
i++;
}
layerGroup = layerGroup.addLayerGroup(name + i);
}
}
layerGroup.addLayer(layer);
}
private static void editConnection(final RecordStoreConnection connection) {
final RecordStoreConnectionRegistry registry = connection.getRegistry();
final RecordStoreConnectionForm form = new RecordStoreConnectionForm(registry, connection);
form.showDialog();
}
public static BaseTreeNode newRecordStoreConnectionsTreeNode() {
final RecordStoreConnectionManager connectionManager = RecordStoreConnectionManager.get();
final BaseTreeNode node = BaseTreeNode.newTreeNode(connectionManager);
node.setOpen(true);
return node;
}
}