/*
 * 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;

/**
 * Resource
 *
 */

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

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


@Entity
@Table(name="x_resource")
@XmlRootElement
public class XXResource extends XXDBBase implements java.io.Serializable {
	private static final long serialVersionUID = 1L;


	@Id
	@SequenceGenerator(name="X_RESOURCE_SEQ",sequenceName="X_RESOURCE_SEQ",allocationSize=1)
	@GeneratedValue(strategy=GenerationType.AUTO,generator="X_RESOURCE_SEQ")
	@Column(name="ID")
	protected Long id;
	@Override
	public void setId(Long id) {
		this.id=id;
	}
	@Override
	public Long getId() {
		return id;
	}
	/**
	 * Name
	 * <ul>
	 * <li>The maximum length for this attribute is <b>4000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_NAME"   , length=4000)
	protected String name;
	
	@Column(name="POLICY_NAME"   , length=500)
	protected String policyName;
	/**
	 * Description
	 * <ul>
	 * <li>The maximum length for this attribute is <b>4000</b>.
	 * </ul>
	 *
	 */
	@Column(name="DESCR"   , length=4000)
	protected String description;

	/**
	 * Status
	 * <ul>
	 * <li>This attribute is of type enum CommonEnums::ResourceType
	 * </ul>
	 *
	 */
	@Column(name="RES_TYPE"  , nullable=false )
	protected int resourceType = AppConstants.RESOURCE_PATH;

	/**
	 * Id of the asset
	 * <ul>
	 * </ul>
	 *
	 */
	@Column(name="ASSET_ID"  , nullable=false )
	protected Long assetId;


	/**
	 * Id of the parent
	 * <ul>
	 * </ul>
	 *
	 */
	@Column(name="PARENT_ID"   )
	protected Long parentId;


	/**
	 * Path for the parent
	 * <ul>
	 * <li>The maximum length for this attribute is <b>4000</b>.
	 * </ul>
	 *
	 */
	@Column(name="PARENT_PATH"   , length=4000)
	protected String parentPath;

	/**
	 * Whether to encrypt this resource
	 * <ul>
	 * <li>This attribute is of type enum CommonEnums::BooleanValue
	 * </ul>
	 *
	 */
	@Column(name="IS_ENCRYPT"  , nullable=false )
	protected int isEncrypt = RangerConstants.BOOL_FALSE;

	/**
	 * Is recursive
	 * <ul>
	 * <li>This attribute is of type enum CommonEnums::BooleanValue
	 * </ul>
	 *
	 */
	@Column(name="IS_RECURSIVE"  , nullable=false )
	protected int isRecursive = RangerConstants.BOOL_NONE;

	/**
	 * Group to which this resource belongs to
	 * <ul>
	 * <li>The maximum length for this attribute is <b>1024</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_GROUP"   , length=1024)
	protected String resourceGroup;

	/**
	 * Databases
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_DBS"   , length=10000)
	protected String databases;

	/**
	 * Tables
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_TABLES"   , length=10000)
	protected String tables;

	/**
	 * Column families
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_COL_FAMS"   , length=10000)
	protected String columnFamilies;

	/**
	 * Columns
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_COLS"   , length=10000)
	protected String columns;

	/**
	 * UDFs
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_UDFS"   , length=10000)
	protected String udfs;

	/**
	 * Resource Status
	 * <ul>
	 * <li>This attribute is of type enum CommonEnums::ActiveStatus
	 * </ul>
	 *
	 */
	@Column(name="RES_STATUS"  , nullable=false )
	protected int resourceStatus = RangerConstants.STATUS_ENABLED;

	/**
	 * Table Type
	 * <ul>
	 * <li>This attribute is of type enum CommonEnums::PolicyType
	 * </ul>
	 *
	 */
	@Column(name="TABLE_TYPE"  , nullable=false )
	protected int tableType = AppConstants.POLICY_INCLUSION;

	/**
	 * Resource Status
	 * <ul>
	 * <li>This attribute is of type enum CommonEnums::PolicyType
	 * </ul>
	 *
	 */
	@Column(name="COL_TYPE"  , nullable=false )
	protected int columnType = AppConstants.POLICY_INCLUSION;
	/**
	 * Topologoies
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_TOPOLOGIES"   , length=10000)
	protected String topologies;
	/**
	 * SERVICENAMES
	 * <ul>
	 * <li>The maximum length for this attribute is <b>10000</b>.
	 * </ul>
	 *
	 */
	@Column(name="RES_SERVICES"   , length=10000)
	protected String services;

