com.github.maven_nar.NarLayout20.java Source code

Java tutorial

Introduction

Here is the source code for com.github.maven_nar.NarLayout20.java

Source

/*
 * #%L
 * Native ARchive plugin for Maven
 * %%
 * Copyright (C) 2002 - 2014 NAR Maven Plugin developers.
 * %%
 * 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.
 * #L%
 */
package com.github.maven_nar;

import java.io.File;
import java.io.IOException;

import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
import org.codehaus.plexus.archiver.manager.ArchiverManager;
import org.codehaus.plexus.util.FileUtils;

/**
 * Initial layout which expands a nar file into:
 *
 * <pre>
 * nar/includue
 * nar/bin
 * nar/lib
 * </pre>
 *
 * this layout was abandoned because there is no one-to-one relation between the
 * nar file and its directory structure.
 * Therefore SNAPSHOTS could not be fully deleted when replaced.
 *
 * @author Mark Donszelmann (Mark.Donszelmann@gmail.com)
 */
public class NarLayout20 extends AbstractNarLayout {
    private final NarFileLayout fileLayout;

    public NarLayout20(final Log log) {
        super(log);
        this.fileLayout = new NarFileLayout10();
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.github.maven_nar.NarLayout#attachNars(java.io.File,
     * org.apache.maven.project.MavenProjectHelper,
     * org.apache.maven.project.MavenProject, com.github.maven_nar.NarInfo)
     */
    @Override
    public final void attachNars(final File baseDir, final ArchiverManager archiverManager,
            final MavenProjectHelper projectHelper, final MavenProject project) throws MojoExecutionException {
        if (getIncludeDirectory(baseDir, project.getArtifactId(), project.getVersion()).exists()) {
            attachNar(archiverManager, projectHelper, project, "noarch", baseDir, "include/**");
        }

        final String[] binAOL = new File(baseDir, "bin").list();
        for (int i = 0; binAOL != null && i < binAOL.length; i++) {
            attachNar(archiverManager, projectHelper, project, binAOL[i] + "-" + Library.EXECUTABLE, baseDir,
                    "bin/" + binAOL[i] + "/**");
        }

        final File libDir = new File(baseDir, "lib");
        final String[] libAOL = libDir.list();
        for (int i = 0; libAOL != null && i < libAOL.length; i++) {
            final String bindingType = null;
            final String[] libType = new File(libDir, libAOL[i]).list();
            for (int j = 0; libType != null && j < libType.length; j++) {
                attachNar(archiverManager, projectHelper, project, libAOL[i] + "-" + libType[j], baseDir,
                        "lib/" + libAOL[i] + "/" + libType[j] + "/**");
            }

        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.github.maven_nar.NarLayout#getBinDirectory(java.io.File,
     * java.lang.String)
     */
    @Override
    public final File getBinDirectory(final File baseDir, final String artifactId, final String version,
            final String aol) {
        final File dir = new File(baseDir, this.fileLayout.getBinDirectory(aol));
        return dir;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.github.maven_nar.NarLayout#getIncludeDirectory(java.io.File)
     */
    @Override
    public final File getIncludeDirectory(final File baseDir, final String artifactId, final String version) {
        return new File(baseDir, this.fileLayout.getIncludeDirectory());
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.github.maven_nar.NarLayout#getLibDir(java.io.File,
     * com.github.maven_nar.AOL, String type)
     */
    @Override
    public final File getLibDirectory(final File baseDir, final String artifactId, final String version,
            final String aol, final String type) throws MojoFailureException {
        if (type.equals(Library.EXECUTABLE)) {
            throw new MojoFailureException("INTERNAL ERROR, Replace call to getLibDirectory with getBinDirectory");
        }

        final File dir = new File(baseDir, this.fileLayout.getLibDirectory(aol, type));
        return dir;
    }

    @Override
    public File getNarUnpackDirectory(final File baseUnpackDirectory, final File narFile) {
        final File dir = new File(baseUnpackDirectory,
                FileUtils.basename(narFile.getPath(), "." + NarConstants.NAR_EXTENSION));
        return dir;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.github.maven_nar.NarLayout#getNoArchDirectory(java.io.File)
     */
    @Override
    public File getNoArchDirectory(final File baseDir, final String artifactId, final String version)
            throws MojoExecutionException, MojoFailureException {
        return baseDir;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.github.maven_nar.NarLayout#attachNars(java.io.File,
     * org.apache.maven.project.MavenProjectHelper,
     * org.apache.maven.project.MavenProject, com.github.maven_nar.NarInfo)
     */
    @Override
    public final void prepareNarInfo(final File baseDir, final MavenProject project, final NarInfo narInfo,
            final AbstractNarMojo mojo) throws MojoExecutionException {
        if (getIncludeDirectory(baseDir, project.getArtifactId(), project.getVersion()).exists()) {
            narInfo.setNar(null, "noarch", project.getGroupId() + ":" + project.getArtifactId() + ":"
                    + NarConstants.NAR_TYPE + ":" + "noarch");
        }

        final String[] binAOL = new File(baseDir, "bin").list();
        for (int i = 0; binAOL != null && i < binAOL.length; i++) {// TODO: chose
                                                                   // not to apply
                                                                   // new file
                                                                   // naming for
                                                                   // outfile in
                                                                   // case of
                                                                   // backwards
                                                                   // compatability,
                                                                   // may need to
                                                                   // reconsider
            narInfo.setNar(null, Library.EXECUTABLE, project.getGroupId() + ":" + project.getArtifactId() + ":"
                    + NarConstants.NAR_TYPE + ":" + "${aol}" + "-" + Library.EXECUTABLE);
            narInfo.setBinding(new AOL(binAOL[i]), Library.EXECUTABLE);
            narInfo.setBinding(null, Library.EXECUTABLE);
        }

        final File libDir = new File(baseDir, "lib");
        final String[] libAOL = libDir.list();
        for (int i = 0; libAOL != null && i < libAOL.length; i++) {
            String bindingType = null;
            final String[] libType = new File(libDir, libAOL[i]).list();
            for (int j = 0; libType != null && j < libType.length; j++) {
                narInfo.setNar(null, libType[j], project.getGroupId() + ":" + project.getArtifactId() + ":"
                        + NarConstants.NAR_TYPE + ":" + "${aol}" + "-" + libType[j]);

                // set if not set or override if SHARED
                if (bindingType == null || libType[j].equals(Library.SHARED)) {
                    bindingType = libType[j];
                }
            }

            final AOL aol = new AOL(libAOL[i]);
            if (narInfo.getBinding(aol, null) == null) {
                narInfo.setBinding(aol, bindingType != null ? bindingType : Library.NONE);
            }
            if (narInfo.getBinding(null, null) == null) {
                narInfo.setBinding(null, bindingType != null ? bindingType : Library.NONE);
            }
        }
    }

    @Override
    public void unpackNar(final File unpackDir, final ArchiverManager archiverManager, final File file,
            final String os, final String linkerName, final AOL defaultAOL)
            throws MojoExecutionException, MojoFailureException {
        final File flagFile = new File(unpackDir,
                FileUtils.basename(file.getPath(), "." + NarConstants.NAR_EXTENSION) + ".flag");

        boolean process = false;
        if (!unpackDir.exists()) {
            unpackDir.mkdirs();
            process = true;
        } else if (!flagFile.exists()) {
            process = true;
        } else if (file.lastModified() > flagFile.lastModified()) {
            process = true;
        }

        if (process) {
            try {
                unpackNarAndProcess(archiverManager, file, unpackDir, os, linkerName, defaultAOL);
                FileUtils.fileDelete(flagFile.getPath());
                FileUtils.fileWrite(flagFile.getPath(), "");
            } catch (final IOException e) {
                throw new MojoFailureException("Cannot create flag file: " + flagFile.getPath(), e);
            }
        }
    }
}