Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2000, 2007 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: IBM Corporation - initial API and implementation Sebastian Davids <sdavids@gmx.de> - bug 74959 Maik Schreiber - bug 102461 William Mitsuda (wmitsuda@gmail.com) - Bug 153879 [Wizards] configurable size of cvs commit comment history /
 
 package org.eclipse.team.internal.ccvs.ui.repo;
 
 
 import java.io.*;
 import java.util.*;
 
 
 import  org.eclipse.swt.widgets.Shell;
This class is repsible for maintaining the UI's list of known repositories, and a list of known tags within each of those repositories. It also provides a number of useful methods for assisting in repository operations.
 
 public class RepositoryManager {
 	// old state file
 	private static final String STATE_FILE = ".repositoryManagerState"//$NON-NLS-1$
 	private static final int STATE_FILE_VERSION_1 = -1;
 	// new state file
 	private static final String REPOSITORIES_VIEW_FILE = "repositoriesView.xml"//$NON-NLS-1$
 	private static final String COMMENT_HIST_FILE = "commitCommentHistory.xml"//$NON-NLS-1$
     private static final String COMMENT_TEMPLATES_FILE = "commentTemplates.xml"//$NON-NLS-1$
 	static final String ELEMENT_COMMIT_COMMENT = "CommitComment"//$NON-NLS-1$
 	static final String ELEMENT_COMMIT_HISTORY = "CommitComments"//$NON-NLS-1$
     static final String ELEMENT_COMMENT_TEMPLATES = "CommitCommentTemplates"//$NON-NLS-1$
 
 	private Map repositoryRoots = new HashMap();
 	
 	List listeners = new ArrayList();
 
 	// The previously remembered comment
 	static String[] previousComments = new String[0];
     static String[] commentTemplates = new String[0];
 	
 	public static boolean notifyRepoView = true;
 	
 	// Cache of changed repository roots
 	private int notificationLevel = 0;
 	private Map changedRepositories = new HashMap();
 	
 	public static final int DEFAULT_MAX_COMMENTS = 10;
 	
 	private int maxComments = ;
 	
 	public void setMaxComments(int maxComments) {
 		if (maxComments > 0) {
 			this. = maxComments;
 			if (maxComments < .) {
 				String[] newComments = new String[maxComments];
 				System.arraycopy(, 0, newComments, 0, maxComments);
 				 = newComments;
 			}
 		}
 	}

Answer an array of all known remote roots.
 
 		return KnownRepositories.getInstance().getRepositories();
 	}

Method getRepositoryRoots.

Parameters:
iCVSRepositoryLocations
Returns:
RepositoryRoot[]
		List roots = new ArrayList();
		for (int i = 0; i < locations.lengthi++) {
			ICVSRepositoryLocation location = locations[i];
			if (root != null)
				roots.add(root);
		}
		return (RepositoryRoot[]) roots.toArray(new RepositoryRoot[roots.size()]);
	}
	}

