blob: b4e958c7c3534ffd3f8e5d2d176ec41c908189ca [file] [log] [blame]
package org.apache.myfaces.tobago.maven.plugin;
/*
* 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.
*/
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.manager.ArchiverManager;
import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
import org.codehaus.plexus.util.FileUtils;
import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
/**
*
* @version $Id$
* @goal resources
* @phase process-resources
* @requiresDependencyResolution compile
*/
public class UnPackThemeMojo extends AbstractThemeMojo {
/**
* To look up Archiver/UnArchiver implementations
*
* @parameter expression="${component.org.codehaus.plexus.archiver.manager.ArchiverManager}"
* @required
*/
private ArchiverManager archiverManager;
/**
* Directory to unpack JARs into if needed
*
* @parameter expression="${project.build.directory}/theme/work"
* @required
*/
private File workDirectory;
/**
* The directory where the webapp is built.
*
* @parameter expression="${project.build.directory}/${project.build.finalName}"
* @required
*/
private File webappDirectory;
/**
* @parameter expression="${plugin.artifacts}"
* @required
*/
private List pluginArtifacts;
private boolean findThemeDescriptor(File jarFile) throws MojoExecutionException {
ZipInputStream zip = null;
try {
zip = new ZipInputStream(new FileInputStream(jarFile));
while (zip.available() > 0) {
ZipEntry nextEntry = zip.getNextEntry();
if (nextEntry == null || nextEntry.isDirectory()) {
continue;
}
String name = nextEntry.getName();
if (name.equals("META-INF/tobago-theme.xml")) {
return true;
}
}
} catch (IOException e) {
throw new MojoExecutionException("Error find ThemeDescriptor in " + jarFile, e);
} finally {
if (zip != null) {
try {
zip.close();
} catch (IOException e) {
// ignore
}
}
}
return false;
}
public void execute() throws MojoExecutionException {
Iterator artifacts = getProject().getDependencyArtifacts().iterator();
while (artifacts.hasNext()) {
if (!workDirectory.exists()) {
workDirectory.mkdirs();
}
Artifact artifact = (Artifact) artifacts.next();
getLog().debug("Expanding theme "+ artifact);
File file = artifact.getFile();
if (Artifact.SCOPE_COMPILE.equals(artifact.getScope()) && file.isFile()
&& "jar".equals(artifact.getType()) && findThemeDescriptor(file)) {
String name = file.getName();
getLog().debug("Expanding theme "+ name);
File tempLocation = new File(workDirectory, name.substring(0, name.length() - 4));
boolean process = false;
if (!tempLocation.exists()) {
tempLocation.mkdirs();
process = true;
} else if (artifact.getFile().lastModified() > tempLocation.lastModified()) {
process = true;
}
if (process) {
try {
unpack(file, tempLocation);
String[] fileNames = getThemeFiles(tempLocation);
for (String fileName : fileNames) {
File fromFile = new File(tempLocation, fileName);
File toFile = new File(webappDirectory, fileName);
try {
FileUtils.copyFile(fromFile, toFile);
} catch (IOException e) {
throw new MojoExecutionException("Error copy file: " + fromFile + "to: " + toFile, e);
}
}
} catch (NoSuchArchiverException e) {
getLog().info("Skip unpacking dependency file with unknown extension: " + file.getPath());
}
}
}
}
}
private void unpack(File file, File location)
throws MojoExecutionException, NoSuchArchiverException {
String archiveExt = FileUtils.getExtension(file.getAbsolutePath()).toLowerCase(Locale.ENGLISH);
try {
UnArchiver unArchiver = archiverManager.getUnArchiver(archiveExt);
unArchiver.setSourceFile(file);
unArchiver.setDestDirectory(location);
unArchiver.extract();
} catch (IOException e) {
throw new MojoExecutionException("Error unpacking file: " + file + "to: " + location, e);
} catch (ArchiverException e) {
throw new MojoExecutionException("Error unpacking file: " + file + "to: " + location, e);
}
}
}