// idega 2000 - Eiki
package com.idega.core.location.data;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Vector;
import java.util.logging.Level;
import javax.ejb.FinderException;
import com.idega.data.GenericEntity;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.data.IDOStoreException;
import com.idega.data.SimpleQuerier;
import com.idega.data.query.AND;
import com.idega.data.query.Column;
import com.idega.data.query.Criteria;
import com.idega.data.query.InCriteria;
import com.idega.data.query.MatchCriteria;
import com.idega.data.query.OR;
import com.idega.data.query.SelectQuery;
import com.idega.data.query.Table;
import com.idega.data.query.WildCardColumn;
import com.idega.util.ListUtil;
import com.idega.util.StringUtil;
public class PostalCodeBMPBean extends GenericEntity implements PostalCode {
private static final long serialVersionUID = 1106307465807244618L;
static final String TABLE_NAME = "IC_POSTAL_CODE";
static final String COLUMN_POSTAL_CODE_ID = "IC_POSTAL_CODE_ID";
static final String COLUMN_POSTAL_CODE = "POSTAL_CODE";
static final String COLUMN_NAME = "NAME";
static final String COLUMN_POSTAL_ADDRESS = "POSTAL_ADDRESS";
static final String COLUMN_COUNTRY_ID = "IC_COUNTRY_ID";
static final String COLUMN_COMMUNE_ID = "IC_COMMUNE_ID";
public PostalCodeBMPBean() {
super();
}
public PostalCodeBMPBean(int id) throws SQLException {
super(id);
}
public void initializeAttributes() {
addAttribute(getIDColumnName());
addAttribute(COLUMN_POSTAL_CODE, "Postalcode", true, true, String.class, 50);
addAttribute(COLUMN_NAME, "Name", true, true, String.class, 50);
addAttribute(COLUMN_POSTAL_ADDRESS, "Postaladdress", true, true, String.class, 50);
addManyToOneRelationship(COLUMN_COUNTRY_ID, "Country", Country.class);
addManyToOneRelationship(COLUMN_COMMUNE_ID, "Commmune", Commune.class);
addIndex("IDX_IC_POSTALCODE", COLUMN_POSTAL_CODE);
addIndex("IDX_IC_POSTALCODE2", new String[] { COLUMN_POSTAL_CODE, COLUMN_NAME });
addIndex("IDX_IC_POSTALCODE3", new String[] { COLUMN_POSTAL_CODE, COLUMN_COUNTRY_ID });
addIndex("IDX_IC_POSTALCODE4", COLUMN_COUNTRY_ID);
getEntityDefinition().setBeanCachingActiveByDefault(true);
}
public void insertStartData() throws Exception {
/*
* java.util.List countries =
* EntityFinder.findAllByColumn(com.idega.core.data.CountryBMPBean.getStaticInstance(),"ISO_Abbreviation","IS");
* if (countries != null) { Country country = (Country) countries.get(0);
* PostalCode pCode; pCode =
* ((com.idega.core.data.PostalCodeHome)com.idega.data.IDOLookup.getHomeLegacy(PostalCode.class)).createLegacy();
* pCode.setPostalCode("101"); pCode.setName("Reykjavik");
* pCode.setCountryID(country.getID()); pCode.insert(); pCode =
* ((com.idega.core.data.PostalCodeHome)com.idega.data.IDOLookup.getHomeLegacy(PostalCode.class)).createLegacy();
* pCode.setPostalCode("200"); pCode.setName("K�pavogur");
* pCode.setCountryID(country.getID()); pCode.insert(); pCode =
* ((com.idega.core.data.PostalCodeHome)com.idega.data.IDOLookup.getHomeLegacy(PostalCode.class)).createLegacy();
* pCode.setPostalCode("201");< pCode.setName("K�pavogur");
* pCode.setCountryID(country.getID()); pCode.insert(); }
*/
}
public String getEntityName() {
return TABLE_NAME;
}
private String stripWhitespace(String strip) {
if (StringUtil.isEmpty(strip)) {
return null;
}
String s = strip;
return s.replaceAll("\\s", "");
}
public void setPostalCode(String code) {
code = stripWhitespace(code);
setColumn(COLUMN_POSTAL_CODE, code);
String name = getName();
StringBuffer buffer = new StringBuffer();
buffer.append(code);
if (name != null) {
buffer.append(" ").append(name);
}
setColumn(COLUMN_POSTAL_ADDRESS, buffer.toString());
}
public String getPostalCode() {
return getStringColumnValue(COLUMN_POSTAL_CODE);
}
public void setCommuneID(String commune) {
// remove all whitespace from postal code
setColumn(COLUMN_COMMUNE_ID, commune);
}
public String getCommuneID() {
return getStringColumnValue(COLUMN_COMMUNE_ID);
}
public void setCommune(Commune commune) {
setColumn(COLUMN_COMMUNE_ID, commune);
}
public Commune getCommune() {
return (Commune) getColumnValue(COLUMN_COMMUNE_ID);
}
/**
* All names are stored in uppercase, uses String.toUpperCase();
*/
public void setName(String name) {
if (!StringUtil.isEmpty(name)) {
setColumn(COLUMN_NAME, name.toUpperCase());
String code = getPostalCode();
StringBuffer buffer = new StringBuffer();
if (code != null) {
buffer.append(code).append(" ");
}
buffer.append(name);
setColumn(COLUMN_POSTAL_ADDRESS, buffer.toString());
}
}
public String getName() {
return getStringColumnValue(COLUMN_NAME);
}
public void setCountry(Country country) {
setColumn(COLUMN_COUNTRY_ID, country);
}
public Country getCountry() {
return (Country) getColumnValue(COLUMN_COUNTRY_ID);
}
public void setCountryID(int country_id) {
setColumn(COLUMN_COUNTRY_ID, country_id);
}
public int getCountryID() {
return getIntColumnValue(COLUMN_COUNTRY_ID);
}
private void setPostalAddress(String postal_address) {
setColumn(COLUMN_POSTAL_ADDRESS, postal_address);
}
public Collection ejbFindByCommune(Commune commune) throws FinderException {
Table table = new Table(this);
SelectQuery query = new SelectQuery(table);
query.addColumn(table.getColumn(getIDColumnName()));
query.addCriteria(new MatchCriteria(table.getColumn(COLUMN_COMMUNE_ID), MatchCriteria.EQUALS, commune));
query.addOrder(table, COLUMN_POSTAL_CODE, true);
return idoFindPKsByQuery(query);
}
/**
*
* <p>Finds primary keys by given postal codes.</p>
* @param codes is {@link Collection} of {@link PostalCode#getPostalCode()},
* not <code>null</code>;
* @return {@link Collection} of {@link PostalCode#getPrimaryKey()} or
* {@link Collections#emptyList()} on failure;
* @author <a href="mailto:martynas@idega.is">Martynas Stakė</a>
*/
public Collection<Object> ejbFindByPostalCode(Collection<String> codes) {
if (ListUtil.isEmpty(codes)) {
return Collections.emptyList();
}
Table table = new Table(this);
SelectQuery query = new SelectQuery(table);
query.addColumn(table.getColumn(getIDColumnName()));
query.addCriteria(new InCriteria(table.getColumn(COLUMN_POSTAL_CODE), codes));
query.addOrder(table, COLUMN_POSTAL_CODE, true);
try {
return idoFindPKsByQuery(query);
} catch (FinderException e) {
getLogger().log(Level.WARNING,
"Failed to find primary keys by query: " + query +
" cause of: ", e);
}
return Collections.emptyList();
}
public Object ejbFindByPostalCode(String code) throws FinderException {
return ejbFindByPostalCodeAndCountryId(code, -1);
}
public Object ejbFindByPostalCodeAndCountryId(String code, int countryId) throws FinderException {
Table table = new Table(this);
Column codeCol = new Column(table, COLUMN_POSTAL_CODE);
Column countryCol = new Column(table, COLUMN_COUNTRY_ID);
SelectQuery query = new SelectQuery(table);
query.addColumn(new Column(table, getIDColumnName()));
query.addCriteria(new MatchCriteria(codeCol, MatchCriteria.EQUALS, code));
if (countryId != -1) {
query.addCriteria(new MatchCriteria(countryCol, MatchCriteria.EQUALS, countryId));
}
return this.idoFindOnePKByQuery(query);
}
public Collection ejbFindAllByCountryIdOrderedByPostalCode(int countryId) throws FinderException {
Table table = new Table(this);
Column countryCol = new Column(table, COLUMN_COUNTRY_ID);
SelectQuery query = new SelectQuery(table);
query.addColumn(new Column(table, getIDColumnName()));
query.addCriteria(new MatchCriteria(countryCol, MatchCriteria.EQUALS, countryId));
query.addOrder(table, COLUMN_POSTAL_CODE, true);
return this.idoFindPKsByQuery(query);
}
/**
*
* @param countryId
* @return Collection of strings, containing names
* @throws FinderException
* @throws RemoteException
*/
public Collection ejbHomeGetUniquePostalCodeNamesByCountryIdOrderedByPostalCodeName(int countryId) throws FinderException {
Table table = new Table(this);
Column countryCol = new Column(table, COLUMN_COUNTRY_ID);
SelectQuery query = new SelectQuery(table);
query.addColumn(table, COLUMN_NAME, true);
query.addCriteria(new MatchCriteria(countryCol, MatchCriteria.EQUALS, countryId));
query.addGroupByColumn(table, COLUMN_NAME);
query.addOrder(table, COLUMN_NAME, true);
try {
String[] names = SimpleQuerier.executeStringQuery(query.toString());
Vector coll = new Vector();
if (names != null) {
for (int i = 0; i < names.length; i++) {
coll.add(names[i]);
}
}
return coll;
}
catch (Exception e) {
throw new FinderException(e.getMessage());
}
}
public Collection ejbFindByNameAndCountry(String name, Object countryPK) throws FinderException {
Table table = new Table(this);
Column nameCol = new Column(table, COLUMN_NAME);
Column countryCol = new Column(table, COLUMN_COUNTRY_ID);
SelectQuery query = new SelectQuery(table);
query.addColumn(new Column(table, getIDColumnName()));
query.addCriteria(new MatchCriteria(nameCol, MatchCriteria.EQUALS, name));
query.addCriteria(new MatchCriteria(countryCol, MatchCriteria.EQUALS, countryPK));
return this.idoFindPKsByQuery(query);
}
public Collection ejbFindByCountry(Object countryPK) throws FinderException {
Table table = new Table(this);
Column countryCol = new Column(table, COLUMN_COUNTRY_ID);
SelectQuery query = new SelectQuery(table);
query.addColumn(new Column(table, getIDColumnName()));
query.addCriteria(new MatchCriteria(countryCol, MatchCriteria.EQUALS, countryPK));
return this.idoFindPKsByQuery(query);
}
public Collection ejbFindAllUniqueNames() throws RemoteException, FinderException {
Collection all = ejbFindAll();
Collection names = new Vector();
Collection pks = new Vector();
if (all != null && !all.isEmpty()) {
Iterator iter = all.iterator();
PostalCode pc;
while (iter.hasNext()) {
pc = ((PostalCodeHome) this.getEJBLocalHome()).findByPrimaryKey(iter.next());
if (!names.contains(pc.getName())) {
names.add(pc.getName());
pks.add(pc.getPrimaryKey());
}
}
}
return pks;
}
public Collection ejbFindAll() throws FinderException {
return idoFindAllIDsBySQL();
}
public Collection ejbFindAllOrdererByCode() throws FinderException {
return super.idoFindAllIDsOrderedBySQL(COLUMN_POSTAL_CODE);
}
public String getPostalAddress() {
String postalAddress = getStringColumnValue(COLUMN_POSTAL_ADDRESS);
if (postalAddress == null) {
StringBuffer addr = new StringBuffer();
String code = getPostalCode();
if (code != null) {
addr.append(code).append(" ");
}
String name = this.getName();
if (name != null) {
addr.append(name);
}
postalAddress = addr.toString();
}
return postalAddress;
}
public Collection ejbFindByPostalCodeFromTo(String codeFrom, String codeTo) throws FinderException {
return ejbFindByPostalCodeFromTo(new String[] { codeFrom }, new String[] { codeTo });
}
public Collection ejbFindByPostalCodeFromTo(String codeFrom[], String codeTo[]) throws FinderException {
int fromLength = codeFrom.length;
int toLength = codeTo.length;
if (fromLength != toLength) {
throw new FinderException("From and To arrays must be of same size");
}
Table postal = new Table(this);
Column postalCode = new Column(postal, COLUMN_POSTAL_CODE);
SelectQuery query = new SelectQuery(postal);
query.addColumn(new WildCardColumn(postal));
if (fromLength > 0) {
Vector crits = new Vector();
for (int i = 0; i < fromLength; i++) {
if (codeTo[i] == null) {
crits.add(new MatchCriteria(postalCode, MatchCriteria.EQUALS, codeFrom[i]));
}
else {
AND and = new AND(new MatchCriteria(postalCode, MatchCriteria.GREATEREQUAL, codeFrom[i]), new MatchCriteria(postalCode, MatchCriteria.LESSEQUAL, codeTo[i]));
crits.add(and);
}
}
if (fromLength == 1) {
query.addCriteria((Criteria) crits.get(0));
}
else {
OR mainOR = new OR((Criteria) crits.get(0), (Criteria) crits.get(1));
for (int i = 2; i < fromLength; i++) {
mainOR = new OR(mainOR, (Criteria) crits.get(i));
}
query.addCriteria(mainOR);
}
}
query.addOrder(postal, COLUMN_POSTAL_CODE, true);
return this.idoFindPKsByQuery(query);
// IDOQuery query = this.idoQuery();
// query.append("Select * from ").append(getEntityName())
// .append(" where ").append(COLUMN_POSTAL_CODE).append(" >=
// '").append(codeFrom)
// .append("' and ").append(COLUMN_POSTAL_CODE).append(" <=
// '").append(codeTo)
// .append("' order by ").append(COLUMN_POSTAL_CODE);
// return this.idoFindPKsByQuery(query);
}
/**
* Gets related addresses null if no found
*/
public Collection getAddresses() {
try {
return ((AddressHome) IDOLookup.getHome(Address.class)).findByPostalCode((Integer) getPrimaryKey());
}
catch (FinderException e) {
}
catch (IDOLookupException e) {
e.printStackTrace();
}
return null;
}
public boolean equals(Object obj) {
if (obj instanceof PostalCode) {
PostalCode other = (PostalCode) obj;
return other.getPostalCode().equals(this.getPostalCode());
}
return false;
}
/*
* (non-Javadoc)
*
* @see com.idega.core.location.data.PostalCode#isEqualTo(com.idega.core.location.data.PostalCode)
*/
public boolean isEqualTo(PostalCode postal) {
if (postal != null) {
return (this.getPostalCode().equalsIgnoreCase(postal.getPostalCode()));
// && this.getName().equalsIgnoreCase(postal.getName()));
}
return false;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
if (getPostalCode() != null) {
builder.append(getPostalCode());
}
if (builder.length() > 0) {
builder.append(" ");
}
if (getName() != null) {
builder.append(getName());
}
return builder.toString();
}
public void store() throws IDOStoreException {
setPostalAddress(getPostalCode() + " " + getName());
super.store();
}
}