/* * 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.common.services.project.backend.server; import java.io.IOException; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.inject.Named; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.guvnor.common.services.backend.exceptions.ExceptionUtilities; import org.guvnor.common.services.backend.util.CommentedOptionFactory; import org.guvnor.common.services.project.backend.server.utils.POMContentHandler; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.project.model.Repository; import org.guvnor.common.services.project.service.POMService; import org.guvnor.common.services.shared.metadata.MetadataService; import org.guvnor.common.services.shared.metadata.model.Metadata; import org.guvnor.m2repo.service.M2RepoService; import org.jboss.errai.bus.server.annotations.Service; import org.uberfire.backend.server.util.Paths; import org.uberfire.backend.vfs.Path; import org.uberfire.io.IOService; import org.uberfire.java.nio.file.FileAlreadyExistsException; import org.uberfire.java.nio.file.FileSystem; @Service @ApplicationScoped public class POMServiceImpl implements POMService { private IOService ioService; private POMContentHandler pomContentHandler; private M2RepoService m2RepoService; private MetadataService metadataService; @Inject private CommentedOptionFactory optionsFactory; public POMServiceImpl() { // For Weld } @Inject public POMServiceImpl( final @Named("ioStrategy") IOService ioService, final POMContentHandler pomContentHandler, final M2RepoService m2RepoService, final MetadataService metadataService ) { this.ioService = ioService; this.pomContentHandler = pomContentHandler; this.m2RepoService = m2RepoService; this.metadataService = metadataService; } @Override public Path create( final Path projectRoot, final String repositoryWebBaseURL, final POM pomModel ) { org.uberfire.java.nio.file.Path pathToPOMXML = null; try { pomModel.addRepository( getRepository( repositoryWebBaseURL ) ); final org.uberfire.java.nio.file.Path nioRoot = Paths.convert( projectRoot ); pathToPOMXML = nioRoot.resolve( "pom.xml" ); if ( ioService.exists( pathToPOMXML ) ) { throw new FileAlreadyExistsException( pathToPOMXML.toString() ); } ioService.write( pathToPOMXML, pomContentHandler.toString( pomModel ) ); //Don't raise a NewResourceAdded event as this is handled at the Project level in ProjectServices return Paths.convert( pathToPOMXML ); } catch ( Exception e ) { throw ExceptionUtilities.handleException( e ); } } private Repository getRepository( final String baseURL ) { final Repository repository = new Repository(); repository.setId( "guvnor-m2-repo" ); repository.setName( "Guvnor M2 Repo" ); repository.setUrl( m2RepoService.getRepositoryURL( baseURL ) ); return repository; } @Override public POM load( final Path path ) { try { return pomContentHandler.toModel( loadPomXMLString( path ) ); } catch ( Exception e ) { throw ExceptionUtilities.handleException( e ); } } private String loadPomXMLString( final Path path ) { final org.uberfire.java.nio.file.Path nioPath = Paths.convert( path ); return ioService.readAllString( nioPath ); } @Override public Path save( final Path path, final POM content, final Metadata metadata, final String comment ) { try { return save( path, content, metadata ); } catch ( Exception e ) { throw ExceptionUtilities.handleException( e ); } } @Override public Path save( final Path path, final POM content, final Metadata metadata, final String comment, final boolean updateModules ) { try { ioService.startBatch( new FileSystem[]{Paths.convert( path ).getFileSystem()}, optionsFactory.makeCommentedOption( comment != null ? comment : "" ) ); save( path, content, metadata ); saveSubModules( path, content, updateModules ); return path; } catch ( Exception e ) { throw ExceptionUtilities.handleException( e ); } finally { ioService.endBatch(); } } private void saveSubModules( final Path path, final POM content, final boolean updateModules ) throws IOException, XmlPullParserException { if ( updateModules && content.isMultiModule() && content.getModules() != null ) { for (String module : content.getModules()) { org.uberfire.java.nio.file.Path childPath = Paths.convert( path ).getParent().resolve( module ).resolve( "pom.xml" ); if ( ioService.exists( childPath ) ) { POM child = load( Paths.convert( childPath ) ); if ( child != null ) { child.setParent( content.getGav() ); child.getGav().setGroupId( content.getGav().getGroupId() ); child.getGav().setVersion( content.getGav().getVersion() ); save( Paths.convert( childPath ), child ); } } } } } private Path save( final Path path, final POM content, final Metadata metadata ) throws IOException, XmlPullParserException { if ( metadata == null ) { save( path, content ); } else { ioService.write( Paths.convert( path ), pomContentHandler.toString( content, loadPomXMLString( path ) ), metadataService.setUpAttributes( path, metadata ) ); } return path; } private void save( final Path path, final POM content ) throws IOException, XmlPullParserException { ioService.write( Paths.convert( path ), pomContentHandler.toString( content, loadPomXMLString( path ) ) ); } }