com.abiquo.am.services.filesystem.EnterpriseRepositoryRefreshWithTimeout.java Source code

Java tutorial

Introduction

Here is the source code for com.abiquo.am.services.filesystem.EnterpriseRepositoryRefreshWithTimeout.java

Source

/**
 * Abiquo community edition
 * cloud management application for hybrid clouds
 * Copyright (C) 2008-2010 - Abiquo Holdings S.L.
 *
 * This application is free software; you can redistribute it and/or
 * modify it under the terms of the GNU LESSER GENERAL PUBLIC
 * LICENSE as published by the Free Software Foundation under
 * version 3 of the License
 *
 * This software 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
 * LESSER GENERAL PUBLIC LICENSE v.3 for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

package com.abiquo.am.services.filesystem;

import static com.abiquo.am.services.TemplateConventions.OVF_BUNDLE_PATH_IDENTIFIER;
import static com.abiquo.am.services.TemplateConventions.OVF_FILE_EXTENSION;
import static com.abiquo.am.services.TemplateConventions.OVF_LOCATION_PREFIX;
import static com.abiquo.am.services.TemplateConventions.createBundleOvfId;
import static com.abiquo.am.services.TemplateConventions.customDencode;
import static com.abiquo.am.services.filesystem.TemplateFileSystem.getTemplateStatus;

import java.io.File;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.abiquo.am.services.filesystem.filters.BundleImageFileFilter;
import com.abiquo.appliancemanager.transport.TemplateStateDto;
import com.abiquo.appliancemanager.transport.TemplateStatusEnumType;

/**
 * Run a folder list in another thread in order to cancel if it take too long
 */
public class EnterpriseRepositoryRefreshWithTimeout implements Callable<List<TemplateStateDto>> {
    private final static Logger LOG = LoggerFactory.getLogger(EnterpriseRepositoryRefreshWithTimeout.class);

    final String erPath;

    final String relativePath;

    final Boolean includeBundles;

    final Boolean cleanDeploys;

    public EnterpriseRepositoryRefreshWithTimeout(final String erPath, final String relativePath,
            final Boolean includeBundles, final Boolean cleanDeploys) {
        this.erPath = erPath;
        this.relativePath = relativePath;
        this.includeBundles = includeBundles;
        this.cleanDeploys = cleanDeploys;
    }

    @Override
    public List<TemplateStateDto> call() throws Exception {
        return traverseOVFFolderStructure(erPath, relativePath, includeBundles, cleanDeploys, erPath);
    }

    /**
     * Returns DOWNLOAD Ovfs
     * 
     * @param includeBundles, if true return also the OVF packages identifier for the bundled
     *            packages (only used on status = DOWNLOAD).
     * @param relativePath, recursive accumulated folder structure.(empty at the fist call).
     */
    private List<TemplateStateDto> traverseOVFFolderStructure(final String erPath, final String relativePath,
            final Boolean includeBundles, final Boolean cleanDeploys, final String enterpriseRepositoryPath) {
        final List<TemplateStateDto> ovfids = new LinkedList<TemplateStateDto>();
        final File currentFile = new File(erPath);

        for (File file : currentFile.listFiles()) {
            // TODO assert inside a folder only one .ovf (to exactly know the bundle parent!)

            final String recRelativePath = relativePath.isEmpty() ? file.getName()
                    : relativePath + '/' + file.getName();

            if (file.isDirectory() && file.listFiles().length != 0) {
                // recursion
                ovfids.addAll(traverseOVFFolderStructure(file.getAbsolutePath(), recRelativePath, includeBundles,
                        cleanDeploys, enterpriseRepositoryPath));
            } else if (file.isFile() && file.getName().endsWith(OVF_FILE_EXTENSION)) {
                final String ovfId = OVF_LOCATION_PREFIX + customDencode(recRelativePath);
                final TemplateStateDto status = getTemplateStatus(enterpriseRepositoryPath, ovfId);

                if (cleanDeploys && status.getStatus() == TemplateStatusEnumType.DOWNLOADING) {
                    try {
                        FileUtils.deleteDirectory(currentFile);
                    } catch (Exception e) {
                        LOG.error("Can not delete the interrupted download [{}], \n{}", ovfId, e);
                    }
                } else {
                    ovfids.add(status);

                    if (includeBundles) {
                        for (String fileBund : currentFile.list(new BundleImageFileFilter())) {
                            final String snapshot = fileBund.substring(0,
                                    fileBund.indexOf(OVF_BUNDLE_PATH_IDENTIFIER));

                            final String bundleOvfId = createBundleOvfId(ovfId, snapshot);

                            TemplateStateDto bundleState = new TemplateStateDto();

                            bundleState.setOvfId(bundleOvfId);
                            bundleState.setMasterOvf(ovfId);
                            bundleState.setStatus(TemplateStatusEnumType.DOWNLOAD);

                            ovfids.add(bundleState);
                        }
                    } // includeBundles

                }
            } // its an Ovf
              // else if (file.isFile() && file.getName().endsWith(OVF_FILE_EXTENSION) &&
              // file.getName().contains(OVF_BUNDLE_PATH_IDENTIFIER))
              // { logger.debug("deleting [{}]", file.getName());
              // file.delete();
              // }

        } // all files in currentFile

        return ovfids;
    }

}