blob: 197bfe382406427f3e41011faaf5a43dd49a35dd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.directory.server.installers;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.apache.directory.server.InstallationLayout;
import org.apache.directory.server.i18n.I18n;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.tools.ant.taskdefs.Execute;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.InterpolationFilterReader;
/**
* Some helper/utility methods for this plugin.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public final class MojoHelperUtils
{
private MojoHelperUtils()
{
}
public static void copyBinaryFile( GenerateMojo mojo, String fileName, InputStream from, File to )
throws IOException
{
mojo.getLog().info( "Copying " + fileName + " to " + to );
try ( OutputStream out = Files.newOutputStream( to.toPath() ) )
{
IOUtil.copy( from, out );
}
}
public static void copyAsciiFile( GenerateMojo mymojo, Properties filterProperties, String fileName,
InputStream from, File to, boolean filtering ) throws IOException
{
// buffer so it isn't reading a byte at a time!
try ( Reader fileReader = new BufferedReader( new InputStreamReader( from, StandardCharsets.UTF_8 ) );
Writer writer = Files.newBufferedWriter( to.toPath(), StandardCharsets.UTF_8 ) )
{
Reader reader = null;
if ( filtering )
{
// support _${token}
reader = new InterpolationFilterReader( fileReader, filterProperties, "_${", "}" );
// support ${token}
reader = new InterpolationFilterReader( reader, filterProperties, "${", "}" );
// support @token@
reader = new InterpolationFilterReader( reader, filterProperties, "@", "@" );
boolean isPropertiesFile = false;
if ( to.isFile() && to.getName().endsWith( ".properties" ) )
{
isPropertiesFile = true;
}
reader = new InterpolationFilterReader( reader, new ReflectionProperties( mymojo.getProject(),
isPropertiesFile ), "${", "}" );
}
else
{
reader = fileReader;
}
IOUtil.copy( reader, writer );
}
}
public static void copyAsciiFile( GenerateMojo mymojo, Properties filterProperties, File from, File to,
boolean filtering ) throws IOException
{
InputStream input = Files.newInputStream( from.toPath() );
copyAsciiFile( mymojo, filterProperties, from.getAbsolutePath(), input, to, filtering );
}
public static void copyDependencies( GenerateMojo myMojo, InstallationLayout layout,
boolean includeWrapperDependencies )
throws MojoFailureException
{
// Creating the excludes set
Set<String> includes = new HashSet<>();
// Always add the apacheds-service.jar
includes.add( "org.apache.directory.server:apacheds-service" );
// Adding the wrapper dependencies to the excludes set
if ( includeWrapperDependencies )
{
includes.add( "org.apache.directory.server:apacheds-wrapper" );
includes.add( "tanukisoft:wrapper" );
}
// Filtering and copying dependencies
Set<Artifact> artifacts = myMojo.getProject().getArtifacts();
for ( Artifact artifact : artifacts )
{
String key = artifact.getGroupId() + ":" + artifact.getArtifactId();
if ( includes.contains( key ) )
{
try
{
myMojo.getLog().info( "Copying " + artifact.getFile() + " to " + layout.getLibDirectory() );
FileUtils.copyFileToDirectory( artifact.getFile(), layout.getLibDirectory() );
}
catch ( IOException e )
{
throw new MojoFailureException( "Failed to copy dependency artifact " + artifact
+ " into position " + layout.getLibDirectory() );
}
}
}
}
public static void exec( String[] cmd, File workDir, boolean doSudo ) throws MojoFailureException
{
Execute task = new Execute();
task.setCommandline( cmd );
task.setWorkingDirectory( workDir );
if ( doSudo )
{
StringBuilder cmdString = new StringBuilder( " " );
for ( String command : cmd )
{
cmdString.append( command ).append( " " );
}
String[] temp = new String[2];
temp[0] = "sudo";
temp[1] = cmdString.toString();
cmd = temp;
}
StringBuilder cmdString = new StringBuilder( " " );
for ( String command : cmd )
{
cmdString.append( command ).append( " " );
}
try
{
task.execute();
}
catch ( IOException e )
{
throw new MojoFailureException( "Failed while trying to execute '" + cmdString + "': " + e.getMessage() );
}
if ( task.getExitValue() != 0 )
{
throw new MojoFailureException( "Execution of '" + cmdString + "' resulted in a non-zero exit value: "
+ task.getExitValue() );
}
}
/**
* Recursively copy files from the given source to the given destination.
*
* @param src the source
* @param dest the destination
* @throws IOException If an error occurs when copying a file
*/
public static void copyFiles( File src, File dest ) throws IOException
{
if ( src.isDirectory() )
{
File[] files = src.listFiles();
if ( !dest.mkdirs() )
{
throw new IOException( I18n.err( I18n.ERR_112_COULD_NOT_CREATE_DIRECTORY, dest ) );
}
for ( File file : files )
{
copyFiles( file, new File( dest, file.getName() ) );
}
}
else
{
FileUtils.copyFile( src, dest );
}
}
}