DFSFolder.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:6k
- /**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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 org.apache.hadoop.eclipse.dfs;
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.logging.Logger;
- import org.apache.hadoop.eclipse.server.HadoopServer;
- import org.apache.hadoop.fs.FileStatus;
- import org.apache.hadoop.fs.Path;
- import org.eclipse.core.runtime.IProgressMonitor;
- import org.eclipse.core.runtime.IStatus;
- import org.eclipse.core.runtime.Status;
- import org.eclipse.core.runtime.jobs.Job;
- import org.eclipse.jface.dialogs.MessageDialog;
- /**
- * Local representation of a folder in the DFS.
- *
- * The constructor creates an empty representation of the folder and spawn a
- * thread that will fill
- */
- public class DFSFolder extends DFSPath implements DFSContent {
- static Logger log = Logger.getLogger(DFSFolder.class.getName());
- private DFSContent[] children;
- protected DFSFolder(DFSContentProvider provider, HadoopServer location)
- throws IOException {
- super(provider, location);
- }
- private DFSFolder(DFSPath parent, Path path) {
- super(parent, path);
- }
- protected void loadDFSFolderChildren() throws IOException {
- List<DFSPath> list = new ArrayList<DFSPath>();
- for (FileStatus status : getDFS().listStatus(this.getPath())) {
- if (status.isDir()) {
- list.add(new DFSFolder(this, status.getPath()));
- } else {
- list.add(new DFSFile(this, status.getPath()));
- }
- }
- this.children = list.toArray(new DFSContent[list.size()]);
- }
- /**
- * Upload the given file or directory into this DfsFolder
- *
- * @param file
- * @throws IOException
- */
- public void upload(IProgressMonitor monitor, final File file)
- throws IOException {
- if (file.isDirectory()) {
- Path filePath = new Path(this.path, file.getName());
- getDFS().mkdirs(filePath);
- DFSFolder newFolder = new DFSFolder(this, filePath);
- monitor.worked(1);
- for (File child : file.listFiles()) {
- if (monitor.isCanceled())
- return;
- newFolder.upload(monitor, child);
- }
- } else if (file.isFile()) {
- Path filePath = new Path(this.path, file.getName());
- DFSFile newFile = new DFSFile(this, filePath, file, monitor);
- } else {
- // XXX don't know what the file is?
- }
- }
- /* @inheritDoc */
- @Override
- public void downloadToLocalDirectory(IProgressMonitor monitor, File dir) {
- if (!dir.exists())
- dir.mkdirs();
- if (!dir.isDirectory()) {
- MessageDialog.openError(null, "Download to local file system",
- "Invalid directory location: "" + dir + """);
- return;
- }
- File dfsPath = new File(this.getPath().toString());
- File destination = new File(dir, dfsPath.getName());
- if (!destination.exists()) {
- if (!destination.mkdir()) {
- MessageDialog.openError(null, "Download to local directory",
- "Unable to create directory " + destination.getAbsolutePath());
- return;
- }
- }
- // Download all DfsPath children
- for (Object childObj : getChildren()) {
- if (childObj instanceof DFSPath) {
- ((DFSPath) childObj).downloadToLocalDirectory(monitor, destination);
- monitor.worked(1);
- }
- }
- }
- /* @inheritDoc */
- @Override
- public int computeDownloadWork() {
- int work = 1;
- for (DFSContent child : getChildren()) {
- if (child instanceof DFSPath)
- work += ((DFSPath) child).computeDownloadWork();
- }
- return work;
- }
- /**
- * Create a new sub directory into this directory
- *
- * @param folderName
- */
- public void mkdir(String folderName) {
- try {
- getDFS().mkdirs(new Path(this.path, folderName));
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- doRefresh();
- }
- /*
- * Implementation of DFSContent
- */
- /* @inheritDoc */
- public boolean hasChildren() {
- if (this.children == null)
- return true;
- else
- return (this.children.length > 0);
- }
- /* @inheritDoc */
- public DFSContent[] getChildren() {
- if (children == null) {
- new Job("Connecting to DFS " + location) {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- try {
- loadDFSFolderChildren();
- return Status.OK_STATUS;
- } catch (IOException ioe) {
- children =
- new DFSContent[] { new DFSMessage("Error: "
- + ioe.getLocalizedMessage()) };
- return Status.CANCEL_STATUS;
- } finally {
- // Under all circumstances, update the UI
- provider.refresh(DFSFolder.this);
- }
- }
- }.schedule();
- return new DFSContent[] { new DFSMessage("Listing folder content...") };
- }
- return this.children;
- }
- /* @inheritDoc */
- @Override
- public void refresh() {
- this.children = null;
- this.doRefresh();
- }
- /* @inheritDoc */
- @Override
- public String toString() {
- return String.format("%s (%s)", super.toString(),
- this.getChildren().length);
- }
- }