Package net.sf.robocode.repository.root

Source Code of net.sf.robocode.repository.root.ClasspathRoot

/**
* Copyright (c) 2001-2014 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*/
package net.sf.robocode.repository.root;


import net.sf.robocode.io.Logger;
import net.sf.robocode.repository.IRepository;
import net.sf.robocode.repository.items.IRepositoryItem;
import net.sf.robocode.repository.items.handlers.ItemHandler;
import net.sf.robocode.util.UrlUtil;

import java.io.File;
import java.io.FileFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


/**
* Represents a classpath root.
*
* @author Pavel Savara (original)
* @author Flemming N. Larsen (contributor)
*/
public final class ClasspathRoot extends BaseRoot implements IRepositoryRoot {
  private static final long serialVersionUID = 1L;

  private final File projectPath;

  public ClasspathRoot(IRepository repository, File rootPath, File projectPath) {
    super(repository, rootPath);
    this.projectPath = projectPath;
  }

  /**
   * {@inheritDoc}
   */
  public void updateItems(boolean force) {
    setStatus("Updating classpath: " + rootPath.toString());
   
    // We remove all items from the root so we don't need to check, which items that might have been deleted.
    // This is fast to do, as items are simple referenced by friendly URLs in a map.
    // Items will be re-added or updated later in this method.
    repository.removeItemsFromRoot(this);

    // Retrieve all items accessible from this classpath root along with their 'last modified' date
    List<IRepositoryItem> items = new ArrayList<IRepositoryItem>();
    List<Long> itemsLastModification = new ArrayList<Long>();

    visitDirectory(rootPath, items, itemsLastModification);

    // Run thru all found repository items and update these according to their 'last modified' date
    for (int i = 0; i < items.size(); i++) {
      IRepositoryItem repositoryItem = items.get(i);
      repositoryItem.update(itemsLastModification.get(i), force);
    }
  }

  private void visitDirectory(File path, final List<IRepositoryItem> items, final List<Long> itemsLastModification) {
   
    path.listFiles(
        new FileFilter() {
      public boolean accept(File pathname) {
        if (pathname.isFile()) {
          try {
            IRepositoryItem repositoryItem = ItemHandler.registerItem(pathname.toURI().toURL(),
                ClasspathRoot.this, repository);
            if (repositoryItem != null) {
              items.add(repositoryItem);
              itemsLastModification.add(pathname.lastModified());
            }
          } catch (MalformedURLException e) {
            Logger.logError(e);
          }
        }
        return false;
      }
    });

    // find sub-directories
    File[] subDirs = path.listFiles(
        new FileFilter() {
      public boolean accept(File pathname) {
        return pathname.isDirectory() && !pathname.getName().toLowerCase().endsWith(".data")
            && !pathname.getName().toLowerCase().endsWith(".robotcache");
      }
    });

    if (subDirs != null) {
      for (File subDir : subDirs) {
        visitDirectory(subDir, items, itemsLastModification);
      }
    }
  }

  public void updateItem(IRepositoryItem item, boolean force) {
    setStatus("Updating classpath: " + rootPath);

    File file = new File(item.getItemURL().toString());
    item.update(file.lastModified(), force);
  }

  public boolean isChanged(IRepositoryItem repositoryItem) {
    File file = new File(repositoryItem.getItemURL().toString());
    return file.lastModified() > repositoryItem.getLastModified();
  }

  public boolean isDevelopmentRoot() {
    return true;
  }

  public boolean isJAR() {
    return false;
  }

  public String getFriendlyProjectURL(URL itemURL) {
    String url = null;

    if (projectPath != null) {
      try {
        String rootPath = projectPath.toURI().toURL().toString();
        String itemPath = itemURL.toString().substring(getURL().toString().length());

        url = rootPath + UrlUtil.removeFileExtension(itemPath);

      } catch (MalformedURLException e) {
        Logger.logError(e);       
      }
    }
    return url;
  }
}
TOP

Related Classes of net.sf.robocode.repository.root.ClasspathRoot

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.