diff --git a/platform/core-api/src/com/intellij/testFramework/BinaryLightVirtualFile.java b/platform/core-api/src/com/intellij/testFramework/BinaryLightVirtualFile.java new file mode 100644 index 000000000000..a2123060eed0 --- /dev/null +++ b/platform/core-api/src/com/intellij/testFramework/BinaryLightVirtualFile.java @@ -0,0 +1,108 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.testFramework; + +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.vfs.VfsUtilCore; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.ArrayUtil; +import com.intellij.util.LocalTimeCounter; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * In-memory implementation of {@link VirtualFile}. + */ +public class BinaryLightVirtualFile extends LightVirtualFileBase { + private byte[] myContent = ArrayUtil.EMPTY_BYTE_ARRAY; + + public BinaryLightVirtualFile() { + this(""); + } + + public BinaryLightVirtualFile(@NonNls String name) { + this(name, ArrayUtil.EMPTY_BYTE_ARRAY); + } + + public BinaryLightVirtualFile(@NonNls String name, byte[] content) { + this(name, null, content, LocalTimeCounter.currentTime()); + } + + public BinaryLightVirtualFile(final String name, final FileType fileType, final byte[] content) { + this(name, fileType, content, LocalTimeCounter.currentTime()); + } + + public BinaryLightVirtualFile(VirtualFile original, final byte[] content, long modificationStamp) { + this(original.getName(), original.getFileType(), content, modificationStamp); + } + + public BinaryLightVirtualFile(final String name, + final FileType fileType, + final byte[] content, + final long modificationStamp) { + super(name, fileType, modificationStamp); + setContent(content); + } + + @Override + public InputStream getInputStream() throws IOException { + return VfsUtilCore.byteStreamSkippingBOM(myContent, this); + } + + @Override + @NotNull + public OutputStream getOutputStream(Object requestor, final long newModificationStamp, long newTimeStamp) throws IOException { + return VfsUtilCore.outputStreamAddingBOM(new ByteArrayOutputStream() { + @Override + public void close() { + setModificationStamp(newModificationStamp); + + byte[] content = toByteArray(); + setContent(content); + } + }, this); + } + + @Override + @NotNull + public byte[] contentsToByteArray() throws IOException { + return myContent; + } + + public void setContent(Object requestor, byte[] content, boolean fireEvent) { + setContent(content); + setModificationStamp(LocalTimeCounter.currentTime()); + } + + private void setContent(byte[] content) { + //StringUtil.assertValidSeparators(content); + myContent = content; + } + + public byte[] getContent() { + return myContent; + } + + @Override + public String toString() { + return "BinaryLightVirtualFile: " + getPresentableUrl(); + } +} diff --git a/platform/core-api/src/com/intellij/testFramework/LightVirtualFile.java b/platform/core-api/src/com/intellij/testFramework/LightVirtualFile.java index 3b85a6aa7e42..e68c9b1e36ef 100644 --- a/platform/core-api/src/com/intellij/testFramework/LightVirtualFile.java +++ b/platform/core-api/src/com/intellij/testFramework/LightVirtualFile.java @@ -19,11 +19,11 @@ import com.intellij.lang.Language; import com.intellij.openapi.fileTypes.CharsetUtil; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeRegistry; -import com.intellij.openapi.vfs.*; +import com.intellij.openapi.vfs.VfsUtilCore; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.LocalTimeCounter; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.*; import java.nio.charset.Charset; @@ -31,15 +31,9 @@ import java.nio.charset.Charset; /** * In-memory implementation of {@link VirtualFile}. */ -public class LightVirtualFile extends VirtualFile { - private FileType myFileType; +public class LightVirtualFile extends LightVirtualFileBase { private CharSequence myContent = ""; - private String myName = ""; - private long myModStamp = LocalTimeCounter.currentTime(); - private boolean myIsWritable = true; - private boolean myValid = true; private Language myLanguage; - private VirtualFile myOriginalFile; public LightVirtualFile() { this(""); @@ -66,18 +60,19 @@ public class LightVirtualFile extends VirtualFile { this(name, fileType, text, CharsetUtil.extractCharsetFromFileContent(null, null, fileType, text), modificationStamp); } - public LightVirtualFile(final String name, final FileType fileType, final CharSequence text, Charset charset, final long modificationStamp) { - myName = name; - myFileType = fileType; + public LightVirtualFile(final String name, + final FileType fileType, + final CharSequence text, + Charset charset, + final long modificationStamp) { + super(name, fileType, modificationStamp); setContent(text); - myModStamp = modificationStamp; setCharset(charset); } public LightVirtualFile(final String name, final Language language, final CharSequence text) { - myName = name; + super(name, null, LocalTimeCounter.currentTime()); setContent(text); - myModStamp = LocalTimeCounter.currentTime(); setLanguage(language); } @@ -87,141 +82,11 @@ public class LightVirtualFile extends VirtualFile { public void setLanguage(final Language language) { myLanguage = language; - myFileType = language.getAssociatedFileType(); - if (myFileType == null) { - myFileType = FileTypeRegistry.getInstance().getFileTypeByFileName(myName); + FileType type = language.getAssociatedFileType(); + if (type == null) { + type = FileTypeRegistry.getInstance().getFileTypeByFileName(getName()); } - } - - public void setFileType(final FileType fileType) { - myFileType = fileType; - } - - private void setContent(CharSequence content) { - //StringUtil.assertValidSeparators(content); - myContent = content; - } - - public VirtualFile getOriginalFile() { - return myOriginalFile; - } - - public void setOriginalFile(VirtualFile originalFile) { - myOriginalFile = originalFile; - } - - private static class MyVirtualFileSystem extends DeprecatedVirtualFileSystem implements NonPhysicalFileSystem{ - @NonNls private static final String PROTOCOL = "mock"; - - private MyVirtualFileSystem() { - startEventPropagation(); - } - - @Override - @NotNull - public String getProtocol() { - return PROTOCOL; - } - - @Override - @Nullable - public VirtualFile findFileByPath(@NotNull String path) { - return null; - } - - @Override - public void refresh(boolean asynchronous) { - } - - @Override - @Nullable - public VirtualFile refreshAndFindFileByPath(@NotNull String path) { - return null; - } - - @Override - public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { - } - - @Override - public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { - } - - @NotNull - @Override - public VirtualFile copyFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent, @NotNull final String copyName) throws IOException { - throw new IOException("Cannot copy files"); - } - - @Override - public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { - } - - @NotNull - @Override - public VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { - throw new IOException("Cannot create files"); - } - - @Override - @NotNull - public VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { - throw new IOException("Cannot create directories"); - } - } - - private static final MyVirtualFileSystem ourFileSystem = new MyVirtualFileSystem(); - - @Override - @NotNull - public VirtualFileSystem getFileSystem() { - return ourFileSystem; - } - - @Nullable - public FileType getAssignedFileType() { - return myFileType; - } - - @NotNull - @Override - public String getPath() { - return "/" + getName(); - } - - @Override - @NotNull - public String getName() { - return myName; - } - - @Override - public boolean isWritable() { - return myIsWritable; - } - - @Override - public boolean isDirectory() { - return false; - } - - @Override - public boolean isValid() { - return myValid; - } - - public void setValid(boolean valid) { - myValid = valid; - } - - @Override - public VirtualFile getParent() { - return null; - } - - @Override - public VirtualFile[] getChildren() { - return EMPTY_ARRAY; + setFileType(type); } @Override @@ -235,7 +100,7 @@ public class LightVirtualFile extends VirtualFile { return VfsUtilCore.outputStreamAddingBOM(new ByteArrayOutputStream() { @Override public void close() { - myModStamp = newModificationStamp; + setModificationStamp(newModificationStamp); try { String content = toString(getCharset().name()); @@ -244,9 +109,8 @@ public class LightVirtualFile extends VirtualFile { catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } - } - },this); + }, this); } @Override @@ -257,46 +121,14 @@ public class LightVirtualFile extends VirtualFile { return s.getBytes(charset.name()); } - @Override - public long getModificationStamp() { - return myModStamp; - } - - @Override - public long getTimeStamp() { - return 0; // todo[max] : Add UnsupportedOperationException at better times. - } - - @Override - public long getLength() { - try { - return contentsToByteArray().length; - } - catch (IOException e) { - //noinspection CallToPrintStackTrace - e.printStackTrace(); - assert false; - return 0; - } - } - - @Override - public void refresh(boolean asynchronous, boolean recursive, Runnable postRunnable) { - } - public void setContent(Object requestor, CharSequence content, boolean fireEvent) { setContent(content); - myModStamp = LocalTimeCounter.currentTime(); + setModificationStamp(LocalTimeCounter.currentTime()); } - @Override - public void setWritable(boolean b) { - myIsWritable = b; - } - - @Override - public void rename(Object requestor, @NotNull String newName) throws IOException { - myName = newName; + private void setContent(CharSequence content) { + //StringUtil.assertValidSeparators(content); + myContent = content; } public CharSequence getContent() { diff --git a/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java b/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java new file mode 100644 index 000000000000..edf10bd92491 --- /dev/null +++ b/platform/core-api/src/com/intellij/testFramework/LightVirtualFileBase.java @@ -0,0 +1,216 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.testFramework; + +import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.vfs.DeprecatedVirtualFileSystem; +import com.intellij.openapi.vfs.NonPhysicalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileSystem; +import com.intellij.util.LocalTimeCounter; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +/** + * In-memory implementation of {@link VirtualFile}. + */ +public abstract class LightVirtualFileBase extends VirtualFile { + private FileType myFileType; + private String myName = ""; + private long myModStamp = LocalTimeCounter.currentTime(); + private boolean myIsWritable = true; + private boolean myValid = true; + private VirtualFile myOriginalFile; + + public LightVirtualFileBase(final String name, final FileType fileType, final long modificationStamp) { + myName = name; + myFileType = fileType; + myModStamp = modificationStamp; + } + + public void setFileType(final FileType fileType) { + myFileType = fileType; + } + + public VirtualFile getOriginalFile() { + return myOriginalFile; + } + + public void setOriginalFile(VirtualFile originalFile) { + myOriginalFile = originalFile; + } + + private static class MyVirtualFileSystem extends DeprecatedVirtualFileSystem implements NonPhysicalFileSystem { + @NonNls private static final String PROTOCOL = "mock"; + + private MyVirtualFileSystem() { + startEventPropagation(); + } + + @Override + @NotNull + public String getProtocol() { + return PROTOCOL; + } + + @Override + @Nullable + public VirtualFile findFileByPath(@NotNull String path) { + return null; + } + + @Override + public void refresh(boolean asynchronous) { + } + + @Override + @Nullable + public VirtualFile refreshAndFindFileByPath(@NotNull String path) { + return null; + } + + @Override + public void deleteFile(Object requestor, @NotNull VirtualFile vFile) throws IOException { + } + + @Override + public void moveFile(Object requestor, @NotNull VirtualFile vFile, @NotNull VirtualFile newParent) throws IOException { + } + + @NotNull + @Override + public VirtualFile copyFile(Object requestor, + @NotNull VirtualFile vFile, + @NotNull VirtualFile newParent, + @NotNull final String copyName) throws IOException { + throw new IOException("Cannot copy files"); + } + + @Override + public void renameFile(Object requestor, @NotNull VirtualFile vFile, @NotNull String newName) throws IOException { + } + + @NotNull + @Override + public VirtualFile createChildFile(Object requestor, @NotNull VirtualFile vDir, @NotNull String fileName) throws IOException { + throw new IOException("Cannot create files"); + } + + @Override + @NotNull + public VirtualFile createChildDirectory(Object requestor, @NotNull VirtualFile vDir, @NotNull String dirName) throws IOException { + throw new IOException("Cannot create directories"); + } + } + + private static final MyVirtualFileSystem ourFileSystem = new MyVirtualFileSystem(); + + @Override + @NotNull + public VirtualFileSystem getFileSystem() { + return ourFileSystem; + } + + @Nullable + public FileType getAssignedFileType() { + return myFileType; + } + + @NotNull + @Override + public String getPath() { + return "/" + getName(); + } + + @Override + @NotNull + public String getName() { + return myName; + } + + @Override + public boolean isWritable() { + return myIsWritable; + } + + @Override + public boolean isDirectory() { + return false; + } + + @Override + public boolean isValid() { + return myValid; + } + + public void setValid(boolean valid) { + myValid = valid; + } + + @Override + public VirtualFile getParent() { + return null; + } + + @Override + public VirtualFile[] getChildren() { + return EMPTY_ARRAY; + } + + @Override + public long getModificationStamp() { + return myModStamp; + } + + protected void setModificationStamp(long stamp) { + myModStamp = stamp; + } + + @Override + public long getTimeStamp() { + return 0; // todo[max] : Add UnsupportedOperationException at better times. + } + + @Override + public long getLength() { + try { + return contentsToByteArray().length; + } + catch (IOException e) { + //noinspection CallToPrintStackTrace + e.printStackTrace(); + assert false; + return 0; + } + } + + @Override + public void refresh(boolean asynchronous, boolean recursive, Runnable postRunnable) { + } + + @Override + public void setWritable(boolean b) { + myIsWritable = b; + } + + @Override + public void rename(Object requestor, @NotNull String newName) throws IOException { + myName = newName; + } +}