/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0, which accompanies this distribution
 * and is available at http://www.eclipse.org/legal/epl-v10.html.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/
package org.eclipse.persistence.tools.dbws;

//javase imports
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

//EclipseLink
import static org.eclipse.persistence.internal.xr.Util.DBWS_OR_XML;
import static org.eclipse.persistence.internal.xr.Util.DBWS_OX_XML;
import static org.eclipse.persistence.internal.xr.Util.DBWS_SCHEMA_XML;
import static org.eclipse.persistence.internal.xr.Util.DBWS_SERVICE_XML;
import static org.eclipse.persistence.internal.xr.Util.DBWS_WSDL;
import static org.eclipse.persistence.internal.xr.Util.META_INF_PATHS;
import static org.eclipse.persistence.internal.xr.Util.WEB_INF_DIR;
import static org.eclipse.persistence.internal.xr.Util.WSDL_DIR;
import static org.eclipse.persistence.tools.dbws.Util.CLASSES;
import static org.eclipse.persistence.tools.dbws.Util.DBWS_PROVIDER_CLASS_FILE;
import static org.eclipse.persistence.tools.dbws.Util.DBWS_PROVIDER_SOURCE_FILE;
import static org.eclipse.persistence.tools.dbws.Util.PROVIDER_LISTENER_CLASS_FILE;
import static org.eclipse.persistence.tools.dbws.Util.PROVIDER_LISTENER_SOURCE_FILE;
import static org.eclipse.persistence.tools.dbws.Util.SWAREF_FILENAME;
import static org.eclipse.persistence.tools.dbws.Util.UNDER_DBWS;
import static org.eclipse.persistence.tools.dbws.Util.WEB_XML_FILENAME;

public class WarArchiver extends JarArchiver {

    static final String DEFAULT_WAR_FILENAME = "dbws.war";

    public WarArchiver() {
    }
    public WarArchiver(DBWSPackager packager) {
        super(packager);
    }

    @Override
    public void setFilename(String jarFilename) {
        if (!(jarFilename.endsWith(".war"))) {
            jarFilename += ".war";
        }
        this.jarFilename = jarFilename;
    }

