X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CommitWorkingCopyOperation.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CommitWorkingCopyOperation.java index 743484c..3c1285c 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CommitWorkingCopyOperation.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CommitWorkingCopyOperation.java @@ -10,14 +10,22 @@ *******************************************************************************/ package net.sourceforge.phpdt.internal.core; +import java.io.ByteArrayInputStream; +import java.io.UnsupportedEncodingException; + import net.sourceforge.phpdt.core.IBuffer; import net.sourceforge.phpdt.core.ICompilationUnit; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaModelStatus; import net.sourceforge.phpdt.core.IJavaModelStatusConstants; import net.sourceforge.phpdt.core.JavaModelException; +import net.sourceforge.phpdt.internal.core.util.Util; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.jobs.ISchedulingRule; /** @@ -60,47 +68,97 @@ public class CommitWorkingCopyOperation extends JavaModelOperation { protected void executeOperation() throws JavaModelException { try { beginTask(Util.bind("workingCopy.commit"), 2); //$NON-NLS-1$ - WorkingCopy copy = (WorkingCopy)getCompilationUnit(); - ICompilationUnit original = (ICompilationUnit) copy.getOriginalElement(); - - - // creates the delta builder (this remembers the content of the cu) - if (!original.isOpen()) { + CompilationUnit workingCopy = getCompilationUnit(); + IFile resource = (IFile)workingCopy.getResource(); + ICompilationUnit primary = workingCopy.getPrimary(); + boolean isPrimary = workingCopy.isPrimary(); + + JavaElementDeltaBuilder deltaBuilder = null; +// PackageFragmentRoot root = (PackageFragmentRoot)workingCopy.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); + boolean isIncluded = !Util.isExcluded(workingCopy); +// if (isPrimary || (root.isOnClasspath() && isIncluded && resource.isAccessible() && Util.isValidCompilationUnitName(workingCopy.getElementName()))) { + if (isPrimary || (isIncluded && resource.isAccessible() && Util.isValidCompilationUnitName(workingCopy.getElementName()))) { + // force opening so that the delta builder can get the old info - original.open(null); - } - JavaElementDeltaBuilder deltaBuilder; - if (Util.isExcluded(original)) { - deltaBuilder = null; + if (!isPrimary && !primary.isOpen()) { + primary.open(null); + } + + // creates the delta builder (this remembers the content of the cu) if: + // - it is not excluded + // - and it is not a primary or it is a non-consistent primary + if (isIncluded && (!isPrimary || !workingCopy.isConsistent())) { + deltaBuilder = new JavaElementDeltaBuilder(primary); + } + + // save the cu + IBuffer primaryBuffer = primary.getBuffer(); + if (!isPrimary) { + if (primaryBuffer == null) return; + char[] primaryContents = primaryBuffer.getCharacters(); + boolean hasSaved = false; + try { + IBuffer workingCopyBuffer = workingCopy.getBuffer(); + if (workingCopyBuffer == null) return; + primaryBuffer.setContents(workingCopyBuffer.getCharacters()); + primaryBuffer.save(this.progressMonitor, this.force); + primary.makeConsistent(this); + hasSaved = true; + } finally { + if (!hasSaved){ + // restore original buffer contents since something went wrong + primaryBuffer.setContents(primaryContents); + } + } + } else { + // for a primary working copy no need to set the content of the buffer again + primaryBuffer.save(this.progressMonitor, this.force); + primary.makeConsistent(this); + } } else { - deltaBuilder = new JavaElementDeltaBuilder(original); - } - - // save the cu - IBuffer originalBuffer = original.getBuffer(); - if (originalBuffer == null) return; - char[] originalContents = originalBuffer.getCharacters(); - boolean hasSaved = false; - try { - IBuffer copyBuffer = copy.getBuffer(); - if (copyBuffer == null) return; - originalBuffer.setContents(copyBuffer.getCharacters()); - original.save(fMonitor, fForce); - this.setAttribute(HAS_MODIFIED_RESOURCE_ATTR, TRUE); - hasSaved = true; - } finally { - if (!hasSaved){ - // restore original buffer contents since something went wrong - originalBuffer.setContents(originalContents); + // working copy on cu outside classpath OR resource doesn't exist yet + String encoding = null; + try { + encoding = resource.getCharset(); + } + catch (CoreException ce) { + // use no encoding + } + String contents = workingCopy.getSource(); + if (contents == null) return; + try { + byte[] bytes = encoding == null + ? contents.getBytes() + : contents.getBytes(encoding); + ByteArrayInputStream stream = new ByteArrayInputStream(bytes); + if (resource.exists()) { + resource.setContents( + stream, + this.force ? IResource.FORCE | IResource.KEEP_HISTORY : IResource.KEEP_HISTORY, + null); + } else { + resource.create( + stream, + this.force, + this.progressMonitor); + } + } catch (CoreException e) { + throw new JavaModelException(e); + } catch (UnsupportedEncodingException e) { + throw new JavaModelException(e, IJavaModelStatusConstants.IO_EXCEPTION); } + } + + setAttribute(HAS_MODIFIED_RESOURCE_ATTR, TRUE); + // make sure working copy is in sync - copy.updateTimeStamp((CompilationUnit)original); - copy.makeConsistent(this); + workingCopy.updateTimeStamp((CompilationUnit)primary); + workingCopy.makeConsistent(this); worked(1); + // build the deltas if (deltaBuilder != null) { - // build the deltas deltaBuilder.buildDeltas(); // add the deltas to the list of deltas created during this operation @@ -113,11 +171,21 @@ public class CommitWorkingCopyOperation extends JavaModelOperation { done(); } } + /** * Returns the compilation unit this operation is working on. */ - protected ICompilationUnit getCompilationUnit() { - return (ICompilationUnit)getElementToProcess(); + protected CompilationUnit getCompilationUnit() { + return (CompilationUnit)getElementToProcess(); + } + protected ISchedulingRule getSchedulingRule() { + IResource resource = getElementToProcess().getResource(); + IWorkspace workspace = resource.getWorkspace(); + if (resource.exists()) { + return workspace.getRuleFactory().modifyRule(resource); + } else { + return workspace.getRuleFactory().createRule(resource); + } } /** * Possible failures: