// idega 2000 - eiki
package com.idega.core.location.data;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Collection;
import javax.ejb.FinderException;
import com.idega.core.user.data.User;
import com.idega.data.EntityAttribute;
import com.idega.data.IDOLookup;
import com.idega.data.IDOQuery;
import com.idega.util.text.TextSoap;
public class AddressBMPBean extends com.idega.data.GenericEntity implements
Address {
private static final String COLUMN_IC_COMMUNE_ID = "IC_COMMUNE_ID";
private static final String ENTITY_NAME = "IC_ADDRESS";
private static final String STREET_NAME = "STREET_NAME";
private static final String STREET_NUMBER = "STREET_NUMBER";
private static final String CITY = "CITY";
private static final String PROVINCE = "PROVINCE";
private static final String P_O_BOX = "P_O_BOX";
private static final String POSTAL_CODE_ID = "POSTAL_CODE_ID";
private static final String IC_ADDRESS_TYPE_ID = "IC_ADDRESS_TYPE_ID";
private static final String IC_COUNTRY_ID = "IC_COUNTRY_ID";
private static final String COORDINATE = "COORDINATE";
private static final String COORDINATE_ID = "IC_ADDRESS_COORDINATE_ID";
private static final String COORDINATE_DATE = "COORDINATE_DATE";
private transient AddressTypeHome addressTypeHome;
private static AddressType type1; // for caching
private static AddressType type2; // for caching
public AddressBMPBean() {
super();
}
public AddressBMPBean(int id) throws SQLException {
super(id);
}
public void initializeAttributes() {
addAttribute(getIDColumnName());
addManyToOneRelationship(getColumnNameAddressTypeId(), "Address type",
AddressType.class);
addAttribute(STREET_NAME, "Street Name", true, true, String.class, 150);
EntityAttribute streetNameAttr = (EntityAttribute) getEntityDefinition()
.findFieldByUniqueName(STREET_NAME);
streetNameAttr.setUniqueFieldName(Address.FIELD_STREET_NAME);
addAttribute(STREET_NUMBER, "Street number", true, true, String.class, 30);
EntityAttribute streetNumberAttr = (EntityAttribute) getEntityDefinition()
.findFieldByUniqueName(STREET_NUMBER);
streetNumberAttr.setUniqueFieldName(Address.FIELD_STREET_NUMBER);
addAttribute(CITY, "City", true, true, String.class, 50);
addAttribute(PROVINCE, "Province", true, true, String.class, 50);
addAttribute(P_O_BOX, "PostBox", true, true, String.class, 50);
addManyToOneRelationship(POSTAL_CODE_ID, "PostalCode", PostalCode.class);
addManyToOneRelationship(IC_COUNTRY_ID, "Country", Country.class);
this.addManyToManyRelationShip(User.class, "ic_user_address");
this.addManyToOneRelationship(getColumnNameCommuneID(), Commune.class);
this.addManyToOneRelationship(COORDINATE_ID, AddressCoordinate.class);
this.addAttribute(COORDINATE_DATE, "Cooardinate date", String.class);
addIndex("IDX_ADDRESS_TYPE", getColumnNameAddressTypeId());
addIndex("IDX_ADDRESS_STREET_NAME", STREET_NAME);
addIndex("IDX_ADDR_ADDR_TYPE", new String[] { getIDColumnName(),
getColumnNameAddressTypeId() });
}
public static String getColumnNameAddressTypeId() {
return IC_ADDRESS_TYPE_ID;
}
public static String getColumnNameCommuneID() {
return COLUMN_IC_COMMUNE_ID;
}
public String getEntityName() {
return ENTITY_NAME;
}
public void setDefaulValues() {
}
public String getName() {
return getStreetAddress();
}
public String getStreetName() {
return (String) getColumnValue(STREET_NAME);
}
/**
* All names are stored in uppercase, uses String.toUpperCase();
*/
public void setStreetName(String street_name) {
setColumn(STREET_NAME, street_name.toUpperCase());
}
public String getStreetNumber() {
return getStringColumnValue(STREET_NUMBER);
}
public void setStreetNumber(String street_number) {
setColumn(STREET_NUMBER, street_number);
}
public void setStreetNumber(int street_number) {
setColumn(STREET_NUMBER, street_number);
}
public String getCity() {
return (String) getColumnValue(CITY);
}
public void setCity(String city) {
setColumn(CITY, city);
}
public String getProvince() {
return (String) getColumnValue(PROVINCE);
}
public void setProvince(String province) {
setColumn(PROVINCE, province);
}
public String getPOBox() {
return (String) getColumnValue(P_O_BOX);
}
public void setPOBox(String p_o_box) {
setColumn(P_O_BOX, p_o_box);
}
public PostalCode getPostalCode() {
return (PostalCode) getColumnValue(POSTAL_CODE_ID);
}
public int getPostalCodeID() {
return getIntColumnValue(POSTAL_CODE_ID);
}
public void setPostalCode(PostalCode postalCode) {
setColumn(POSTAL_CODE_ID, postalCode);
if (postalCode != null) {
if (postalCode.getCountryID() > 0 && getCountry() == null) {
setColumn(IC_COUNTRY_ID, postalCode.getCountryID());
}
}
}
public void setPostalCodeID(int postal_code_id) {
setColumn(POSTAL_CODE_ID, postal_code_id);
}
public AddressType getAddressType() {
return (AddressType) getColumnValue(IC_ADDRESS_TYPE_ID);
}
public void setAddressTypeID(int address_type_id) {
setColumn(IC_ADDRESS_TYPE_ID, address_type_id);
}
public void setAddressType(AddressType type) {
setColumn(IC_ADDRESS_TYPE_ID, type);
}
public int getAddressTypeID() {
return getIntColumnValue(IC_ADDRESS_TYPE_ID);
}
public AddressCoordinate getCoordinate() {
String oldVal = getStringColumnValue(COORDINATE);
if (oldVal != null) {
try {
AddressCoordinateHome acd = (AddressCoordinateHome) IDOLookup
.getHome(AddressCoordinate.class);
AddressCoordinate ac = null;
try {
ac = acd.findByCoordinate(oldVal);
} catch (FinderException f) {
ac = acd.create();
ac.setCoordinate(oldVal);
ac.store();
}
if (ac != null) {
setCoordinate(ac);
}
removeFromColumn(COORDINATE);
} catch (Exception e) {
e.printStackTrace();
}
}
return (AddressCoordinate) getColumnValue(COORDINATE_ID);
}
public void setCoordinate(AddressCoordinate coordinate) {
this.setColumn(COORDINATE_ID, coordinate);
}
public String getCoordinateDate() {
return getStringColumnValue(COORDINATE_DATE);
}
public void setCoordinateDate(String coordinateDate) {
setColumn(COORDINATE_DATE, coordinateDate);
}
public Country getCountry() {
Country country = (Country) getColumnValue(IC_COUNTRY_ID);
if (country == null) {
PostalCode code = getPostalCode();
if (code != null) {
return code.getCountry();
}
}
return country;
}
public int getCountryId() {
int id = getIntColumnValue(IC_COUNTRY_ID);
if (id == -1) {
Country country = getCountry();
if (country != null) {
id = ((Integer) country.getPrimaryKey()).intValue();
}
}
return id;
}
public void setCountry(Country country) {
setColumn(IC_COUNTRY_ID, country);
}
public void setCountryId(int country_id) {
setColumn(IC_COUNTRY_ID, country_id);
}
public int getCommuneID() {
return getIntColumnValue(getColumnNameCommuneID());
}
public void setCommuneID(int communeId) {
setColumn(getColumnNameCommuneID(), communeId);
}
public void setCommune(Commune commune) {
setColumn(getColumnNameCommuneID(), commune);
}
public Commune getCommune() {
return (Commune) getColumnValue(getColumnNameCommuneID());
}
public AddressTypeHome getAddressTypeHome() throws RemoteException {
if (this.addressTypeHome == null) {
this.addressTypeHome = (AddressTypeHome) IDOLookup
.getHome(AddressType.class);
}
return this.addressTypeHome;
}
public AddressType ejbHomeGetAddressType1() throws RemoteException {
if (AddressBMPBean.type1 == null) {
try {
type1 = getAddressTypeHome().findAddressType1();
} catch (FinderException e) {
throw new RemoteException(e.getMessage());
}
}
return type1;
}
public AddressType ejbHomeGetAddressType2() throws RemoteException {
if (AddressBMPBean.type2 == null) {
try {
type2 = getAddressTypeHome().findAddressType2();
} catch (FinderException e) {
throw new RemoteException(e.getMessage());
}
}
return type2;
}
/**
* Gets the street name together with the street number
*
* @return Returns the combined address string with capitalization.
*/
public String getStreetAddress() {
StringBuffer addr = new StringBuffer();
String street = getStreetName();
if (street != null) {
addr.append(street).append(" ");
}
String number = this.getStreetNumber();
if (number != null) {
addr.append(number);
}
return TextSoap.capitalize(addr.toString(), " ");
}
/**
* Gets the postal code together with its name
*/
public String getPostalAddress() {
try {
PostalCode postalCode = getPostalCode();
if (postalCode == null) {
return "";
}
return postalCode.getPostalAddress();
} catch (Exception ex) {
}
return "";
}
public Integer ejbFindPrimaryUserAddress(int userID) throws FinderException {
IDOQuery query = idoQuery();
query.appendSelect().append("a.").append(getIDColumnName())
.appendFrom().append(getEntityName()).append(" a, ");
query.append("ic_user_address iua, ic_address_type iat ")
.appendWhereEquals("a.ic_address_id", "iua.ic_address_id");
query.appendAnd().append(
"iat.ic_address_type_id = a.ic_address_type_id");
query.appendAnd().append("iua.ic_user_id = ").append(userID)
.appendAnd().append("iat.unique_name = ")
.appendWithinSingleQuotes(AddressTypeBMPBean.ADDRESS_1);
return (Integer) super.idoFindOnePKBySQL(query.toString());
}
public Integer ejbFindUserAddressByAddressType(int userID, AddressType type)
throws FinderException {
IDOQuery query = idoQuery();
query.appendSelect().append("a.").append(getIDColumnName())
.appendFrom().append(getEntityName()).append(" a, ").append(
"ic_user_address iua ").appendWhereEquals(
"a.ic_address_id", "iua.ic_address_id").appendAnd()
.append("iua.ic_user_id = ").append(userID).appendAnd().append(
"a.ic_address_type_id = ").append(
((Integer) type.getPrimaryKey()).intValue());
return (Integer) super.idoFindOnePKBySQL(query.toString());
}
public Collection ejbFindPrimaryUserAddresses(String[] userIDs)
throws FinderException {
IDOQuery query = idoQuery();
query.appendSelect().append("a.").append(getIDColumnName())
.appendFrom().append(getEntityName()).append(" a, ");
query.append("ic_user_address iua, ic_address_type iat ")
.appendWhereEquals("a.ic_address_id", "iua.ic_address_id");
query.appendAnd().append("iat.ic_address_type_id").appendEqualSign()
.append("a.ic_address_type_id");
query.appendAnd().append("iua.ic_user_id").appendInArray(userIDs)
.appendAnd().append("iat.unique_name = ")
.appendWithinSingleQuotes(AddressTypeBMPBean.ADDRESS_1);
return super.idoFindPKsBySQL(query.toString());
}
public Collection ejbFindPrimaryUserAddresses(IDOQuery query)
throws FinderException {
IDOQuery sqlquery = idoQuery();
sqlquery.appendSelect().append("a.").append(getIDColumnName())
.appendFrom().append(getEntityName()).append(" a, ");
sqlquery.append("ic_user_address iua, ic_address_type iat ")
.appendWhereEquals("a.ic_address_id", "iua.ic_address_id");
sqlquery.appendAnd().append("iat.ic_address_type_id").appendEqualSign()
.append("a.ic_address_type_id");
sqlquery.appendAnd().append("iua.ic_user_id").appendIn(query)
.appendAnd().append("iat.unique_name = ")
.appendWithinSingleQuotes(AddressTypeBMPBean.ADDRESS_1);
return super.idoFindPKsBySQL(sqlquery.toString());
}
public Collection ejbFindUserAddressesByAddressType(int userID,
AddressType type) throws FinderException {
IDOQuery query = idoQuery();
query.appendSelect().append("a.").append(getIDColumnName())
.appendFrom().append(getEntityName()).append(" a, ");
query.append("ic_user_address iua, ic_address_type iat ")
.appendWhereEquals("a.ic_address_id", "iua.ic_address_id");
query.appendAnd().append("iua.ic_user_id = ").append(userID)
.appendAnd().append("a.ic_address_type_id = ").append(
((Integer) type.getPrimaryKey()).intValue());
return super.idoFindPKsBySQL(query.toString());
}
public Collection ejbFindByPostalCode(Integer postalCodeID)
throws FinderException {
return idoFindPKsByQuery(idoQueryGetSelect().appendWhereEquals(
POSTAL_CODE_ID, postalCodeID));
}
public int getUserCountForAddress() {
try {
Collection users = super.idoGetRelatedEntities(User.class);
return users.size();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error in getAddresses() : "
+ e.getMessage());
}
}
/*
* (non-Javadoc)
*
* @see com.idega.core.location.data.Address#isSame(com.idega.core.location.data.Address)
*/
public boolean isEqualTo(Address address) {
boolean returner = false;
if (address != null) {
returner = getStreetAddress().equalsIgnoreCase(
address.getStreetAddress());
if (returner) {
if (getPostalCode() != null && address.getPostalCode() != null) {
returner = getPostalCode().isEqualTo(
address.getPostalCode());
}
}
if (returner) {
returner = getCountryId() == address.getCountryId();
}
}
return returner;
}
}