Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 120525 Details for
Bug 240914
Error for API breakage when there is none (compare plug-in split)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
another update
plugin-split-4.patch (text/plain), 43.90 KB, created by
Darin Wright
on 2008-12-15 17:05:39 EST
(
hide
)
Description:
another update
Filename:
MIME Type:
Creator:
Darin Wright
Created:
2008-12-15 17:05:39 EST
Size:
43.90 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.pde.api.tools.tests >Index: test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassD.java >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassD.java >diff -N test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassD.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassD.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,22 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 d.e.f; >+ >+ >+/** >+ * >+ */ >+public class ClassD { >+ >+ public void methodOne(ClassD arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/pre-split/a.b.c/src/a/b/c/ClassA.java >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/src/a/b/c/ClassA.java >diff -N test-builder/split/pre-split/a.b.c/src/a/b/c/ClassA.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/src/a/b/c/ClassA.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,21 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 a.b.c; >+ >+/** >+ * >+ */ >+public class ClassA { >+ >+ public void methodOne(ClassA arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: src/org/eclipse/pde/api/tools/builder/tests/compatibility/BundleSplitTest.java >=================================================================== >RCS file: src/org/eclipse/pde/api/tools/builder/tests/compatibility/BundleSplitTest.java >diff -N src/org/eclipse/pde/api/tools/builder/tests/compatibility/BundleSplitTest.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/pde/api/tools/builder/tests/compatibility/BundleSplitTest.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,476 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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.api.tools.builder.tests.compatibility; >+ >+import java.io.File; >+import java.io.FileInputStream; >+import java.io.FileOutputStream; >+import java.io.InputStream; >+import java.util.HashSet; >+import java.util.Set; >+import java.util.jar.JarFile; >+ >+import junit.framework.Test; >+ >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IFolder; >+import org.eclipse.core.resources.IMarker; >+import org.eclipse.core.resources.IProject; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.resources.ResourcesPlugin; >+import org.eclipse.core.runtime.IPath; >+import org.eclipse.core.runtime.Path; >+import org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest; >+import org.eclipse.pde.api.tools.builder.tests.ApiProblem; >+import org.eclipse.pde.api.tools.builder.tests.ApiTestingEnvironment; >+import org.eclipse.pde.api.tools.internal.ApiSettingsXmlVisitor; >+import org.eclipse.pde.api.tools.internal.model.ApiModelFactory; >+import org.eclipse.pde.api.tools.internal.problems.ApiProblemFactory; >+import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin; >+import org.eclipse.pde.api.tools.internal.provisional.IApiBaselineManager; >+import org.eclipse.pde.api.tools.internal.provisional.model.IApiBaseline; >+import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent; >+import org.eclipse.pde.api.tools.internal.util.Util; >+import org.eclipse.pde.api.tools.model.tests.TestSuiteHelper; >+import org.eclipse.pde.api.tools.tests.ApiTestsPlugin; >+ >+/** >+ * Tests for splitting plug-ins across releases >+ * >+ * @since 1.0 >+ */ >+public class BundleSplitTest extends ApiBuilderTest { >+ >+ /** >+ * >+ */ >+ public static final String WORKSPACE_PROFILE = "split/post-split"; >+ >+ public static final String BASELINE = "split/pre-split"; >+ >+ /** >+ * Constructor >+ * @param name >+ */ >+ public BundleSplitTest(String name) { >+ super(name); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTests#setBuilderOptions() >+ */ >+ protected void setBuilderOptions() { >+ enableUnsupportedTagOptions(false); >+ enableBaselineOptions(true); >+ enableCompatibilityOptions(true); >+ enableLeakOptions(false); >+ enableSinceTagOptions(false); >+ enableUsageOptions(false); >+ enableVersionNumberOptions(true); >+ } >+ >+ /** >+ * @return the tests for this class >+ */ >+ public static Test suite() { >+ return buildTestSuite(BundleSplitTest.class); >+ } >+ >+ /* (non-Javadoc) >+ * >+ * Ensure a baseline has been created to compare against. >+ * >+ * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#setUp() >+ */ >+ @Override >+ protected void setUp() throws Exception { >+ ApiTestingEnvironment env = getEnv(); >+ if (env != null) { >+ env.setRevert(true); >+ } >+ super.setUp(); >+ // build the baseline if not present >+ IApiBaselineManager manager = ApiPlugin.getDefault().getApiBaselineManager(); >+ IApiBaseline baseline = manager.getDefaultApiBaseline(); >+ if (baseline == null) { >+ // import baseline projects >+ createExistingProjects(BASELINE, true); >+ // create the API baseline >+ IApiBaseline profile = manager.getWorkspaceBaseline(); >+ IProject[] projects = getEnv().getWorkspace().getRoot().getProjects(); >+ IPath baselineLocation = ApiTestsPlugin.getDefault().getStateLocation().append(BASELINE); >+ for (int i = 0; i < projects.length; i++) { >+ exportApiComponent( >+ projects[i], >+ profile.getApiComponent(projects[i].getName()), >+ baselineLocation); >+ } >+ baseline = ApiModelFactory.newApiBaseline("API-baseline"); >+ IApiComponent[] components = new IApiComponent[projects.length]; >+ for (int i = 0; i < projects.length; i++) { >+ IProject project = projects[i]; >+ IPath location = baselineLocation.append(project.getName()); >+ components[i] = ApiModelFactory.newApiComponent(baseline, location.toOSString()); >+ } >+ baseline.addApiComponents(components); >+ manager.addApiBaseline(baseline); >+ manager.setDefaultApiBaseline(baseline.getName()); >+ // delete the projects >+ for (int i = 0; i < projects.length; i++) { >+ getEnv().removeProject(projects[i].getFullPath()); >+ } >+ } >+ // for the first test create workspace projects >+ IProject[] projects = getEnv().getWorkspace().getRoot().getProjects(); >+ if (projects.length == 0) { >+ // populate the workspace with initial plug-ins/projects >+ createExistingProjects(WORKSPACE_PROFILE, true); >+ } else { >+ // build after revert >+ incrementalBuild(); >+ } >+ >+ } >+ >+ @Override >+ protected void tearDown() throws Exception { >+ super.tearDown(); >+ getEnv().setRevert(false); >+ } >+ >+ /** >+ * Exports the project as an API component to be used in an API baseline. >+ * >+ * @param project project to export >+ * @param apiComponent associated API component from the workspace profile >+ * @param baselineLocation local file system directory to host exported component >+ */ >+ private void exportApiComponent(IProject project, IApiComponent apiComponent, IPath baselineLocation) throws Exception { >+ File root = baselineLocation.toFile(); >+ File componentDir = new File(root, project.getName()); >+ componentDir.mkdirs(); >+ IResource[] members = project.members(); >+ // copy root files and manifest >+ for (int i = 0; i < members.length; i++) { >+ IResource res = members[i]; >+ if (res.getType() == IResource.FILE) { >+ copyFile(componentDir, (IFile)res); >+ } else if (res.getType() == IResource.FOLDER) { >+ if (res.getName().equals("META-INF")) { >+ File manDir = new File(componentDir, "META-INF"); >+ manDir.mkdirs(); >+ copyFile(manDir, ((IFolder)res).getFile("MANIFEST.MF")); >+ } >+ } >+ } >+ // copy over .class files >+ IFolder output = project.getFolder("bin"); >+ copyFolder(output, componentDir); >+ // API Description >+ ApiSettingsXmlVisitor visitor = new ApiSettingsXmlVisitor(apiComponent); >+ apiComponent.getApiDescription().accept(visitor); >+ String xml = visitor.getXML(); >+ File desc = new File(componentDir, ".api_description"); >+ desc.createNewFile(); >+ FileOutputStream stream = new FileOutputStream(desc); >+ stream.write(xml.getBytes("UTF-8")); >+ stream.close(); >+ } >+ >+ /** >+ * Copy the folder contents to the local file system. >+ * >+ * @param folder workspace folder >+ * @param dir local directory >+ */ >+ private void copyFolder(IFolder folder, File dir) throws Exception { >+ IResource[] members = folder.members(); >+ for (int i = 0; i < members.length; i++) { >+ IResource res = members[i]; >+ if (res.getType() == IResource.FILE) { >+ IFile file = (IFile) res; >+ copyFile(dir, file); >+ } else { >+ IFolder nested = (IFolder) res; >+ File next = new File(dir, nested.getName()); >+ next.mkdirs(); >+ copyFolder(nested, next); >+ } >+ } >+ } >+ >+ /** >+ * Copies the given file to the given directory. >+ * >+ * @param dir >+ * @param file >+ */ >+ private void copyFile(File dir, IFile file) throws Exception { >+ File local = new File(dir, file.getName()); >+ local.createNewFile(); >+ FileOutputStream stream = new FileOutputStream(local); >+ InputStream contents = file.getContents(); >+ byte[] bytes = Util.getInputStreamAsByteArray(contents, -1); >+ stream.write(bytes); >+ contents.close(); >+ stream.close(); >+ } >+ >+ /** >+ * Updates the contents of a workspace file at the specified location (full path), >+ * with the contents of a local file at the given replacement location (absolute path). >+ * >+ * @param workspaceLocation >+ * @param replacementLocation >+ */ >+ protected void updateWorkspaceFile(IPath workspaceLocation, IPath replacementLocation) throws Exception { >+ IFile file = getEnv().getWorkspace().getRoot().getFile(workspaceLocation); >+ assertTrue("Workspace file does not exist: " + workspaceLocation.toString(), file.exists()); >+ File replacement = replacementLocation.toFile(); >+ assertTrue("Replacement file does not exist: " + replacementLocation.toOSString(), replacement.exists()); >+ FileInputStream stream = new FileInputStream(replacement); >+ file.setContents(stream, false, true, null); >+ stream.close(); >+ getEnv().changed(workspaceLocation); >+ } >+ >+ /** >+ * Updates the contents of a workspace file at the specified location (full path), >+ * with the contents of a local file at the given replacement location (absolute path). >+ * >+ * @param workspaceLocation >+ * @param replacementLocation >+ */ >+ protected void createWorkspaceFile(IPath workspaceLocation, IPath replacementLocation) throws Exception { >+ IFile file = getEnv().getWorkspace().getRoot().getFile(workspaceLocation); >+ assertFalse("Workspace file should not exist: " + workspaceLocation.toString(), file.exists()); >+ File replacement = replacementLocation.toFile(); >+ assertTrue("Replacement file does not exist: " + replacementLocation.toOSString(), replacement.exists()); >+ FileInputStream stream = new FileInputStream(replacement); >+ file.create(stream, false, null); >+ stream.close(); >+ getEnv().added(workspaceLocation); >+ } >+ >+ /** >+ * Deletes the workspace file at the specified location (full path). >+ * >+ * @param workspaceLocation >+ */ >+ protected void deleteWorkspaceFile(IPath workspaceLocation) throws Exception { >+ IFile file = getEnv().getWorkspace().getRoot().getFile(workspaceLocation); >+ assertTrue("Workspace file does not exist: " + workspaceLocation.toString(), file.exists()); >+ file.delete(false, null); >+ getEnv().removed(workspaceLocation); >+ } >+ >+ /** >+ * Returns a path in the local file system to an updated file based on this tests source path >+ * and filename. >+ * >+ * @param filename name of file to update >+ * @return path to the file in the local file system >+ */ >+ protected IPath getUpdateFilePath(String filename) { >+ return TestSuiteHelper.getPluginDirectoryPath().append(TEST_SOURCE_ROOT).append(getTestSourcePath()).append(filename); >+ } >+ /** >+ * Performs a compatibility test. The workspace file at the specified (full workspace path) >+ * location is updated with a corresponding file from test data. A build is performed >+ * and problems are compared against the expected problems for the associated resource. >+ * >+ * @param workspaceFile file to update >+ * @param incremental whether to perform an incremental (<code>true</code>) or >+ * full (<code>false</code>) build >+ * @throws Exception >+ */ >+ protected void performCompatibilityTest(IPath workspaceFile, boolean incremental) throws Exception { >+ updateWorkspaceFile( >+ workspaceFile, >+ getUpdateFilePath(workspaceFile.lastSegment())); >+ if (incremental) { >+ incrementalBuild(); >+ } else { >+ fullBuild(); >+ } >+ IMarker[] jdtMarkers = getEnv().getAllJDTMarkers(workspaceFile); >+ int length = jdtMarkers.length; >+ if (length != 0) { >+ for (int i = 0; i < length; i++) { >+ boolean condition = jdtMarkers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING) == IMarker.SEVERITY_ERROR; >+ if (condition) { >+ System.err.println("workspace file : " + workspaceFile.toOSString()); >+ System.err.println(jdtMarkers[i].getAttribute(IMarker.MESSAGE)); >+ } >+ assertFalse("Should not be a JDT error", condition); >+ } >+ } >+ ApiProblem[] problems = getEnv().getProblemsFor(workspaceFile, null); >+ assertProblems(problems); >+ } >+ >+ /** >+ * Performs a compatibility test. The workspace file at the specified (full workspace path) >+ * location is updated with a corresponding file from test data. A build is performed >+ * and problems are compared against the expected problems for the associated resource. >+ * >+ * @param workspaceFile file to update >+ * @param incremental whether to perform an incremental (<code>true</code>) or >+ * full (<code>false</code>) build >+ * @throws Exception >+ */ >+ protected void performVersionTest(IPath workspaceFile, boolean incremental) throws Exception { >+ updateWorkspaceFile( >+ workspaceFile, >+ getUpdateFilePath(workspaceFile.lastSegment())); >+ if (incremental) { >+ incrementalBuild(); >+ } else { >+ fullBuild(); >+ } >+ ApiProblem[] problems = getEnv().getProblemsFor(new Path(workspaceFile.segment(0)).append(JarFile.MANIFEST_NAME), null); >+ assertProblems(problems); >+ } >+ >+ /** >+ * Performs a compatibility test. The workspace file at the specified (full workspace path) >+ * location is deleted. A build is performed and problems are compared against the expected >+ * problems for the associated resource. >+ * >+ * @param workspaceFile file to update >+ * @param incremental whether to perform an incremental (<code>true</code>) or >+ * full (<code>false</code>) build >+ * @throws Exception >+ */ >+ protected void performDeletionCompatibilityTest(IPath workspaceFile, boolean incremental) throws Exception { >+ deleteWorkspaceFile(workspaceFile); >+ if (incremental) { >+ incrementalBuild(); >+ } else { >+ fullBuild(); >+ } >+ ApiProblem[] problems = getEnv().getProblems(); >+ assertProblems(problems); >+ } >+ >+ /** >+ * Performs a compatibility test. The workspace file at the specified (full workspace path) >+ * location is created. A build is performed and problems are compared against the expected >+ * problems for the associated resource. >+ * >+ * @param workspaceFile file to update >+ * @param incremental whether to perform an incremental (<code>true</code>) or >+ * full (<code>false</code>) build >+ * @throws Exception >+ */ >+ protected void performCreationCompatibilityTest(IPath workspaceFile, boolean incremental) throws Exception { >+ createWorkspaceFile( >+ workspaceFile, >+ getUpdateFilePath(workspaceFile.lastSegment())); >+ if (incremental) { >+ incrementalBuild(); >+ } else { >+ fullBuild(); >+ } >+ ApiProblem[] problems = getEnv().getProblems(); >+ assertProblems(problems); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#assertProblems(org.eclipse.pde.api.tools.builder.tests.ApiProblem[]) >+ */ >+ @Override >+ protected void assertProblems(ApiProblem[] problems) { >+ super.assertProblems(problems); >+ int[] expectedProblemIds = getExpectedProblemIds(); >+ int length = problems.length; >+ if (expectedProblemIds.length != length) { >+ for (int i = 0; i < length; i++) { >+ System.err.println(problems[i]); >+ } >+ } >+ assertEquals("Wrong number of problems", expectedProblemIds.length, length); >+ String[][] args = getExpectedMessageArgs(); >+ if (args != null) { >+ // compare messages >+ Set<String> set = new HashSet<String>(); >+ for (int i = 0; i < length; i++) { >+ set.add(problems[i].getMessage()); >+ } >+ for (int i = 0; i < expectedProblemIds.length; i++) { >+ String[] messageArgs = args[i]; >+ int messageId = ApiProblemFactory.getProblemMessageId(expectedProblemIds[i]); >+ String message = ApiProblemFactory.getLocalizedMessage(messageId, messageArgs); >+ assertTrue("Missing expected problem: " + message, set.remove(message)); >+ } >+ } else { >+ // compare id's >+ Set<Integer> set = new HashSet<Integer>(); >+ for (int i = 0; i < length; i++) { >+ set.add(new Integer(problems[i].getProblemId())); >+ } >+ for (int i = 0; i < expectedProblemIds.length; i++) { >+ assertTrue("Missing expected problem: " + expectedProblemIds[i], set.remove(new Integer(expectedProblemIds[i]))); >+ } >+ } >+ } >+ >+ /** >+ * Tests that splitting a plug-in and re-exporting the base is compatible with >+ * previous release. >+ * >+ * @throws Exception >+ */ >+ public void testPluginSplit() throws Exception { >+ fullBuild(); >+ IMarker[] jdtMarkers = getEnv().getAllJDTMarkers(ResourcesPlugin.getWorkspace().getRoot().getLocation()); >+ int length = jdtMarkers.length; >+ if (length != 0) { >+ for (int i = 0; i < length; i++) { >+ boolean condition = jdtMarkers[i].getAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING) == IMarker.SEVERITY_ERROR; >+ if (condition) { >+ System.err.println(jdtMarkers[i].getAttribute(IMarker.MESSAGE)); >+ } >+ assertFalse("Should not be a JDT error", condition); >+ } >+ } >+ ApiProblem[] problems = getEnv().getProblems(); >+ assertProblems(problems); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#getDefaultProblemId() >+ */ >+ @Override >+ protected int getDefaultProblemId() { >+ // TODO Auto-generated method stub >+ return 0; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#getTestSourcePath() >+ */ >+ @Override >+ protected IPath getTestSourcePath() { >+ // TODO Auto-generated method stub >+ return null; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.pde.api.tools.builder.tests.ApiBuilderTest#getTestingProjectName() >+ */ >+ @Override >+ protected String getTestingProjectName() { >+ // TODO Auto-generated method stub >+ return null; >+ } >+ >+} >Index: test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassE.java >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassE.java >diff -N test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassE.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/src/d/e/f/ClassE.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,22 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 d.e.f; >+ >+ >+/** >+ * >+ */ >+public class ClassE { >+ >+ public void methodOne(ClassE arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/post-split/a.b.c.core/META-INF/MANIFEST.MF >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/META-INF/MANIFEST.MF >diff -N test-builder/split/post-split/a.b.c.core/META-INF/MANIFEST.MF >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/META-INF/MANIFEST.MF 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,8 @@ >+Manifest-Version: 1.0 >+Bundle-ManifestVersion: 2 >+Bundle-Name: Core Plug-in >+Bundle-SymbolicName: a.b.c.core >+Bundle-Version: 1.0.0 >+Bundle-RequiredExecutionEnvironment: J2SE-1.5 >+Export-Package: a.b.c, >+ d.e.f >Index: test-builder/split/pre-split/a.b.c/src/a/b/c/ClassB.java >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/src/a/b/c/ClassB.java >diff -N test-builder/split/pre-split/a.b.c/src/a/b/c/ClassB.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/src/a/b/c/ClassB.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,21 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 a.b.c; >+ >+/** >+ * >+ */ >+public class ClassB { >+ >+ public void methodOne(ClassB arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/pre-split/a.b.c/.settings/org.eclipse.jdt.core.prefs >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/.settings/org.eclipse.jdt.core.prefs >diff -N test-builder/split/pre-split/a.b.c/.settings/org.eclipse.jdt.core.prefs >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/.settings/org.eclipse.jdt.core.prefs 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,8 @@ >+#Fri Dec 12 15:24:28 CST 2008 >+eclipse.preferences.version=1 >+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled >+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 >+org.eclipse.jdt.core.compiler.compliance=1.5 >+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error >+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error >+org.eclipse.jdt.core.compiler.source=1.5 >Index: test-builder/split/post-split/a.b.c/.settings/org.eclipse.jdt.core.prefs >=================================================================== >RCS file: test-builder/split/post-split/a.b.c/.settings/org.eclipse.jdt.core.prefs >diff -N test-builder/split/post-split/a.b.c/.settings/org.eclipse.jdt.core.prefs >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c/.settings/org.eclipse.jdt.core.prefs 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,8 @@ >+#Fri Dec 12 15:24:28 CST 2008 >+eclipse.preferences.version=1 >+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled >+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 >+org.eclipse.jdt.core.compiler.compliance=1.5 >+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error >+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error >+org.eclipse.jdt.core.compiler.source=1.5 >Index: test-builder/split/pre-split/a.b.c/META-INF/MANIFEST.MF >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/META-INF/MANIFEST.MF >diff -N test-builder/split/pre-split/a.b.c/META-INF/MANIFEST.MF >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/META-INF/MANIFEST.MF 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,9 @@ >+Manifest-Version: 1.0 >+Bundle-ManifestVersion: 2 >+Bundle-Name: Test Plug-in >+Bundle-SymbolicName: a.b.c;singleton:=true >+Bundle-Version: 1.0.0 >+Bundle-RequiredExecutionEnvironment: J2SE-1.5 >+Bundle-ActivationPolicy: lazy >+Export-Package: a.b.c, >+ d.e.f >\ No newline at end of file >Index: test-builder/split/post-split/a.b.c.core/src/a/b/c/ClassB.java >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/src/a/b/c/ClassB.java >diff -N test-builder/split/post-split/a.b.c.core/src/a/b/c/ClassB.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/src/a/b/c/ClassB.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,21 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 a.b.c; >+ >+/** >+ * >+ */ >+public class ClassB { >+ >+ public void methodOne(ClassB arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/post-split/a.b.c/META-INF/MANIFEST.MF >=================================================================== >RCS file: test-builder/split/post-split/a.b.c/META-INF/MANIFEST.MF >diff -N test-builder/split/post-split/a.b.c/META-INF/MANIFEST.MF >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c/META-INF/MANIFEST.MF 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,9 @@ >+Manifest-Version: 1.0 >+Bundle-ManifestVersion: 2 >+Bundle-Name: Test Plug-in >+Bundle-SymbolicName: a.b.c;singleton:=true >+Bundle-Version: 1.0.0 >+Bundle-RequiredExecutionEnvironment: J2SE-1.5 >+Bundle-ActivationPolicy: lazy >+Require-Bundle: a.b.c.core;bundle-version="1.0.0";visibility:=reexport >+Export-Package: a.b.c >Index: test-builder/split/post-split/a.b.c.core/build.properties >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/build.properties >diff -N test-builder/split/post-split/a.b.c.core/build.properties >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/build.properties 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,4 @@ >+source.. = src/ >+output.. = bin/ >+bin.includes = META-INF/,\ >+ . >Index: test-builder/split/post-split/a.b.c.core/.classpath >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/.classpath >diff -N test-builder/split/post-split/a.b.c.core/.classpath >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/.classpath 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,7 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<classpath> >+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> >+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> >+ <classpathentry kind="src" path="src"/> >+ <classpathentry kind="output" path="bin"/> >+</classpath> >Index: test-builder/split/pre-split/a.b.c/build.properties >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/build.properties >diff -N test-builder/split/pre-split/a.b.c/build.properties >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/build.properties 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,4 @@ >+source.. = src/ >+output.. = bin/ >+bin.includes = META-INF/,\ >+ . >Index: test-builder/split/post-split/a.b.c/build.properties >=================================================================== >RCS file: test-builder/split/post-split/a.b.c/build.properties >diff -N test-builder/split/post-split/a.b.c/build.properties >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c/build.properties 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,4 @@ >+source.. = src/ >+output.. = bin/ >+bin.includes = META-INF/,\ >+ . >Index: test-builder/split/post-split/a.b.c.core/.project >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/.project >diff -N test-builder/split/post-split/a.b.c.core/.project >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/.project 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,34 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<projectDescription> >+ <name>a.b.c.core</name> >+ <comment></comment> >+ <projects> >+ </projects> >+ <buildSpec> >+ <buildCommand> >+ <name>org.eclipse.jdt.core.javabuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.ManifestBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.SchemaBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ </buildSpec> >+ <natures> >+ <nature>org.eclipse.pde.PluginNature</nature> >+ <nature>org.eclipse.jdt.core.javanature</nature> >+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> >+ </natures> >+</projectDescription> >Index: test-builder/split/pre-split/a.b.c/src/d/e/f/ClassD.java >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/src/d/e/f/ClassD.java >diff -N test-builder/split/pre-split/a.b.c/src/d/e/f/ClassD.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/src/d/e/f/ClassD.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,22 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 d.e.f; >+ >+ >+/** >+ * >+ */ >+public class ClassD { >+ >+ public void methodOne(ClassD arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/pre-split/a.b.c/.classpath >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/.classpath >diff -N test-builder/split/pre-split/a.b.c/.classpath >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/.classpath 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,7 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<classpath> >+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> >+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> >+ <classpathentry kind="src" path="src"/> >+ <classpathentry kind="output" path="bin"/> >+</classpath> >Index: test-builder/split/post-split/a.b.c/.classpath >=================================================================== >RCS file: test-builder/split/post-split/a.b.c/.classpath >diff -N test-builder/split/post-split/a.b.c/.classpath >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c/.classpath 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,7 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<classpath> >+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> >+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> >+ <classpathentry kind="src" path="src"/> >+ <classpathentry kind="output" path="bin"/> >+</classpath> >Index: test-builder/split/pre-split/a.b.c/src/d/e/f/ClassE.java >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/src/d/e/f/ClassE.java >diff -N test-builder/split/pre-split/a.b.c/src/d/e/f/ClassE.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/src/d/e/f/ClassE.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,22 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 d.e.f; >+ >+ >+/** >+ * >+ */ >+public class ClassE { >+ >+ public void methodOne(ClassE arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/pre-split/a.b.c/.project >=================================================================== >RCS file: test-builder/split/pre-split/a.b.c/.project >diff -N test-builder/split/pre-split/a.b.c/.project >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/pre-split/a.b.c/.project 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,34 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<projectDescription> >+ <name>a.b.c</name> >+ <comment></comment> >+ <projects> >+ </projects> >+ <buildSpec> >+ <buildCommand> >+ <name>org.eclipse.jdt.core.javabuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.ManifestBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.SchemaBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ </buildSpec> >+ <natures> >+ <nature>org.eclipse.pde.PluginNature</nature> >+ <nature>org.eclipse.jdt.core.javanature</nature> >+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> >+ </natures> >+</projectDescription> >Index: test-builder/split/post-split/a.b.c/src/a/b/c/ClassA.java >=================================================================== >RCS file: test-builder/split/post-split/a.b.c/src/a/b/c/ClassA.java >diff -N test-builder/split/post-split/a.b.c/src/a/b/c/ClassA.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c/src/a/b/c/ClassA.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,21 @@ >+/******************************************************************************* >+ * Copyright (c) 2008 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 a.b.c; >+ >+/** >+ * >+ */ >+public class ClassA { >+ >+ public void methodOne(ClassA arg) { >+ System.out.println(arg.getClass() + "methodOne()"); >+ } >+} >Index: test-builder/split/post-split/a.b.c/.project >=================================================================== >RCS file: test-builder/split/post-split/a.b.c/.project >diff -N test-builder/split/post-split/a.b.c/.project >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c/.project 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,34 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<projectDescription> >+ <name>a.b.c</name> >+ <comment></comment> >+ <projects> >+ </projects> >+ <buildSpec> >+ <buildCommand> >+ <name>org.eclipse.jdt.core.javabuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.ManifestBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.SchemaBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ <buildCommand> >+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name> >+ <arguments> >+ </arguments> >+ </buildCommand> >+ </buildSpec> >+ <natures> >+ <nature>org.eclipse.pde.PluginNature</nature> >+ <nature>org.eclipse.jdt.core.javanature</nature> >+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature> >+ </natures> >+</projectDescription> >Index: test-builder/split/post-split/a.b.c.core/.settings/org.eclipse.jdt.core.prefs >=================================================================== >RCS file: test-builder/split/post-split/a.b.c.core/.settings/org.eclipse.jdt.core.prefs >diff -N test-builder/split/post-split/a.b.c.core/.settings/org.eclipse.jdt.core.prefs >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ test-builder/split/post-split/a.b.c.core/.settings/org.eclipse.jdt.core.prefs 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,8 @@ >+#Fri Dec 12 15:34:46 CST 2008 >+eclipse.preferences.version=1 >+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled >+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 >+org.eclipse.jdt.core.compiler.compliance=1.5 >+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error >+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error >+org.eclipse.jdt.core.compiler.source=1.5 >#P org.eclipse.pde.api.tools >Index: src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java >=================================================================== >RCS file: /cvsroot/eclipse/pde/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java,v >retrieving revision 1.37 >diff -u -r1.37 ApiComparator.java >--- src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java 15 Dec 2008 19:11:38 -0000 1.37 >+++ src/org/eclipse/pde/api/tools/internal/provisional/comparator/ApiComparator.java 15 Dec 2008 22:04:41 -0000 >@@ -21,6 +21,7 @@ > import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin; > import org.eclipse.pde.api.tools.internal.provisional.IApiAnnotations; > import org.eclipse.pde.api.tools.internal.provisional.IApiDescription; >+import org.eclipse.pde.api.tools.internal.provisional.IRequiredComponentDescription; > import org.eclipse.pde.api.tools.internal.provisional.RestrictionModifiers; > import org.eclipse.pde.api.tools.internal.provisional.VisibilityModifiers; > import org.eclipse.pde.api.tools.internal.provisional.model.ApiScopeVisitor; >@@ -745,7 +746,42 @@ > } else{ > typeRoot2 = component2.findTypeRoot(typeName, id); > } >- String deltaComponentID = Util.getDeltaComponentID(component2); >+ String deltaComponentID = null; >+ IApiComponent provider = null; >+ IApiDescription providerApiDesc = null; >+ boolean reexported = false; >+ if (typeRoot2 == null) { >+ // check if the type is provided by a required component (it could have been moved/re-exported) >+ IApiComponent[] providers = component2.getBaseline().resolvePackage(component2, packageName); >+ int index = 0; >+ while (typeRoot2 == null && index < providers.length) { >+ IApiComponent p = providers[index]; >+ if (!p.equals(component2)) { >+ typeRoot2 = p.findTypeRoot(typeName, p.getId()); >+ if (typeRoot2 != null) { >+ provider = p; >+ providerApiDesc = p.getApiDescription(); >+ IRequiredComponentDescription[] required = component2.getRequiredComponents(); >+ for (int k = 0; k < required.length; k++) { >+ IRequiredComponentDescription description = required[k]; >+ if (description.getId().equals(p.getId())) { >+ reexported = description.isExported(); >+ break; >+ } >+ } >+ } >+ } >+ index++; >+ } >+ } else { >+ provider = component2; >+ providerApiDesc = apiDescription2; >+ } >+ if (provider == null) { >+ deltaComponentID = Util.getDeltaComponentID(component2); >+ } else { >+ deltaComponentID = Util.getDeltaComponentID(provider); >+ } > if(typeRoot2 == null) { > if ((visibility & visibilityModifiers) == 0) { > // we skip the class file according to their visibility >@@ -775,7 +811,7 @@ > return; > } > IApiType typeDescriptor2 = typeRoot2.getStructure(); >- IApiAnnotations elementDescription2 = apiDescription2.resolveAnnotations(typeDescriptor2.getHandle()); >+ IApiAnnotations elementDescription2 = providerApiDesc.resolveAnnotations(typeDescriptor2.getHandle()); > int visibility2 = 0; > if (elementDescription2 != null) { > visibility2 = elementDescription2.getVisibility(); >@@ -787,9 +823,11 @@ > return; > } > } >- if (isAPI(visibility, typeDescriptor) && !isAPI(visibility2, typeDescriptor2)) { >- globalDelta.add( >- new Delta( >+ if (isAPI(visibility, typeDescriptor)) { >+ if (!isAPI(visibility2, typeDescriptor2) || (!provider.equals(component2) && !reexported)) { >+ if (!isAPI(visibility2, typeDescriptor2)) { >+ globalDelta.add( >+ new Delta( > deltaComponentID, > IDelta.API_COMPONENT_ELEMENT_TYPE, > IDelta.REMOVED, >@@ -799,7 +837,9 @@ > typeName, > typeName, > new String[] { typeName, deltaComponentID})); >- return; >+ return; >+ } >+ } > } > if ((visibility2 & visibilityModifiers) == 0) { > // we simply report a changed visibility >@@ -816,7 +856,7 @@ > new String[] { typeName, deltaComponentID})); > } > typeRootBaseLineNames.add(typeName); >- ClassFileComparator comparator = new ClassFileComparator(typeDescriptor, typeRoot2, component, component2, referenceBaseline, baseline, visibilityModifiers); >+ ClassFileComparator comparator = new ClassFileComparator(typeDescriptor, typeRoot2, component, provider, referenceBaseline, baseline, visibilityModifiers); > IDelta delta = comparator.getDelta(); > IStatus status = comparator.getStatus(); > if(status != null) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 240914
:
107666
|
120515
|
120519
|
120525
|
120569