| /* |
| * 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 NetBeans. The Initial Developer of the Original |
| * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun |
| * Microsystems, Inc. All Rights Reserved. |
| */ |
| package org.netbeans.lib.cvsclient.command.importcmd; |
| |
| import org.netbeans.lib.cvsclient.IClientEnvironment; |
| import org.netbeans.lib.cvsclient.IRequestProcessor; |
| import org.netbeans.lib.cvsclient.connection.AuthenticationException; |
| import org.netbeans.lib.cvsclient.command.*; |
| import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry; |
| import org.netbeans.lib.cvsclient.event.IEventSender; |
| import org.netbeans.lib.cvsclient.file.DirectoryObject; |
| import org.netbeans.lib.cvsclient.file.FileObject; |
| 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.DirectoryRequest; |
| import org.netbeans.lib.cvsclient.request.Requests; |
| import org.netbeans.lib.cvsclient.util.BugLog; |
| import org.netbeans.lib.cvsclient.util.SimpleStringPattern; |
| import org.jetbrains.annotations.NonNls; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.*; |
| |
| /** |
| * The import command imports local directory structures into the repository. |
| * |
| * @author Thomas Singer |
| */ |
| public final class ImportCommand extends Command { |
| |
| // Fields ================================================================= |
| |
| private final Map<SimpleStringPattern, KeywordSubstitution> wrapperMap = new HashMap(); |
| private String logMessage; |
| private String module; |
| private String releaseTag; |
| private String vendorBranch; |
| private String vendorTag; |
| private KeywordSubstitution keywordSubstitutionOption; |
| |
| // Setup ================================================================== |
| |
| public ImportCommand() {} |
| |
| // Implemented ============================================================ |
| |
| public boolean execute(IRequestProcessor requestProcessor, IEventSender eventManager, ICvsListenerRegistry listenerRegistry, IClientEnvironment clientEnvironment, IProgressViewer progressViewer) throws CommandException, |
| AuthenticationException { |
| // check necessary fields |
| BugLog.getInstance().assertNotNull(getModule()); |
| BugLog.getInstance().assertNotNull(getReleaseTag()); |
| BugLog.getInstance().assertNotNull(getVendorTag()); |
| |
| final Requests requests; |
| try { |
| requests = new Requests(CommandRequest.IMPORT, clientEnvironment); |
| requests.addArgumentRequest(getVendorBranchNotNull(), "-b"); |
| requests.addMessageRequests(CommandUtils.getMessageNotNull(getLogMessage())); |
| requests.addArgumentRequest(getKeywordSubstitutionOption(), "-k"); |
| |
| addWrapperRequests(requests, this.wrapperMap); |
| |
| requests.addArgumentRequest(getModule()); |
| requests.addArgumentRequest(getVendorTag()); |
| requests.addArgumentRequest(getReleaseTag()); |
| |
| final File rootDirectory = clientEnvironment.getCvsFileSystem().getLocalFileSystem().getRootDirectory(); |
| addFileRequests(rootDirectory, requests, requestProcessor, clientEnvironment); |
| |
| // This is necessary when importing a directory structure with CVS directories. |
| // If requests.addLocalPathDirectoryRequest(); would be used, the repository path |
| // would be used from the CVS folders. |
| requests.addRequest(new DirectoryRequest(".", getRepositoryRoot(clientEnvironment))); |
| } |
| catch (IOException ex) { |
| throw new IOCommandException(ex); |
| } |
| |
| return requestProcessor.processRequests(requests, new DummyRequestsProgressHandler()); |
| } |
| |
| public void resetCvsCommand() { |
| super.resetCvsCommand(); |
| setLogMessage(null); |
| setModule(null); |
| setReleaseTag(null); |
| setVendorTag(null); |
| setVendorBranch(null); |
| setKeywordSubstitutionOption(null); |
| if (wrapperMap != null) { |
| wrapperMap.clear(); |
| } |
| } |
| |
| public String getCvsCommandLine() { |
| @NonNls final StringBuilder cvsArguments = new StringBuilder("import "); |
| cvsArguments.append(getCvsArguments()); |
| |
| cvsArguments.append(' '); |
| cvsArguments.append(getModule()); |
| |
| cvsArguments.append(' '); |
| cvsArguments.append(getVendorTag()); |
| |
| cvsArguments.append(' '); |
| cvsArguments.append(getReleaseTag()); |
| return cvsArguments.toString(); |
| } |
| |
| // Accessing ============================================================== |
| |
| public void addWrapper(String filenamePattern, KeywordSubstitution keywordSubstitutionOptions) { |
| BugLog.getInstance().assertNotNull(keywordSubstitutionOptions); |
| |
| wrapperMap.put(new SimpleStringPattern(filenamePattern), keywordSubstitutionOptions); |
| } |
| |
| private KeywordSubstitution getKeywordSubstitutionOption() { |
| return keywordSubstitutionOption; |
| } |
| |
| public void setKeywordSubstitutionOption(KeywordSubstitution keywordSubstitutionOption) { |
| this.keywordSubstitutionOption = keywordSubstitutionOption; |
| } |
| |
| private String getReleaseTag() { |
| return releaseTag; |
| } |
| |
| public void setReleaseTag(String releaseTag) { |
| this.releaseTag = getTrimmedString(releaseTag); |
| } |
| |
| private String getLogMessage() { |
| return logMessage; |
| } |
| |
| public void setLogMessage(String logMessage) { |
| this.logMessage = logMessage; |
| } |
| |
| private String getModule() { |
| return module; |
| } |
| |
| public void setModule(String module) { |
| this.module = getTrimmedString(module); |
| } |
| |
| private String getVendorBranch() { |
| return vendorBranch; |
| } |
| |
| /** |
| * Returns the vendor branch. |
| * If not set, then 1.1.1 is returned. |
| */ |
| private String getVendorBranchNotNull() { |
| if (vendorBranch == null) { |
| return "1.1.1"; |
| } |
| |
| return vendorBranch; |
| } |
| |
| /** |
| * Sets the vendor branch. |
| * If null is set, the default branch 1.1.1 is used automatically. |
| */ |
| public void setVendorBranch(String vendorBranch) { |
| this.vendorBranch = getTrimmedString(vendorBranch); |
| } |
| |
| private String getVendorTag() { |
| return vendorTag; |
| } |
| |
| public void setVendorTag(String vendorTag) { |
| this.vendorTag = getTrimmedString(vendorTag); |
| } |
| |
| // Utils ================================================================== |
| |
| private String getCvsArguments() { |
| @NonNls final StringBuilder cvsArguments = new StringBuilder(); |
| cvsArguments.append("-m \""); |
| cvsArguments.append(CommandUtils.getMessageNotNull(getLogMessage())); |
| cvsArguments.append("\" "); |
| |
| if (getKeywordSubstitutionOption() != null) { |
| cvsArguments.append("-k"); |
| cvsArguments.append(getKeywordSubstitutionOption().toString()); |
| cvsArguments.append(" "); |
| } |
| if (getVendorBranch() != null) { |
| cvsArguments.append("-b "); |
| cvsArguments.append(getVendorBranch()); |
| cvsArguments.append(" "); |
| } |
| if (wrapperMap.size() > 0) { |
| for (final SimpleStringPattern pattern : wrapperMap.keySet()) { |
| final KeywordSubstitution keywordSubstitutionOptions = wrapperMap.get(pattern); |
| cvsArguments.append("-W "); |
| cvsArguments.append(pattern.toString()); |
| cvsArguments.append(" -k '"); |
| cvsArguments.append(keywordSubstitutionOptions.toString()); |
| cvsArguments.append("' "); |
| } |
| } |
| return cvsArguments.toString(); |
| } |
| |
| /** |
| * Adds requests for specified wrappers to the specified requestList. |
| */ |
| private static void addWrapperRequests(Requests requests, Map<SimpleStringPattern, KeywordSubstitution> wrapperMap) { |
| // override the server's ignore list |
| requests.addArgumentRequest("-I !"); |
| |
| for (final SimpleStringPattern pattern : wrapperMap.keySet()) { |
| final KeywordSubstitution keywordSubstitutionOptions = wrapperMap.get(pattern); |
| |
| @NonNls final StringBuilder buffer = new StringBuilder(); |
| buffer.append(pattern.toString()); |
| buffer.append(" -k '"); |
| buffer.append(keywordSubstitutionOptions.toString()); |
| buffer.append("'"); |
| |
| requests.addArgumentRequest("-W"); |
| requests.addArgumentRequest(buffer.toString()); |
| } |
| } |
| |
| /** |
| * Adds recursively all request for files and directories in the specified |
| * directory to the specified requestList. |
| */ |
| private void addFileRequests(File directory, Requests requests, IRequestProcessor requestProcessor, IClientEnvironment clientEnvironment) throws IOException { |
| final DirectoryObject directoryObject = clientEnvironment.getCvsFileSystem().getLocalFileSystem().getDirectoryObject(directory); |
| |
| final String relativePath = directoryObject.toUnixPath(); |
| String repository = getRepositoryRoot(clientEnvironment); |
| if (!relativePath.equals(".")) { |
| repository += '/' + relativePath; |
| } |
| requests.addRequest(new DirectoryRequest(relativePath, repository)); |
| |
| final File[] files = directory.listFiles(); |
| if (files == null) { |
| return; |
| } |
| |
| final List<File> subdirectories = new ArrayList(); |
| |
| for (final File file : files) { |
| if (file.isDirectory()) { |
| final DirectoryObject subDirObject = clientEnvironment.getCvsFileSystem().getLocalFileSystem().getDirectoryObject(file); |
| |
| if (clientEnvironment.getIgnoreFileFilter().shouldBeIgnored(subDirObject, clientEnvironment.getCvsFileSystem())) { |
| continue; |
| } |
| |
| subdirectories.add(file); |
| } |
| else { |
| final FileObject fileObject = clientEnvironment.getCvsFileSystem().getLocalFileSystem().getFileObject(file); |
| |
| if (clientEnvironment.getIgnoreFileFilter().shouldBeIgnored(fileObject, clientEnvironment.getCvsFileSystem())) { |
| continue; |
| } |
| |
| final KeywordSubstitution keywordSubstMode = getKeywordSubstMode(file.getName()); |
| final boolean writable = clientEnvironment.getLocalFileReader().isWritable(fileObject, clientEnvironment.getCvsFileSystem()); |
| if (keywordSubstMode != null) { |
| requests.addKoptRequest(keywordSubstMode); |
| } |
| requests.addModifiedRequest(fileObject, keywordSubstMode == KeywordSubstitution.BINARY, writable); |
| } |
| } |
| |
| for (final File subdirectory : subdirectories) { |
| addFileRequests(subdirectory, requests, requestProcessor, clientEnvironment); |
| } |
| } |
| |
| /** |
| * Returns the used root path in the repository. |
| * It's built from the repository stored in the clientService and the |
| * module. |
| */ |
| private String getRepositoryRoot(IClientEnvironment clientEnvironment) { |
| return clientEnvironment.getCvsRoot().getRepositoryPath() + '/' + getModule(); |
| } |
| |
| /** |
| * Returns true, if the file for the specified filename should be treated as |
| * a binary file. |
| * |
| * The information comes from the wrapper map and the set keywordsubstitution. |
| */ |
| private KeywordSubstitution getKeywordSubstMode(String fileName) { |
| KeywordSubstitution keywordSubstMode = getKeywordSubstitutionOption(); |
| |
| for (final SimpleStringPattern pattern : wrapperMap.keySet()) { |
| if (pattern.doesMatch(fileName)) { |
| keywordSubstMode = wrapperMap.get(pattern); |
| break; |
| } |
| } |
| |
| return keywordSubstMode; |
| } |
| } |