/* 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.ArchiveInfoInterface; import com.qumasoft.qvcslib.DirectoryCoordinate; import com.qumasoft.qvcslib.QVCSConstants; import com.qumasoft.qvcslib.QVCSException; import com.qumasoft.qvcslib.ServerResponseFactoryInterface; import com.qumasoft.qvcslib.SkinnyLogfileInfo; import com.qumasoft.qvcslib.Utility; import com.qumasoft.qvcslib.requestdata.ClientRequestMoveFileData; import com.qumasoft.qvcslib.response.ServerResponseError; import com.qumasoft.qvcslib.response.ServerResponseInterface; import com.qumasoft.qvcslib.response.ServerResponseMessage; import com.qumasoft.qvcslib.response.ServerResponseMoveFile; import com.qumasoft.server.ActivityJournalManager; import com.qumasoft.server.ArchiveDirManager; import com.qumasoft.server.ArchiveDirManagerFactoryForServer; import com.qumasoft.server.ArchiveDirManagerForTranslucentBranch; import java.io.File; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; /** * Move an archive file. * * @author Jim Voris */ public class ClientRequestMoveFile implements ClientRequestInterface { // Create our logger object private static final Logger LOGGER = Logger.getLogger("com.qumasoft.server"); private final ClientRequestMoveFileData request; /** * Creates a new instance of ClientRequestRename. * * @param data an instance of the super class that contains command line arguments, etc. */ public ClientRequestMoveFile(ClientRequestMoveFileData data) { request = data; } /** * Perform the move operation. * * @param userName the user making the request. * @param response the response object that identifies the client connection. * @return an object we'll send back to the client. */ @Override public ServerResponseInterface execute(String userName, ServerResponseFactoryInterface response) { ServerResponseInterface returnObject = null; String projectName = request.getProjectName(); String viewName = request.getViewName(); String shortWorkfileName = request.getShortWorkfileName(); String originalAppendedPath = request.getOriginalAppendedPath(); try { DirectoryCoordinate originCoordinate = new DirectoryCoordinate(projectName, viewName, originalAppendedPath); ArchiveDirManagerInterface originDirectoryManager = ArchiveDirManagerFactoryForServer.getInstance().getDirectoryManager(QVCSConstants.QVCS_SERVER_SERVER_NAME, originCoordinate, QVCSConstants.QVCS_SERVED_PROJECT_TYPE, QVCSConstants.QVCS_SERVER_USER, response, true); DirectoryCoordinate destinationCoordinate = new DirectoryCoordinate(projectName, viewName, request.getNewAppendedPath()); ArchiveDirManagerInterface destinationDirectoryManager = ArchiveDirManagerFactoryForServer.getInstance().getDirectoryManager(QVCSConstants.QVCS_SERVER_SERVER_NAME, destinationCoordinate, QVCSConstants.QVCS_SERVED_PROJECT_TYPE, QVCSConstants.QVCS_SERVER_USER, response, true); ArchiveInfoInterface logfile = originDirectoryManager.getArchiveInfo(shortWorkfileName); if ((logfile != null) && ((originDirectoryManager instanceof ArchiveDirManager) || (originDirectoryManager instanceof ArchiveDirManagerForTranslucentBranch))) { // Send a response to the user (note that a notification has also been sent earlier). if (originDirectoryManager.moveArchive(userName, shortWorkfileName, destinationDirectoryManager, response)) { ServerResponseMoveFile serverResponseMoveFile = new ServerResponseMoveFile(); serverResponseMoveFile.setServerName(response.getServerName()); serverResponseMoveFile.setProjectName(originDirectoryManager.getProjectName()); serverResponseMoveFile.setViewName(originDirectoryManager.getViewName()); serverResponseMoveFile.setProjectProperties(originDirectoryManager.getProjectProperties().getProjectProperties()); serverResponseMoveFile.setOriginAppendedPath(originDirectoryManager.getAppendedPath()); serverResponseMoveFile.setDestinationAppendedPath(destinationDirectoryManager.getAppendedPath()); serverResponseMoveFile.setShortWorkfileName(shortWorkfileName); ArchiveInfoInterface newArchiveInfo = destinationDirectoryManager.getArchiveInfo(shortWorkfileName); serverResponseMoveFile.setSkinnyLogfileInfo(new SkinnyLogfileInfo(newArchiveInfo.getLogfileInfo(), File.separator, newArchiveInfo.getIsObsolete(), newArchiveInfo.getDefaultRevisionDigest(), shortWorkfileName, newArchiveInfo.getIsOverlap())); returnObject = serverResponseMoveFile; // Add an entry to the server journal file. String logMessage = buildJournalEntry(userName); ActivityJournalManager.getInstance().addJournalEntry(logMessage); LOGGER.log(Level.INFO, logMessage); } } else { if (logfile == null) { // Return a command error. ServerResponseError error = new ServerResponseError("Archive not found for " + shortWorkfileName, projectName, viewName, originalAppendedPath); returnObject = error; } else { // Explain the error. ServerResponseMessage message = new ServerResponseMessage("Move not allowed for non-Trunk views.", projectName, viewName, originalAppendedPath, ServerResponseMessage.HIGH_PRIORITY); message.setShortWorkfileName(shortWorkfileName); returnObject = message; } } } catch (IOException | QVCSException e) { LOGGER.log(Level.WARNING, Utility.expandStackTraceToString(e)); // Return a command error. ServerResponseError error = new ServerResponseError("Caught exception trying to move " + shortWorkfileName + " from " + originalAppendedPath + " to " + request.getNewAppendedPath() + ". Exception string: " + e.getMessage(), projectName, viewName, originalAppendedPath); returnObject = error; } return returnObject; } private String buildJournalEntry(final String userName) { return "User: [" + userName + "] moved file [" + Utility.formatFilenameForActivityJournal(request.getProjectName(), request.getViewName(), request.getOriginalAppendedPath(), request.getShortWorkfileName()) + "] to [" + Utility.formatFilenameForActivityJournal(request.getProjectName(), request.getViewName(), request.getNewAppendedPath(), request.getShortWorkfileName()) + "]."; } }