/*
* JBoss, Home of Professional Open Source
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.jboss.shrinkwrap.impl.base.exporter;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.logging.Logger;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ArchivePath;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.Asset;
import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset;
import org.jboss.shrinkwrap.api.exporter.StreamExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.impl.base.TestIOUtil;
import org.jboss.shrinkwrap.impl.base.path.BasicPath;
import org.junit.Assert;
/**
* ExportTestBase
*
* Base support for the exporter test cases
*
* @author <a href="mailto:andrew.rubinger@jboss.org">ALR</a>
* @author <a href="mailto:baileyje@gmail.com">John Bailey</a>
* @version $Revision: $
*/
public abstract class ExportTestBase {
// -------------------------------------------------------------------------------------||
// Class Members ----------------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
/**
* Logger
*/
private static final Logger log = Logger.getLogger(ExportTestBase.class.getName());
/**
* Name of an Archive
*/
protected static final String NAME_ARCHIVE = "testArchive";
/**
* Name of a properties file upon the test CP
*/
protected static final String NAME_TEST_PROPERTIES = "org/jboss/shrinkwrap/impl/base/asset/Test.properties";
/**
* Name of another properties file upon the test CP
*/
protected static final String NAME_TEST_PROPERTIES_2 = "org/jboss/shrinkwrap/impl/base/asset/Test2.properties";
/**
* Path of for nested content
*/
protected static final ArchivePath NESTED_PATH = new BasicPath("nested");
/**
* Name of a nested archive
*/
protected static final String NAME_NESTED_ARCHIVE = "nestedArchive";
/**
* Name of another nested archive
*/
protected static final String NAME_NESTED_ARCHIVE_2 = "nestedArchive2";
/**
* Asset used for testing
*/
protected static final Asset ASSET_ONE = new ClassLoaderAsset(NAME_TEST_PROPERTIES);
/**
* Path used for testing
*/
protected static final ArchivePath PATH_ONE = new BasicPath("Test.properties");
/**
* Another asset used for testing
*/
protected static final Asset ASSET_TWO = new ClassLoaderAsset(NAME_TEST_PROPERTIES_2);
/**
* Another path used for testing
*/
protected static final ArchivePath PATH_TWO = new BasicPath(NESTED_PATH, "Test2.properties");
/**
* Path to a nested empty directory
*/
protected static final ArchivePath PATH_EMPTY_NESTED_DIR = ArchivePaths.create("/empty");
/**
* Path to an empty directory, a child of the nested
*/
protected static final ArchivePath PATH_EMPTY_TOPLEVEL_DIR = ArchivePaths.create("/empty/directory");
// -------------------------------------------------------------------------------------||
// Functional Methods -----------------------------------------------------------------||
// -------------------------------------------------------------------------------------||
/**
* Returns a temp directory for a test. Needs the test
*/
protected File createTempDirectory(String testName) throws IOException {
// Qualify the temp directory by test case
File tempDirectoryParent = new File(this.getTarget(), this.getClass().getSimpleName());
// Qualify the temp directory by test name
File tempDirectory = new File(tempDirectoryParent, testName);
log.info("Temp Directory: " + tempDirectory.getCanonicalPath());
if (tempDirectory.exists()) {
TestIOUtil.deleteDirectory(tempDirectory);
}
Assert.assertTrue("Temp directory should be clear before start", !tempDirectory.exists());
final boolean created = tempDirectory.mkdirs();
Assert.assertEquals("Could not create temp directory for tests: " + tempDirectory.getAbsolutePath(), true,
created);
return tempDirectory;
}
/**
* Returns the target directory
*/
protected File getTarget() {
try {
return new File(
new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).getParent());
} catch (final URISyntaxException urise) {
throw new RuntimeException("Could not obtain the target URI", urise);
}
}
/**
* Create an archive instance and add some assets
*/
protected Archive<?> createArchiveWithAssets() {
// Create an archive
Archive<?> archive = ShrinkWrap.create(JavaArchive.class, NAME_ARCHIVE + getArchiveExtension());
// Add some content
addContent(archive);
// Return archive
return archive;
}
/**
* Obtains the extension for created archives
*
* @return
*/
protected abstract String getArchiveExtension();
/**
* Returns the exporter type
*
* @return
*/
protected abstract Class<? extends StreamExporter> getExporterClass();
/**
* Create an archive instance and add some assets and some nested archives
*/
protected Archive<?> createArchiveWithNestedArchives() {
// Create an archive
Archive<?> archive = createArchiveWithAssets();
// Create a nested archive
Archive<?> nestedArchive = ShrinkWrap.create(JavaArchive.class, NAME_NESTED_ARCHIVE + getArchiveExtension());
// Add some content
addContent(nestedArchive);
// Add nested archive
archive.add(nestedArchive, ArchivePaths.root(), this.getExporterClass());
// Add an archive nested in a directory
Archive<?> nestedArchiveTwo = ShrinkWrap.create(JavaArchive.class, NAME_NESTED_ARCHIVE_2
+ getArchiveExtension());
// Add some content
addContent(nestedArchiveTwo);
// Add the archive under a nested path
archive.add(nestedArchiveTwo, NESTED_PATH, this.getExporterClass());
// Add empty directories
archive.addAsDirectory(PATH_EMPTY_NESTED_DIR);
archive.addAsDirectory(PATH_EMPTY_TOPLEVEL_DIR);
// Return archive
return archive;
}
/**
* Add basic contents to the archive
*
* @param archive
*/
protected void addContent(Archive<?> archive) {
archive.add(ASSET_ONE, PATH_ONE);
archive.add(ASSET_TWO, PATH_TWO);
}
}