/* * Copyright 2015 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. * * 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.kie.workbench.common.services.backend.dependencies; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.enterprise.context.ApplicationScoped; import org.eclipse.aether.artifact.Artifact; import org.guvnor.common.services.backend.exceptions.ExceptionUtilities; import org.guvnor.common.services.project.model.Dependency; import org.guvnor.common.services.project.model.GAV; import org.guvnor.common.services.project.model.Repository; import org.jboss.errai.bus.server.annotations.Service; import org.kie.scanner.MavenRepository; import org.kie.workbench.common.services.shared.dependencies.DependencyService; import org.kie.workbench.common.services.shared.dependencies.EnhancedDependencies; import org.kie.workbench.common.services.shared.dependencies.NormalEnhancedDependency; import org.kie.workbench.common.services.shared.dependencies.TransitiveEnhancedDependency; import static org.kie.workbench.common.services.backend.dependencies.DependencyTestUtils.*; @Service @ApplicationScoped public class DependencyServiceImpl implements DependencyService { public DependencyServiceImpl() { } @Override public Collection<Dependency> loadDependencies( final Collection<GAV> gavs ) { final ArrayList<Dependency> dependencies = new ArrayList<Dependency>(); for ( final GAV gav : gavs ) { dependencies.addAll( loadDependencies( gav ) ); } return dependencies; } @Override public Collection<Dependency> loadDependencies( final GAV gav ) { return toDependencies( getMavenRepository().getArtifactDependecies( gav.toString() ) ); } @Override public Set<String> loadPackageNames( final GAV gav ) { final Artifact artifact = getMavenRepository().resolveArtifact( gav.toString() ); if ( artifact != null ) { return stripPackageNamesFromJar( artifact.getFile() ); } else { return new HashSet<>(); } } @Override public EnhancedDependencies loadEnhancedDependencies( final Collection<Dependency> dependencies) { EnhancedDependencies result = new EnhancedDependencies(); for ( final Dependency dependency : dependencies ) { result.add( getEnhancedDependency( dependency ) ); } return result; } private NormalEnhancedDependency getEnhancedDependency( final Dependency dependency ) { final NormalEnhancedDependency enhancedDependency = new NormalEnhancedDependency( dependency, loadPackageNames( dependency ) ); for ( Dependency transitiveDependency : loadDependencies( dependency ) ) { enhancedDependency.addTransitiveDependency( new TransitiveEnhancedDependency( transitiveDependency, loadPackageNames( transitiveDependency ) ) ); } return enhancedDependency; } private Set<String> stripPackageNamesFromJar( final File file ) { final Set<String> packageNames = new HashSet<String>(); ZipFile zipFile = null; try { zipFile = new ZipFile( file ); final Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { String pathName = entries.nextElement().getName(); if ( pathName.endsWith( ".class" ) ) { String fqcn = pathName.replace( '/', '.' ).substring( 0, pathName.lastIndexOf( '.' ) ); packageNames.add( fqcn.substring( 0, fqcn.lastIndexOf( '.' ) ) ); } } } catch (IOException e) { throw ExceptionUtilities.handleException( e ); } finally { if ( zipFile != null ) { try { zipFile.close(); } catch (IOException e) { throw ExceptionUtilities.handleException( e ); } } } return packageNames; } protected MavenRepository getMavenRepository() { return MavenRepository.getMavenRepository(); } }