package ecologylab.bigsemantics.metametadata;
import ecologylab.generic.StringTools;
import ecologylab.net.ParsedURL;
import ecologylab.serialization.ElementState;
import ecologylab.serialization.annotations.simpl_inherit;
import ecologylab.serialization.annotations.simpl_scalar;
@simpl_inherit
public class UrlGenerator extends ElementState
{
public static final String TYPE_SEARCH = "search";
public static final String TYPE_PATTERN = "pattern";
@simpl_scalar
private String type;
@simpl_scalar
private String engine;
@simpl_scalar
private String useId;
@simpl_scalar
private String pattern;
private String patternInvolvedId;
public String getType()
{
return type;
}
public String getEngine()
{
return engine;
}
public String getUseId()
{
return useId;
}
public String getPattern()
{
return pattern;
}
private String getPatternInvolvedId()
{
if (patternInvolvedId == null && pattern != null)
{
int begin = pattern.indexOf('{');
int end = pattern.indexOf('}', begin + 1);
if (begin >= 0 && end >= 0 && end > begin)
{
String id = pattern.substring(begin + 1, end);
if (!StringTools.isNullOrEmpty(id))
{
patternInvolvedId = id;
}
}
}
return patternInvolvedId;
}
public boolean canGenerate(String naturalId)
{
if (naturalId == null)
return false;
if (TYPE_SEARCH.equals(getType()))
{
return naturalId.equals(getUseId());
}
else if (TYPE_PATTERN.equals(getType()))
{
return naturalId.equals(getPatternInvolvedId());
}
return false;
}
public ParsedURL generate(MetaMetadataRepository repository, String naturalId, String value)
{
if (naturalId == null || value == null)
return null;
if (TYPE_SEARCH.equals(getType()) && naturalId.equals(useId))
{
SearchEngine searchEngine = repository.getSearchEngine(engine);
if (searchEngine != null)
{
return searchEngine.formSearchUrl(value, 0, 0);
}
else
{
warning("can't generate url because search engine not defined for " + engine);
}
}
else if (TYPE_PATTERN.equals(getType()) && naturalId.equals(getPatternInvolvedId()))
{
String url = new String(pattern);
url = url.replace("{" + naturalId + "}", value);
return ParsedURL.getAbsolute(url);
}
return null;
}
}