DFSFolder.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:6k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.eclipse.dfs;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.logging.Logger;
  24. import org.apache.hadoop.eclipse.server.HadoopServer;
  25. import org.apache.hadoop.fs.FileStatus;
  26. import org.apache.hadoop.fs.Path;
  27. import org.eclipse.core.runtime.IProgressMonitor;
  28. import org.eclipse.core.runtime.IStatus;
  29. import org.eclipse.core.runtime.Status;
  30. import org.eclipse.core.runtime.jobs.Job;
  31. import org.eclipse.jface.dialogs.MessageDialog;
  32. /**
  33.  * Local representation of a folder in the DFS.
  34.  * 
  35.  * The constructor creates an empty representation of the folder and spawn a
  36.  * thread that will fill
  37.  */
  38. public class DFSFolder extends DFSPath implements DFSContent {
  39.   static Logger log = Logger.getLogger(DFSFolder.class.getName());
  40.   private DFSContent[] children;
  41.   protected DFSFolder(DFSContentProvider provider, HadoopServer location)
  42.       throws IOException {
  43.     super(provider, location);
  44.   }
  45.   private DFSFolder(DFSPath parent, Path path) {
  46.     super(parent, path);
  47.   }
  48.   protected void loadDFSFolderChildren() throws IOException {
  49.     List<DFSPath> list = new ArrayList<DFSPath>();
  50.     for (FileStatus status : getDFS().listStatus(this.getPath())) {
  51.       if (status.isDir()) {
  52.         list.add(new DFSFolder(this, status.getPath()));
  53.       } else {
  54.         list.add(new DFSFile(this, status.getPath()));
  55.       }
  56.     }
  57.     this.children = list.toArray(new DFSContent[list.size()]);
  58.   }
  59.   /**
  60.    * Upload the given file or directory into this DfsFolder
  61.    * 
  62.    * @param file
  63.    * @throws IOException
  64.    */
  65.   public void upload(IProgressMonitor monitor, final File file)
  66.       throws IOException {
  67.     if (file.isDirectory()) {
  68.       Path filePath = new Path(this.path, file.getName());
  69.       getDFS().mkdirs(filePath);
  70.       DFSFolder newFolder = new DFSFolder(this, filePath);
  71.       monitor.worked(1);
  72.       for (File child : file.listFiles()) {
  73.         if (monitor.isCanceled())
  74.           return;
  75.         newFolder.upload(monitor, child);
  76.       }
  77.     } else if (file.isFile()) {
  78.       Path filePath = new Path(this.path, file.getName());
  79.       DFSFile newFile = new DFSFile(this, filePath, file, monitor);
  80.     } else {
  81.       // XXX don't know what the file is?
  82.     }
  83.   }
  84.   /* @inheritDoc */
  85.   @Override
  86.   public void downloadToLocalDirectory(IProgressMonitor monitor, File dir) {
  87.     if (!dir.exists())
  88.       dir.mkdirs();
  89.     if (!dir.isDirectory()) {
  90.       MessageDialog.openError(null, "Download to local file system",
  91.           "Invalid directory location: "" + dir + """);
  92.       return;
  93.     }
  94.     File dfsPath = new File(this.getPath().toString());
  95.     File destination = new File(dir, dfsPath.getName());
  96.     if (!destination.exists()) {
  97.       if (!destination.mkdir()) {
  98.         MessageDialog.openError(null, "Download to local directory",
  99.             "Unable to create directory " + destination.getAbsolutePath());
  100.         return;
  101.       }
  102.     }
  103.     // Download all DfsPath children
  104.     for (Object childObj : getChildren()) {
  105.       if (childObj instanceof DFSPath) {
  106.         ((DFSPath) childObj).downloadToLocalDirectory(monitor, destination);
  107.         monitor.worked(1);
  108.       }
  109.     }
  110.   }
  111.   /* @inheritDoc */
  112.   @Override
  113.   public int computeDownloadWork() {
  114.     int work = 1;
  115.     for (DFSContent child : getChildren()) {
  116.       if (child instanceof DFSPath)
  117.         work += ((DFSPath) child).computeDownloadWork();
  118.     }
  119.     return work;
  120.   }
  121.   /**
  122.    * Create a new sub directory into this directory
  123.    * 
  124.    * @param folderName
  125.    */
  126.   public void mkdir(String folderName) {
  127.     try {
  128.       getDFS().mkdirs(new Path(this.path, folderName));
  129.     } catch (IOException ioe) {
  130.       ioe.printStackTrace();
  131.     }
  132.     doRefresh();
  133.   }
  134.   /*
  135.    * Implementation of DFSContent
  136.    */
  137.   /* @inheritDoc */
  138.   public boolean hasChildren() {
  139.     if (this.children == null)
  140.       return true;
  141.     else
  142.       return (this.children.length > 0);
  143.   }
  144.   /* @inheritDoc */
  145.   public DFSContent[] getChildren() {
  146.     if (children == null) {
  147.       new Job("Connecting to DFS " + location) {
  148.         @Override
  149.         protected IStatus run(IProgressMonitor monitor) {
  150.           try {
  151.             loadDFSFolderChildren();
  152.             return Status.OK_STATUS;
  153.           } catch (IOException ioe) {
  154.             children =
  155.                 new DFSContent[] { new DFSMessage("Error: "
  156.                     + ioe.getLocalizedMessage()) };
  157.             return Status.CANCEL_STATUS;
  158.           } finally {
  159.             // Under all circumstances, update the UI
  160.             provider.refresh(DFSFolder.this);
  161.           }
  162.         }
  163.       }.schedule();
  164.       return new DFSContent[] { new DFSMessage("Listing folder content...") };
  165.     }
  166.     return this.children;
  167.   }
  168.   /* @inheritDoc */
  169.   @Override
  170.   public void refresh() {
  171.     this.children = null;
  172.     this.doRefresh();
  173.   }
  174.   /* @inheritDoc */
  175.   @Override
  176.   public String toString() {
  177.     return String.format("%s (%s)", super.toString(),
  178.         this.getChildren().length);
  179.   }
  180. }