@@ -, +, @@ - variant #3 (fixed Y01&Y02) --- a/dlight.remote.impl/nbproject/project.xml +++ a/dlight.remote.impl/nbproject/project.xml @@ -85,7 +85,7 @@ - 7.56 + 7.60 --- a/dlight.remote.impl/src/org/netbeans/modules/remote/impl/fs/RemoteFileSystem.java +++ a/dlight.remote.impl/src/org/netbeans/modules/remote/impl/fs/RemoteFileSystem.java @@ -66,6 +66,8 @@ import org.netbeans.modules.nativeexecution.api.ExecutionEnvironment; import org.netbeans.modules.nativeexecution.api.util.ConnectionListener; import org.netbeans.modules.nativeexecution.api.util.ConnectionManager; +import org.netbeans.modules.nativeexecution.api.util.ConnectionManager.CancellationException; +import org.netbeans.modules.nativeexecution.api.util.HostInfoUtils; import org.netbeans.modules.remote.api.ui.ConnectionNotifier; import org.netbeans.modules.remote.spi.FileSystemCacheProvider; import org.netbeans.modules.remote.impl.RemoteLogger; @@ -262,6 +264,45 @@ return getRoot().getFileObject(name); } } + + @Override + public FileObject getTempFolder() throws IOException { + try { + String tmpName = HostInfoUtils.getHostInfo(execEnv).getTempDir(); + RemoteFileObject tmpDir = findResource(tmpName); + if (tmpDir != null && tmpDir.isFolder() && tmpDir.isValid()) { + return tmpDir; + } + } catch (CancellationException ex) { + // + } + throw new IOException("Cannot find temporary folder"); // NOI18N + } + + @Override + public FileObject createTempFile(FileObject parent, String prefix, String suffix) throws IOException { + if (parent.isFolder() && parent.isValid()) { + while(true) { + File tmpFile = File.createTempFile(prefix, suffix); + String tmpName = tmpFile.getName(); + tmpFile.delete(); + try { + FileObject fo = parent.createData(tmpName); + if (fo != null && fo.isData() && fo.isValid()) { + return fo; + } + break; + } catch (IOException ex) { + FileObject test = parent.getFileObject(tmpName); + if (test != null) { + continue; + } + throw ex; + } + } + } + throw new IOException("Cannot create temporary file"); // NOI18N + } /*package*/ RemoteFileObjectBase findResource(String name, Set antiloop) { if (name.isEmpty() || name.equals("/")) { // NOI18N --- a/dlight.remote.impl/test/unit/src/org/netbeans/modules/remote/test/RemoteFSTCKTest.java +++ a/dlight.remote.impl/test/unit/src/org/netbeans/modules/remote/test/RemoteFSTCKTest.java @@ -49,6 +49,7 @@ import org.openide.filesystems.FileObjectTestHid; import org.openide.filesystems.FileSystemTestHid; import org.openide.filesystems.FileUtilTestHidden; +import org.openide.filesystems.TempFileObjectTestHid; import org.openide.filesystems.URLMapperTestHidden; /** @@ -69,6 +70,7 @@ //suite.addTestSuite(AttributesTestHidden.class); suite.addTestSuite(URLMapperTestHidden.class); suite.addTestSuite(FileUtilTestHidden.class); + suite.addTestSuite(TempFileObjectTestHid.class); return new RemoteFSTCKTest(suite); } --- a/masterfs/nbproject/project.xml +++ a/masterfs/nbproject/project.xml @@ -63,7 +63,7 @@ - 7.54 + 7.60 --- a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystem.java +++ a/masterfs/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystem.java @@ -48,6 +48,7 @@ import java.io.IOException; import java.io.ObjectStreamException; import java.io.Serializable; +import java.security.SecureRandom; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -211,6 +212,28 @@ } return getFileObject(f); } + + @Override + public FileObject getTempFolder() throws IOException { + FileObject tmpDir = FileUtil.toFileObject(File.createTempFile("tmp", null).getParentFile()); // NOI18N + if (tmpDir != null && tmpDir.isFolder() && tmpDir.isValid()) { + return tmpDir; + } + throw new IOException("Cannot find temporary folder"); // NOI18N + } + + @Override + public FileObject createTempFile(FileObject parent, String prefix, String suffix) throws IOException { + if (parent.isFolder() && parent.isValid()) { + File tmpFile = File.createTempFile(prefix, suffix, FileUtil.toFile(parent)); + FileObject fo = FileUtil.toFileObject(tmpFile); + if (fo != null && fo.isData() && fo.isValid()) { + return fo; + } + tmpFile.delete(); + } + throw new IOException("Cannot create temporary file"); // NOI18N + } @Override public SystemAction[] getActions() { --- a/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystemTest.java +++ a/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/FileBasedFileSystemTest.java @@ -83,6 +83,7 @@ suite.addTestSuite(FileUtilTestHidden.class); suite.addTestSuite(FileUtilJavaIOFileHidden.class); suite.addTestSuite(BaseFileObjectTestHid.class); + suite.addTestSuite(TempFileObjectTestHid.class); suite.addTest(new CheckProviders(created)); return suite; } --- a/openide.filesystems/apichanges.xml +++ a/openide.filesystems/apichanges.xml @@ -49,6 +49,22 @@ Filesystems API + + + File System can create temporary file + + + + + +

