/*******************************************************************************
 * 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 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Mike Norman - May 26 2008, creating packager for JAX-WS RI
 ******************************************************************************/
 package org.eclipse.persistence.tools.dbws;

// javase imports
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

//EclipseLink imports
import static org.eclipse.persistence.internal.xr.Util.WEB_INF_DIR;
import static org.eclipse.persistence.tools.dbws.DBWSPackager.ArchiveUse.noArchive;
import static org.eclipse.persistence.tools.dbws.Util.WEB_XML_FILENAME;

/**
 * <p>
 * <b>INTERNAL:</b> WebServicePackager extends {@link ProviderPackager}. It is responsible for generating<br>
 * the simplified JSR-109 files to deploy the service.
 * <pre>
 * \--- ${stageDir} root directory
 *    |   ...                   -- files generated by parent class
 *    |   web.xml               -- conform to JSR-154 Servlet 2.5
 * </pre>
 *
 * @author Mike Norman - michael.norman@oracle.com
 * @since EclipseLink 1.x
 */
public class JSR109WebServicePackager extends ProviderPackager {

    public static final String WEB_XML_PREAMBLE =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<web-app\n" +
        "  xmlns=\"http://java.sun.com/xml/ns/javaee\"\n" +
        "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
        "  xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\"\n" +
        "  version=\"2.5\"\n" +
        "  >\n" +
        "  <listener>\n" +
        "    <listener-class>_dbws.ProviderListener</listener-class>\n" +
        "  </listener>\n" +
        "  <servlet>\n" +
        "    <servlet-name>_dbws.DBWSProvider</servlet-name>\n" +
        "    <servlet-class>_dbws.DBWSProvider</servlet-class>\n" +
        "    <load-on-startup>0</load-on-startup>\n" +
        "  </servlet>\n" +
        "  <servlet-mapping>\n" +
        "    <servlet-name>_dbws.DBWSProvider</servlet-name>\n" +
        "    <url-pattern>";
    public static final String WEB_XML_URL_PATTERN =
                               "</url-pattern>\n" +
        "  </servlet-mapping>\n" +
        "</web-app>";

    public JSR109WebServicePackager() {
        this(new WarArchiver(), "wse", noArchive);
    }
    protected JSR109WebServicePackager(Archiver archiver, String packagerLabel, ArchiveUse useJavaArchive) {
        super(archiver, packagerLabel, useJavaArchive);
    }

    @Override
    public Archiver buildDefaultArchiver() {
        return new WarArchiver(this);
    }

    @Override
    public OutputStream getWebXmlStream() throws FileNotFoundException {
        return new FileOutputStream(new File(stageDir, WEB_XML_FILENAME));
    }
    @Override
    public void writeWebXml(OutputStream webXmlStream, DBWSBuilder dbwsBuilder) {
        StringBuilder sb = new StringBuilder(WEB_XML_PREAMBLE);
        sb.append(dbwsBuilder.getContextRoot());
        sb.append(WEB_XML_URL_PATTERN);
        OutputStreamWriter osw = new OutputStreamWriter(new BufferedOutputStream(webXmlStream));
        try {
            osw.write(sb.toString());
            osw.flush();
        }
        catch (IOException e) {/* ignore */}
    }

    @Override
    public String getWSDLPathPrefix() {
        return WEB_INF_DIR + super.getWSDLPathPrefix();
    }
}
