/*******************************************************************************
 * 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:
 *     Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.test.models.phone;

import java.util.List;

import org.eclipse.persistence.sessions.Record;

public class Address {
	/**
	 * Flags for converting int rate to booleans.
	 **/
	public final static int LOCAL_FLAG = 1;
	public final static int LONG_DISTANCE_FLAG = 2;
	public final static int DSL_FLAG = 4;
	
	
	/**
	 * To test DTF
	 **/
	private String street;
	/**
	 * To test OT
	 **/
	private String buildingType;
	public static final String[] BUILDING_TYPES = new String[] {"Apartment", "Single-family Home", "Multi-family home"};
	/**
	 * To test 1-1
	 **/
	private State state;
	/**
	 * To test 1-M, has a Variable 1-1 back pointer to Person or Company
	 **/
	private List serviceCalls; // (List of ServiceCalls)
	/**
	 * To test M-M
	 **/
	private List providers; // (List of Companies)
	/**
	 * To test DC
	 **/
	private List phoneNumbers; // List of Strings
	/**
	 * To test Transformation
	 * Determined by adding up a bunch of booleans in the database.
	 * For simplicity, it stores it as an int.  Of course, this is never
	 * how you'd do it in the real world, but I'm just coming up with a test
	 * here, so leave me alone.
	 **/
	private int rate;
/**
 * Address constructor comment.
 */
public Address() {
	super();
}
/**
 * Calculates and sets the rate based on the values in the database row.
 **/
public void calculateRate(Record row) {
	this.rate = 0;
	if (((Boolean)row.get("HAS_LOCAL")).booleanValue()) this.rate += LOCAL_FLAG;
	if (((Boolean)row.get("HAS_LONG_DISTANCE")).booleanValue()) this.rate += LONG_DISTANCE_FLAG;
	if (((Boolean)row.get("HAS_DSL")).booleanValue()) this.rate += DSL_FLAG;
}
/**
 * 
 * @return java.lang.String
 */
public java.lang.String getBuildingType() {
	return this.buildingType;
}
/**
 * 
 * @return java.util.List
 */
public java.util.List getPhoneNumbers() {
	return this.phoneNumbers;
}
/**
 * 
 * @return java.util.List
 */
public java.util.List getProviders() {
	return this.providers;
}
/**
 * 
 * @return int
 */
public int getRate() {
	return this.rate;
}
/**
 * 
 * @return java.util.List
 */
public java.util.List getServiceCalls() {
	return this.serviceCalls;
}
/**
 * 
 * @return org.eclipse.persistence.tools.workbench.test.models.phone.State
 */
public State getState() {
	return this.state;
}
/**
 * 
 * @return java.lang.String
 */
public java.lang.String getStreet() {
	return this.street;
}
public boolean hasDslService() {
	return (this.rate & DSL_FLAG) > 0;
}
public boolean hasLocalService() {
	return (this.rate & LOCAL_FLAG) > 0;
}
public boolean hasLongDistanceService() {
	return (this.rate & LONG_DISTANCE_FLAG) > 0;
}
/**
 * 
 * @param newBuildingType java.lang.String
 */
public void setBuildingType(java.lang.String newBuildingType) {
	this.buildingType = newBuildingType;
}
/**
 * 
 * @param newPhoneNumbers java.util.List
 */
public void setPhoneNumbers(java.util.List newPhoneNumbers) {
	this.phoneNumbers = newPhoneNumbers;
}
/**
 * 
 * @param newProviders java.util.List
 */
public void setProviders(java.util.List newProviders) {
	this.providers = newProviders;
}
/**
 * 
 * @param newRate int
 */
public void setRate(int newRate) {
	this.rate = newRate;
}
/**
 * 
 * @param newServiceCalls java.util.List
 */
public void setServiceCalls(java.util.List newServiceCalls) {
	this.serviceCalls = newServiceCalls;
}
/**
 * 
 * @param newState org.eclipse.persistence.tools.workbench.test.models.phone.State
 */
public void setState(State newState) {
	this.state = newState;
}
/**
 * 
 * @param newStreet java.lang.String
 */
public void setStreet(java.lang.String newStreet) {
	this.street = newStreet;
}
}
