3m9 compatible;
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / core / CommitWorkingCopyOperation.java
index 743484c..b22eede 100644 (file)
@@ -10,6 +10,9 @@
  *******************************************************************************/
 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;
@@ -17,7 +20,16 @@ import net.sourceforge.phpdt.core.IJavaModelStatus;
 import net.sourceforge.phpdt.core.IJavaModelStatusConstants;
 import net.sourceforge.phpdt.core.JavaModelException;
 
+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;
+
+import net.sourceforge.phpdt.internal.core.CompilationUnit;
+import net.sourceforge.phpdt.internal.core.JavaElementDeltaBuilder;
+import net.sourceforge.phpdt.internal.core.PackageFragmentRoot;
+import net.sourceforge.phpdt.internal.core.util.Util;
 
 
 /**
@@ -60,47 +72,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 +175,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: <ul>
@@ -137,7 +209,7 @@ public class CommitWorkingCopyOperation extends JavaModelOperation {
                }
                ICompilationUnit original= (ICompilationUnit)cu.getOriginalElement();
                IResource resource = original.getResource();
-               if (!cu.isBasedOn(resource) && !fForce) {
+               if (!cu.isBasedOn(resource) && !force) {
                        return new JavaModelStatus(IJavaModelStatusConstants.UPDATE_CONFLICT);
                }
                // no read-only check, since some repository adapters can change the flag on save