    @Override
    protected JarEntry getOrJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + META_INF_PATHS[1] + DBWS_OR_XML);
    }

    @Override
    protected JarEntry getOxJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + META_INF_PATHS[1] + DBWS_OX_XML);
    }

    @Override
    protected JarEntry getSchemaJarEntry() {
        return new JarEntry(WEB_INF_DIR + WSDL_DIR + DBWS_SCHEMA_XML);
    }

    @Override
    protected JarEntry getServiceJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + META_INF_PATHS[1] + DBWS_SERVICE_XML);
    }

    @Override
    protected JarEntry getSessionsJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + META_INF_PATHS[1] +
            packager.getSessionsFileName());
    }

    @Override
    protected JarEntry getSWARefJarEntry() {
        return new JarEntry(WEB_INF_DIR + WSDL_DIR + SWAREF_FILENAME);
    }

    @Override
    public String getOrProjectPathPrefix() {
        return META_INF_PATHS[1];
    }

    @Override
    public String getOxProjectPathPrefix() {
        return META_INF_PATHS[1];
    }

    protected ZipEntry getWebXmlJarEntry() {
        return new JarEntry(WEB_INF_DIR + WEB_XML_FILENAME);
    }

    protected ZipEntry getDBWSProviderClassJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + "/" + UNDER_DBWS + "/" + DBWS_PROVIDER_CLASS_FILE);
    }

    protected ZipEntry getDBWSProviderSourceJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + "/" + UNDER_DBWS + "/" + DBWS_PROVIDER_SOURCE_FILE);
    }

    protected ZipEntry getProviderListenerSourceJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + "/" + UNDER_DBWS + "/" + PROVIDER_LISTENER_SOURCE_FILE);
    }

    protected ZipEntry getProviderListenerClassJarEntry() {
        return new JarEntry(WEB_INF_DIR + CLASSES + "/" + UNDER_DBWS + "/" + PROVIDER_LISTENER_CLASS_FILE);
    }

    protected ZipEntry getWSDLJarEntry() {
        return new JarEntry(WEB_INF_DIR + WSDL_DIR + DBWS_WSDL);
    }

    /**
     * Returns a JarEntry based on WEB-INF/ + the given descriptorFileName.
     */
    protected ZipEntry getDeploymentDescriptorJarEntry(String descriptorFileName) {
        return new JarEntry(WEB_INF_DIR + descriptorFileName);
    }
    
    @Override
    protected JarOutputStream buildJarOutputStream() {
        JarOutputStream jarOutputStream = null;
        try {
            if (jarFilename == null || jarFilename.length() == 0) {
                jarFilename = DEFAULT_WAR_FILENAME;
            }
            jarOutputStream = new JarOutputStream(new FileOutputStream(
                new File(packager.getStageDir(), jarFilename)));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jarOutputStream;
    }

    @Override
    protected void addFilesToJarOutputStream(JarOutputStream jarOutputStream) {
        super.addFilesToJarOutputStream(jarOutputStream);

        /* and more ...
         * web.xml
         * DBWSProvider.class
         * DBWSProvider.java
         * eclipselink-dbws.wsdl
         */
        try {
            jarOutputStream.putNextEntry(getWebXmlJarEntry());
            f = new File(packager.getStageDir(), WEB_XML_FILENAME);
            fis = new FileInputStream(f);
            for (int read = 0; read != -1; read = fis.read(buffer)) {
                jarOutputStream.write(buffer, 0, read);
            }
            fis.close();
            f.deleteOnExit();
            
            // Deployment descriptor is optional
            String deploymentDescriptorFileName = packager.getDeploymentDescriptorFileName();
            if (deploymentDescriptorFileName != null) {
                f = new File(packager.getStageDir(), deploymentDescriptorFileName);
                jarOutputStream.putNextEntry(getDeploymentDescriptorJarEntry(deploymentDescriptorFileName));
                fis = new FileInputStream(f);
                for (int read = 0; read != -1; read = fis.read(buffer)) {
                    jarOutputStream.write(buffer, 0, read);
                }
                fis.close();
                f.deleteOnExit();
            }
            
            jarOutputStream.putNextEntry(getDBWSProviderClassJarEntry());
            f = new File(packager.getStageDir(), DBWS_PROVIDER_CLASS_FILE);
            fis = new FileInputStream(f);
            for (int read = 0; read != -1; read = fis.read(buffer)) {
                jarOutputStream.write(buffer, 0, read);
            }
            fis.close();
            f.deleteOnExit();

            // DBWS Provider source is optional
            f = new File(packager.getStageDir(), DBWS_PROVIDER_SOURCE_FILE);
            if (f.length() > 0) {
                jarOutputStream.putNextEntry(getDBWSProviderSourceJarEntry());
                fis = new FileInputStream(f);
                for (int read = 0; read != -1; read = fis.read(buffer)) {
                    jarOutputStream.write(buffer, 0, read);
                }
                fis.close();
            }
            f.deleteOnExit();

            // ProviderListener source is optional
            f = new File(packager.getStageDir(), PROVIDER_LISTENER_SOURCE_FILE);
            if (f.length() > 0) {
                jarOutputStream.putNextEntry(getProviderListenerSourceJarEntry());
                fis = new FileInputStream(f);
                for (int read = 0; read != -1; read = fis.read(buffer)) {
                    jarOutputStream.write(buffer, 0, read);
                }
                fis.close();
            }
            f.deleteOnExit();

            jarOutputStream.putNextEntry(getProviderListenerClassJarEntry());
            f = new File(packager.getStageDir(), PROVIDER_LISTENER_CLASS_FILE);
            fis = new FileInputStream(f);
            for (int read = 0; read != -1; read = fis.read(buffer)) {
                jarOutputStream.write(buffer, 0, read);
            }
            fis.close();
            f.deleteOnExit();

            jarOutputStream.putNextEntry(getWSDLJarEntry());
            f = new File(packager.getStageDir(), DBWS_WSDL);
            fis = new FileInputStream(f);
            for (int read = 0; read != -1; read = fis.read(buffer)) {
                jarOutputStream.write(buffer, 0, read);
            }
            fis.close();
            f.deleteOnExit();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}