	/**
	 * Default constructor. This will set all the attributes to default value.
	 */
	public XXResource ( ) {
		resourceType = AppConstants.RESOURCE_PATH;
		isEncrypt = RangerConstants.BOOL_FALSE;
		isRecursive = RangerConstants.BOOL_NONE;
		resourceStatus = RangerConstants.STATUS_ENABLED;
		tableType = AppConstants.POLICY_INCLUSION;
		columnType = AppConstants.POLICY_INCLUSION;
	}

	@Override
	public int getMyClassType( ) {
	    return AppConstants.CLASS_TYPE_XA_RESOURCE;
	}

	@Override
	public String getMyDisplayValue() {
		return getDescription( );
	}

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

	public String getPolicyName() {
		return policyName;
	}

	public void setPolicyName(String policyName) {
		this.policyName = policyName;
	}

	/**
	 * Returns the value for the member attribute <b>name</b>
	 * @return String - value of member attribute <b>name</b>.
	 */
	public String getName( ) {
		return this.name;
	}

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

	/**
	 * Returns the value for the member attribute <b>description</b>
	 * @return String - value of member attribute <b>description</b>.
	 */
	public String getDescription( ) {
		return this.description;
	}

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

	/**
	 * Returns the value for the member attribute <b>resourceType</b>
	 * @return int - value of member attribute <b>resourceType</b>.
	 */
	public int getResourceType( ) {
		return this.resourceType;
	}

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

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


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

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


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

	/**
	 * Returns the value for the member attribute <b>parentPath</b>
	 * @return String - value of member attribute <b>parentPath</b>.
	 */
	public String getParentPath( ) {
		return this.parentPath;
	}

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

	/**
	 * Returns the value for the member attribute <b>isEncrypt</b>
	 * @return int - value of member attribute <b>isEncrypt</b>.
	 */
	public int getIsEncrypt( ) {
		return this.isEncrypt;
	}

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

	/**
	 * Returns the value for the member attribute <b>isRecursive</b>
	 * @return int - value of member attribute <b>isRecursive</b>.
	 */
	public int getIsRecursive( ) {
		return this.isRecursive;
	}

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

	/**
	 * Returns the value for the member attribute <b>resourceGroup</b>
	 * @return String - value of member attribute <b>resourceGroup</b>.
	 */
	public String getResourceGroup( ) {
		return this.resourceGroup;
	}

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

	/**
	 * Returns the value for the member attribute <b>databases</b>
	 * @return String - value of member attribute <b>databases</b>.
	 */
	public String getDatabases( ) {
		return this.databases;
	}

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

	/**
	 * Returns the value for the member attribute <b>tables</b>
	 * @return String - value of member attribute <b>tables</b>.
	 */
	public String getTables( ) {
		return this.tables;
	}

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

	/**
	 * Returns the value for the member attribute <b>columnFamilies</b>
	 * @return String - value of member attribute <b>columnFamilies</b>.
	 */
	public String getColumnFamilies( ) {
		return this.columnFamilies;
	}

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

	/**
	 * Returns the value for the member attribute <b>columns</b>
	 * @return String - value of member attribute <b>columns</b>.
	 */
	public String getColumns( ) {
		return this.columns;
	}

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

	/**
	 * Returns the value for the member attribute <b>udfs</b>
	 * @return String - value of member attribute <b>udfs</b>.
	 */
	public String getUdfs( ) {
		return this.udfs;
	}

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

	/**
	 * Returns the value for the member attribute <b>resourceStatus</b>
	 * @return int - value of member attribute <b>resourceStatus</b>.
	 */
	public int getResourceStatus( ) {
		return this.resourceStatus;
	}

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

	/**
	 * Returns the value for the member attribute <b>tableType</b>
	 * @return int - value of member attribute <b>tableType</b>.
	 */
	public int getTableType( ) {
		return this.tableType;
	}

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

	/**
	 * Returns the value for the member attribute <b>columnType</b>
	 * @return int - value of member attribute <b>columnType</b>.
	 */
	public int getColumnType( ) {
		return this.columnType;
	}
	
	/**
	 * Returns the value for the member attribute <b>topologies</b>
	 * @return String - value of member attribute <b>topologies</b>.
	 */
	public String getTopologies() {
		return topologies;
	}

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

	/**
	 * Returns the value for the member attribute <b>services</b>
	 * @return String - value of member attribute <b>services</b>.
	 */
	public String getServices() {
		return services;
	}

