Java tutorial
///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.business.address; import java.sql.Date; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.MapKey; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang.StringUtils; import org.hibernate.search.annotations.Analyze; import org.hibernate.search.annotations.DateBridge; import org.hibernate.search.annotations.EncodingType; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.FieldBridge; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.Resolution; import org.hibernate.search.annotations.Store; import org.projectforge.business.task.TaskDO; import org.projectforge.common.StringHelper; import org.projectforge.framework.persistence.attr.entities.DefaultBaseWithAttrDO; import org.projectforge.framework.persistence.history.HibernateSearchPhoneNumberBridge; import org.projectforge.framework.persistence.user.api.ThreadLocalUserContext; import org.projectforge.framework.utils.LabelValueBean; import de.micromata.genome.db.jpa.history.api.HistoryProperty; import de.micromata.genome.db.jpa.history.api.NoHistory; import de.micromata.genome.db.jpa.history.impl.TabAttrHistoryPropertyConverter; import de.micromata.genome.db.jpa.tabattr.entities.JpaTabAttrBaseDO; import de.micromata.genome.db.jpa.tabattr.entities.JpaTabAttrDataBaseDO; /** * @author Kai Reinhard (k.reinhard@micromata.de) */ @Entity @Indexed @Table(name = "T_ADDRESS", indexes = { @javax.persistence.Index(name = "idx_fk_t_address_task_id", columnList = "task_id"), @javax.persistence.Index(name = "idx_fk_t_address_tenant_id", columnList = "tenant_id") }) @NoHistory public class AddressDO extends DefaultBaseWithAttrDO<AddressDO> { private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(AddressDO.class); private static final long serialVersionUID = 974064367925158463L; private TaskDO task; private ContactStatus contactStatus = ContactStatus.ACTIVE; private AddressStatus addressStatus = AddressStatus.UPTODATE; @Field() private String name; // 255 not null @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String firstName; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private FormOfAddress form; @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String title; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String positionText; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String organization; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String division; // 255 @FieldBridge(impl = HibernateSearchPhoneNumberBridge.class) @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String businessPhone; // 255 @FieldBridge(impl = HibernateSearchPhoneNumberBridge.class) @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String mobilePhone; // 255 @FieldBridge(impl = HibernateSearchPhoneNumberBridge.class) @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String fax; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String addressText; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String zipCode; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String city; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String country; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String state; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String postalAddressText; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String postalZipCode; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String postalCity; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String postalCountry; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String postalState; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String email; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String website; // 255 private Locale communicationLanguage; @FieldBridge(impl = HibernateSearchPhoneNumberBridge.class) @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privatePhone; // 255 @FieldBridge(impl = HibernateSearchPhoneNumberBridge.class) @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateMobilePhone; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateAddressText; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateZipCode; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateCity; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateCountry; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateState; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String privateEmail; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String publicKey; // 7000 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String fingerprint; // 255 @Field(index = Index.YES /* TOKENIZED */, store = Store.NO) private String comment; // 5000; @Field(index = Index.YES, analyze = Analyze.NO /* UN_TOKENIZED */) @DateBridge(resolution = Resolution.DAY, encoding = EncodingType.STRING) private Date birthday; // @FieldBridge(impl = HibernateSearchInstantMessagingBridge.class) // @Field(index = Index.YES /*TOKENIZED*/, store = Store.NO) // TODO: Prepared for hibernate search. private List<LabelValueBean<InstantMessagingType, String>> instantMessaging; @Enumerated(EnumType.STRING) @Column(name = "contact_status", length = 20, nullable = false) public ContactStatus getContactStatus() { return contactStatus; } public AddressDO setContactStatus(final ContactStatus contactStatus) { this.contactStatus = contactStatus; return this; } @Enumerated(EnumType.STRING) @Column(name = "address_status", length = 20, nullable = false) public AddressStatus getAddressStatus() { return addressStatus; } public AddressDO setAddressStatus(final AddressStatus addressStatus) { this.addressStatus = addressStatus; return this; } @Column(name = "business_phone", length = 255) public String getBusinessPhone() { return businessPhone; } public AddressDO setBusinessPhone(final String businessPhone) { this.businessPhone = businessPhone; return this; } @Column(name = "mobile_phone", length = 255) public String getMobilePhone() { return mobilePhone; } public AddressDO setMobilePhone(final String mobilePhone) { this.mobilePhone = mobilePhone; return this; } @Column(length = 255) public String getFax() { return fax; } public void setFax(final String fax) { this.fax = fax; } @Column(length = 255) public String getAddressText() { return addressText; } public void setAddressText(final String addressText) { this.addressText = addressText; } @Column(name = "zip_code", length = 255) public String getZipCode() { return zipCode; } public void setZipCode(final String zipCode) { this.zipCode = zipCode; } @Column(length = 255) public String getCity() { return city; } public void setCity(final String city) { this.city = city; } @Column(length = 255) public String getCountry() { return country; } public void setCountry(final String country) { this.country = country; } @Column(length = 255) public String getState() { return state; } public void setState(final String state) { this.state = state; } @Column(length = 255, name = "postal_addresstext") public String getPostalAddressText() { return postalAddressText; } public void setPostalAddressText(final String postalAddressText) { this.postalAddressText = postalAddressText; } @Column(name = "postal_zip_code", length = 255) public String getPostalZipCode() { return postalZipCode; } public void setPostalZipCode(final String postalZipCode) { this.postalZipCode = postalZipCode; } @Column(length = 255, name = "postal_city") public String getPostalCity() { return postalCity; } public void setPostalCity(final String postalCity) { this.postalCity = postalCity; } @Column(name = "postal_country", length = 255) public String getPostalCountry() { return postalCountry; } public void setPostalCountry(final String postalCountry) { this.postalCountry = postalCountry; } @Column(name = "postal_state", length = 255) public String getPostalState() { return postalState; } public void setPostalState(final String postalState) { this.postalState = postalState; } @Column public Date getBirthday() { return birthday; } public void setBirthday(final Date birthday) { this.birthday = birthday; } @Column(name = "comment", length = 5000) public String getComment() { return comment; } public AddressDO setComment(final String comment) { this.comment = comment; return this; } @Column(length = 255) public String getEmail() { return email; } public AddressDO setEmail(final String email) { this.email = email; return this; } @Column(length = 255) public String getWebsite() { return website; } public void setWebsite(final String website) { this.website = website; } /** * @return The communication will take place in this language. */ @Column(name = "communication_language") public Locale getCommunicationLanguage() { return communicationLanguage; } public void setCommunicationLanguage(final Locale communicationLanguage) { this.communicationLanguage = communicationLanguage; } @Column(length = 255) public String getFingerprint() { return fingerprint; } public void setFingerprint(final String fingerprint) { this.fingerprint = fingerprint; } @Column(name = "first_name", length = 255) public String getFirstName() { return firstName; } public AddressDO setFirstName(final String firstName) { this.firstName = firstName; return this; } @Transient public String getFullName() { return StringHelper.listToString(", ", name, firstName); } @Transient public String getFullNameWithTitleAndForm() { final StringBuffer buf = new StringBuffer(); if (getForm() != null) { buf.append(ThreadLocalUserContext.getLocalizedString(getForm().getI18nKey())).append(" "); } if (getTitle() != null) { buf.append(getTitle()).append(" "); } if (getFirstName() != null) { buf.append(getFirstName()).append(" "); } if (getName() != null) { buf.append(getName()); } return buf.toString(); } @Column(length = 255) public String getName() { return name; } public AddressDO setName(final String name) { this.name = name; return this; } @Enumerated(EnumType.STRING) @Column(name = "form", length = 10) public FormOfAddress getForm() { return form; } public AddressDO setForm(final FormOfAddress form) { this.form = form; return this; } @Column(length = 255) public String getOrganization() { return organization; } public AddressDO setOrganization(final String organization) { this.organization = organization; return this; } @Column(length = 255) public String getDivision() { return division; } public void setDivision(final String division) { this.division = division; } @Column(length = 255) public String getPositionText() { return positionText; } public void setPositionText(final String positionText) { this.positionText = positionText; } @Column(name = "private_phone", length = 255) public String getPrivatePhone() { return privatePhone; } public AddressDO setPrivatePhone(final String privatePhone) { this.privatePhone = privatePhone; return this; } @Column(name = "private_mobile_phone", length = 255) public String getPrivateMobilePhone() { return privateMobilePhone; } public void setPrivateMobilePhone(final String mobilePhone) { this.privateMobilePhone = mobilePhone; } @Column(length = 255, name = "private_addresstext") public String getPrivateAddressText() { return privateAddressText; } public void setPrivateAddressText(final String privateAddressText) { this.privateAddressText = privateAddressText; } @Column(name = "private_zip_code", length = 255) public String getPrivateZipCode() { return privateZipCode; } public void setPrivateZipCode(final String zipCode) { this.privateZipCode = zipCode; } @Column(length = 255, name = "private_city") public String getPrivateCity() { return privateCity; } public void setPrivateCity(final String city) { this.privateCity = city; } @Column(name = "private_country", length = 255) public String getPrivateCountry() { return privateCountry; } public void setPrivateCountry(final String privateCountry) { this.privateCountry = privateCountry; } @Column(name = "private_state", length = 255) public String getPrivateState() { return privateState; } public void setPrivateState(final String privateState) { this.privateState = privateState; } @Column(length = 255, name = "private_email") public String getPrivateEmail() { return privateEmail; } public AddressDO setPrivateEmail(final String email) { this.privateEmail = email; return this; } @Column(name = "public_key", length = 20000) public String getPublicKey() { return publicKey; } public void setPublicKey(final String publicKey) { this.publicKey = publicKey; } /** * Not used as object due to performance reasons. * * @return */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "task_id", nullable = false) public TaskDO getTask() { return task; } public void setTask(final TaskDO task) { this.task = task; } @Transient public Integer getTaskId() { if (this.task == null) { return null; } return task.getId(); } @Column(length = 255) public String getTitle() { return title; } public AddressDO setTitle(final String title) { this.title = title; return this; } /** * @return address text of mailing address (in order: postal, default or private address). * @see #hasPostalAddress() * @see #hasDefaultAddress() */ @Transient public String getMailingAddressText() { if (hasPostalAddress() == true) { return getPostalAddressText(); } else if (hasDefaultAddress() == true) { return getAddressText(); } else { return getPrivateAddressText(); } } /** * @return zip code of mailing address (in order: postal, default or private address). * @see #hasPostalAddress() * @see #hasDefaultAddress() */ @Transient public String getMailingZipCode() { if (hasPostalAddress() == true) { return getPostalZipCode(); } else if (hasDefaultAddress() == true) { return getZipCode(); } else { return getPrivateZipCode(); } } /** * @return city of mailing address (in order: postal, default or private address). * @see #hasPostalAddress() * @see #hasDefaultAddress() */ @Transient public String getMailingCity() { if (hasPostalAddress() == true) { return getPostalCity(); } else if (hasDefaultAddress() == true) { return getCity(); } else { return getPrivateCity(); } } /** * @return country of mailing address (in order: postal, default or private address). * @see #hasPostalAddress() * @see #hasDefaultAddress() */ @Transient public String getMailingCountry() { if (hasPostalAddress() == true) { return getPostalCountry(); } else if (hasDefaultAddress() == true) { return getCountry(); } else { return getPrivateCountry(); } } /** * @return state of mailing address (in order: postal, default or private address). * @see #hasPostalAddress() * @see #hasDefaultAddress() */ @Transient public String getMailingState() { if (hasPostalAddress() == true) { return getPostalState(); } else if (hasDefaultAddress() == true) { return getState(); } else { return getPrivateState(); } } /** * @return true, if postal addressText, zip code, city or country is given. */ @Transient public boolean hasPostalAddress() { return StringHelper.isNotBlank(getPostalAddressText(), getPostalZipCode(), getPostalCity(), getPostalCountry()); } /** * @return true, if default addressText, zip code, city or country is given. */ @Transient public boolean hasDefaultAddress() { return StringHelper.isNotBlank(getAddressText(), getZipCode(), getCity(), getCountry()); } /** * @return true, if private addressText, zip code, city or country is given. */ @Transient public boolean hasPrivateAddress() { return StringHelper.isNotBlank(getPrivateAddressText(), getPrivateZipCode(), getPrivateCity(), getPrivateCountry()); } /** * List of instant messaging contacts in the form of a property file: {skype=hugo.mustermann\naim=12345dse}. Only for * data base access, use getter an setter of instant messaging instead. * * @return */ // @Column(name = "instant_messaging", length = 4000) @Transient // TODO: Prepared for data base persistence. public String getInstantMessaging4DB() { return getInstantMessagingAsString(instantMessaging); } public void setInstantMessaging4DB(final String properties) { if (StringUtils.isBlank(properties) == true) { this.instantMessaging = null; } else { final StringTokenizer tokenizer = new StringTokenizer(properties, "\n"); while (tokenizer.hasMoreTokens() == true) { final String line = tokenizer.nextToken(); if (StringUtils.isBlank(line) == true) { continue; } final int idx = line.indexOf('='); if (idx <= 0) { log.error("Wrong instant messaging entry format in data base: " + line); continue; } String label = line.substring(0, idx); final String value = ""; if (idx < line.length()) { label = line.substring(idx); } InstantMessagingType type = null; try { type = InstantMessagingType.get(label); } catch (final Exception ex) { log.error("Ignoring unknown Instant Messaging entry: " + label, ex); continue; } setInstantMessaging(type, value); } } } /** * Instant messaging settings as property file. * * @return */ @Transient public List<LabelValueBean<InstantMessagingType, String>> getInstantMessaging() { return instantMessaging; } public void setInstantMessaging(final InstantMessagingType type, final String value) { if (this.instantMessaging == null) { this.instantMessaging = new ArrayList<LabelValueBean<InstantMessagingType, String>>(); } else { for (final LabelValueBean<InstantMessagingType, String> entry : this.instantMessaging) { if (entry.getLabel() == type) { // Entry found; if (StringUtils.isBlank(value) == true) { // Remove this entry: this.instantMessaging.remove(entry); } else { // Modify existing entry: entry.setValue(value); } return; } } } this.instantMessaging.add(new LabelValueBean<InstantMessagingType, String>(type, value)); } /** * Used for representation in the data base and for hibernate search (lucene). */ static String getInstantMessagingAsString(final List<LabelValueBean<InstantMessagingType, String>> list) { if (list == null || list.size() == 0) { return null; } final StringBuffer buf = new StringBuffer(); boolean first = true; for (final LabelValueBean<InstantMessagingType, String> lv : list) { if (StringUtils.isBlank(lv.getValue()) == true) { continue; // Do not write empty entries. } if (first == true) { first = false; } else { buf.append("\n"); } buf.append(lv.getLabel()).append("=").append(lv.getValue()); } if (first == true) { return null; // No entry was written. } return buf.toString(); } /** * @see org.projectforge.framework.persistence.attr.entities.DefaultBaseWithAttrDO#getAttrEntityClass() */ @Override @Transient public Class<? extends JpaTabAttrBaseDO<AddressDO, Integer>> getAttrEntityClass() { return AddressAttrDO.class; } /** * @see org.projectforge.framework.persistence.attr.entities.DefaultBaseWithAttrDO#getAttrEntityWithDataClass() */ @Override @Transient public Class<? extends JpaTabAttrBaseDO<AddressDO, Integer>> getAttrEntityWithDataClass() { return AddressAttrWithDataDO.class; } /** * @see org.projectforge.framework.persistence.attr.entities.DefaultBaseWithAttrDO#getAttrDataEntityClass() */ @Override @Transient public Class<? extends JpaTabAttrDataBaseDO<? extends JpaTabAttrBaseDO<AddressDO, Integer>, Integer>> getAttrDataEntityClass() { return AddressAttrDataDO.class; } /** * @see org.projectforge.framework.persistence.attr.entities.DefaultBaseWithAttrDO#createAttrEntity(java.lang.String, * char, java.lang.String) */ @Override public JpaTabAttrBaseDO<AddressDO, Integer> createAttrEntity(String key, char type, String value) { return new AddressAttrDO(this, key, type, value); } /** * @see org.projectforge.framework.persistence.attr.entities.DefaultBaseWithAttrDO#createAttrEntityWithData(java.lang.String, * char, java.lang.String) */ @Override public JpaTabAttrBaseDO<AddressDO, Integer> createAttrEntityWithData(String key, char type, String value) { return new AddressAttrWithDataDO(this, key, type, value); } @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", targetEntity = AddressAttrDO.class, orphanRemoval = true, fetch = FetchType.EAGER) @MapKey(name = "propertyName") @Override @HistoryProperty(converter = TabAttrHistoryPropertyConverter.class) public Map<String, JpaTabAttrBaseDO<AddressDO, Integer>> getAttrs() { return super.getAttrs(); } }