/*
* Copyright 2012 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.common.services.project.backend.server.utils;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import javax.enterprise.context.Dependent;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.apache.maven.model.Repository;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.guvnor.common.services.project.model.GAV;
import org.guvnor.common.services.project.model.POM;
@Dependent
public class POMContentHandler {
public POMContentHandler() {
// Weld needs this for proxying.
}
public String toString( final POM pomModel )
throws IOException {
return toString( pomModel,
new Model() );
}
private String toString( final POM pom,
final Model model ) throws IOException {
model.setName(pom.getName());
model.setDescription(pom.getDescription());
model.setArtifactId(pom.getGav().getArtifactId());
model.setModelVersion(pom.getModelVersion());
model.setGroupId( pom.getGav().getGroupId() );
model.setVersion( pom.getGav().getVersion() );
model.setPackaging( pom.getPackaging() );
model.setParent( getParent( pom ) );
model.setBuild( getBuild( pom, model ) );
model.setModules( getModules( pom ) );
model.setRepositories( getRepositories( pom ) );
new DependencyUpdater( model.getDependencies() ).updateDependencies( pom.getDependencies() );
StringWriter stringWriter = new StringWriter();
new MavenXpp3Writer().write( stringWriter, model );
return stringWriter.toString();
}
private Build getBuild( final POM pom,
final Model model ) {
return new BuildContentHandler().update( pom.getBuild(),
model.getBuild() );
}
private ArrayList<Repository> getRepositories( final POM pom ) {
ArrayList<Repository> result = new ArrayList<Repository>();
for (org.guvnor.common.services.project.model.Repository repository : pom.getRepositories()) {
result.add( fromClientModelToPom( repository ) );
}
return result;
}
private ArrayList<String> getModules( final POM pom ) {
ArrayList<String> result = new ArrayList<String>();
if ( pom.getModules() != null ) {
for (String module : pom.getModules()) {
result.add( module );
}
}
return result;
}
private Parent getParent( final POM pom ) {
if ( pom.getParent() == null ) {
return null;
} else {
Parent parent = new Parent();
parent.setGroupId( pom.getParent().getGroupId() );
parent.setArtifactId( pom.getParent().getArtifactId() );
parent.setVersion( pom.getParent().getVersion() );
return parent;
}
}
/**
* @param gavModel The model that is saved
* @param originalPomAsText The original pom in text form, since the guvnor POM model does not cover all the pom.xml features.
* @return pom.xml for saving, The original pom.xml with the fields edited in gavModel replaced.
* @throws IOException
*/
public String toString( final POM gavModel,
final String originalPomAsText ) throws IOException, XmlPullParserException {
return toString( gavModel,
new MavenXpp3Reader().read( new StringReader( originalPomAsText ) ) );
}
private Repository fromClientModelToPom( final org.guvnor.common.services.project.model.Repository from ) {
Repository to = new Repository();
to.setId(from.getId());
to.setName(from.getName());
to.setUrl(from.getUrl());
return to;
}
public POM toModel( final String pomAsString ) throws IOException, XmlPullParserException {
Model model = new MavenXpp3Reader().read(new StringReader(pomAsString));
POM pomModel = new POM(
model.getName(),
model.getDescription(),
new GAV(
(model.getGroupId() == null ? model.getParent().getGroupId() : model.getGroupId()),
(model.getArtifactId() == null ? model.getParent().getArtifactId() : model.getArtifactId()),
(model.getVersion() == null ? model.getParent().getVersion() : model.getVersion())
)
);
pomModel.setPackaging( model.getPackaging() );
if (model.getParent() != null) {
pomModel.setParent( new GAV( model.getParent().getGroupId(), model.getParent().getArtifactId(), model.getParent().getVersion() ) );
}
pomModel.getModules().clear();
for (String module : model.getModules()) {
pomModel.getModules().add( module );
pomModel.setPackaging( "pom" );
}
for (Repository repository : model.getRepositories()) {
pomModel.addRepository( fromPomModelToClientModel( repository ) );
}
pomModel.setDependencies( new DependencyContentHandler().fromPomModelToClientModel( model.getDependencies() ) );
pomModel.setBuild( new BuildContentHandler().fromPomModelToClientModel( model.getBuild() ) );
return pomModel;
}
private org.guvnor.common.services.project.model.Repository fromPomModelToClientModel( final Repository from ) {
org.guvnor.common.services.project.model.Repository to = new org.guvnor.common.services.project.model.Repository();
to.setId(from.getId());
to.setName(from.getName());
to.setUrl(from.getUrl());
return to;
}
}