/*
* 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.guvnor.m2repo.backend.server.helpers;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.apache.maven.project.ProjectBuildingException;
import org.drools.compiler.kproject.ReleaseIdImpl;
import org.drools.compiler.kproject.xml.PomModel;
import org.guvnor.m2repo.backend.server.GuvnorM2Repository;
import org.kie.api.builder.ReleaseId;
import org.kie.scanner.embedder.MavenEmbedderException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PomModelResolver {
private static final Logger log = LoggerFactory.getLogger( PomModelResolver.class );
/**
* Construct a PomModel from a JAR by parsing first the pom.xml file within the JAR
* and if not present a pom.properties file in the JAR.
* @param jarStream InputStream to the JAR
* @return a populated PomModel or null if neither pom.xml or pom.properties existed in the JAR
*/
public static PomModel resolveFromJar( InputStream jarStream ) {
//Attempt to load JAR's POM information from it's pom.xml file
PomModel pomModel = null;
try {
String pomXML = GuvnorM2Repository.loadPomFromJar( jarStream );
if ( pomXML != null ) {
pomModel = PomModel.Parser.parse( "pom.xml",
new ByteArrayInputStream( pomXML.getBytes() ) );
}
} catch ( Exception e ) {
log.info( "Failed to parse pom.xml for GAV information. Falling back to pom.properties.",
e );
}
//Attempt to load JAR's POM information from it's pom.properties file
if ( pomModel == null ) {
try {
jarStream.reset();
String pomProperties = GuvnorM2Repository.loadPomPropertiesFromJar( jarStream );
if ( pomProperties != null ) {
final ReleaseId releaseId = ReleaseIdImpl.fromPropertiesString( pomProperties );
pomModel = new PomModel.InternalModel();
( (PomModel.InternalModel) pomModel ).setReleaseId( releaseId );
}
} catch ( Exception e ) {
log.info( "Failed to parse pom.properties for GAV information." );
}
}
return pomModel;
}
/**
* Construct a PomModel from a pom.xml file
* @param pomStream InputStream to the pom.xml file
* @return a populated PomModel or throws exception if the file could not be parsed or deployed
*/
public static PomModel resolveFromPom( InputStream pomStream ) throws Exception {
try {
return PomModel.Parser.parse( "pom.xml", pomStream );
} catch ( final Exception e ) {
if( e.getCause() != null ) {
if( e.getCause() instanceof ProjectBuildingException ) {
throw (ProjectBuildingException) e.getCause();
}
if( e.getCause() instanceof MavenEmbedderException ) {
throw (MavenEmbedderException) e.getCause();
}
}
log.info( "Failed to process pom.xml for GAV information.", e );
throw e;
}
}
}