/* 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.server.clientrequest; import com.qumasoft.qvcslib.ArchiveDirManagerInterface; import com.qumasoft.qvcslib.ArchiveDirManagerReadOnlyViewInterface; import com.qumasoft.qvcslib.ArchiveDirManagerReadWriteViewInterface; import com.qumasoft.qvcslib.DirectoryCoordinate; import com.qumasoft.qvcslib.QVCSConstants; import com.qumasoft.qvcslib.QVCSException; import com.qumasoft.qvcslib.ServerResponseFactoryInterface; import com.qumasoft.qvcslib.Utility; import com.qumasoft.qvcslib.requestdata.ClientRequestAddDirectoryData; import com.qumasoft.qvcslib.response.ServerResponseInterface; import com.qumasoft.qvcslib.response.ServerResponseMessage; import com.qumasoft.qvcslib.response.ServerResponseProjectControl; import com.qumasoft.server.ActivityJournalManager; import com.qumasoft.server.ArchiveDirManager; import com.qumasoft.server.ArchiveDirManagerFactoryForServer; import com.qumasoft.server.ArchiveDirManagerForOpaqueBranch; import com.qumasoft.server.ArchiveDirManagerForTranslucentBranch; import com.qumasoft.server.DirectoryContentsManager; import com.qumasoft.server.DirectoryContentsManagerFactory; import com.qumasoft.server.DirectoryIDManager; import com.qumasoft.server.QVCSEnterpriseServer; import com.qumasoft.server.RolePrivilegesManager; import com.qumasoft.server.ServerUtility; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; /** * Client request add directory. * @author Jim Voris */ public class ClientRequestAddDirectory implements ClientRequestInterface { // Create our logger object private static final Logger LOGGER = Logger.getLogger("com.qumasoft.server"); private final ClientRequestAddDirectoryData request; /** * Creates a new instance of ClientRequestAddDirectory. * @param data client request data. */ public ClientRequestAddDirectory(ClientRequestAddDirectoryData data) { request = data; } @Override public ServerResponseInterface execute(String userName, ServerResponseFactoryInterface response) { ServerResponseProjectControl serverResponse; ServerResponseInterface returnObject = null; try { if (request.getAppendedPath().startsWith(QVCSConstants.QVCS_CEMETERY_DIRECTORY)) { throw new QVCSException("You cannot add a directory to the cemetery!"); } if (request.getAppendedPath().startsWith(QVCSConstants.QVCS_BRANCH_ARCHIVES_DIRECTORY)) { throw new QVCSException("You cannot add a directory to the branch archives directory!"); } DirectoryCoordinate directoryCoordinate = new DirectoryCoordinate(request.getProjectName(), request.getViewName(), request.getAppendedPath()); ArchiveDirManagerInterface archiveDirManager = ArchiveDirManagerFactoryForServer.getInstance().getDirectoryManager(QVCSConstants.QVCS_SERVER_SERVER_NAME, directoryCoordinate, QVCSConstants.QVCS_SERVED_PROJECT_TYPE, QVCSConstants.QVCS_SERVER_USER, response, true); // Add this directory to the DirectoryContents object of the parent directory. // Only do this work if the view is a read-write view... if ((request.getAppendedPath().length() > 0) && (archiveDirManager instanceof ArchiveDirManagerReadWriteViewInterface)) { if (archiveDirManager instanceof ArchiveDirManager) { ArchiveDirManager dirManager = (ArchiveDirManager) archiveDirManager; String parentAppendedPath = ServerUtility.getParentAppendedPath(request.getAppendedPath()); DirectoryContentsManagerFactory.getInstance().getDirectoryContentsManager(request.getProjectName()).addDirectory(request.getViewName(), dirManager.getProjectRootArchiveDirManager().getDirectoryID(), parentAppendedPath, dirManager.getParent().getDirectoryID(), dirManager.getDirectoryID(), Utility.getLastDirectorySegment(request.getAppendedPath()), response); } else { if (archiveDirManager instanceof ArchiveDirManagerForTranslucentBranch) { DirectoryCoordinate rootCoordinate = new DirectoryCoordinate(request.getProjectName(), QVCSConstants.QVCS_TRUNK_VIEW, ""); ArchiveDirManagerInterface projectRootArchiveDirManager = ArchiveDirManagerFactoryForServer.getInstance().getDirectoryManager(QVCSConstants.QVCS_SERVER_SERVER_NAME, rootCoordinate, QVCSConstants.QVCS_SERVED_PROJECT_TYPE, userName, response, true); int rootDirectoryId = projectRootArchiveDirManager.getDirectoryID(); int childDirectoryID = DirectoryIDManager.getInstance().getNewDirectoryID(); String parentAppendedPath = ServerUtility.getParentAppendedPath(request.getAppendedPath()); DirectoryCoordinate parentCoordinate = new DirectoryCoordinate(request.getProjectName(), request.getViewName(), parentAppendedPath); ArchiveDirManagerInterface parentDirManager = ArchiveDirManagerFactoryForServer.getInstance().getDirectoryManager(QVCSConstants.QVCS_SERVER_SERVER_NAME, parentCoordinate, QVCSConstants.QVCS_SERVED_PROJECT_TYPE, QVCSConstants.QVCS_SERVER_USER, response, true); int parentDirectoryID = parentDirManager.getDirectoryID(); DirectoryContentsManager directoryContentsManager = DirectoryContentsManagerFactory.getInstance().getDirectoryContentsManager(request.getProjectName()); String finalDirectorySegment = Utility.getLastDirectorySegment(request.getAppendedPath()); directoryContentsManager.addDirectory(request.getViewName(), rootDirectoryId, parentAppendedPath, parentDirectoryID, childDirectoryID, finalDirectorySegment, response); } else if (archiveDirManager instanceof ArchiveDirManagerForOpaqueBranch) { // TODO LOGGER.log(Level.INFO, "Add directory not yet implemented for an opaque branch."); } else { throw new QVCSException("Unexpected directory manager type: " + archiveDirManager.getClass().toString()); } } for (ServerResponseFactoryInterface responseFactory : QVCSEnterpriseServer.getConnectedUsers()) { // And let users who have the privilege know about this added directory. if (RolePrivilegesManager.getInstance().isUserPrivileged(request.getProjectName(), responseFactory.getUserName(), RolePrivilegesManager.GET)) { serverResponse = new ServerResponseProjectControl(); serverResponse.setAddFlag(true); serverResponse.setProjectName(request.getProjectName()); serverResponse.setViewName(request.getViewName()); serverResponse.setDirectorySegments(Utility.getDirectorySegments(request.getAppendedPath())); serverResponse.setServerName(responseFactory.getServerName()); responseFactory.createServerResponse(serverResponse); LOGGER.log(Level.INFO, "Sending created directory info to: " + responseFactory.getUserName()); } } ActivityJournalManager.getInstance().addJournalEntry("User: [" + userName + "] added directory: [" + archiveDirManager.getProjectName() + "//" + archiveDirManager.getAppendedPath() + "] to " + request.getViewName()); } else { if (request.getAppendedPath().length() > 0) { if (archiveDirManager instanceof ArchiveDirManagerReadOnlyViewInterface) { // Explain the error. ServerResponseMessage message = new ServerResponseMessage("Adding a directory is not allowed for read-only view.", request.getProjectName(), request.getViewName(), request.getAppendedPath(), ServerResponseMessage.HIGH_PRIORITY); message.setShortWorkfileName(""); returnObject = message; } else { throw new QVCSException("#### Internal error: use of unsupported view type."); } } } } catch (QVCSException | SQLException e) { ServerResponseMessage message = new ServerResponseMessage(e.getLocalizedMessage(), request.getProjectName(), request.getViewName(), request.getAppendedPath(), ServerResponseMessage.HIGH_PRIORITY); message.setShortWorkfileName(""); returnObject = message; } return returnObject; } }