//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package com.acme;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;

@SuppressWarnings("serial")
public class DateTag extends BodyTagSupport
{
    Tag parent;
    BodyContent body;
    String tz="GMT";

    public void setParent(Tag parent) {this.parent=parent;}
    public Tag getParent() {return parent;}
    public void setBodyContent(BodyContent content) {body=content;}
    public void setPageContext(PageContext pageContext) {}

    public void setTz(String value) {tz=value;}

    public int doStartTag() throws JspException {return EVAL_BODY_BUFFERED;}

    public int doEndTag() throws JspException {return EVAL_PAGE;}

    public void doInitBody() throws JspException {}

    public int doAfterBody() throws JspException {
        try
        {
            SimpleDateFormat format = new SimpleDateFormat(body.getString());
            format.setTimeZone(TimeZone.getTimeZone(tz));
            body.getEnclosingWriter().write(format.format(new Date()));
            return SKIP_BODY;
        }
        catch (Exception ex) {
            ex.printStackTrace();
            throw new JspTagException(ex.toString());
        }
    }

    public void release()
    {
        body=null;
    }
}

