/* * Data Hub Service (DHuS) - For Space data distribution. * Copyright (C) 2013,2014,2015 GAEL Systems * * This file is part of DHuS software sources. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package fr.gael.dhus.datastore.scanner; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import fr.gael.dhus.datastore.exception.BadLoginException; import fr.gael.drb.DrbAttribute; import fr.gael.drb.DrbItem; import fr.gael.drb.impl.ftp.FtpConnectionFactory; import fr.gael.drb.impl.ftp.FtpFactory; import fr.gael.drb.impl.ftp.FtpNode; /** * This class performs scanning other FTP/FTPS file systems. */ public class FtpScanner extends AbstractScanner { private static final Logger LOGGER = LogManager.getLogger(FtpScanner.class); protected int scannedFiles = 0; protected int retrievedFile = 0; FtpNode ftpNode; public FtpScanner (String uri, boolean store_scan_list, String username, String password) { super (store_scan_list); ftpNode = (FtpNode)(new FtpFactory()).open (toUrl(uri), username, password); if (!FtpConnectionFactory.isArchiveSupported (uri)) throw new UnsupportedOperationException ("URI not supported"); } private URL toUrl (String uri) { try { return new URL (uri); } catch (MalformedURLException e) { throw new UnsupportedOperationException ("URI not supported", e); } } /* * (non-Javadoc) * @see fr.gael.dhus.archive.scanner.AbstractScanner#scan() */ @Override public int scan () throws InterruptedException { scannedFiles = 0; retrievedFile = 0; int total = 0; try { total = scanDirectory (ftpNode); } catch (InterruptedException e) { throw e; } catch (Exception e) { LOGGER.error("Cannot scan directory " + ftpNode, e); throw new RuntimeException(e); } LOGGER.info("FTP Scan done (" + total + ")."); return total; } /** * Recursively scans specified directory. * * @param directory directory to scan * @throws IOException if IO exception occurs * @throws InterruptedException in user request stop */ private int scanDirectory (FtpNode path) throws IOException, BadLoginException, InterruptedException { if (isStopped ()) throw new InterruptedException (); LOGGER.info("LIST " + path); boolean accepted = checkIt (path); int total =0; if (accepted) total++; if ((!accepted || isForceNavigate ()) && !isFile(path)) { for (int index=0; index<path.getChildrenCount () ; index++) { DrbItem item = path.getChildAt (index); total += scanDirectory((FtpNode)item); } } return total; } private boolean checkIt (FtpNode node) { //String url = toUrl(node); if (matches (node)) { return getScanList ().add (new URLExt (node.getUrl (), !isFile(node))); } return false; } boolean isFile (FtpNode node) { // Workaround: for loading attributes node.getAttributes (); // Workaround DrbAttribute attr = node.getAttribute("directory"); if ((attr != null) && (attr.getValue()!=null)) return !((fr.gael.drb.value.Boolean)attr.getValue()).booleanValue(); return true; } }