fr.norad.visuwall.core.business.process.WallProcess.java Source code

Java tutorial

Introduction

Here is the source code for fr.norad.visuwall.core.business.process.WallProcess.java

Source

/**
 *
 *     Copyright (C) norad.fr
 *
 *     Licensed 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 fr.norad.visuwall.core.business.process;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ScheduledFuture;
import fr.norad.visuwall.api.domain.SoftwareProjectId;
import fr.norad.visuwall.api.exception.ProjectNotFoundException;
import fr.norad.visuwall.api.plugin.capability.BasicCapability;
import fr.norad.visuwall.api.plugin.capability.BuildCapability;
import fr.norad.visuwall.core.business.domain.Project;
import fr.norad.visuwall.core.business.service.PluginServiceInterface;
import fr.norad.visuwall.core.business.service.ProjectService;
import fr.norad.visuwall.core.business.service.SoftwareAccessService;
import fr.norad.visuwall.core.persistence.entity.SoftwareAccess;
import fr.norad.visuwall.core.persistence.entity.Wall;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.stereotype.Component;

@Component
public class WallProcess {

    private static final Logger LOG = LoggerFactory.getLogger(WallProcess.class);

    @Autowired
    TaskScheduler taskScheduler;

    @Autowired
    ProjectService projectService;

    @Autowired
    PluginServiceInterface pluginService;

    @Autowired
    SoftwareAccessService softwareAccessService;

    // /////////////////////////////////////////////////////////////

    public void rebuildFullWallInformations(final Wall wall) {
        taskScheduler.schedule(new Runnable() {
            @Override
            public void run() {
                // TODO prevent wall hiding (exception causing wall not added to wall list) if software not found
                rebuildConnectionPluginsInSoftwareAccess(wall);
                for (SoftwareAccess softwareAccess : wall.getSoftwareAccesses()) {
                    if (softwareAccess.getConnection() instanceof BuildCapability) {
                        Runnable task = getDiscoverBuildProjectsRunner(wall, softwareAccess);
                        task.run();
                        // TODO skip first immediate schedule run as called by hand upper
                        @SuppressWarnings("unchecked")
                        ScheduledFuture<Object> futur = taskScheduler.scheduleWithFixedDelay(task,
                                softwareAccess.getProjectFinderDelaySecond() * 1000);
                        softwareAccess.setProjectFinderTask(futur);
                    }
                }

                // here as task war run ones without schedule, projects exists, we need that for first run
                // to add other software without waiting for the second project discover
                for (SoftwareAccess softwareAccess : wall.getSoftwareAccesses()) {
                    if (!(softwareAccess.getConnection() instanceof BuildCapability)) {
                        Runnable task = getDiscoverOtherProjectsRunner(wall, softwareAccess);
                        task.run();
                        // TODO skip first immediate schedule run as called by hand upper
                        @SuppressWarnings("unchecked")
                        ScheduledFuture<Object> futur = taskScheduler.scheduleWithFixedDelay(task,
                                softwareAccess.getProjectFinderDelaySecond() * 1000);
                        softwareAccess.setProjectFinderTask(futur);
                    }
                }

            }
        }, new Date());
    }

    private void rebuildConnectionPluginsInSoftwareAccess(Wall wall) {
        for (SoftwareAccess softwareAccess : wall.getSoftwareAccesses()) {
            try {
                Map<String, String> properties = new HashMap<String, String>(softwareAccess.getProperties());
                //TODO 
                if (softwareAccess.getLogin() != null) {
                    properties.put("login", softwareAccess.getLogin());
                }
                if (softwareAccess.getPassword() != null) {
                    properties.put("password", softwareAccess.getPassword());
                }
                BasicCapability connection = pluginService.getPluginConnectionFromUrl(softwareAccess.getUrl(),
                        properties);
                softwareAccess.setConnection(connection);
            } catch (Throwable e) {
                LOG.warn("Plugin throw an exception", e);
            }
        }
    }

    private Runnable getDiscoverBuildProjectsRunner(final Wall wall, final SoftwareAccess softwareAccess) {
        if (!(softwareAccess.getConnection() instanceof BuildCapability)) {
            throw new RuntimeException("Software should be a build one " + softwareAccess);
        }
        return new Runnable() {
            @Override
            public void run() {
                LOG.debug("Running Project Discover task for " + softwareAccess + " in wall " + wall);
                Set<SoftwareProjectId> projectIds = softwareAccessService.discoverBuildProjects(softwareAccess);
                List<SoftwareProjectId> wallBuildProjectIds = wall.getProjects().getBuildProjectIds();
                for (SoftwareProjectId projectId : projectIds) {
                    if (wallBuildProjectIds.contains(projectId)) {
                        continue;
                    }
                    Runnable projectCreationRunner = WallProcess.this.projectService.getProjectCreationRunner(wall,
                            softwareAccess, projectId);
                    projectCreationRunner.run();
                    // taskScheduler.schedule(projectCreationRunner, new Date());
                }
            }
        };
    }

    private Runnable getDiscoverOtherProjectsRunner(final Wall wall, final SoftwareAccess softwareAccess) {
        if (softwareAccess.getConnection() instanceof BuildCapability) {
            throw new RuntimeException("Software should not be a build one " + softwareAccess);
        }
        return new Runnable() {
            @Override
            public void run() {
                for (Project project : wall.getProjects()) {
                    try {
                        SoftwareProjectId softwareProjectId = softwareAccess.getConnection()
                                .identify(project.getProjectKey());
                        project.getCapabilities().put(softwareProjectId, softwareAccess.getConnection());
                    } catch (ProjectNotFoundException e) {
                        LOG.debug("ProjectKey {} not found in software {}", project.getProjectKey(),
                                softwareAccess);
                    }
                }
            }
        };
    }
}