blob: 398372e507b6858b52e126c66b3b0d229bf3f33c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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
*******************************************************************************/
package org.eclipse.pde.internal.ui.refactoring;
import java.util.ArrayList;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.*;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.osgi.service.resolver.*;
import org.eclipse.pde.core.plugin.*;
import org.eclipse.pde.internal.core.ICoreConstants;
import org.osgi.framework.Constants;
public class FindReferenceOperation implements IWorkspaceRunnable {
private BundleDescription fDesc;
private String fNewId;
private Change[] fChanges;
public FindReferenceOperation(BundleDescription desc, String newId) {
fDesc = desc;
fNewId = newId;
}
public void run(IProgressMonitor monitor) throws CoreException {
ArrayList list = new ArrayList();
if (fDesc != null) {
monitor.beginTask("", 3); //$NON-NLS-1$
findRequireBundleReferences(list, new SubProgressMonitor(monitor, 1));
findFragmentReferences(list, new SubProgressMonitor(monitor, 1));
findXFriendReferences(list, new SubProgressMonitor(monitor, 1));
}
monitor.done();
fChanges = (Change[]) list.toArray(new Change[list.size()]);
}
public Change[] getChanges() {
return fChanges;
}
private void findRequireBundleReferences(ArrayList changes, IProgressMonitor monitor) throws CoreException {
String oldId = fDesc.getSymbolicName();
BundleDescription[] dependents = fDesc.getDependents();
monitor.beginTask("", dependents.length); //$NON-NLS-1$
for (int i = 0; i < dependents.length; i++) {
BundleSpecification[] requires = dependents[i].getRequiredBundles();
boolean found = false;
for (int j = 0; j < requires.length; j++) {
if (requires[j].getName().equals(oldId)) {
CreateHeaderChangeOperation op = new CreateHeaderChangeOperation(PluginRegistry.findModel(dependents[i]), Constants.REQUIRE_BUNDLE, oldId, fNewId);
op.run(new SubProgressMonitor(monitor, 1));
TextFileChange change = op.getChange();
if (change != null)
changes.add(change);
found = true;
break;
}
}
if (!found)
monitor.worked(1);
}
}
private void findFragmentReferences(ArrayList changes, IProgressMonitor monitor) throws CoreException {
BundleDescription[] fragments = fDesc.getFragments();
monitor.beginTask("", fragments.length); //$NON-NLS-1$
String id = fDesc.getSymbolicName();
for (int i = 0; i < fragments.length; i++) {
IPluginModelBase base = PluginRegistry.findModel(fragments[i]);
if (base instanceof IFragmentModel && id.equals(((IFragmentModel) (base)).getFragment().getPluginId())) {
CreateHeaderChangeOperation op = new CreateHeaderChangeOperation(base, Constants.FRAGMENT_HOST, id, fNewId);
op.run(new SubProgressMonitor(monitor, 1));
TextFileChange change = op.getChange();
if (change != null)
changes.add(change);
} else
monitor.worked(1);
}
}
private void findXFriendReferences(ArrayList changes, IProgressMonitor monitor) throws CoreException {
StateHelper helper = Platform.getPlatformAdmin().getStateHelper();
ExportPackageDescription[] pkgs = helper.getVisiblePackages(fDesc);
String id = fDesc.getSymbolicName();
monitor.beginTask("", pkgs.length); //$NON-NLS-1$
for (int i = 0; i < pkgs.length; i++) {
String[] friends = (String[]) pkgs[i].getDirective(ICoreConstants.FRIENDS_DIRECTIVE);
if (friends != null)
for (int j = 0; j < friends.length; j++) {
if (friends[j].equals(id)) {
CreateHeaderChangeOperation op = new CreateHeaderChangeOperation(PluginRegistry.findModel(pkgs[i].getExporter()), Constants.EXPORT_PACKAGE, id, fNewId);
op.run(new SubProgressMonitor(monitor, 1));
TextFileChange change = op.getChange();
if (change != null)
changes.add(change);
break;
}
}
}
}
}