/***************************************************************************** * Sun Public License Notice * * The contents of this file are subject to the Sun Public License Version * 1.0 (the "License"). You may not use this file except in compliance with * the License. A copy of the License is available at http://www.sun.com/ * * The Original Code is the CVS Client Library. * The Initial Developer of the Original Code is Robert Greig. * Portions created by Robert Greig are Copyright (C) 2000. * All Rights Reserved. * * Contributor(s): Robert Greig. *****************************************************************************/ package org.netbeans.lib.cvsclient.command.add; import org.jetbrains.annotations.NonNls; import org.netbeans.lib.cvsclient.IClientEnvironment; import org.netbeans.lib.cvsclient.IRequestProcessor; import org.netbeans.lib.cvsclient.admin.Entry; import org.netbeans.lib.cvsclient.command.AbstractCommand; import org.netbeans.lib.cvsclient.command.CommandException; import org.netbeans.lib.cvsclient.command.IOCommandException; import org.netbeans.lib.cvsclient.command.KeywordSubstitution; import org.netbeans.lib.cvsclient.connection.AuthenticationException; import org.netbeans.lib.cvsclient.event.ICvsListener; import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry; import org.netbeans.lib.cvsclient.event.IEventSender; import org.netbeans.lib.cvsclient.file.AbstractFileObject; import org.netbeans.lib.cvsclient.file.DirectoryObject; import org.netbeans.lib.cvsclient.file.FileObject; import org.netbeans.lib.cvsclient.file.ICvsFileSystem; import org.netbeans.lib.cvsclient.progress.IProgressViewer; import org.netbeans.lib.cvsclient.progress.sending.DummyRequestsProgressHandler; import org.netbeans.lib.cvsclient.request.CommandRequest; import org.netbeans.lib.cvsclient.request.Requests; import org.netbeans.lib.cvsclient.util.BugLog; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * Adds a file or directory. * * When adding two directories, the following requests must be sent: * Directory test3 * O:\CVS/compile/test3 * ............................. * Directory test2 * O:\CVS/compile/test2 * ----------------------------- * Directory . * O:\CVS/compile * ----------------------------- * Argument test3 * ............................. * Argument test2 * ----------------------------- * add * * When adding two files, the following requests must be sent: * Directory test2 * O:\CVS/compile/test2 * ............................... * Modified test2file.txt * u=rw,g=r,o=r * (Sending file: D:\test2\test2\test2file.txt) * --------------------------------------- * Directory test3 * O:\CVS/compile/test3 * ................................. * Modified test2file.txt * u=rw,g=r,o=r * (Sending file: D:\test2\test3\test2file.txt) * ----------------------------------------- * Directory . * O:\CVS/compile * ----------------------------------------- * Argument test2/test2file.txt * ..................................... * Argument test3/test2file.txt * ------------------------------------- * add * * @author Robert Greig */ public final class AddCommand extends AbstractCommand { // Fields ================================================================= private final Map repositoryPathToDirectoryObject = new HashMap(); private KeywordSubstitution keywordSubst; // Setup ================================================================== public AddCommand() { } // Implemented ============================================================ public boolean execute(IRequestProcessor requestProcessor, IEventSender eventManager, ICvsListenerRegistry listenerRegistry, IClientEnvironment clientEnvironment, IProgressViewer progressViewer) throws CommandException, AuthenticationException { BugLog.getInstance().assertTrue(getFileObjects().size() > 0, "No file specified."); repositoryPathToDirectoryObject.clear(); final Requests requests; try { requests = new Requests(CommandRequest.ADD, clientEnvironment); requests.addArgumentRequest(getKeywordSubst(), "-k"); for (AbstractFileObject abstractFileObject : getFileObjects()) { addRequests(abstractFileObject, requests, requestProcessor, clientEnvironment); } requests.addLocalPathDirectoryRequest(); addArgumentRequests(requests); } catch (IOException ex) { throw new IOCommandException(ex); } final ICvsListener parser = new AddParser(eventManager, clientEnvironment.getCvsFileSystem()); parser.registerListeners(listenerRegistry); try { final boolean result = requestProcessor.processRequests(requests, new DummyRequestsProgressHandler()); createCvsDirectories(clientEnvironment); return result; } catch (IOException ex) { throw new IOCommandException(ex); } finally { repositoryPathToDirectoryObject.clear(); parser.unregisterListeners(listenerRegistry); } } public String getCvsCommandLine() { @NonNls final StringBuffer cvsCommandLine = new StringBuffer("add "); cvsCommandLine.append(getCvsArguments()); appendFileArguments(cvsCommandLine); return cvsCommandLine.toString(); } public void resetCvsCommand() { super.resetCvsCommand(); setKeywordSubst(null); } // Accessing ============================================================== private KeywordSubstitution getKeywordSubst() { return keywordSubst; } public void setKeywordSubst(KeywordSubstitution keywordSubst) { this.keywordSubst = keywordSubst; } // Utils ================================================================== private void createCvsDirectories(IClientEnvironment clientEnvironment) throws IOException { for (AbstractFileObject abstractFileObject : getFileObjects()) { if (!abstractFileObject.isDirectory()) { continue; } clientEnvironment.getAdminWriter().directoryAdded((DirectoryObject)abstractFileObject, clientEnvironment.getCvsFileSystem()); } } private String getCvsArguments() { @NonNls final StringBuilder toReturn = new StringBuilder(); if (getKeywordSubst() != null) { toReturn.append("-k"); toReturn.append(getKeywordSubst().toString()); toReturn.append(" "); } return toReturn.toString(); } private void addRequests(AbstractFileObject abstractFileObject, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) throws IOException { if (abstractFileObject.isDirectory()) { addRequestsForDirectory((DirectoryObject)abstractFileObject, requests, requestProcessor, clientEnvironment); } else { addRequestsForFile((FileObject)abstractFileObject, requests, clientEnvironment); } } private void addRequestsForDirectory(DirectoryObject directoryObject, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) { final DirectoryObject parentDirectoryUnderCvsControl = addDirectoryRequestsUpToLocalDirectory(directoryObject, requests, requestProcessor, clientEnvironment); if (parentDirectoryUnderCvsControl == null) { return; } final String tag = clientEnvironment.getAdminReader().getStickyTagForDirectory(parentDirectoryUnderCvsControl, clientEnvironment.getCvsFileSystem()); requests.addStickyRequest(tag); } private DirectoryObject addDirectoryRequestsUpToLocalDirectory(DirectoryObject directoryObject, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) { final DirectoryObject parentDirectoryObject = directoryObject.getParent(); if (parentDirectoryObject == null) { return null; } DirectoryObject parentDirectoryUnderCvsControl; if (clientEnvironment.getAdminReader().hasCvsDirectory(parentDirectoryObject, clientEnvironment.getCvsFileSystem())) { parentDirectoryUnderCvsControl = parentDirectoryObject; requests.addDirectoryRequest(DirectoryObject.getRoot()); addDirectoryRequest(parentDirectoryUnderCvsControl, requests); } else { parentDirectoryUnderCvsControl = addDirectoryRequestsUpToLocalDirectory(parentDirectoryObject, requests, requestProcessor, clientEnvironment); if (parentDirectoryUnderCvsControl == null) { parentDirectoryUnderCvsControl = parentDirectoryObject; } } addDirectoryRequest(directoryObject, requests); return parentDirectoryObject; } private static void addStickyRequest(DirectoryObject directoryObject, Requests requests, ICvsFileSystem cvsFileSystem, IClientEnvironment clientEnvironment) { final String tag = clientEnvironment.getAdminReader().getStickyTagForDirectory(directoryObject, cvsFileSystem); requests.addStickyRequest(tag); } private void addDirectoryRequest(DirectoryObject directoryObject, Requests requests) { final String repositoryPath = requests.addDirectoryRequest(directoryObject); repositoryPathToDirectoryObject.put(repositoryPath, directoryObject); } private void addRequestsForFile(FileObject fileObject, Requests requests, IClientEnvironment clientEnvironment) throws IOException { final DirectoryObject parentDirectory = fileObject.getParent(); addDirectoryRequest(parentDirectory, requests); addStickyRequest(parentDirectory, requests, clientEnvironment.getCvsFileSystem(), clientEnvironment); final Entry entry = clientEnvironment.getAdminReader().getEntry(fileObject, clientEnvironment.getCvsFileSystem()); if (entry != null) { requests.addEntryRequest(entry); } else { requests.addIsModifiedRequest(fileObject); } } }