/*
 * 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.ode.dao.jpa;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.ode.bpel.dao.MessageDAO;
import org.apache.ode.bpel.dao.MessageExchangeDAO;
import org.apache.ode.utils.DOMUtils;
import org.w3c.dom.Element;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.xml.namespace.QName;

@Entity
@Table(name = "ODE_MESSAGE")
@NamedQueries( { @NamedQuery(name = MessageDAOImpl.DELETE_MESSAGES_BY_PROCESS, query = "delete from MessageDAOImpl as m where m._messageExchange._process = :process") })
public class MessageDAOImpl implements MessageDAO {
    private static Logger __log = LoggerFactory.getLogger(MessageDAOImpl.class);
    public final static String DELETE_MESSAGES_BY_PROCESS = "DELETE_MESSAGES_BY_PROCESS";

    @Id
    @Column(name = "MESSAGE_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @SuppressWarnings("unused")
    private Long _id;
    @Basic
    @Column(name = "TYPE")
    private String _type;
    @Lob
    @Column(name = "DATA")
    private String _data;
    @Lob
    @Column(name = "HEADER")
    private String _header;
    @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
    @Column(name = "MESSAGE_EXCHANGE_ID")
    private MessageExchangeDAOImpl _messageExchange;

    public MessageDAOImpl() {
    }

    public MessageDAOImpl(QName type, MessageExchangeDAOImpl me) {
        _type = (type != null) ? type.toString() : null;
        _messageExchange = me;
    }

    public Element getData() {
        if (__log.isDebugEnabled()) {
            __log.debug("getData " + _id + " " + _data);
        }
        try {
            return _data == null ? null : DOMUtils.stringToDOM(_data);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void setData(Element value) {
        if (value == null) {
            if (__log.isDebugEnabled()) {
                __log.debug("setData " + _id + " null");
            }
            return;
        }
        _data = DOMUtils.domToString(value);

        if (__log.isDebugEnabled()) {
            __log.debug("setData " + _id + " " + _data);
        }
    }

    public Element getHeader() {
        try {
            return _header == null ? null : DOMUtils.stringToDOM(_header);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public void setHeader(Element value) {
        if (value == null)
            return;
        _header = DOMUtils.domToString(value);
    }

    public MessageExchangeDAO getMessageExchange() {
        return _messageExchange;
    }

    public QName getType() {
        return _type == null ? null : QName.valueOf(_type);
    }

    public void setType(QName type) {
        _type = (type != null) ? type.toString() : null;
    }

}
