package ecologylab.bigsemantics.metametadata;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import ecologylab.bigsemantics.metadata.Metadata;
import ecologylab.generic.HashMapArrayList;
import ecologylab.net.ParsedURL;
import ecologylab.serialization.ElementState;
import ecologylab.serialization.FieldDescriptor;
import ecologylab.serialization.annotations.simpl_collection;
import ecologylab.serialization.annotations.simpl_inherit;
import ecologylab.serialization.annotations.simpl_map;
import ecologylab.serialization.annotations.simpl_nowrap;
import ecologylab.serialization.annotations.simpl_scalar;
import ecologylab.serialization.annotations.simpl_tag;
import ecologylab.serialization.types.element.IMappable;
/**
*
* @author rhema Contains all of the information that one should need to define when a particular
* MetaMetadata object should be selected.
*
*/
public @simpl_inherit
class MetaMetadataSelector extends ElementState implements IMappable<String>
{
public static final ArrayList<MetaMetadataSelector> NULL_SELECTOR = new ArrayList<MetaMetadataSelector>();
@simpl_scalar
private String name;
@simpl_scalar
private String prefName;
@simpl_scalar
private String defaultPref;
@simpl_scalar
private ParsedURL urlStripped;
@simpl_scalar
private ParsedURL urlPathTree;
/**
* Regular expression. Must be paired with domain. This is the least efficient form of matcher, so
* it should be used only when url_base & url_prefix cannot be used.
*/
@simpl_scalar
private Pattern urlRegex;
@simpl_scalar
private Pattern urlRegexFragment;
/**
* This key is *required* for urlPatterns, so that we can organize them efficiently.
*/
@simpl_scalar
private String domain;
@simpl_collection("mime_type")
@simpl_nowrap
private ArrayList<String> mimeTypes;
@simpl_collection("suffix")
@simpl_nowrap
private ArrayList<String> suffixes;
/* followings are used for selecting another meta-metadata according to a particular field */
@simpl_scalar
@simpl_tag("meta_metadata_name")
private String reselectMetaMetadataName;
@simpl_nowrap
@simpl_map("field")
private HashMapArrayList<String, MetaMetadataSelectorReselectField> reselectFields;
@simpl_nowrap
@simpl_map("param")
private HashMapArrayList<String, MetaMetadataSelectorParam> params;
public MetaMetadataSelector()
{
}
public ParsedURL getUrlStripped()
{
return urlStripped;
}
public void setUrlStripped(ParsedURL urlStripped)
{
this.urlStripped = urlStripped;
}
public ParsedURL getUrlPathTree()
{
return urlPathTree;
}
public void setUrlPathTree(ParsedURL urlPathTree)
{
this.urlPathTree = urlPathTree;
}
public Pattern getUrlRegex()
{
return urlRegex;
}
public void setUrlRegex(Pattern urlRegex)
{
this.urlRegex = urlRegex;
}
public Pattern getUrlRegexFragment()
{
return urlRegexFragment;
}
public String getDomain()
{
return domain;
}
public void setDomain(String domain)
{
this.domain = domain;
}
/**
* @param mimeTypes
* the mimeTypes to set
*/
public void setMimeTypes(ArrayList<String> mimeTypes)
{
this.mimeTypes = mimeTypes;
}
/**
* @return the mimeTypes
*/
public ArrayList<String> getMimeTypes()
{
return mimeTypes;
}
/**
* @param suffixes
* the suffixes to set
*/
public void setSuffixes(ArrayList<String> suffixes)
{
this.suffixes = suffixes;
}
/**
* @return the suffixes
*/
public ArrayList<String> getSuffixes()
{
return suffixes;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setPrefName(String cfPref)
{
this.prefName = cfPref;
}
public String getPrefName()
{
return prefName;
}
@Override
public String key()
{
return name;
}
public String getDefaultPref()
{
return defaultPref;
}
public void setDefaultPref(String defaultPref)
{
this.defaultPref = defaultPref;
}
public String getReselectMetaMetadataName()
{
return reselectMetaMetadataName;
}
public boolean reselect(Metadata metadata)
{
if (reselectFields == null || reselectFields.isEmpty())
return false;
for (String fieldName : reselectFields.keySet())
{
FieldDescriptor fd = metadata.getMetadataClassDescriptor().getFieldDescriptorByFieldName(fieldName);
String actualValue = fd.getValueString(metadata);
String expectedValue = reselectFields.get(fieldName).getValue();
if (!actualValue.equals(expectedValue))
return false;
}
return true;
}
public Map<String, MetaMetadataSelectorParam> getParams()
{
return params;
}
void addParam(MetaMetadataSelectorParam param)
{
if (params == null)
params = new HashMapArrayList<String, MetaMetadataSelectorParam>();
params.put(param.getName(), param);
}
public boolean checkForParams(final ParsedURL purl)
{
if (params != null)
{
HashMap<String, String> purlParams = purl.extractParams(true);
for (MetaMetadataSelectorParam param : params)
{
String paramName = param.getName();
String paramValue = param.getValue();
String paramValueIsNot = param.getValueIsNot();
String actualValue = purlParams == null ? null : purlParams.get(paramName);
if (actualValue == null)
{
actualValue = "";
}
if (paramValue != null && paramValue.length() > 0)
{
boolean allowEmptyAndIsEmpty = param.isAllowEmptyValue() && actualValue.length() == 0;
if (!allowEmptyAndIsEmpty && !paramValue.equals(actualValue))
{
return false;
}
}
if (paramValueIsNot != null && paramValueIsNot.length() > 0)
{
if (paramValueIsNot.equals(actualValue))
{
return false;
}
}
}
}
return true;
}
}