VCS: patch creation separated from patch application, small cleanup
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / diff / impl / patch / apply / ApplyTextFilePatch.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.diff.impl.patch.apply;
17
18 import com.intellij.openapi.diff.impl.patch.ApplyPatchException;
19 import com.intellij.openapi.diff.impl.patch.ApplyPatchStatus;
20 import com.intellij.openapi.diff.impl.patch.TextFilePatch;
21 import com.intellij.openapi.editor.Document;
22 import com.intellij.openapi.fileEditor.FileDocumentManager;
23 import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import org.jetbrains.annotations.Nullable;
26
27 import java.io.IOException;
28
29 public class ApplyTextFilePatch extends ApplyFilePatchBase<TextFilePatch> {
30   public ApplyTextFilePatch(final TextFilePatch patch) {
31     super(patch);
32   }
33
34   @Nullable
35   protected ApplyPatchStatus applyChange(final VirtualFile fileToPatch) throws IOException, ApplyPatchException {
36     byte[] fileContents = fileToPatch.contentsToByteArray();
37     CharSequence text = LoadTextUtil.getTextByBinaryPresentation(fileContents, fileToPatch);
38     StringBuilder newText = new StringBuilder();
39     ApplyPatchStatus status = ApplyFilePatchBase.applyModifications(myPatch, text, newText);
40     if (status != ApplyPatchStatus.ALREADY_APPLIED) {
41       final Document document = FileDocumentManager.getInstance().getDocument(fileToPatch);
42       if (document == null) {
43         throw new ApplyPatchException("Failed to set contents for updated file " + fileToPatch.getPath());
44       }
45       document.setText(newText.toString());
46       FileDocumentManager.getInstance().saveDocument(document);
47     }
48     return status;
49   }
50
51   protected void applyCreate(final VirtualFile newFile) throws IOException, ApplyPatchException {
52     final Document document = FileDocumentManager.getInstance().getDocument(newFile);
53     if (document == null) {
54       throw new ApplyPatchException("Failed to set contents for new file " + newFile.getPath());
55     }
56     document.setText(myPatch.getNewFileText());
57     FileDocumentManager.getInstance().saveDocument(document);
58   }
59 }