// Copyright 2004-2014 Jim Voris // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package com.qumasoft.guitools.admin; import com.qumasoft.qvcslib.DefaultServerProperties; import com.qumasoft.qvcslib.QVCSConstants; import com.qumasoft.qvcslib.QVCSServerNamesFilter; import com.qumasoft.qvcslib.ServedProjectProperties; import com.qumasoft.qvcslib.ServerManager; import com.qumasoft.qvcslib.ServerProperties; import com.qumasoft.qvcslib.response.ServerResponseListProjectUsers; import com.qumasoft.qvcslib.response.ServerResponseListProjects; import com.qumasoft.qvcslib.response.ServerResponseListRoleNames; import com.qumasoft.qvcslib.response.ServerResponseListRolePrivileges; import com.qumasoft.qvcslib.response.ServerResponseListUserRoles; import com.qumasoft.qvcslib.response.ServerResponseListUsers; import java.io.File; import java.util.Properties; import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.ChangeListener; import javax.swing.tree.TreeNode; /** * Server tree model class. * * @author Jim Voris */ public final class ServerTreeModel implements ChangeListener { // Create our logger object private static final Logger LOGGER = Logger.getLogger("com.qumasoft.guitools.admin"); private javax.swing.tree.DefaultTreeModel model = null; private final TreeMap<String, ServerTreeNode> serverNodeMap = new TreeMap<>(); /** * Creates new ServerTreeModel. */ public ServerTreeModel() { loadModel(); ServerManager.getServerManager().addChangeListener(this); } javax.swing.tree.DefaultTreeModel getTreeModel() { return model; } @Override public void stateChanged(javax.swing.event.ChangeEvent changeEvent) { Object change = changeEvent.getSource(); if (change instanceof ServerResponseListUsers) { // We don't do anything with users on this side of the display... LOGGER.log(Level.INFO, "Ignoring List Users state change"); } else if (change instanceof ServerResponseListProjectUsers) { // We don't do anything with users on this side of the display... LOGGER.log(Level.INFO, "Ignoring List Project Users state change"); } else if (change instanceof ServerResponseListUserRoles) { // We don't do anything with users on this side of the display... LOGGER.log(Level.INFO, "Ignoring List User Roles state change"); } else if (change instanceof ServerResponseListRoleNames) { // We don't do anything with users on this side of the display... LOGGER.log(Level.INFO, "Ignoring List Role Names state change"); } else if (change instanceof ServerResponseListRolePrivileges) { // We don't do anything with role privileges on this side... LOGGER.log(Level.INFO, "Ignoring List Role Privileges state change"); } else if (change instanceof ServerResponseListProjects) { ServerResponseListProjects response = (ServerResponseListProjects) change; TreeNode changedNode = loadRemoteProjects(response); if (changedNode != null) { model.nodeStructureChanged(changedNode); } } else { LOGGER.log(Level.WARNING, "unknown source of state change in ServerTreeModel"); } } void loadModel() { // Where all the property files can be found... File propertiesDirectory = new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + QVCSConstants.QVCS_PROPERTIES_DIRECTORY); DefaultServerTreeNode rootNode; if (model == null) { // Create the root node for the tree rootNode = new DefaultServerTreeNode(DefaultServerProperties.getInstance()); // Create the tree model model = new javax.swing.tree.DefaultTreeModel(rootNode, false); } else { rootNode = (DefaultServerTreeNode) model.getRoot(); rootNode.removeAllChildren(); } // Load the server nodes. loadServerNodes(rootNode, propertiesDirectory); // And the view needs to change. model.nodeStructureChanged(rootNode); } void loadServerNodes(DefaultServerTreeNode rootNode, File projectsDirectory) { QVCSServerNamesFilter serverNameFilter = new QVCSServerNamesFilter(); java.io.File[] serverFiles = projectsDirectory.listFiles(serverNameFilter); if (serverFiles != null) { for (File serverFile : serverFiles) { String serverName = serverNameFilter.getServerName(serverFile.getName()); try { ServerProperties serverProperties = new ServerProperties(serverName); ServerTreeNode serverNode = new ServerTreeNode(serverProperties); rootNode.add(serverNode); serverNodeMap.put(serverName, serverNode); } catch (Exception e) { LOGGER.log(Level.WARNING, "Failed to load server '" + serverName + "' into tree model."); } } } } TreeNode loadRemoteProjects(ServerResponseListProjects response) { TreeNode treeNode = null; try { String[] projectList = response.getProjectList(); Properties[] propertiesList = response.getPropertiesList(); // Find the server for this project, and add it as a child of the // server's node. String serverName = response.getServerName(); ServerTreeNode serverNode = serverNodeMap.get(serverName); if (serverNode != null) { // We'll replace any existing children with the list we just // received. serverNode.removeAllChildren(); // Add all the projects that we received. for (int i = 0; i < response.getProjectList().length; i++) { ServedProjectProperties projectProperties = new ServedProjectProperties(projectList[i], propertiesList[i]); ProjectTreeNode projectNode = new ProjectTreeNode(serverName, projectProperties); // Add this as a child of the server's node. serverNode.add(projectNode); } treeNode = serverNode; } else { LOGGER.log(Level.WARNING, "received project list from unknown server: " + serverName); } } catch (Exception e) { LOGGER.log(Level.WARNING, "Failed to load projects for server: " + response.getServerName()); } return treeNode; } void logoffServer(String serverName) { try { ServerTreeNode serverNode = serverNodeMap.get(serverName); if (serverNode != null) { // We'll replace any existing children with the list we just // received. serverNode.removeAllChildren(); // And the view needs to change. model.nodeStructureChanged(serverNode); } } catch (Exception e) { LOGGER.log(Level.WARNING, "Caught exception in logoffServer(): " + e.getLocalizedMessage()); } } }