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 151046 Details for
Bug 289767
Refactoring for Java EE artifacts
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Generic refactoring classes for all java ee artifacts
genericJ2eeDeleteRefactoring.txt (text/plain), 20.39 KB, created by
Petya Sabeva
on 2009-11-02 02:50:02 EST
(
hide
)
Description:
Generic refactoring classes for all java ee artifacts
Filename:
MIME Type:
Creator:
Petya Sabeva
Created:
2009-11-02 02:50:02 EST
Size:
20.39 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jst.j2ee >Index: META-INF/MANIFEST.MF >=================================================================== >RCS file: /cvsroot/webtools/jeetools/plugins/org.eclipse.jst.j2ee/META-INF/MANIFEST.MF,v >retrieving revision 1.61 >diff -u -r1.61 MANIFEST.MF >--- META-INF/MANIFEST.MF 1 Oct 2009 13:31:00 -0000 1.61 >+++ META-INF/MANIFEST.MF 2 Nov 2009 07:19:22 -0000 >@@ -48,6 +48,7 @@ > org.eclipse.jst.j2ee.refactor.listeners, > org.eclipse.jst.j2ee.refactor.operations, > org.eclipse.jst.javaee.ltk.core.change, >+ org.eclipse.jst.javaee.ltk.core.delete, > org.eclipse.jst.javaee.ltk.core.descriptor, > org.eclipse.jst.javaee.ltk.core.nls, > org.eclipse.jst.javaee.ltk.core.participant, >@@ -83,6 +84,7 @@ > org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)", > org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)", > org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)", >- org.eclipse.ltk.core.refactoring;bundle-version="3.4.1" >+ org.eclipse.ltk.core.refactoring;bundle-version="3.4.1", >+ org.eclipse.core.filebuffers;bundle-version="3.5.100" > Eclipse-LazyStart: true > Bundle-RequiredExecutionEnvironment: J2SE-1.5 >Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java >=================================================================== >RCS file: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java >diff -N ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/IJ2eeDeleteProcessor.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,23 @@ >+package org.eclipse.jst.javaee.ltk.core.delete; >+ >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IProject; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.jst.j2ee.model.IModelProvider; >+import org.eclipse.ltk.core.refactoring.TextFileChange; >+ >+public interface IJ2eeDeleteProcessor { >+ >+ public String getObjectName(Object object); >+ >+ public String getObjectType(Object object); >+ >+ public Object specifyXMLFile(IProject project, >+ IModelProvider modelProvider); >+ >+ public void modifyXML(IFile file, Object modelObject, TextFileChange result, >+ Object fObject) throws CoreException; >+ >+ public IResource getObjectResource(Object object); >+} >Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java >=================================================================== >RCS file: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java >diff -N ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteProcessorImpl.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,352 @@ >+package org.eclipse.jst.javaee.ltk.core.delete; >+ >+import java.util.ArrayList; >+import java.util.Arrays; >+import java.util.HashMap; >+import java.util.List; >+import java.util.Map; >+ >+import org.eclipse.core.filebuffers.FileBuffers; >+import org.eclipse.core.filebuffers.ITextFileBuffer; >+import org.eclipse.core.filebuffers.LocationKind; >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IProject; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.resources.IResourceVisitor; >+import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory; >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.core.runtime.IPath; >+import org.eclipse.core.runtime.IProgressMonitor; >+import org.eclipse.core.runtime.NullProgressMonitor; >+import org.eclipse.core.runtime.OperationCanceledException; >+import org.eclipse.jem.util.emf.workbench.ProjectUtilities; >+import org.eclipse.jface.text.Document; >+import org.eclipse.jface.text.IDocument; >+import org.eclipse.jst.j2ee.model.IModelProvider; >+import org.eclipse.jst.j2ee.model.ModelProviderManager; >+import org.eclipse.jst.javaee.ltk.core.nls.RefactoringResourceHandler; >+import org.eclipse.ltk.core.refactoring.Change; >+import org.eclipse.ltk.core.refactoring.CompositeChange; >+import org.eclipse.ltk.core.refactoring.RefactoringStatus; >+import org.eclipse.ltk.core.refactoring.TextFileChange; >+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; >+import org.eclipse.ltk.core.refactoring.participants.DeleteArguments; >+import org.eclipse.ltk.core.refactoring.participants.DeleteProcessor; >+import org.eclipse.ltk.core.refactoring.participants.ParticipantManager; >+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant; >+import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker; >+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants; >+import org.eclipse.ltk.core.refactoring.resource.DeleteResourceChange; >+import org.eclipse.ltk.internal.core.refactoring.Resources; >+import org.eclipse.ltk.internal.core.refactoring.resource.ResourceProcessors; >+import org.eclipse.osgi.util.NLS; >+import org.eclipse.text.edits.DeleteEdit; >+import org.eclipse.text.edits.MultiTextEdit; >+import org.eclipse.text.edits.TextEdit; >+ >+public abstract class J2eeDeleteProcessorImpl extends DeleteProcessor implements IJ2eeDeleteProcessor{ >+ >+ private List<IResource> fResources = new ArrayList<IResource>(); >+ private boolean fDeleteContents; >+ private int offset; >+ private int length; >+ private List<Object> fObjects = new ArrayList<Object>(); >+ private Map<Object, List<IResource>> fMap = new HashMap<Object, List<IResource>>(); >+ private Map<IFile, List<DeleteEdit>> editMap = new HashMap<IFile, List<DeleteEdit>>(); >+ private List<IFile> files = new ArrayList<IFile>(); >+ private IFile xmlFile; >+ >+ >+ public J2eeDeleteProcessorImpl(List<Object> objects, Map<Object, List<IResource>> map) { >+ this(objects, map, false); >+ } >+ >+ >+ public J2eeDeleteProcessorImpl(List<Object> objects, Map<Object, List<IResource>> map, boolean deleteContents) { >+ fObjects = objects; >+ fMap = map; >+ for(Object obj : fObjects){ >+ fResources = removeDescendants(map.get(obj)); >+ } >+ fDeleteContents= deleteContents; >+ } >+ >+ >+ @Override >+ public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException, OperationCanceledException { >+ // allow only projects or only non-projects to be selected; >+ // note that the selection may contain multiple types of resource >+ if (!(Resources.containsOnlyProjects(fResources.toArray(new IResource[fResources.size()])) || Resources.containsOnlyNonProjects(fResources.toArray(new IResource[fResources.size()])))) { >+ return RefactoringStatus.createFatalErrorStatus(RefactoringResourceHandler.J2eeDeleteProcessorImpl_delete_error_mixed_types); >+ } >+ >+ return new RefactoringStatus(); >+ } >+ >+ @Override >+ public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException, OperationCanceledException { >+ pm.beginTask("", 1); //$NON-NLS-1$ >+ try { >+ RefactoringStatus result= new RefactoringStatus(); >+ >+ for (int i= 0; i < fResources.size(); i++) { >+ IResource resource= fResources.get(i); >+ if (!resource.isSynchronized(IResource.DEPTH_INFINITE)) { >+ if (resource instanceof IFile) { >+ result.addInfo(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_warning_out_of_sync_file, resource.getFullPath().makeRelative().toString())); >+ } else { >+ result.addInfo(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_warning_out_of_sync_container, resource.getFullPath().makeRelative().toString())); >+ } >+ } >+ } >+ >+ checkDirtyResources(result); >+ >+ ResourceChangeChecker checker= (ResourceChangeChecker) context.getChecker(ResourceChangeChecker.class); >+ IResourceChangeDescriptionFactory deltaFactory= checker.getDeltaFactory(); >+ for (int i= 0; i < fResources.size(); i++) { >+ if (fResources.get(i).isPhantom()) { >+ result.addFatalError(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_delete_error_phantom, fResources.get(i).getFullPath().makeRelative().toString())); >+ } else if (fDeleteContents && Resources.isReadOnly(fResources.get(i))) { >+ result.addFatalError(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_delete_error_read_only, fResources.get(i).getFullPath().makeRelative().toString())); >+ } else { >+ deltaFactory.delete(fResources.get(i)); >+ } >+ } >+ return result; >+ } finally { >+ pm.done(); >+ } >+ } >+ >+ private void checkDirtyResources(final RefactoringStatus result) throws CoreException { >+ for (int i= 0; i < fResources.size(); i++) { >+ IResource resource= fResources.get(i); >+ if (resource instanceof IProject && !((IProject) resource).isOpen()) >+ continue; >+ resource.accept(new IResourceVisitor() { >+ public boolean visit(IResource visitedResource) throws CoreException { >+ if (visitedResource instanceof IFile) { >+ checkDirtyFile(result, (IFile)visitedResource); >+ } >+ return true; >+ } >+ }, IResource.DEPTH_INFINITE, false); >+ } >+ } >+ >+ private void checkDirtyFile(RefactoringStatus result, IFile file) { >+ if (!file.exists()) >+ return; >+ ITextFileBuffer buffer= FileBuffers.getTextFileBufferManager().getTextFileBuffer(file.getFullPath(), LocationKind.IFILE); >+ if (buffer != null && buffer.isDirty()) { >+ String message= RefactoringResourceHandler.J2eeDeleteProcessorImpl_warning_unsaved_file; >+ if (buffer.isStateValidated() && buffer.isSynchronized()) { >+ result.addWarning(NLS.bind(message, file.getFullPath().makeRelative().toString())); >+ } else { >+ result.addFatalError(NLS.bind(message, file.getFullPath().makeRelative().toString())); >+ } >+ } >+ } >+ >+ >+ >+ @Override >+ public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { >+ pm.beginTask(RefactoringResourceHandler.J2eeDeleteProcessorImpl_create_task, fResources.size()); >+ try { >+ CompositeChange change = new CompositeChange(RefactoringResourceHandler.J2eeDeleteProcessorImpl_change_name); >+ change.markAsSynthetic(); >+ >+ for(Object object : fObjects){ >+ >+ modifyXMLFiles(object); >+ >+ if(getObjectResource(object)!=null){ >+ >+ CompositeChange childChange = new CompositeChange(NLS.bind(RefactoringResourceHandler.J2eeDeleteProcessorImpl_childChange_name, getObjectType(object), getObjectName(object) )); >+ >+ setResourcesToDelete(fMap.get(object)); >+ for (int i= 0; i < fResources.size(); i++) { >+ pm.worked(1); >+ if(!fResources.get(i).getName().endsWith(".xml")){ //$NON-NLS-1$ >+ >+ DeleteResourceChange dc= new DeleteResourceChange(fResources.get(i).getFullPath(), true, fDeleteContents); >+ childChange.add(dc); >+ } >+ } >+ change.add(childChange); >+ } >+ } >+ >+ CompositeChange webXMLChange = new CompositeChange(NLS.bind( >+ RefactoringResourceHandler.J2eeDeleteProcessorImpl_webXMLChange_name, getXmlFile().getName())); >+ showXMLFileChanges(webXMLChange); >+ change.add(webXMLChange); >+ return change; >+ >+ } finally { >+ pm.done(); >+ } >+ } >+ >+ private void modifyXMLFiles(Object object) throws CoreException { >+ IProject project = ProjectUtilities.getProject(object); >+ IModelProvider modelProvider = ModelProviderManager.getModelProvider(project); >+ >+ Object modelObject = specifyXMLFile(project, modelProvider); >+ >+ TextFileChange result = new TextFileChange( getXmlFile().getName(), getXmlFile() ); >+ modifyXML(getXmlFile(), modelObject, result, object); >+ } >+ >+ >+ private void showXMLFileChanges(CompositeChange webXMLChange) >+ throws CoreException { >+ for (int m = 0; m < getFiles().size(); m++) { >+ IFile f = getFiles().get(m); >+ TextFileChange text = new TextFileChange(f.getName(), f); >+ List<DeleteEdit> lists = getEditMap().get(f); >+ >+ IDocument doc = new Document(); >+ doc.set(text.getCurrentContent(new NullProgressMonitor())); >+ TextEdit mul = new MultiTextEdit(0, doc.getLength()); >+ text.setEdit(mul); >+ mul.addChildren(lists.toArray(new TextEdit[lists.size()])); >+ >+ webXMLChange.add(text); >+ } >+ } >+ >+ >+ @Override >+ public Object[] getElements() { >+ return fResources.toArray(new IResource[fResources.size()]); >+ } >+ >+ @Override >+ public String getIdentifier() { >+ return "org.eclipse.ltk.core.refactoring.deleteResourcesProcessor"; //$NON-NLS-1$ >+ } >+ >+ @Override >+ public String getProcessorName() { >+ return RefactoringResourceHandler.J2eeDeleteProcessorImpl_processor_name; >+ } >+ >+ >+ @Override >+ public boolean isApplicable() throws CoreException { >+ for (int i= 0; i < fResources.size(); i++) { >+ if (!canDelete(fResources.get(i))) { >+ return false; >+ } >+ } >+ return true; >+ } >+ >+ private boolean canDelete(IResource res) { >+ return res.isAccessible() && !res.isPhantom(); >+ } >+ >+ >+ >+ >+ @Override >+ public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants) throws CoreException { >+ final ArrayList<RefactoringParticipant> result= new ArrayList<RefactoringParticipant>(); >+ if (!isApplicable()) { >+ return new RefactoringParticipant[0]; >+ } >+ >+ final String[] affectedNatures= ResourceProcessors.computeAffectedNatures(fResources.toArray(new IResource[fResources.size()])); >+ final DeleteArguments deleteArguments= new DeleteArguments(); >+ for (int i= 0; i < fResources.size(); i++) { >+ result.addAll(Arrays.asList(ParticipantManager.loadDeleteParticipants(status, this, fResources.get(i), deleteArguments, affectedNatures, sharedParticipants))); >+ } >+ >+ return result.toArray(new RefactoringParticipant[result.size()]); >+ } >+ >+ >+ public void setResourcesToDelete(List<IResource> resources) { >+ this.fResources = resources; >+ } >+ public List<IResource> getResourcesToDelete() { >+ return fResources; >+ } >+ public void setDeleteContents(boolean deleteContents) { >+ this.fDeleteContents = deleteContents; >+ } >+ public boolean isDeleteContents() { >+ return fDeleteContents; >+ } >+ >+ private static List<IResource> removeDescendants(List<IResource> resources) { >+ ArrayList<IResource> result= new ArrayList<IResource>(); >+ for (int i= 0; i < resources.size(); i++) { >+ addToList(result, resources.get(i)); >+ } >+ return result; >+ } >+ >+ private static void addToList(ArrayList<IResource> result, IResource curr) { >+ IPath currPath= curr.getFullPath(); >+ for (int k= result.size() - 1; k >= 0 ; k--) { >+ IResource other= result.get(k); >+ IPath otherPath= other.getFullPath(); >+ if (otherPath.isPrefixOf(currPath)) { >+ return; >+ } >+ if (currPath.isPrefixOf(otherPath)) { >+ result.remove(k); >+ } >+ } >+ result.add(curr); >+ } >+ >+ public void setLength(int flength) { >+ this.length = flength; >+ } >+ >+ public int getLength() { >+ return length; >+ } >+ >+ public void setOffset(int foffset) { >+ this.offset = foffset; >+ } >+ >+ public int getOffset() { >+ return offset; >+ } >+ >+ public void setEditMap(Map<IFile, List<DeleteEdit>> feditMap) { >+ this.editMap = feditMap; >+ } >+ >+ >+ public Map<IFile, List<DeleteEdit>> getEditMap() { >+ return editMap; >+ } >+ >+ >+ public void setXmlFile(IFile fxmlFile) { >+ this.xmlFile = fxmlFile; >+ } >+ >+ >+ public IFile getXmlFile() { >+ return xmlFile; >+ } >+ >+ >+ public void setFiles(List<IFile> ffiles) { >+ this.files = ffiles; >+ } >+ >+ >+ public List<IFile> getFiles() { >+ return files; >+ } >+} >Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java >=================================================================== >RCS file: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java >diff -N ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/delete/J2eeDeleteRefactoring.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,31 @@ >+package org.eclipse.jst.javaee.ltk.core.delete; >+ >+import org.eclipse.core.runtime.Assert; >+import org.eclipse.ltk.core.refactoring.participants.DeleteProcessor; >+import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring; >+import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor; >+ >+public class J2eeDeleteRefactoring extends ProcessorBasedRefactoring { >+ >+ private DeleteProcessor fProcessor; >+ >+ /** >+ * Constructs a new delete refactoring for the given processor. >+ * >+ * @param processor the delete processor >+ */ >+ public J2eeDeleteRefactoring(DeleteProcessor processor) { >+ super(processor); >+ Assert.isNotNull(processor); >+ fProcessor= processor; >+ } >+ >+ /** >+ * {@inheritDoc} >+ */ >+ @Override >+ public RefactoringProcessor getProcessor() { >+ return fProcessor; >+ } >+ >+} >Index: ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java >=================================================================== >RCS file: /cvsroot/webtools/jeetools/plugins/org.eclipse.jst.j2ee/ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java,v >retrieving revision 1.3 >diff -u -r1.3 RefactoringResourceHandler.java >--- ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java 29 Jul 2009 20:50:03 -0000 1.3 >+++ ltkbasedrefactoring/org/eclipse/jst/javaee/ltk/core/nls/RefactoringResourceHandler.java 2 Nov 2009 07:19:24 -0000 >@@ -23,6 +23,18 @@ > public static String Remove_JavaEE_References; > public static String JavaEE_Refactorings_Participant_title; > public static String Delete_EJB_Client_Project; >+ >+ public static String J2eeDeleteProcessorImpl_change_name; >+ public static String J2eeDeleteProcessorImpl_webXMLChange_name; >+ public static String J2eeDeleteProcessorImpl_childChange_name; >+ public static String J2eeDeleteProcessorImpl_create_task; >+ public static String J2eeDeleteProcessorImpl_delete_error_mixed_types; >+ public static String J2eeDeleteProcessorImpl_delete_error_phantom; >+ public static String J2eeDeleteProcessorImpl_delete_error_read_only; >+ public static String J2eeDeleteProcessorImpl_processor_name; >+ public static String J2eeDeleteProcessorImpl_warning_out_of_sync_file; >+ public static String J2eeDeleteProcessorImpl_warning_out_of_sync_container; >+ public static String J2eeDeleteProcessorImpl_warning_unsaved_file; > > public static String CheckStateTester_Could_not_find_Check_State_Tester_E_; > >Index: property_files/refactoring.properties >=================================================================== >RCS file: /cvsroot/webtools/jeetools/plugins/org.eclipse.jst.j2ee/property_files/refactoring.properties,v >retrieving revision 1.3 >diff -u -r1.3 refactoring.properties >--- property_files/refactoring.properties 29 Jul 2009 20:50:04 -0000 1.3 >+++ property_files/refactoring.properties 2 Nov 2009 07:19:24 -0000 >@@ -4,4 +4,15 @@ > Remove_JavaEE_References=Remove Java EE References to {0} in > JavaEE_Refactorings_Participant_title=Java EE Refactorings for {0} > Delete_EJB_Client_Project=Delete {0} >-CheckStateTester_Could_not_find_Check_State_Tester_E_=Could not find Check State Tester Extension Point >\ No newline at end of file >+CheckStateTester_Could_not_find_Check_State_Tester_E_=Could not find Check State Tester Extension Point >+J2eeDeleteProcessorImpl_webXMLChange_name=Changes related to {0} files >+J2eeDeleteProcessorImpl_childChange_name=Changes related to {0} ''{1}'' >+J2eeDeleteProcessorImpl_change_name=Changes to be performed >+J2eeDeleteProcessorImpl_create_task=Creating pending deletes... >+J2eeDeleteProcessorImpl_delete_error_mixed_types=Cannot delete projects and other resources in the same operation. >+J2eeDeleteProcessorImpl_delete_error_phantom=Cannot delete phantom resource ''{0}''. >+J2eeDeleteProcessorImpl_delete_error_read_only=Cannot delete content for read-only resource ''{0}''. >+J2eeDeleteProcessorImpl_processor_name=Delete Resource >+J2eeDeleteProcessorImpl_warning_out_of_sync_file=''{0}'' is not in sync. Press continue to force delete. >+J2eeDeleteProcessorImpl_warning_out_of_sync_container=''{0}'' contains resources that are not in sync. Press continue to force delete. >+J2eeDeleteProcessorImpl_warning_unsaved_file=File ''{0}'' has unsaved changes. >\ No newline at end of file
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
Flags:
kaloyan
:
iplog+
Actions:
View
|
Diff
Attachments on
bug 289767
:
149881
|
151045
| 151046 |
151047
|
151048
|
151049