/*
* Created on Sep 13, 2005
*/
package org.openedit.data;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.openedit.xml.XmlFile;
public class PropertyDetails extends AbstractCollection
{
protected List fieldDetails;
protected Map fieldDetailsCached;
protected Map fieldExternalIdCache;
protected Map fieldDefaults;
protected XmlFile fieldInputFile;
protected String fieldPrefix;
protected String fieldBeanName;
protected String fieldToString;
protected String fieldClassName;//The object type to create
public String getClassName()
{
if( fieldClassName == null)
{
if( getInputFile() != null && getInputFile().getRoot() != null)
{
fieldClassName = getInputFile().getRoot().attributeValue("class");
}
// if( fieldBeanName == null )
// {
// fieldBeanName = "dynamicSearcher";
// }
}
return fieldClassName;
}
public void setClassName(String inClassName)
{
fieldClassName = inClassName;
}
public String getBeanName()
{
if( fieldBeanName == null)
{
if( getInputFile() != null && getInputFile().getRoot() != null)
{
fieldBeanName = getInputFile().getRoot().attributeValue("beanname");
}
// if( fieldBeanName == null )
// {
// fieldBeanName = "dynamicSearcher";
// }
}
return fieldBeanName;
}
public void setBeanName(String inBeanName)
{
fieldBeanName = inBeanName;
}
/**
* This is used for autocomplete fields when searching on this table that may not have a name column
* @return
*/
public String getRender()
{
if( fieldToString == null)
{
if( getInputFile() != null && getInputFile().getRoot() != null)
{
fieldToString = getInputFile().getRoot().attributeValue("tostring");
}
// if( fieldBeanName == null )
// {
// fieldBeanName = "dynamicSearcher";
// }
}
return fieldToString;
}
public void setRender(String inBeanName)
{
fieldToString = inBeanName;
}
public PropertyDetails()
{
// TODO Auto-generated constructor stub
}
public XmlFile getInputFile()
{
return fieldInputFile;
}
public void setInputFile(XmlFile inInputFile)
{
fieldInputFile = inInputFile;
}
public Map getDefaults() {
if (fieldDefaults == null) {
fieldDefaults = new HashMap();
}
return fieldDefaults;
}
public void setDefaults(Map inDefaults) {
fieldDefaults = inDefaults;
}
long fieldLastLoaded;
public List getDetails() {
if (fieldDetails == null) {
fieldDetails = new ArrayList();
}
return fieldDetails;
}
public void addDetail(PropertyDetail inDetail) {
PropertyDetail oldDetail = getDetail(inDetail.getId());
if(oldDetail != null){
getDetails().remove(oldDetail);
}
getDetails().add(inDetail);
getDetailsCached().remove(inDetail.getId());
getDetailsCached().put(inDetail.getId(), inDetail);
}
public List findIndexProperties() {
List list = new ArrayList(getDetails().size());
for (Iterator iter = getDetails().iterator(); iter.hasNext();) {
PropertyDetail d = (PropertyDetail) iter.next();
if (d.isIndex()) {
list.add(d);
}
}
return list;
}
public List findKeywordProperties() {
List list = new ArrayList(getDetails().size());
for (Iterator iter = getDetails().iterator(); iter.hasNext();) {
PropertyDetail d = (PropertyDetail) iter.next();
if (d.isKeyword()) {
list.add(d);
}
}
return list;
}
public List findStoredProperties() {
List list = new ArrayList(getDetails().size());
for (Iterator iter = getDetails().iterator(); iter.hasNext();) {
PropertyDetail d = (PropertyDetail) iter.next();
if (d.isStored()) {
list.add(d);
}
}
return list;
}
// public List findSearchProperties()
// {
// List list = new ArrayList(getDetails().size());
//
// for (Iterator iter = getDetails().iterator(); iter.hasNext();)
// {
// Detail d = (Detail) iter.next();
//
// if ( d.isSearchable() )
// {
// list.add(d);
// }
// }
// return list;
// }
//
public boolean contains(String inKey) {
PropertyDetail det = getDetail(inKey);
return det != null;
}
public Map<String,PropertyDetail> getDetailsCached()
{
if (fieldDetailsCached == null)
{
fieldDetailsCached = new HashMap(getDetails().size());
for (Iterator iter = getDetails().iterator(); iter.hasNext();)
{
PropertyDetail detail = (PropertyDetail) iter.next();
fieldDetailsCached.put(detail.getId(),detail);
}
}
return fieldDetailsCached;
}
public PropertyDetail getDetail(String inId) {
if (inId == null) {
return null;
}
PropertyDetail detail = getDetailsCached().get(inId);
return detail;
}
public void removeDetail(String inId) {
PropertyDetail toRemove = null;
for (Iterator iterator = getDetails().iterator(); iterator.hasNext();) {
PropertyDetail detail = (PropertyDetail) iterator.next();
if (inId.equals(detail.getId())) {
toRemove = detail;
}
}
if (toRemove != null) {
getDetails().remove(toRemove);
}
}
/**
* inName should be lower case with or without spaces
* @param inName
* @return
*/
public PropertyDetail getDetailByExternalId(String inName)
{
PropertyDetail found = (PropertyDetail) getExternalIdCache()
.get(inName);
if (found == null) {
for (Iterator iter = getDetails().iterator(); iter.hasNext();) {
PropertyDetail detail = (PropertyDetail) iter.next();
String[] all = detail.getExternalIds();
if (all != null) {
for (int i = 0; i < all.length; i++)
{
String id = all[i].toLowerCase();
String targetname = inName.toLowerCase();
//strip off the : from XMP-dc:Title
int index = id.indexOf(':');
if( index > 0 )
{
id = id.substring(index + 1);
}
if (targetname.equals(id) || targetname.equals(id.replace(" ", "")))
{
found = detail;
getExternalIdCache().put(inName, found);
break;
}
}
}
}
}
return found;
}
public List getDetailsByProperty(String property, String value) {
//TODO: Add a cache here.
List properties = new ArrayList();
for (Iterator iter = getDetails().iterator(); iter.hasNext();) {
PropertyDetail detail = (PropertyDetail) iter.next();
String val = detail.get(property);
if (value.equals(val)) {
properties.add(detail);
}
}
return properties;
}
public List getDetailsByType(String property, String value) {
List properties = new ArrayList();
for (Iterator iter = getDetails().iterator(); iter.hasNext();) {
PropertyDetail detail = (PropertyDetail) iter.next();
String val = detail.get(property);
if (value.equals(val)) {
properties.add(detail);
}
}
return properties;
}
public long getLastLoaded() {
return fieldLastLoaded;
}
public void setLastLoaded(long inLastLoaded) {
fieldLastLoaded = inLastLoaded;
}
public Iterator iterator() {
return getDetails().iterator();
}
public int size() {
return getDetails().size();
}
public void setDetails(List inNewdetails) {
fieldDetails = new ArrayList(inNewdetails);
}
public Map getExternalIdCache() {
if (fieldExternalIdCache == null) {
fieldExternalIdCache = new HashMap();
}
return fieldExternalIdCache;
}
public String getPrefix()
{
if( fieldPrefix == null)
{
if( getInputFile() != null && getInputFile().getRoot() != null)
{
fieldPrefix = getInputFile().getRoot().attributeValue("prefix");
}
}
return fieldPrefix;
}
public void setPrefix(String fieldPrefix)
{
this.fieldPrefix = fieldPrefix;
}
}