/*
Copyright 2011-2016 Google Inc. All Rights Reserved.
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.google.security.zynamics.binnavi.Gui.Debug.RemoteBrowser.FileBrowser;
import java.io.File;
import javax.swing.Icon;
import javax.swing.filechooser.FileSystemView;
import com.google.common.base.Preconditions;
import com.google.security.zynamics.binnavi.debug.models.remotebrowser.RemoteDirectory;
import com.google.security.zynamics.binnavi.debug.models.remotebrowser.RemoteDrive;
import com.google.security.zynamics.binnavi.debug.models.remotebrowser.RemoteFileSystem;
import com.google.security.zynamics.zylib.io.FileUtils;
import com.google.security.zynamics.zylib.types.common.CollectionHelpers;
import com.google.security.zynamics.zylib.types.common.ICollectionMapper;
/**
* Simulates remote file systems.
*/
public final class CRemoteFileSystemView extends FileSystemView {
/**
* Default directory of the simulated remote file system.
*/
private final CRemoteFile m_defaultDirectory;
/**
* Remote file system that is simulated.
*/
private RemoteFileSystem m_fileSystem;
/**
* Creates a new remote file system view.
*
* @param fileSystem Information about the objects to be simulated.
*/
public CRemoteFileSystemView(final RemoteFileSystem fileSystem) {
Preconditions.checkNotNull(fileSystem, "IE01496: File system argument can not be null");
m_fileSystem = fileSystem;
m_defaultDirectory = new CRemoteFile(fileSystem.getDirectory().getName(), true);
}
@Override
public File createNewFolder(final File containingDir) {
return null;
}
@Override
public File getDefaultDirectory() {
return m_defaultDirectory;
}
@Override
public File[] getFiles(final File dir, final boolean useFileHiding) // NO_UCD
{
final CRemoteFile[] files = CollectionHelpers.map(m_fileSystem.getFiles(),
new ICollectionMapper<com.google.security.zynamics.binnavi.debug.models.remotebrowser.RemoteFile, File>() {
@Override
public File map(final com.google.security.zynamics.binnavi.debug.models.remotebrowser.RemoteFile item) {
return new CRemoteFile(
m_fileSystem.getDirectory().getName() + "/" + item.getName(), false);
}
}).toArray(new CRemoteFile[0]);
final CRemoteFile[] directories = CollectionHelpers.map(
m_fileSystem.getDirectories(), new ICollectionMapper<RemoteDirectory, File>() {
@Override
public File map(final RemoteDirectory item) {
return new CRemoteFile(m_fileSystem.getDirectory().getName() + "/" + item.getName()
+ "/", true);
}
}).toArray(new CRemoteFile[0]);
final File[] combined = new File[files.length + directories.length];
System.arraycopy(files, 0, combined, 0, files.length);
System.arraycopy(directories, 0, combined, files.length, directories.length);
return combined;
}
@Override
public File getHomeDirectory() {
return m_defaultDirectory;
}
@Override
public File getParentDirectory(final File dir) // NO_UCD
{
return new CRemoteFile(dir.getParent(), true);
}
@Override
public File[] getRoots() {
return CollectionHelpers.map(
m_fileSystem.getDrives(), new ICollectionMapper<RemoteDrive, File>() {
@Override
public File map(final RemoteDrive item) {
return new CRemoteFile(item.getName() + "/", true);
}
}).toArray(new CRemoteFile[0]);
}
@Override
public String getSystemDisplayName(final File file) // NO_UCD
{
return isDrive(file) ? file.getAbsolutePath() : FileUtils.getFileBasename(file);
}
@Override
public Icon getSystemIcon(final File file) {
throw new IllegalStateException("IE01132: Not yet implemented");
}
@Override
public String getSystemTypeDescription(final File file) {
throw new IllegalStateException("IE01133: Not yet implemented");
}
@Override
public boolean isComputerNode(final File dir) {
return false;
}
@Override
public boolean isDrive(final File dir) {
return CRemoteBrowserHelpers.isDrive(dir);
}
@Override
public boolean isFileSystem(final File file) {
throw new IllegalStateException("IE01134: Not yet implemented");
}
@Override
public boolean isFileSystemRoot(final File dir) {
return false;
}
@Override
public boolean isFloppyDrive(final File dir) {
return false;
}
@Override
public boolean isHiddenFile(final File file) {
throw new IllegalStateException("IE01135: Not yet implemented");
}
@Override
public boolean isParent(final File folder, final File file) {
return false;
}
@Override
public boolean isRoot(final File file) {
return (file != null) && isDrive(file);
}
/**
* Changes the object that contains the simulated objects.
*
* @param fileSystem The new file system object model.
*/
public void setFileSystem(final RemoteFileSystem fileSystem) {
Preconditions.checkNotNull(fileSystem, "IE01497: File system argument can not be null");
m_fileSystem = fileSystem;
}
}