	/**
	 * This method sets the value to the member attribute <b>services</b>.
	 * You cannot set null to the attribute.
	 * @param services Value to set member attribute <b>services</b>
	 */
	public void setServices(String services) {
		this.services = services;
	}
	/**
	 * This return the bean content in string format
	 * @return formatedStr
	*/
	@Override
	public String toString( ) {
		String str = "XXResource={";
		str += super.toString();
		str += "name={" + name + "} ";
		str += "policyName={" + policyName + "} ";
		str += "description={" + description + "} ";
		str += "resourceType={" + resourceType + "} ";
		str += "assetId={" + assetId + "} ";
		str += "parentId={" + parentId + "} ";
		str += "parentPath={" + parentPath + "} ";
		str += "isEncrypt={" + isEncrypt + "} ";
		str += "isRecursive={" + isRecursive + "} ";
		str += "resourceGroup={" + resourceGroup + "} ";
		str += "databases={" + databases + "} ";
		str += "tables={" + tables + "} ";
		str += "columnFamilies={" + columnFamilies + "} ";
		str += "columns={" + columns + "} ";
		str += "udfs={" + udfs + "} ";
		str += "resourceStatus={" + resourceStatus + "} ";
		str += "tableType={" + tableType + "} ";
		str += "columnType={" + columnType + "} ";
		str += "topologies={" + topologies + "} ";
		str += "services={" + services + "} ";
		str += "}";
		return str;
	}

	/**
	 * Checks for all attributes except referenced db objects
	 * @return true if all attributes match
	*/
	@Override
	public boolean equals( Object obj) {
		if ( !super.equals(obj) ) {
			return false;
		}
		XXResource other = (XXResource) obj;
        	if ((this.name == null && other.name != null) || (this.name != null && !this.name.equals(other.name))) {
            		return false;
        	}
        	if ((this.description == null && other.description != null) || (this.description != null && !this.description.equals(other.description))) {
            		return false;
        	}
		if( this.resourceType != other.resourceType ) return false;
        	if ((this.assetId == null && other.assetId != null) || (this.assetId != null && !this.assetId.equals(other.assetId))) {
            		return false;
        	}
        	if ((this.parentId == null && other.parentId != null) || (this.parentId != null && !this.parentId.equals(other.parentId))) {
            		return false;
        	}
        	if ((this.parentPath == null && other.parentPath != null) || (this.parentPath != null && !this.parentPath.equals(other.parentPath))) {
            		return false;
        	}
		if( this.isEncrypt != other.isEncrypt ) return false;
		if( this.isRecursive != other.isRecursive ) return false;
        	if ((this.resourceGroup == null && other.resourceGroup != null) || (this.resourceGroup != null && !this.resourceGroup.equals(other.resourceGroup))) {
            		return false;
        	}
        	if ((this.databases == null && other.databases != null) || (this.databases != null && !this.databases.equals(other.databases))) {
            		return false;
        	}
        	if ((this.tables == null && other.tables != null) || (this.tables != null && !this.tables.equals(other.tables))) {
            		return false;
        	}
        	if ((this.columnFamilies == null && other.columnFamilies != null) || (this.columnFamilies != null && !this.columnFamilies.equals(other.columnFamilies))) {
            		return false;
        	}
        	if ((this.columns == null && other.columns != null) || (this.columns != null && !this.columns.equals(other.columns))) {
            		return false;
        	}
        	if ((this.udfs == null && other.udfs != null) || (this.udfs != null && !this.udfs.equals(other.udfs))) {
            		return false;
        	}
		if( this.resourceStatus != other.resourceStatus ) return false;
		if( this.tableType != other.tableType ) return false;
		if( this.columnType != other.columnType ) return false;
		
		if ((this.topologies == null && other.topologies != null)
				|| (this.topologies != null && !this.topologies.equals(other.topologies))) {
			return false;
		}
		if ((this.services == null && other.services != null)
				|| (this.services != null && !this.services.equals(other.services))) {
			return false;
		}
		return true;
	}
	public static String getEnumName(String fieldName ) {
		if( fieldName.equals("resourceType") ) {
			return "CommonEnums.ResourceType";
		}
		if( fieldName.equals("isEncrypt") ) {
			return "CommonEnums.BooleanValue";
		}
		if( fieldName.equals("isRecursive") ) {
			return "CommonEnums.BooleanValue";
		}
		if( fieldName.equals("resourceStatus") ) {
			return "CommonEnums.ActiveStatus";
		}
		if( fieldName.equals("tableType") ) {
			return "CommonEnums.PolicyType";
		}
		if( fieldName.equals("columnType") ) {
			return "CommonEnums.PolicyType";
		}
		if( fieldName.equals("assetType") ) {
			return "CommonEnums.AssetType";
		}
		//Later TODO
		//return super.getEnumName(fieldName);
		return null;
	}

}
