/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.thunderbird;
import java.util.Map;
import java.util.regex.*;
import org.jitsi.service.configuration.*;
import mork.Row;
import net.java.sip.communicator.service.contactsource.*;
/**
* Query creator for an instance of a Thunderbird address book.
*
* @author Ingo Bauersachs
*/
public class ThunderbirdContactSourceService
implements ExtendedContactSourceService, PrefixedContactSourceService
{
/**
* Name of the base-property for a Thunderbird address book configuration.
*/
public final static String PNAME_BASE_THUNDERBIRD_CONFIG =
"net.java.sip.communicator.plugin.thunderbird.source";
/**
* Property-name, appended to
* {@link ThunderbirdContactSourceService#PNAME_BASE_THUNDERBIRD_CONFIG} ,
* that indicates the address-book database filename.
*/
public final static String PNAME_FILENAME = "FILENAME";
/**
* Property-name, appended to
* {@link ThunderbirdContactSourceService#PNAME_BASE_THUNDERBIRD_CONFIG} ,
* that indicates the display-name shown as the contact group.
*/
public final static String PNAME_DISPLAYNAME = "DISPLAYNAME";
/**
* Property-name, appended to
* {@link ThunderbirdContactSourceService#PNAME_BASE_THUNDERBIRD_CONFIG} ,
* that indicates the priority in the search results.
*/
public final static String PNAME_INDEX = "INDEX";
/**
* Property-name, appended to
* {@link ThunderbirdContactSourceService#PNAME_BASE_THUNDERBIRD_CONFIG} ,
* that indicates the telephone-number prefix.
*/
public final static String PNAME_PREFIX = "PREFIX";
/** Reference to the configuration service */
ConfigurationService config = ThunderbirdActivator.getConfigService();
/** The base property name to which the other PNAME_ will be appended */
private final String baseConfigProperty;
/** Value of property {@link #PNAME_FILENAME} */
private String fileName;
/** Value of property {@link #PNAME_DISPLAYNAME} */
private final String displayName;
/** Value of property {@link #PNAME_INDEX} */
private final int index;
/** Value of property {@link #PNAME_PREFIX} */
private String prefix;
/** Date/time when the Thunderbird database file was last changed. */
long lastDatabaseFileChange = 0;
/**
* The parsed Thunderbird database. This field is used as a cache and set by
* the query. It is re-set when the file date is newer than
* {@link #lastDatabaseFileChange}
*/
Map<String, Map<String, Row>> database;
/** Name of the default namespace in the Thunderbird database. */
String defaultScope;
/**
* Creates a new instance of this class.
*
* @param baseConfigProperty The base property name of the config for this
* instance
*/
public ThunderbirdContactSourceService(String baseConfigProperty)
{
this.baseConfigProperty = baseConfigProperty;
this.fileName =
config.getString(baseConfigProperty + "." + PNAME_FILENAME);
this.displayName =
config.getString(baseConfigProperty + "." + PNAME_DISPLAYNAME);
this.index = config.getInt(baseConfigProperty + "." + PNAME_INDEX, 0);
this.prefix = config.getString(baseConfigProperty + "." + PNAME_PREFIX);
}
/**
* Gets the base property name to which the other PNAME_ will be appended.
* @return the base property name.
*/
String getBaseConfigProperty()
{
return this.baseConfigProperty;
}
/*
* (non-Javadoc)
*
* @see net.java.sip.communicator.service.contactsource
* .ContactSourceService#getType()
*/
public int getType()
{
return DEFAULT_TYPE;
}
/*
* (non-Javadoc)
*
* @see net.java.sip.communicator.service.contactsource
* .ContactSourceService#getDisplayName()
*/
public String getDisplayName()
{
return this.displayName;
}
/*
* (non-Javadoc)
*
* @see net.java.sip.communicator.service.contactsource
* .ContactSourceService#queryContactSource(java.lang.String)
*/
public ContactQuery createContactQuery(String queryString)
{
Pattern pattern = null;
try
{
pattern = Pattern.compile(queryString, Pattern.CASE_INSENSITIVE);
}
catch(PatternSyntaxException pse)
{
pattern = Pattern.compile(
Pattern.quote(queryString),
Pattern.CASE_INSENSITIVE);
}
if(pattern != null)
{
return createContactQuery(pattern);
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* net.java.sip.communicator.service.contactsource.ContactSourceService#
* queryContactSource(java.lang.String, int)
*/
public ContactQuery createContactQuery(String queryString, int contactCount)
{
// XXX: The ThunderbirdContactQuery does not tqke a contactCount
// argument yet. Thus, call the default queryContactSource function.
return createContactQuery(queryString);
}
/*
* (non-Javadoc)
*
* @see
* net.java.sip.communicator.service.contactsource.ExtendedContactSourceService
* #queryContactSource(java.util.regex.Pattern)
*/
public ContactQuery createContactQuery(Pattern queryPattern)
{
return new ThunderbirdContactQuery(this, queryPattern);
}
/*
* (non-Javadoc)
*
* @see
* net.java.sip.communicator.service.contactsource.ContactSourceService#
* getIndex()
*/
public int getIndex()
{
return this.index;
}
/*
* (non-Javadoc)
*
* @see
* net.java.sip.communicator.service.contactsource.ExtendedContactSourceService
* #getPhoneNumberPrefix()
*/
@Override
public String getPhoneNumberPrefix()
{
return this.prefix;
}
/**
* Sets a new phone number prefix to use from now on.
* @param prefix the new prefix.
*/
void setPhoneNumberPrefix(String prefix)
{
this.prefix = prefix;
config.setProperty(this.baseConfigProperty + "." + PNAME_PREFIX,
prefix);
}
/**
* Gets the filename to the address book database processed by this
* ContactSource.
*
* @return The filename to the address book database.
*/
String getFilename()
{
return this.fileName;
}
/**
* Sets a new database file name to use from now on.
* @param filename the new file name.
*/
void setFilename(String filename)
{
this.fileName = filename;
config.setProperty(this.baseConfigProperty + "." + PNAME_FILENAME,
filename);
}
}