package mircoders.abuse;
-import mir.config.MirPropertiesConfiguration;
import mir.entity.Entity;
import mir.entity.adapter.EntityAdapter;
import mir.entity.adapter.EntityAdapterModel;
import mir.log.LoggerWrapper;
import mir.session.Request;
import mir.storage.DatabaseExc;
+import mir.storage.DatabaseHelper;
import mircoders.global.MirGlobal;
import mircoders.storage.DatabaseFilter;
import mircoders.storage.DatabaseFilterGroup;
-import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
/** The FilterEngine manages a list of all filters and filter groups.
* Use the testPosting() method to apply all filters on an
* Entity (for ex. an article or a comment)
*/
public class FilterEngine {
- private Map filterTypes;
- private List filterTypeIds;
+ private final Map filterTypes = new HashMap();
+ private final List filterTypeIds = new ArrayList();
- private List filterGroups;
- private Map idToFilterGroup;
- private LoggerWrapper logger;
+ private final List filterGroups = new ArrayList();
+ private final Map idToFilterGroup = new HashMap();
+ private final LoggerWrapper logger = new LoggerWrapper("Global.Abuse.FilterEngine");
private EntityAdapterModel model;
- private SimpleDateFormat dateFormat;
- private MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance();
public FilterEngine(EntityAdapterModel aModel) {
- logger = new LoggerWrapper("Global.Abuse.FilterEngine");
- filterGroups = new ArrayList();
- idToFilterGroup = new HashMap();
-
- filterTypes = new HashMap();
- filterTypeIds = new ArrayList();
try {
Iterator i = MirGlobal.localizer().openPostings().getAntiAbuseFilterTypes().iterator();
while (i.hasNext()) {
model = aModel;
- dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- dateFormat.setTimeZone(TimeZone.getTimeZone(configuration.getString("Mir.DefaultTimezone")));
reload();
}
+
/** applies all filters from all filter groups to an Entity.
* The entity may be, for example, an article, or a comment.
* It returns a filter that matches if it finds one, null otherwise
*/
- public Filter testPosting(Entity anEntity, Request aRequest) {
+ public synchronized Filter testPosting(Entity anEntity, Request aRequest) {
Iterator i = filterGroups.iterator();
while (i.hasNext()) {
FilterGroup group = (FilterGroup) i.next();
+
Iterator j = group.getFilters().iterator();
while (j.hasNext()) {
Filter filter = (Filter) j.next();
return result;
}
catch (Throwable t) {
- throw new RuntimeException("can't get article actions");
+ throw new RuntimeException("can't get article actions: " + t.getMessage());
}
}
/** This class reflects a row of the filter_group
}
public void updateLastHit(Date aDate) {
- entity.setFieldValue("last_hit", dateFormat.format(aDate));
+ entity.setFieldValue("last_hit",
+ DatabaseHelper.convertDateToInternalRepresenation(
+ new Date(System.currentTimeMillis())));
entity.update();
}
while (i.hasNext()) {
EntityAdapter entityAdapter = (EntityAdapter) i.next();
List filters = new ArrayList();
- Iterator j = (Iterator) entityAdapter.get("to_filters");
+ Iterator j = (Iterator) entityAdapter.getIterator("to_filters");
while (j.hasNext()) {
filters.add(((EntityAdapter) j.next()).getEntity());
}
return getFilterGroupForId(aFilterGroupId).getFilterEntityAdapterList();
}
- private void introduceFilterGroup(FilterGroup aFilterGroup) {
+ private synchronized void introduceFilterGroup(FilterGroup aFilterGroup) {
filterGroups.add(aFilterGroup);
idToFilterGroup.put(aFilterGroup.getEntity().getId(), aFilterGroup);
}
- private void removeFilterGroup(FilterGroup aFilterGroup) {
+ private synchronized void removeFilterGroup(FilterGroup aFilterGroup) {
filterGroups.remove(aFilterGroup);
idToFilterGroup.remove(aFilterGroup.getEntity().getId());
}