/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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 org.guvnor.asset.management.backend.service; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.inject.Inject; import org.guvnor.asset.management.model.RepositoryStructureModel; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.project.model.Project; import org.guvnor.common.services.project.service.POMService; import org.guvnor.common.services.project.service.ProjectService; import org.guvnor.common.services.shared.metadata.MetadataService; import org.guvnor.structure.repositories.Repository; import org.uberfire.backend.server.util.Paths; import org.uberfire.backend.vfs.Path; import static org.guvnor.structure.repositories.EnvironmentParameters.*; public class RepositoryStructureModelLoader { @Inject private POMService pomService; @Inject private ProjectService<? extends Project> projectService; @Inject private ManagedStatusUpdater managedStatusUpdater; @Inject private MetadataService metadataService; public RepositoryStructureModel load( final Repository repository, final String branch, final boolean includeModules ) { if ( repository == null ) { return null; } final Project project = projectService.resolveToParentProject( repository.getBranchRoot( branch ) ); if ( project != null ) { return getModel( repository, includeModules, project ); } else { return getModel( repository, branch ); } } private RepositoryStructureModel getModel( final Repository repository, final String branch ) { final RepositoryStructureModel model = new RepositoryStructureModel(); //if no parent pom.xml present we must check if there are orphan projects for this repository. final Set<Project> repositoryProjects = projectService.getProjects( repository, branch ); switch ( getManagedStatus( repository ) ) { case MANAGED: model.setManaged( true ); break; case UNMANAGED: model.setManaged( false ); break; case UNKNOWN: if ( repositoryProjects.isEmpty() ) { //there are no projects and the managed attribute is not set, means the repository was never initialized. return null; } else if ( repositoryProjects.size() > 1 ) { //update managed status managedStatusUpdater.updateManagedStatus( repository, false ); } else { break; } } model.setOrphanProjects( new ArrayList<>( repositoryProjects ) ); for ( Project orphanProject : repositoryProjects ) { final POM pom = pomService.load( orphanProject.getPomXMLPath() ); model.getOrphanProjectsPOM().put( orphanProject.getIdentifier(), pom ); } return model; } private RepositoryStructureModel getModel( final Repository repository, final boolean includeModules, final Project project ) { final RepositoryStructureModel model = new RepositoryStructureModel(); switch ( getManagedStatus( repository ) ) { case MANAGED: model.setManaged( true ); break; case UNMANAGED: model.setManaged( false ); break; case UNKNOWN: break; } if ( !model.isManaged() ) { //uncommon case, the repository is managed. Update managed status. managedStatusUpdater.updateManagedStatus( repository, true ); model.setManaged( true ); } model.setPOM( pomService.load( project.getPomXMLPath() ) ); model.setPOMMetaData( metadataService.getMetadata( project.getPomXMLPath() ) ); model.setPathToPOM( project.getPomXMLPath() ); model.setModules( project.getModules() ); if ( includeModules && project.getModules() != null ) { model.setModulesProject( getModuleProjects( project.getRootPath(), project.getModules() ) ); } return model; } private Map<String, Project> getModuleProjects( final Path projectRootPath, final Collection<String> moduleNames ) { final Map<String, Project> result = new HashMap<>(); final org.uberfire.java.nio.file.Path parentPath = Paths.convert( projectRootPath ); for ( final String moduleName : moduleNames ) { result.put( moduleName, projectService.resolveProject( Paths.convert( parentPath.resolve( moduleName ) ) ) ); } return result; } private ManagedStatus getManagedStatus( final Repository repository ) { if ( repository.getEnvironment() != null ) { final Boolean managed = (Boolean) repository.getEnvironment().get( MANAGED ); if ( Boolean.TRUE.equals( managed ) ) { return ManagedStatus.MANAGED; } else { return ManagedStatus.UNMANAGED; } } else { return ManagedStatus.UNKNOWN; } } enum ManagedStatus { MANAGED, UNMANAGED, UNKNOWN } }