+ Added methods to create temporary file objects: + FileSystem.getTempFolder, FileSystem.createTempFile. +

+
+ + +
SPI for Additions to System File System --- a/openide.filesystems/manifest.mf +++ a/openide.filesystems/manifest.mf @@ -2,5 +2,5 @@ OpenIDE-Module: org.openide.filesystems OpenIDE-Module-Localizing-Bundle: org/openide/filesystems/Bundle.properties OpenIDE-Module-Layer: org/openide/filesystems/resources/layer.xml -OpenIDE-Module-Specification-Version: 7.59 +OpenIDE-Module-Specification-Version: 7.60 --- a/openide.filesystems/src/org/openide/filesystems/FileSystem.java +++ a/openide.filesystems/src/org/openide/filesystems/FileSystem.java @@ -442,6 +442,29 @@ */ public abstract FileObject findResource(String name); + /** Returns temporary folder if it is avaliable on this file system. + * Method never returns null. IOException is thrown instead. + * @return a file object for temporary folder + * @throws IOException + * @since 7.60 + */ + public FileObject getTempFolder() throws IOException { + throw new IOException("Unsupported operation"); // NOI18N + } + + /** Creates temporary file in the given parent folder. + * Method never returns null. IOException is thrown instead. + * @param parent the parent folder where temporary file will be created + * @param prefix prefix of the name of created file + * @param suffix suffix of the name of created file + * @return new temporary file + * @throws IOException + * @since 7.60 + */ + public FileObject createTempFile(FileObject parent, String prefix, String suffix) throws IOException { + throw new IOException("Unsupported operation"); // NOI18N + } + /** Returns an array of actions that can be invoked on any file in * this filesystem. * These actions should preferably --- a/openide.filesystems/test/unit/src/org/openide/filesystems/TempFileObjectTestHid.java +++ a/openide.filesystems/test/unit/src/org/openide/filesystems/TempFileObjectTestHid.java @@ -0,0 +1,85 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2012 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2012 Sun Microsystems, Inc. + */ +package org.openide.filesystems; + +/** + * + * @author Alexander Simon + */ +public class TempFileObjectTestHid extends TestBaseHid { + private FileObject root; + + public TempFileObjectTestHid(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + root = testedFS.findResource(getResourcePrefix()); + } + + @Override + protected String[] getResources(String testName) { + return new String[] {}; + } + + public void testTempDir() throws Exception { + FileObject tempFolder = root.getFileSystem().getTempFolder(); + assertNotNull(tempFolder); + assertTrue(tempFolder.isValid()); + assertTrue(tempFolder.isFolder()); + assertEquals(tempFolder.getFileSystem(), root.getFileSystem()); + } + + public void testTempFile() throws Exception { + FileObject tempFolder = root.getFileSystem().getTempFolder(); + FileObject tempFile = root.getFileSystem().createTempFile(tempFolder, "out", ".tmp"); + assertNotNull(tempFile); + assertTrue(tempFile.isValid()); + assertTrue(tempFile.isData()); + assertEquals(tempFile.getParent(), tempFolder); + assertEquals(tempFolder.getFileSystem(), tempFile.getFileSystem()); + assertTrue(tempFile.getNameExt().startsWith("out")); + assertTrue(tempFile.getNameExt().endsWith(".tmp")); + } +}