diff -r e84fceafb789 openide.filesystems/src/org/openide/filesystems/FileUtil.java --- a/openide.filesystems/src/org/openide/filesystems/FileUtil.java Thu Aug 07 11:39:18 2008 +0200 +++ b/openide.filesystems/src/org/openide/filesystems/FileUtil.java Thu Aug 07 12:00:11 2008 +0200 @@ -43,6 +43,7 @@ import java.io.File; import java.io.FileFilter; +import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; @@ -75,6 +76,7 @@ import javax.swing.SwingUtilities; import javax.swing.filechooser.FileSystemView; import org.openide.filesystems.FileSystem.AtomicAction; +import org.openide.filesystems.MIMESupport.CachedInputStream; import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.util.Utilities; @@ -1125,6 +1127,61 @@ return retVal; } + private static class CachedFileObjectProxy extends MIMESupport.CachedFileObject { + + CachedFileObjectProxy(File file) { + super(file); + } + + @Override + public String getName() { + String name = file.getName(); + int i = name.lastIndexOf('.'); + return ((i < 1) || (i == name.length())) ? name : name.substring(0, i); + } + + @Override + public String getExt() { + String name = file.getName(); + int i = name.lastIndexOf('.') + 1; + return ((i <= 1) || (i == name.length())) ? "" : name.substring(i); // NOI18N + } + + @Override + public String getNameExt() { + return file.getName(); + } + + @Override + public InputStream getInputStream() throws java.io.FileNotFoundException { + if (fixIt == null) { + fixIt = new CachedInputStream(new FileInputStream(file)); + } + fixIt.cacheToStart(); + return fixIt; + } + + @Override + public boolean isData() { + return file.isFile(); + } + + @Override + public boolean isFolder() { + return file.isDirectory(); + } + + @Override + public boolean isValid() { + return file.exists(); + } + } + + public static String getMIMEType(File file) { + FileObject fo = new CachedFileObjectProxy(file); + return getMIMEType(fo); + } + /** Finds mime type by calling getMIMEType, but * instead of returning null it fallbacks to default type * either text/plain or content/unknown (even for folders) diff -r e84fceafb789 openide.filesystems/src/org/openide/filesystems/MIMESupport.java --- a/openide.filesystems/src/org/openide/filesystems/MIMESupport.java Thu Aug 07 11:39:18 2008 +0200 +++ b/openide.filesystems/src/org/openide/filesystems/MIMESupport.java Thu Aug 07 12:00:11 2008 +0200 @@ -42,6 +42,7 @@ package org.openide.filesystems; import java.io.BufferedInputStream; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -113,7 +114,11 @@ synchronized (lock) { CachedFileObject lcfo = (CachedFileObject)lastCfo.get(); if (lcfo == null || fo != lastFo.get()) { + if(fo instanceof CachedFileObject) { + cfo = (CachedFileObject)fo; + } else { cfo = new CachedFileObject(fo); + } } else { cfo = lcfo; } @@ -136,7 +141,7 @@ return CachedFileObject.getResolvers(); } - private static class CachedFileObject extends FileObject implements FileChangeListener { + static class CachedFileObject extends FileObject implements FileChangeListener { static Lookup.Result result; private static Union2> resolvers; // call getResolvers instead /** resolvers that were here before we cleaned them */ @@ -151,10 +156,22 @@ /*All calls delegated to this object. Except few methods, that returns cached values*/ FileObject fileObj; + File file; + + CachedFileObject(File file) { + this.file = file; + } CachedFileObject(FileObject fo) { fileObj = fo; fileObj.addFileChangeListener(FileUtil.weakFileChangeListener(this, fileObj)); + } + + private FileObject getFileObject() { + if(fileObj == null) { + fileObj = FileUtil.toFileObject(file); + } + return fileObj; } private static MIMEResolver[] getResolvers() { @@ -312,14 +329,14 @@ public java.util.Date lastModified() { if (lastModified == null) { - lastModified = fileObj.lastModified(); + lastModified = getFileObject().lastModified(); } return lastModified; } public InputStream getInputStream() throws java.io.FileNotFoundException { if (fixIt == null) { - InputStream is = fileObj.getInputStream(); + InputStream is = getFileObject().getInputStream(); if (!(is instanceof BufferedInputStream)) { is = new BufferedInputStream(is); @@ -349,118 +366,118 @@ /*All other methods only delegate to fileObj*/ public FileObject getParent() { - return fileObj.getParent(); + return getFileObject().getParent(); } @Deprecated // have to override for compat @Override public String getPackageNameExt(char separatorChar, char extSepChar) { - return fileObj.getPackageNameExt(separatorChar, extSepChar); + return getFileObject().getPackageNameExt(separatorChar, extSepChar); } @Override public FileObject copy(FileObject target, String name, String ext) throws IOException { - return fileObj.copy(target, name, ext); + return getFileObject().copy(target, name, ext); } @Override protected void fireFileDeletedEvent(Enumeration en, FileEvent fe) { - fileObj.fireFileDeletedEvent(en, fe); + getFileObject().fireFileDeletedEvent(en, fe); } @Override protected void fireFileFolderCreatedEvent(Enumeration en, FileEvent fe) { - fileObj.fireFileFolderCreatedEvent(en, fe); + getFileObject().fireFileFolderCreatedEvent(en, fe); } @Deprecated // have to override for compat public void setImportant(boolean b) { - fileObj.setImportant(b); + getFileObject().setImportant(b); } public boolean isData() { - return fileObj.isData(); + return getFileObject().isData(); } public Object getAttribute(String attrName) { - return fileObj.getAttribute(attrName); + return getFileObject().getAttribute(attrName); } @Override public Enumeration getFolders(boolean rec) { - return fileObj.getFolders(rec); + return getFileObject().getFolders(rec); } public void delete(FileLock lock) throws IOException { - fileObj.delete(lock); + getFileObject().delete(lock); } public boolean isRoot() { - return fileObj.isRoot(); + return getFileObject().isRoot(); } @Override public Enumeration getData(boolean rec) { - return fileObj.getData(rec); + return getFileObject().getData(rec); } public FileObject[] getChildren() { - return fileObj.getChildren(); + return getFileObject().getChildren(); } @Override public String getNameExt() { - return fileObj.getNameExt(); + return getFileObject().getNameExt(); } public boolean isValid() { - return fileObj.isValid(); + return getFileObject().isValid(); } @Deprecated // have to override for compat public boolean isReadOnly() { - return fileObj.isReadOnly(); + return getFileObject().isReadOnly(); } @Override public boolean canRead() { - return fileObj.canRead(); + return getFileObject().canRead(); } @Override public boolean canWrite() { - return fileObj.canWrite(); + return getFileObject().canWrite(); } public String getExt() { if(ext == null) { - ext = fileObj.getExt(); + ext = getFileObject().getExt(); } return ext; } public String getName() { - return fileObj.getName(); + return getFileObject().getName(); } public void removeFileChangeListener(FileChangeListener fcl) { - fileObj.removeFileChangeListener(fcl); + getFileObject().removeFileChangeListener(fcl); } @Override protected void fireFileRenamedEvent(Enumeration en, FileRenameEvent fe) { - fileObj.fireFileRenamedEvent(en, fe); + getFileObject().fireFileRenamedEvent(en, fe); } @Override public void refresh(boolean expected) { - fileObj.refresh(expected); + getFileObject().refresh(expected); } @Override protected void fireFileAttributeChangedEvent(Enumeration en, FileAttributeEvent fe) { - fileObj.fireFileAttributeChangedEvent(en, fe); + getFileObject().fireFileAttributeChangedEvent(en, fe); } public long getSize() { @@ -468,97 +485,97 @@ return size; } - return size = fileObj.getSize(); + return size = getFileObject().getSize(); } public Enumeration getAttributes() { - return fileObj.getAttributes(); + return getFileObject().getAttributes(); } public void rename(FileLock lock, String name, String ext) throws IOException { - fileObj.rename(lock, name, ext); + getFileObject().rename(lock, name, ext); } @Override protected void fireFileChangedEvent(Enumeration en, FileEvent fe) { - fileObj.fireFileChangedEvent(en, fe); + getFileObject().fireFileChangedEvent(en, fe); } public FileObject getFileObject(String name, String ext) { - return fileObj.getFileObject(name, ext); + return getFileObject().getFileObject(name, ext); } @Override public void refresh() { - fileObj.refresh(); + getFileObject().refresh(); } public FileObject createData(String name, String ext) throws IOException { - return fileObj.createData(name, ext); + return getFileObject().createData(name, ext); } public void addFileChangeListener(FileChangeListener fcl) { - fileObj.addFileChangeListener(fcl); + getFileObject().addFileChangeListener(fcl); } @Override protected void fireFileDataCreatedEvent(Enumeration en, FileEvent fe) { - fileObj.fireFileDataCreatedEvent(en, fe); + getFileObject().fireFileDataCreatedEvent(en, fe); } public boolean isFolder() { - return fileObj.isFolder(); + return getFileObject().isFolder(); } public FileObject createFolder(String name) throws IOException { - return fileObj.createFolder(name); + return getFileObject().createFolder(name); } @Override public Enumeration getChildren(boolean rec) { - return fileObj.getChildren(rec); + return getFileObject().getChildren(rec); } public void setAttribute(String attrName, Object value) throws IOException { - fileObj.setAttribute(attrName, value); + getFileObject().setAttribute(attrName, value); } @Deprecated // have to override for compat @Override public String getPackageName(char separatorChar) { - return fileObj.getPackageName(separatorChar); + return getFileObject().getPackageName(separatorChar); } public FileSystem getFileSystem() throws FileStateInvalidException { - return fileObj.getFileSystem(); + return getFileObject().getFileSystem(); } public OutputStream getOutputStream(FileLock lock) throws java.io.IOException { - return fileObj.getOutputStream(lock); + return getFileObject().getOutputStream(lock); } @Override public boolean existsExt(String ext) { - return fileObj.existsExt(ext); + return getFileObject().existsExt(ext); } @Override public FileObject move(FileLock lock, FileObject target, String name, String ext) throws IOException { - return fileObj.move(lock, target, name, ext); + return getFileObject().move(lock, target, name, ext); } @Override public synchronized boolean isLocked() { - return fileObj.isLocked(); + return getFileObject().isLocked(); } public FileLock lock() throws IOException { - return fileObj.lock(); + return getFileObject().lock(); } public void fileFolderCreated(FileEvent fe) { @@ -574,13 +591,13 @@ * resolved patterns in Map with this FileObject as key.*/ @Override public int hashCode() { - return fileObj.hashCode(); + return getFileObject().hashCode(); } @Override public boolean equals(java.lang.Object obj) { if (obj instanceof CachedFileObject) { - return ((CachedFileObject) obj).fileObj.equals(fileObj); + return ((CachedFileObject) obj).getFileObject().equals(getFileObject()); } return super.equals(obj); @@ -588,11 +605,11 @@ @Override public String getPath() { - return fileObj.getPath(); + return getFileObject().getPath(); } } - private static class CachedInputStream extends InputStream { + static class CachedInputStream extends InputStream { private InputStream inputStream; private byte[] buffer = null; private int len = 0;