blob: 9f241d8074aebff0ef79cdc2a9bf91767ecb9f45 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.client.core.model;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.persistence.Basic;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.Version;
import org.apache.commons.lang.LocaleUtils;
import org.apache.commons.lang.Validate;
import org.eclipse.jubula.tools.constants.StringConstants;
import org.eclipse.persistence.annotations.BatchFetch;
import org.eclipse.persistence.annotations.BatchFetchType;
/**
* utility class for management of values or references
*
* @author BREDEX GmbH
* @created 08.12.2004
*/
@Entity
@Table(name = "TEST_DATA")
class TestDataPO implements ITestDataPO {
/**
* <code>DEFAULT_NUMBER_OF_LANGUAGES</code> the default number of Languages
* to hold
*/
public static final int DEFAULT_NUMBER_OF_LANGUAGES = 2;
/** Persistence (JPA / EclipseLink) OID */
private transient Long m_id = null;
/** maps languages (locales) to string values
* key: Locale (string representation), value: value as string
*/
private Map<String, String> m_map =
new HashMap<String, String>(DEFAULT_NUMBER_OF_LANGUAGES);
/** Persistence (JPA / EclipseLink) version id */
private transient Integer m_version = null;
/** The ID of the parent project */
private Long m_parentProjectId = null;
/**
* constructor for TestDataPO with value
* @param languageToValue The initial values for the created object.
*/
TestDataPO(Map<Locale, String> languageToValue) {
for (Locale language : languageToValue.keySet()) {
setValue(language, languageToValue.get(language));
}
}
/**
* constructor only for Persistence (JPA / EclipseLink)
*/
TestDataPO() {
// only for Persistence (JPA / EclipseLink)
}
/**
*
* @return Returns the id.
*/
@Id
@GeneratedValue
public Long getId() {
return m_id;
}
/**
* @param id The id to set.
*/
void setId(Long id) {
m_id = id;
}
/**
*
* {@inheritDoc}
*/
@Transient
public Long getParentProjectId() {
return getHbmParentProjectId();
}
/**
*
* {@inheritDoc}
*/
public void setParentProjectId(Long projectId) {
setHbmParentProjectId(projectId);
}
/**
*
* {@inheritDoc}
*/
@Basic
@Column(name = "PARENT_PROJ")
Long getHbmParentProjectId() {
return m_parentProjectId;
}
/**
*
* {@inheritDoc}
*/
void setHbmParentProjectId(Long projectId) {
m_parentProjectId = projectId;
}
/**
*
* {@inheritDoc}
*/
@Version
public Integer getVersion() {
return m_version;
}
/**
* @param version version
*/
@SuppressWarnings("unused")
private void setVersion(Integer version) {
m_version = version;
}
/**
* {@inheritDoc}
* @return empty string
*/
@Transient
public String getName() {
return StringConstants.EMPTY;
}
/**
* Creates a deep copy of this instance.
*
* @return The new test data instance
*/
public ITestDataPO deepCopy() {
TestDataPO td = new TestDataPO();
td.getMap().putAll(getMap());
td.setParentProjectId(getParentProjectId());
return td;
}
/**
* only for Persistence (JPA / EclipseLink)
*
* @return Returns the map.
*/
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "LOCALE_TO_TD")
@MapKeyColumn(name = "LOCALE")
@Column(name = "TD_VALUE", length = MAX_STRING_LENGTH, nullable = false)
@JoinColumn(name = "I18N_STR")
@BatchFetch(value = BatchFetchType.JOIN)
private Map<String, String> getMap() {
return m_map;
}
/**
* only for Persistence (JPA / EclipseLink)
* @param map The map to set.
*/
void setMap(Map<String, String> map) {
m_map = map;
}
/**
* set the value for the given language
* @param lang language, for which to set the value
* @param value value
* @param project associated project
*/
public void setValue(Locale lang, String value, IProjectPO project) {
if (validateLang(lang, project)) {
setValue(lang, value);
setParentProjectId(project.getId());
}
}
/**
* set the value for the given language
* @param lang language, for which to set the value
* @param value value
*/
private void setValue(Locale lang, String value) {
if (value != null && value.length() != 0) {
getMap().put(lang.toString(), value);
} else {
getMap().remove(lang.toString());
}
}
/**
* @param lang language to validate
* @param project associated project, for which to use an I18N string object
* @return flag, if the given language is a supported language inside of
* actual project
*/
private boolean validateLang(Locale lang, IProjectPO project) {
return project.getLangHelper().containsItem(lang);
}
/**
* get the value for a given locale
* @param lang language, for which to get the value
* @return value
*/
public String getValue(Locale lang) {
Validate.notNull(lang);
return getMap().get(lang.toString());
}
/**
* @return a set of all Locale's used in this I18NString
*/
@Transient
public Set<Locale> getLanguages() {
Set<Locale> supportedLocales = new java.util.HashSet<Locale>();
for (String localeCode : getMap().keySet()) {
supportedLocales.add(LocaleUtils.toLocale(localeCode));
}
return supportedLocales;
}
/**
* {@inheritDoc}
* @return
*/
public String toString() {
SortedSet<String> sorter = new TreeSet<String>();
for (Entry<String, String> entry : getMap().entrySet()) {
sorter.add(entry.getKey() + StringConstants.COLON
+ entry.getValue());
}
StringBuilder result = new StringBuilder(sorter.size() * 100);
for (String line : sorter) {
result.append(line);
result.append(StringConstants.NEWLINE);
}
return result.toString();
}
/**
* {@inheritDoc}
*/
public void setData(ITestDataPO testData) {
for (Locale language : testData.getLanguages()) {
setValue(language, testData.getValue(language));
}
}
/**
* {@inheritDoc}
*/
public void clear() {
m_map.clear();
}
}