|
Added
Link Here
|
| 1 |
/******************************************************************************* |
| 2 |
* Copyright (c) 2007 IBM Corporation and others. |
| 3 |
* All rights reserved. This program and the accompanying materials |
| 4 |
* are made available under the terms of the Eclipse Public License v1.0 |
| 5 |
* which accompanies this distribution, and is available at |
| 6 |
* http://www.eclipse.org/legal/epl-v10.html |
| 7 |
* |
| 8 |
* Contributors: |
| 9 |
* IBM Corporation - initial API and implementation |
| 10 |
*******************************************************************************/ |
| 11 |
package org.eclipse.pde.internal.ui.correction.java; |
| 12 |
|
| 13 |
import java.util.ArrayList; |
| 14 |
import java.util.HashSet; |
| 15 |
import java.util.Iterator; |
| 16 |
import java.util.List; |
| 17 |
import java.util.Set; |
| 18 |
|
| 19 |
import org.eclipse.core.resources.IProject; |
| 20 |
import org.eclipse.core.runtime.CoreException; |
| 21 |
import org.eclipse.core.runtime.IProgressMonitor; |
| 22 |
import org.eclipse.jdt.core.IJavaProject; |
| 23 |
import org.eclipse.jdt.ui.text.java.ClasspathFixProcessor; |
| 24 |
import org.eclipse.osgi.service.resolver.BundleDescription; |
| 25 |
import org.eclipse.osgi.service.resolver.BundleSpecification; |
| 26 |
import org.eclipse.osgi.service.resolver.ExportPackageDescription; |
| 27 |
import org.eclipse.osgi.service.resolver.ImportPackageSpecification; |
| 28 |
import org.eclipse.pde.core.plugin.IPluginImport; |
| 29 |
import org.eclipse.pde.core.plugin.IPluginModelBase; |
| 30 |
import org.eclipse.pde.core.plugin.PluginRegistry; |
| 31 |
import org.eclipse.pde.internal.core.ICoreConstants; |
| 32 |
import org.eclipse.pde.internal.core.PDECore; |
| 33 |
import org.eclipse.pde.internal.core.bundle.BundlePluginBase; |
| 34 |
import org.eclipse.pde.internal.core.converter.PluginConverter; |
| 35 |
import org.eclipse.pde.internal.core.ibundle.IBundle; |
| 36 |
import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase; |
| 37 |
import org.eclipse.pde.internal.core.ibundle.IManifestHeader; |
| 38 |
import org.eclipse.pde.internal.core.text.bundle.Bundle; |
| 39 |
import org.eclipse.pde.internal.core.text.bundle.ImportPackageHeader; |
| 40 |
import org.eclipse.pde.internal.core.text.bundle.ImportPackageObject; |
| 41 |
import org.eclipse.pde.internal.ui.PDEUIMessages; |
| 42 |
import org.osgi.framework.Constants; |
| 43 |
import org.osgi.framework.Version; |
| 44 |
|
| 45 |
import com.ibm.icu.text.MessageFormat; |
| 46 |
|
| 47 |
/** |
| 48 |
* Offers a classpath fix proposal if the broken import statement can be |
| 49 |
* fixed by adding a plugin dependency (required bundle or package import). |
| 50 |
* @since 3.4 |
| 51 |
*/ |
| 52 |
public class UnresolvedImportFixProcessor extends ClasspathFixProcessor { |
| 53 |
|
| 54 |
/* (non-Javadoc) |
| 55 |
* @see org.eclipse.jdt.ui.text.java.ClasspathFixProcessor#getFixImportProposals(org.eclipse.jdt.core.IJavaProject, java.lang.String) |
| 56 |
*/ |
| 57 |
public ClasspathFixProposal[] getFixImportProposals(IJavaProject project, String name) throws CoreException { |
| 58 |
int idx= name.lastIndexOf('.'); |
| 59 |
String packageName= idx != -1 ? name.substring(0, idx) : null; |
| 60 |
String typeName= name.substring(idx + 1); |
| 61 |
if (typeName.length() == 1 && typeName.charAt(0) == '*') { |
| 62 |
typeName= null; |
| 63 |
} |
| 64 |
|
| 65 |
if (packageName != null){ |
| 66 |
// Get the packages exported by all bundles, see if any can provide the required classes |
| 67 |
ExportPackageDescription[] knownPackages = PDECore.getDefault().getModelManager().getState().getState().getExportedPackages(); |
| 68 |
Set validPackages = new HashSet(); |
| 69 |
for (int i = 0; i < knownPackages.length; i++) { |
| 70 |
if (knownPackages[i].getName().equals(packageName)){ |
| 71 |
validPackages.add(knownPackages[i]); |
| 72 |
} |
| 73 |
} |
| 74 |
|
| 75 |
List proposals = new ArrayList(); |
| 76 |
Iterator validPackagesIter = validPackages.iterator(); |
| 77 |
while (validPackagesIter.hasNext()) { |
| 78 |
ExportPackageDescription currentPackage = (ExportPackageDescription) validPackagesIter.next(); |
| 79 |
addRequireBundleProposal(proposals, project.getProject(),currentPackage); |
| 80 |
addImportPackageProposal(proposals, project.getProject(),currentPackage); |
| 81 |
} |
| 82 |
|
| 83 |
return (ClasspathFixProposal[])proposals.toArray(new ClasspathFixProposal[proposals.size()]); |
| 84 |
} |
| 85 |
|
| 86 |
return new ClasspathFixProposal[0]; |
| 87 |
} |
| 88 |
|
| 89 |
/** |
| 90 |
* Helper method to create a proposal to add an require bundle dependency to the project |
| 91 |
*/ |
| 92 |
private void addRequireBundleProposal(List proposalList, IProject project, ExportPackageDescription dependency){ |
| 93 |
// Check if the bundle already exists |
| 94 |
boolean alreadyExists = false; |
| 95 |
BundleDescription description = PluginRegistry.findModel(project).getBundleDescription(); |
| 96 |
BundleSpecification[] requiredBundles = description.getRequiredBundles(); |
| 97 |
for (int i = 0; i < requiredBundles.length; i++) { |
| 98 |
if (requiredBundles[i].getName().equals(dependency.getExporter().getSymbolicName())){ |
| 99 |
alreadyExists = true; |
| 100 |
break; |
| 101 |
} |
| 102 |
} |
| 103 |
if (!alreadyExists){ |
| 104 |
proposalList.add(new UnresolvedImportFixProposal(project, dependency) { |
| 105 |
|
| 106 |
/* (non-Javadoc) |
| 107 |
* @see org.eclipse.pde.internal.ui.correction.java.UnresolvedImportFixProposal#handleDependencyChange(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase, org.eclipse.osgi.service.resolver.ExportPackageDescription, boolean) |
| 108 |
*/ |
| 109 |
public void handleDependencyChange(IProgressMonitor pm, IPluginModelBase model, ExportPackageDescription dependency, boolean isAdd) throws CoreException { |
| 110 |
IPluginImport pluginImport = model.getPluginFactory().createImport(); |
| 111 |
pluginImport.setId(dependency.getExporter().getSymbolicName()); |
| 112 |
if (isAdd) { |
| 113 |
model.getPluginBase().add(pluginImport); |
| 114 |
} else { |
| 115 |
model.getPluginBase().remove(pluginImport); |
| 116 |
} |
| 117 |
} |
| 118 |
|
| 119 |
/* (non-Javadoc) |
| 120 |
* @see org.eclipse.pde.internal.ui.correction.java.UnresolvedImportFixProposal#getLabel(boolean) |
| 121 |
*/ |
| 122 |
public String getLabel(boolean isAdd) { |
| 123 |
if (isAdd) { |
| 124 |
return MessageFormat.format(PDEUIMessages.UnresolvedImportFixProcessor_0,new Object[]{getDependency().getExporter().getName()}); |
| 125 |
} |
| 126 |
return MessageFormat.format(PDEUIMessages.UnresolvedImportFixProcessor_1,new Object[]{getDependency().getExporter().getName()}); |
| 127 |
} |
| 128 |
|
| 129 |
/* (non-Javadoc) |
| 130 |
* @see org.eclipse.pde.internal.ui.correction.java.UnresolvedImportFixProposal#getDescription() |
| 131 |
*/ |
| 132 |
public String getDescription() { |
| 133 |
return PDEUIMessages.UnresolvedImportFixProcessor_2; |
| 134 |
} |
| 135 |
}); |
| 136 |
} |
| 137 |
} |
| 138 |
|
| 139 |
/** |
| 140 |
* Helper method to create a proposal to add an import package dependency to the project |
| 141 |
*/ |
| 142 |
private void addImportPackageProposal(List proposalList, IProject project, ExportPackageDescription dependency){ |
| 143 |
// Check if the import package already exists |
| 144 |
boolean alreadyExists = false; |
| 145 |
IPluginModelBase base = PluginRegistry.findModel(project); |
| 146 |
if (!(base instanceof IBundlePluginModelBase)){ |
| 147 |
// The model must be manifest based to add an import package entry |
| 148 |
return; |
| 149 |
} |
| 150 |
BundleDescription description = base.getBundleDescription(); |
| 151 |
ImportPackageSpecification[] importedPackages = description.getImportPackages(); |
| 152 |
for (int i = 0; i < importedPackages.length; i++) { |
| 153 |
if (importedPackages[i].getName().equals(dependency.getName())){ |
| 154 |
alreadyExists = true; |
| 155 |
break; |
| 156 |
} |
| 157 |
} |
| 158 |
if (!alreadyExists){ |
| 159 |
proposalList.add(new UnresolvedImportFixProposal(project, dependency) { |
| 160 |
|
| 161 |
/* (non-Javadoc) |
| 162 |
* @see org.eclipse.pde.internal.ui.correction.java.UnresolvedImportFixProposal#handleDependencyChange(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase, org.eclipse.osgi.service.resolver.ExportPackageDescription, boolean) |
| 163 |
*/ |
| 164 |
public void handleDependencyChange(IProgressMonitor pm, IPluginModelBase model, ExportPackageDescription dependency, boolean isAdd) throws CoreException { |
| 165 |
IBundle bundle = ((IBundlePluginModelBase)model).getBundleModel().getBundle(); |
| 166 |
if (!(bundle instanceof Bundle)){ |
| 167 |
return; |
| 168 |
} |
| 169 |
IManifestHeader mheader = bundle.getManifestHeader(Constants.IMPORT_PACKAGE); |
| 170 |
if (mheader == null) { |
| 171 |
bundle.setHeader(Constants.IMPORT_PACKAGE, new String()); |
| 172 |
mheader = bundle.getManifestHeader(Constants.IMPORT_PACKAGE); |
| 173 |
} |
| 174 |
if (mheader instanceof ImportPackageHeader) { |
| 175 |
ImportPackageHeader header = (ImportPackageHeader) mheader; |
| 176 |
String versionAttr = (BundlePluginBase.getBundleManifestVersion(bundle) < 2) ? ICoreConstants.PACKAGE_SPECIFICATION_VERSION : Constants.VERSION_ATTRIBUTE; |
| 177 |
ImportPackageObject obj = new ImportPackageObject(header, dependency, versionAttr); |
| 178 |
header.addPackage(obj); |
| 179 |
} else { |
| 180 |
StringBuffer buffer = new StringBuffer(); |
| 181 |
String currentValue = (mheader != null) ? mheader.getValue() : null; |
| 182 |
if (currentValue != null){ |
| 183 |
buffer.append(currentValue).append(PluginConverter.LIST_SEPARATOR); |
| 184 |
} |
| 185 |
if (dependency.getVersion().equals(Version.emptyVersion)){ |
| 186 |
buffer.append(dependency.getName()); |
| 187 |
} else { |
| 188 |
buffer.append(dependency.getName()); |
| 189 |
buffer.append("; version=\""); //$NON-NLS-1$ |
| 190 |
buffer.append(dependency.getVersion()); |
| 191 |
buffer.append("\""); //$NON-NLS-1$ |
| 192 |
} |
| 193 |
bundle.setHeader(Constants.IMPORT_PACKAGE, buffer.toString()); |
| 194 |
} |
| 195 |
} |
| 196 |
|
| 197 |
/* (non-Javadoc) |
| 198 |
* @see org.eclipse.pde.internal.ui.correction.java.UnresolvedImportFixProposal#getLabel(boolean) |
| 199 |
*/ |
| 200 |
public String getLabel(boolean isAdd) { |
| 201 |
if (isAdd) { |
| 202 |
return MessageFormat.format(PDEUIMessages.UnresolvedImportFixProcessor_3,new Object[]{getDependency().getName()}); |
| 203 |
} |
| 204 |
return MessageFormat.format(PDEUIMessages.UnresolvedImportFixProcessor_4,new Object[]{getDependency().getName()}); |
| 205 |
} |
| 206 |
|
| 207 |
/* (non-Javadoc) |
| 208 |
* @see org.eclipse.pde.internal.ui.correction.java.UnresolvedImportFixProposal#getDescription() |
| 209 |
*/ |
| 210 |
public String getDescription() { |
| 211 |
return PDEUIMessages.UnresolvedImportFixProcessor_5; |
| 212 |
} |
| 213 |
|
| 214 |
}); |
| 215 |
} |
| 216 |
} |
| 217 |
} |