Get the list of known branch tags for a given remote root.
	public CVSTag[] getKnownTags(ICVSFolder projectint tagType) {
		try {
			CVSTag[] tags = getKnownTags(project);
			Set result = new HashSet();
			for (int i = 0; i < tags.lengthi++) {
				CVSTag tag = tags[i];
				if (tag.getType() == tagType)
					result.add(tag);
			}
			return (CVSTag[])result.toArray(new CVSTag[result.size()]);
catch(CVSException e) {
			CVSUIPlugin.log(e);
			return new CVSTag[0];
		}
	}

Get the list of known version tags for a given project.
	public CVSTag[] getKnownTags(ICVSRepositoryLocation locationint tagType) {
		Set result = new HashSet();
		if (root != null) {
			String[] paths = root.getKnownRemotePaths();
			for (int i = 0; i < paths.lengthi++) {
				String path = paths[i];
				CVSTag[] tags = root.getAllKnownTags(path);
				for (int j = 0; j < tags.lengthj++) {
					CVSTag tag = tags[j];
					if (tag.getType() == tagType)
						result.add(tag);
				}
			}
		}
		return (CVSTag[])result.toArray(new CVSTag[0]);
	}

Method getKnownTags.

Parameters:
repository
set
i
monitor
Returns:
CVSTag[]
	public CVSTag[] getKnownTags(ICVSRepositoryLocation repositoryIWorkingSet setint tagTypeIProgressMonitor monitorthrows CVSException {
		if (set == null) {
			return getKnownTags(repositorytagType);
		}
		ICVSRemoteResource[] folders = getFoldersForTag(repository.monitor);
		folders = filterResources(setfolders);
		Set tags = new HashSet();
		for (int i = 0; i < folders.lengthi++) {
			ICVSRemoteFolder folder = (ICVSRemoteFolder)folders[i];
			tags.addAll(Arrays.asList(getKnownTags(foldertagType)));
		}
		return (CVSTag[]) tags.toArray(new CVSTag[tags.size()]);
	}
	public CVSTag[] getKnownTags(ICVSFolder projectthrows CVSException {
		String remotePath = RepositoryRoot.getRemotePathFor(project);
		return root.getAllKnownTags(remotePath);
	}
	/*
	 * XXX I hope this methos is not needed in this form
	 */
		Map knownTags = new HashMap();
		String[] paths = root.getKnownRemotePaths();
		for (int i = 0; i < paths.lengthi++) {
			String path = paths[i];
			Set result = new HashSet();
			result.addAll(Arrays.asList(root.getAllKnownTags(path)));
			knownTags.put(pathresult);
		}
		return knownTags;
	}
		monitor = Policy.monitorFor(monitor);
		try {
			if (tag.getType() == .) {
				ICVSRemoteResource[] resources = location.members(tagfalse, Policy.subMonitorFor(monitor, 60));
				ICVSRemoteResource[] modules = root.getDefinedModules(tag, Policy.subMonitorFor(monitor, 40));
				ICVSRemoteResource[] result = new ICVSRemoteResource[resources.length + modules.length];
				System.arraycopy(resources, 0, result, 0, resources.length);
				System.arraycopy(modules, 0, resultresources.lengthmodules.length);
				return result;
			}
			if (tag.getType() == .) {
				ICVSRemoteResource[] resources = location.members(tagfalse, Policy.subMonitorFor(monitor, 60));
				ICVSRemoteResource[] modules = root.getDefinedModules(tag, Policy.subMonitorFor(monitor, 40));
				ICVSRemoteResource[] result = new ICVSRemoteResource[resources.length + modules.length];
				System.arraycopy(resources, 0, result, 0, resources.length);
				System.arraycopy(modules, 0, resultresources.lengthmodules.length);
				return result;
			}
			Set result = new HashSet();
			// Get the tags for the location
			String[] paths = root.getKnownRemotePaths();
			for (int i = 0; i < paths.lengthi++) {
				String path = paths[i];
				List tags = Arrays.asList(root.getAllKnownTags(path));
				if (tags.contains(tag)) {
					ICVSRemoteFolder remote = root.getRemoteFolder(pathtag, Policy.subMonitorFor(monitor, 100));
					result.add(remote);
				}
			}
			return (ICVSRemoteResource[])result.toArray(new ICVSRemoteResource[result.size()]);
finally {
			monitor.done();
		}
	}
	/*
	 * Fetches tags from auto-refresh files if they exist. Then fetches tags from the user defined auto-refresh file
	 * list. The fetched tags are cached in the CVS ui plugin's tag cache.
	 */
	public CVSTag[] refreshDefinedTags(ICVSFolder folderboolean recurseboolean notifyIProgressMonitor monitorthrows TeamException {
		CVSTag[] tags = root.refreshDefinedTags(folderrecursemonitor);
		if (tags.length > 0 && notify)
		return tags;
	}

A repository root has been added. Notify any listeners.
	public void rootAdded(ICVSRepositoryLocation root) {
		while (it.hasNext()) {
			listener.repositoryAdded(root);
		}
	}

A repository root has been removed. Remove the tags defined for this root and notify any listeners
	public void rootRemoved(ICVSRepositoryLocation root) {
		if (repoRoot != null)
	}

Accept tags for any CVS resource. However, for the time being, the given version tags are added to the list of known tags for the remote ancestor of the resource that is a direct child of the remote root
	public void addTags(ICVSResource resourceCVSTag[] tagsthrows CVSException {
		// XXX could be a file or folder
		String remotePath = RepositoryRoot.getRemotePathFor(resource);
		root.addTags(remotePathtags);
	}
	public void addDateTag(ICVSRepositoryLocation locationCVSTag tag) {
		if(tag == nullreturn;
		root.addDateTag(tag);
	}
	public CVSTag[] getDateTags(ICVSRepositoryLocation location) {
		return root.getDateTags();
	}
	public void removeDateTag(ICVSRepositoryLocation locationCVSTag tag){
		root.removeDateTag(tag);
	}
	public void setAutoRefreshFiles(ICVSFolder projectString[] filePathsthrows CVSException {
		String remotePath = RepositoryRoot.getRemotePathFor(project);
		root.setAutoRefreshFiles(remotePathfilePaths);
	}
	public String[] getAutoRefreshFiles(ICVSFolder projectthrows CVSException {
		String remotePath = RepositoryRoot.getRemotePathFor(project);
		return root.getAutoRefreshFiles(remotePath);
	}

Remove the given tags from the list of known tags for the given remote root.
	public void removeTags(ICVSFolder projectCVSTag[] tagsthrows CVSException {
		String remotePath = RepositoryRoot.getRemotePathFor(project);
		root.removeTags(remotePathtags);
	}
	public void startup() {
        loadCommentTemplates();
		CVSProviderPlugin.getPlugin().addRepositoryListener(new ICVSListener() {
				rootAdded(root);
			}
			}
		});
		IPreferenceStore store = CVSUIPlugin.getPlugin().getPreferenceStore();
			public void propertyChange(PropertyChangeEvent event) {
					Object newValue = event.getNewValue();
					if (newValue instanceof String) {
						try {
							setMaxComments(Integer.parseInt((StringnewValue));
catch (NumberFormatException e) {
							// fail silently
						}
					}
				}
			}
		});
	}
	public void shutdown() throws TeamException {
        saveCommentTemplates();
	}
	private void loadState() {
		IPath pluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation().append();
		File file = pluginStateLocation.toFile();
		if (file.exists()) {
			try {
				try {
finally {
					is.close();
				}
catch (IOException e) {
catch (TeamException e) {
				CVSUIPlugin.log(e);
			}
else {
			IPath oldPluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation().append();
			file = oldPluginStateLocation.toFile();
			if (file.exists()) {
				try {
					try {
finally {
						dis.close();
					}
					file.delete();
catch (IOException e) {
catch (TeamException e) {
					CVSUIPlugin.log(e);
				}
		}
	}
	private void loadCommentHistory() {
		IPath pluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation().append();
		File file = pluginStateLocation.toFile();
		if (!file.exists()) return;
		try {
			try {
finally {
				is.close();
			}
catch (IOException e) {
catch (TeamException e) {
			CVSUIPlugin.log(e);
		}
	}
    private void loadCommentTemplates() {
        IPath pluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation().append();
        File file = pluginStateLocation.toFile();
        if (!file.exists()) return;
        try {
            BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
            try {
                readCommentTemplates(is);
            } finally {
                is.close();
            }
        } catch (IOException e) {
            CVSUIPlugin.log(..e);
        } catch (TeamException e) {
            CVSUIPlugin.log(e);
        }
    }
	protected void saveState() throws TeamException {
		IPath pluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation();
		File tempFile = pluginStateLocation.append( + ".tmp").toFile(); //$NON-NLS-1$
		File stateFile = pluginStateLocation.append().toFile();
		try {
			XMLWriter writer = new XMLWriter(new BufferedOutputStream(new FileOutputStream(tempFile)));
			try {
				writeState(writer);
finally {
				writer.close();
			}
			if (stateFile.exists()) {
				stateFile.delete();
			}
			boolean renamed = tempFile.renameTo(stateFile);
			if (!renamed) {
			}
catch (IOException e) {
		}
	}
	private void writeState(XMLWriter writer) {
		// Write the repositories
		Iterator it = repos.iterator();
		while (it.hasNext()) {
			root.writeState(writer);
		}
	}
	private void readState(InputStream streamthrows IOExceptionTeamException {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			parser.parse(new InputSource(stream), new RepositoriesViewContentHandler(this));
catch (SAXException ex) {
			throw new CVSException(status); 
			throw new CVSException(status); 
		}
	}
	private void readCommentHistory(InputStream streamthrows IOExceptionTeamException {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			parser.parse(new InputSource(stream), new CommentHistoryContentHandler());
catch (SAXException ex) {
			throw new CVSException(status); 
			throw new CVSException(status);  
		}
	}
	private void readOldState(DataInputStream disthrows IOExceptionTeamException {
		int repoSize = dis.readInt();
		boolean version1 = false;
		if (repoSize == ) {
			version1 = true;
			repoSize = dis.readInt();
		}
		for (int i = 0; i < repoSizei++) {
			ICVSRepositoryLocation root = KnownRepositories.getInstance().getRepository(dis.readUTF());
			// read branch tags associated with this root
			int tagsSize = dis.readInt();
			CVSTag[] branchTags = new CVSTag[tagsSize];
			for (int j = 0; j < tagsSizej++) {
				String tagName = dis.readUTF();
				int tagType = dis.readInt();
				branchTags[j] = new CVSTag(tagNametagType);
			}
			// Ignore the branch tags since they are handled differently now
			// addBranchTags(root, branchTags);
			// read the number of projects for this root that have version tags
			int projSize = dis.readInt();
			if (projSize > 0) {
				for (int j = 0; j < projSizej++) {
					String name = dis.readUTF();
					Set tagSet = new HashSet();
					int numTags = dis.readInt();
					for (int k = 0; k < numTagsk++) {
						tagSet.add(new CVSTag(dis.readUTF(), .));
					}
					CVSTag[] tags = (CVSTag[]) tagSet.toArray(new CVSTag[tagSet.size()]);
					repoRoot.addTags(nametags);
				}
			}
			// read the auto refresh filenames for this project
			if (version1) {
				try {
					projSize = dis.readInt();
					if (projSize > 0) {
						for (int j = 0; j < projSizej++) {
							String name = dis.readUTF();
							Set filenames = new HashSet();
							int numFilenames = dis.readInt();
							for (int k = 0; k < numFilenamesk++) {
								filenames.add(name + "/" + dis.readUTF()); //$NON-NLS-1$
							}
							repoRoot.setAutoRefreshFiles(name, (String[]) filenames.toArray(new String[filenames.size()]));
						}
					}
catch (EOFException e) {
					// auto refresh files are not persisted, continue and save them next time.
				}
			}
		}
	}
	protected void saveCommentHistory() throws TeamException {
		IPath pluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation();
		File tempFile = pluginStateLocation.append( + ".tmp").toFile(); //$NON-NLS-1$
		File histFile = pluginStateLocation.append().toFile();
		try {
				 XMLWriter writer = new XMLWriter(new BufferedOutputStream(new FileOutputStream(tempFile)));
		 		 try {
		 		 		 writeCommentHistory(writer);
		 		 } finally {
		 		 		 writer.close();
		 		 }
		 		 if (histFile.exists()) {
		 		 		 histFile.delete();
		 		 }
		 		 boolean renamed = tempFile.renameTo(histFile);
		 		 if (!renamed) {
		 		 		 throw new TeamException(new Status(..., NLS.bind(.new String[] { tempFile.getAbsolutePath() }), null)); 
		 		 }
		 } catch (IOException e) {
		 }
	}
	private void writeCommentHistory(XMLWriter writer) {
		writer.startTag(nullfalse);
		for (int i = 0; i < . && i < i++)
	}
		 
	public void addRepositoryListener(IRepositoryListener listener) {
		.add(listener);
	}
		.remove(listener);
	}

Return the entered comment or null if canceled.

Parameters:
proposedComment
	public String promptForComment(final Shell shellIResource[] resourcesToCommitString proposedComment) {
		final int[] result = new int[1];
		final ReleaseCommentDialog dialog = new ReleaseCommentDialog(shellresourcesToCommitproposedComment.); 
		shell.getDisplay().syncExec(new Runnable() {
			public void run() {
				result[0] = dialog.open();
				if (result[0] != .return;
			}
		});
		if (result[0] != .return null;
		return dialog.getComment();
	}

Prompt to add all or some of the provided resources to version control. The value null is returned if the dialog is cancelled.

Parameters:
shell
unadded
Returns:
IResource[]
	public IResource[] promptForResourcesToBeAdded(Shell shellIResource[] unadded) {
		if (unadded == nullreturn new IResource[0];
		if (unadded.length == 0) return unadded;
		final IResource[][] result = new IResource[1][0];
		result[0] = null;
		final AddToVersionControlDialog dialog = new AddToVersionControlDialog(shellunadded);
		shell.getDisplay().syncExec(new Runnable() {
			public void run() {
				int code = dialog.open();
				if (code == .) {
					result[0] = dialog.getResourcesToAdd();
else if(code == .) {
					// allow the commit to continue.
					result[0] = new IResource[0];
				}
			}
		});
		return result[0];
	}
		try {
catch (CVSException e) {
			CVSUIPlugin.log(e);
			return null;
		}
	}
		ICVSFolder folder;
		if (resource.isFolder()) {
			folder = (ICVSFolder)resource;
else {
			folder = resource.getParent();
		}
		if (folder.isCVSFolder()) {
			ICVSRepositoryLocation location = KnownRepositories.getInstance().getRepository(folder.getFolderSyncInfo().getRoot());
			return location;
		}
		// XXX This is asking for trouble
		return null;
	}
		if (location == nullreturn null;
		return getRepositoryRootFor(location);
	}
		if (root == null) {
			root = new RepositoryRoot(location);
			add(root);
		}
		return root;
	}

Add the given repository root to the receiver. The provided instance of RepositoryRoot is used to provide extra information about the repository location

Parameters:
currentRepositoryRoot
	public void add(RepositoryRoot root) {
		.put(root.getRoot().getLocation(false), root);
	}
		if ( == 0) {
else {
		}
	}
		if (roots.length == 0) return;
		while (it.hasNext()) {
			listener.repositoriesChanged(roots);
		}
	}

Run the given runnable, waiting until the end to perform a refresh

Parameters:
runnable
monitor
		try {
			runnable.run(monitor);
finally {
			if ( == 0) {
				try {
finally {
				}
			}
		}
	}

Method isDisplayingProjectVersions.

Parameters:
repository
Returns:
boolean
	public boolean isDisplayingProjectVersions(ICVSRepositoryLocation repository) {
		return true;
	}

Method filterResources filters the given resources using the given working set.

Parameters:
current
resources
Returns:
ICVSRemoteResource[]
	public ICVSRemoteResource[] filterResources(IWorkingSet workingSetICVSRemoteResource[] resources) {
		if (workingSet == nullreturn resources;
		// get the projects associated with the working set
		IAdaptable[] adaptables = workingSet.getElements();
		Set projects = new HashSet();
		for (int i = 0; i < adaptables.lengthi++) {
			IAdaptable adaptable = adaptables[i];
			Object adapted = adaptable.getAdapter(IResource.class);
			if (adapted != null) {
				// Can this code be generalized?
				IProject project = ((IResource)adapted).getProject();
				projects.add(project);
			}
		}
		List result = new ArrayList();
		for (int i = 0; i < resources.lengthi++) {
			ICVSRemoteResource resource = resources[i];
			for (Iterator iter = projects.iterator(); iter.hasNext();) {
				IProject project = (IProjectiter.next();
				if (project.getName().equals(resource.getName())) {
					result.add(resource);
					break;
				}
			}
		}
		return (ICVSRemoteResource[]) result.toArray(new ICVSRemoteResource[result.size()]);
	}

Method setLabel.

Parameters:
location
label
	public void setLabel(CVSRepositoryLocation locationString label) {
		String oldLabel = root.getName();
		if (oldLabel == null) {
			if (label == nullreturn;
			root.setName(label);
else if (label == null) {
			root.setName(label);
else if (label.equals(oldLabel)) {
			return;
else {
			root.setName(label);
		}
	}

Replace the old repository location with the new one assuming that they are the same location with different authentication informations

Parameters:
location
newLocation
			final ICVSRepositoryLocation oldLocation,
			final CVSRepositoryLocation newLocation) {
		try {
					RepositoryRoot root = getRepositoryRootFor(oldLocation);
					// Disposing of the old location will result in the deletion of the
					// cached root through a listener callback
					KnownRepositories.getInstance().disposeRepository(oldLocation);
					// Get the new location from the CVS plugin to ensure we use the
					// instance that will be returned by future calls to getRepository()
					boolean isNew = !KnownRepositories.getInstance().isKnownRepository(newLocation.getLocation());
							KnownRepositories.getInstance().addRepository(newLocationisNew /* broadcast */));
					add(root);
				}
			}, Policy.monitorFor(null));
catch (InvocationTargetException e) {
			CVSException.wrapException(e);
catch (InterruptedException e) {
		}
	}

Purge any cahced information.
	public void purgeCache() {
		for (Iterator iter = .values().iterator(); iter.hasNext();) {
			RepositoryRoot root = (RepositoryRootiter.next();
			root.clearCache();
		}
	}

Answer the list of comments that were previously used when committing.

Returns:
String[]
	}

Method addComment.

Parameters:
string
	public void addComment(String comment) {
		// Make comment first element if it's already there
		int index = getCommentIndex(comment);
		if (index != -1) {
			return;
		}
			return;
		// Insert the comment as the first element
		String[] newComments = new String[Math.min(. + 1, )];
		newComments[0] = comment;
		for (int i = 1; i < newComments.lengthi++) {
			newComments[i] = [i-1];
		}
		 = newComments;
	}
	private int getCommentIndex(String comment) {
		for (int i = 0; i < .i++) {
			if ([i].equals(comment)) {
				return i;
			}
		}
		return -1;
	}
	private void makeFirstElement(int index) {
		String[] newComments = new String[.];
		newComments[0] = [index];
		System.arraycopy(, 0, newComments, 1, index);
		int maxIndex = . - 1;
		if (index != maxIndex) {
			int nextIndex = (index + 1);
			System.arraycopy(nextIndexnewComments,
					nextIndex, (maxIndex - index));
		}
		 = newComments;
	}
	private void readCommentTemplates(InputStream streamthrows IOExceptionTeamException {
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
			SAXParser parser = factory.newSAXParser();
			parser.parse(new InputSource(stream),
catch (SAXException ex) {
			IStatus status = new CVSStatus(.., NLS.bind(
					new String[] {  }), ex);
			throw new CVSException(status);
			IStatus status = new CVSStatus(.., NLS.bind(
					new String[] {  }), ex);
			throw new CVSException(status);
		}
	}
	protected void saveCommentTemplates() throws TeamException {
		IPath pluginStateLocation = CVSUIPlugin.getPlugin().getStateLocation();
		File tempFile = pluginStateLocation.append(
				 + ".tmp").toFile(); //$NON-NLS-1$
		File histFile = pluginStateLocation.append()
		try {
					new FileOutputStream(tempFile)));
			try {
finally {
				writer.close();
			}
			if (histFile.exists()) {
				histFile.delete();
			}
			boolean renamed = tempFile.renameTo(histFile);
			if (!renamed) {
								new String[] { tempFile.getAbsolutePath() }),
						null));
			}
catch (IOException e) {
							new String[] { histFile.getAbsolutePath() }), e));
		}
	}
	private void writeCommentTemplates(XMLWriter writer) {
		writer.startTag(nullfalse);
		for (int i = 0; i < .i++)
	}
	private boolean containsCommentTemplate(String comment) {
		for (int i = 0; i < .i++) {
			if ([i].equals(comment)) {
				return true;
			}
		}
		return false;
	}

Get list of comment templates.
	}
	public void replaceAndSaveCommentTemplates(String[] templates)
			throws TeamException {
		 = templates;
	}