/* * 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.tools.ant.taskdefs; import java.io.File; import java.io.IOException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.ZipFileSet; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.zip.ZipOutputStream; /** * Creates a EAR archive. Based on WAR task * * @since Ant 1.4 * * @ant.task category="packaging" */ public class Ear extends Jar { private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); private File deploymentDescriptor; private boolean descriptorAdded; private static final String XML_DESCRIPTOR_PATH = "META-INF/application.xml"; /** * Create an Ear task. */ public Ear() { super(); archiveType = "ear"; emptyBehavior = "create"; } /** * Set the destination file. * @param earFile the destination file * @deprecated since 1.5.x. * Use setDestFile(destfile) instead. */ @Deprecated public void setEarfile(File earFile) { setDestFile(earFile); } /** * File to incorporate as application.xml. * @param descr the descriptor file */ public void setAppxml(File descr) { deploymentDescriptor = descr; if (!deploymentDescriptor.exists()) { throw new BuildException( "Deployment descriptor: %s does not exist.", deploymentDescriptor); } // Create a ZipFileSet for this file, and pass it up. ZipFileSet fs = new ZipFileSet(); fs.setFile(deploymentDescriptor); fs.setFullpath(XML_DESCRIPTOR_PATH); super.addFileset(fs); } /** * Adds zipfileset. * * @param fs zipfileset to add */ public void addArchives(ZipFileSet fs) { // We just set the prefix for this fileset, and pass it up. // Do we need to do this? LH fs.setPrefix("/"); super.addFileset(fs); } /** * Initialize the output stream. * @param zOut the zip output stream. * @throws IOException on I/O errors * @throws BuildException on other errors */ @Override protected void initZipOutputStream(ZipOutputStream zOut) throws IOException, BuildException { // If no webxml file is specified, it's an error. if (deploymentDescriptor == null && !isInUpdateMode()) { throw new BuildException("appxml attribute is required", getLocation()); } super.initZipOutputStream(zOut); } /** * Overridden from Zip class to deal with application.xml * @param file the file to add to the archive * @param zOut the stream to write to * @param vPath the name this entry shall have in the archive * @param mode the Unix permissions to set. * @throws IOException on error */ @Override protected void zipFile(File file, ZipOutputStream zOut, String vPath, int mode) throws IOException { // If the file being added is META-INF/application.xml, we // warn if it's not the one specified in the "appxml" // attribute - or if it's being added twice, meaning the same // file is specified by the "appxml" attribute and in a // <fileset> element. if (XML_DESCRIPTOR_PATH.equalsIgnoreCase(vPath)) { if (deploymentDescriptor == null || !FILE_UTILS.fileNameEquals(deploymentDescriptor, file) || descriptorAdded) { logWhenWriting("Warning: selected " + archiveType + " files include a " + XML_DESCRIPTOR_PATH + " which will" + " be ignored (please use appxml attribute to " + archiveType + " task)", Project.MSG_WARN); } else { super.zipFile(file, zOut, vPath, mode); descriptorAdded = true; } } else { super.zipFile(file, zOut, vPath, mode); } } /** * Make sure we don't think we already have a application.xml next * time this task gets executed. */ @Override protected void cleanUp() { descriptorAdded = false; super.cleanUp(); } }