/*
 * 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.ranger.entity;

/**
 * Base JPA class with id, versionNumber and other common attributes
 *
 */

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;

import org.apache.ranger.common.AppConstants;
import org.apache.ranger.common.DateUtil;


@MappedSuperclass @EntityListeners( org.apache.ranger.common.db.JPABeanCallbacks.class)
@XmlRootElement
public abstract class XXDBBase implements java.io.Serializable {
	private static final long serialVersionUID = 1L;



	/**
	 * Id for the object
	 * <ul>
	 * <li>This attribute is the <b>Primary Key</b> for this class<br>.
	 * </ul>
	 *
	 */

	/**
	 * Date/Time creation of this user.
	 * <ul>
	 * </ul>
	 *
	 */
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="CREATE_TIME"   )
	protected Date createTime = DateUtil.getUTCDate();

	/**
	 * Date value.
	 * <ul>
	 * </ul>
	 *
	 */
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="UPDATE_TIME"   )
	protected Date updateTime = DateUtil.getUTCDate();

	/**
	 * Added by
	 * <ul>
	 * </ul>
	 *
	 */
	@Column(name="ADDED_BY_ID"   )
	protected Long addedByUserId;


	/**
	 * Last updated by
	 * <ul>
	 * </ul>
	 *
	 */
	@Column(name="UPD_BY_ID"   )
	protected Long updatedByUserId;


	/**
	 * Default constructor. This will set all the attributes to default value.
	 */
	public XXDBBase ( ) {
	}

	public int getMyClassType( ) {
	    return AppConstants.CLASS_TYPE_NONE;
	}

	public String getMyDisplayValue() {
		return null;
	}

	/**
	 * This method sets the value to the member attribute <b>id</b>.
	 * You cannot set null to the attribute.
	 * @param id Value to set member attribute <b>id</b>
	 */
	public abstract void setId( Long id );

	/**
	 * Returns the value for the member attribute <b>id</b>
	 * @return Long - value of member attribute <b>id</b>.
	 */
	public abstract Long getId( );

	/**
	 * This method sets the value to the member attribute <b>createTime</b>.
	 * You cannot set null to the attribute.
	 * @param createTime Value to set member attribute <b>createTime</b>
	 */
	public void setCreateTime( Date createTime ) {
		this.createTime = createTime;
	}

	/**
	 * Returns the value for the member attribute <b>createTime</b>
	 * @return Date - value of member attribute <b>createTime</b>.
	 */
	public Date getCreateTime( ) {
		return this.createTime;
	}

	/**
	 * This method sets the value to the member attribute <b>updateTime</b>.
	 * You cannot set null to the attribute.
	 * @param updateTime Value to set member attribute <b>updateTime</b>
	 */
	public void setUpdateTime( Date updateTime ) {
		this.updateTime = updateTime;
	}

	/**
	 * Returns the value for the member attribute <b>updateTime</b>
	 * @return Date - value of member attribute <b>updateTime</b>.
	 */
	public Date getUpdateTime( ) {
		return this.updateTime;
	}

	/**
	 * This method sets the value to the member attribute <b>addedByUserId</b>.
	 * You cannot set null to the attribute.
	 * @param addedByUserId Value to set member attribute <b>addedByUserId</b>
	 */
	public void setAddedByUserId( Long addedByUserId ) {
		this.addedByUserId = addedByUserId;
	}

	/**
	 * Returns the value for the member attribute <b>addedByUserId</b>
	 * @return Long - value of member attribute <b>addedByUserId</b>.
	 */
	public Long getAddedByUserId( ) {
		return this.addedByUserId;
	}


	/**
	 * This method sets the value to the member attribute <b>updatedByUserId</b>.
	 * You cannot set null to the attribute.
	 * @param updatedByUserId Value to set member attribute <b>updatedByUserId</b>
	 */
	public void setUpdatedByUserId( Long updatedByUserId ) {
		this.updatedByUserId = updatedByUserId;
	}

	/**
	 * Returns the value for the member attribute <b>updatedByUserId</b>
	 * @return Long - value of member attribute <b>updatedByUserId</b>.
	 */
	public Long getUpdatedByUserId( ) {
		return this.updatedByUserId;
	}


	/**
	 * This return the bean content in string format
	 * @return formatedStr
	*/
	@Override
	public String toString( ) {
		String str = "XXDBBase={";
		//`str += "id={" + id + "} ";
		str += "createTime={" + createTime + "} ";
		str += "updateTime={" + updateTime + "} ";
		str += "addedByUserId={" + addedByUserId + "} ";
		str += "updatedByUserId={" + updatedByUserId + "} ";
		str += "}";
		return str;
	}

	/**
	 * Checks for all attributes except referenced db objects
	 * @return true if all attributes match
	*/
	@Override
	public boolean equals( Object obj) {
		XXDBBase other = (XXDBBase) obj;
//        	if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
//            		return false;
//        	}
        	if ((this.createTime == null && other.createTime != null) || (this.createTime != null && !this.createTime.equals(other.createTime))) {
            		return false;
        	}
        	if ((this.updateTime == null && other.updateTime != null) || (this.updateTime != null && !this.updateTime.equals(other.updateTime))) {
            		return false;
        	}
        	if ((this.addedByUserId == null && other.addedByUserId != null) || (this.addedByUserId != null && !this.addedByUserId.equals(other.addedByUserId))) {
            		return false;
        	}
        	if ((this.updatedByUserId == null && other.updatedByUserId != null) || (this.updatedByUserId != null && !this.updatedByUserId.equals(other.updatedByUserId))) {
            		return false;
        	}
		return true;
	}
	public static String getEnumName(String fieldName ) {
		//Later TODO
		//return super.getEnumName(fieldName);
		return null;
	}

	public static boolean equals(Object object1, Object object2) {
        if (object1 == object2) {
            return true;
        }
        if ((object1 == null) || (object2 == null)) {
            return false;
        }
        return object1.equals(object2);
    }

}
