| /******************************************************************************* |
| * Copyright (c) 2000, 2016 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 |
| *******************************************************************************/ |
| package org.eclipse.releng.tools; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.StringTokenizer; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.team.internal.ccvs.core.CVSException; |
| import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin; |
| import org.eclipse.team.internal.ccvs.core.CVSTag; |
| import org.eclipse.team.internal.ccvs.core.ICVSRemoteResource; |
| import org.eclipse.team.internal.ccvs.core.ICVSRepositoryLocation; |
| import org.eclipse.team.internal.ccvs.core.connection.CVSRepositoryLocation; |
| import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin; |
| import org.eclipse.team.internal.ccvs.ui.actions.TagInRepositoryAction; |
| |
| |
| /** |
| * Tags the versions in a map file with another tag |
| */ |
| public class TagMap extends TagInRepositoryAction { |
| |
| @Override |
| protected ICVSRemoteResource[] getSelectedRemoteResources() { |
| IResource[] resources = getSelectedResources(); |
| List<String> identifiers = new ArrayList<String>(); |
| for (int i = 0; i < resources.length; i++) { |
| IResource resource = resources[i]; |
| try { |
| String[] strings = LoadMap.readReferenceStrings((IFile)resource); |
| identifiers.addAll(Arrays.asList(strings)); |
| } catch (CoreException e) { |
| RelEngPlugin.log(e); |
| } |
| } |
| return getCVSResourcesFor(identifiers.toArray(new String[identifiers.size()])); |
| } |
| |
| private ICVSRemoteResource[] getCVSResourcesFor(String[] referenceStrings) { |
| Map<ICVSRepositoryLocation, ICVSRepositoryLocation> previouslySelectedRepositories = new HashMap<ICVSRepositoryLocation, ICVSRepositoryLocation>(); |
| int size = referenceStrings.length; |
| List<ICVSRemoteResource> result = new ArrayList<ICVSRemoteResource>(size); |
| for (int i = 0; i < size; i++) { |
| StringTokenizer tokenizer = new StringTokenizer(referenceStrings[i], ","); //$NON-NLS-1$ |
| String version = tokenizer.nextToken(); |
| if (!version.equals("1.0")) { //$NON-NLS-1$ |
| // Bail out, this is a newer version |
| return null; |
| } |
| try { |
| String repo = tokenizer.nextToken(); |
| ICVSRepositoryLocation storedlocation = getLocationFromString(repo); |
| ICVSRepositoryLocation location = previouslySelectedRepositories.get(storedlocation); |
| if (location == null) { |
| location = getWritableRepositoryLocation(storedlocation); |
| previouslySelectedRepositories.put(storedlocation, location); |
| if (location == null) return new ICVSRemoteResource[0]; |
| } |
| String module = tokenizer.nextToken(); |
| tokenizer.nextToken(); /* project name */ |
| CVSTag tag = CVSTag.DEFAULT; |
| if (tokenizer.hasMoreTokens()) { |
| String tagName = tokenizer.nextToken(); |
| tag = new CVSTag(tagName, CVSTag.VERSION); |
| } |
| result.add(location.getRemoteFolder(module, tag)); |
| } catch (CVSException e) { |
| RelEngPlugin.log(e); |
| } |
| } |
| return result.toArray(new ICVSRemoteResource[result.size()]); |
| } |
| |
| private ICVSRepositoryLocation getLocationFromString(String repo) throws CVSException { |
| // create the new location |
| ICVSRepositoryLocation newLocation = CVSRepositoryLocation.fromString(repo); |
| if (newLocation.getUsername() == null || newLocation.getUsername().length() == 0) { |
| // look for an existing location that matched |
| ICVSRepositoryLocation[] locations = CVSProviderPlugin.getPlugin().getKnownRepositories(); |
| for (int i = 0; i < locations.length; i++) { |
| ICVSRepositoryLocation location = locations[i]; |
| if (location.getMethod() == newLocation.getMethod() |
| && location.getHost().equals(newLocation.getHost()) |
| && location.getPort() == newLocation.getPort() |
| && location.getRootDirectory().equals(newLocation.getRootDirectory())) |
| return location; |
| } |
| } |
| return newLocation; |
| } |
| |
| private ICVSRepositoryLocation getWritableRepositoryLocation(ICVSRepositoryLocation storedLocation) { |
| // Find out which repo locations are appropriate |
| ICVSRepositoryLocation[] locations = CVSUIPlugin.getPlugin().getRepositoryManager().getKnownRepositoryLocations(); |
| List<ICVSRepositoryLocation> compatibleLocations = new ArrayList<ICVSRepositoryLocation>(); |
| for (int i = 0; i < locations.length; i++) { |
| ICVSRepositoryLocation location = locations[i]; |
| // Only locations with the same host and root are eligible |
| if (!location.getHost().equals(storedLocation.getHost())) continue; |
| if (!location.getRootDirectory().equals(storedLocation.getRootDirectory())) continue; |
| compatibleLocations.add(location); |
| } |
| RepositorySelectionDialog dialog = new RepositorySelectionDialog(getShell()); |
| dialog.setLocations(compatibleLocations.toArray(new ICVSRepositoryLocation[compatibleLocations.size()])); |
| dialog.open(); |
| ICVSRepositoryLocation location = dialog.getLocation(); |
| return location; |
| } |
| |
| @Override |
| public boolean isEnabled() { |
| IResource[] resources = getSelectedResources(); |
| if (resources.length == 0) return false; |
| for (int i = 0; i < resources.length; i++) { |
| IResource resource = resources[i]; |
| if (resource.getType() != IResource.FILE) |
| return false; |
| if (!MapFile.isMapFile((IFile)resource)) |
| return false; |
| } |
| return true; |
| } |
| |
| } |