/**
*
*/
package org.korsakow.ide.ui.components.snupool;
import java.util.Collection;
import java.util.HashSet;
import org.dsrg.soenea.domain.MapperException;
import org.korsakow.domain.interf.IKeyword;
import org.korsakow.domain.interf.IProject;
import org.korsakow.domain.interf.IResource;
import org.korsakow.domain.interf.IRule;
import org.korsakow.domain.interf.ISnu;
import org.korsakow.domain.mapper.input.KeywordInputMapper;
import org.korsakow.domain.mapper.input.SnuInputMapper;
import org.korsakow.ide.Application;
import org.korsakow.ide.controller.ApplicationAdapter;
import org.korsakow.ide.resources.ResourceType;
import org.korsakow.ide.rules.RuleType;
public class SnuPoolUpdateListener extends ApplicationAdapter implements Runnable
{
private final SnuPool pool;
public SnuPoolUpdateListener(SnuPool pool)
{
this.pool = pool;
}
public void run()
{
doUpdate();
}
private void update()
{
Application.getInstance().enqueueCommonTask(this);
}
private void doUpdate()
{
SnuPoolModel model;
try {
model = createModel();
} catch (MapperException e) {
Application.getInstance().showUnhandledErrorDialog(e);
model = new SnuPoolModel();
}
pool.setModel(model);
}
@Override
public void onKeywordsChanged() {
update();
}
@Override
public void onProjectLoaded(IProject project) {
update();
}
@Override
public void onResourceAdded(IResource resource) {
if (ResourceType.forId(resource.getType()) == ResourceType.SNU)
update();
}
@Override
public void onResourceDeleted(IResource resource) {
if (ResourceType.forId(resource.getType()) == ResourceType.SNU)
update();
}
@Override
public void onResourceModified(IResource resource) {
if (ResourceType.forId(resource.getType()) == ResourceType.SNU)
update();
}
@Override
public void onResourcesCleared() {
update();
}
public static SnuPoolModel createModel() throws MapperException
{
SnuPoolModel model = new SnuPoolModel();
Collection<ISnu> snus = SnuInputMapper.findAll();
model.beginBatchUpdate();
for (ISnu snu : snus)
{
Collection<String> inKeywords = new HashSet<String>();
for (IKeyword k : KeywordInputMapper.findByObject(snu.getId()))
inKeywords.add(k.getValue());
Collection<String> outKeywords = new HashSet<String>();
for (IRule searchRule : snu.getRules()) {
if (RuleType.forId(searchRule.getRuleType()) != RuleType.Search)
continue;
for (IRule rule : searchRule.getRules()) {
switch(RuleType.forId(rule.getRuleType())) {
case KeywordLookup:
for (IKeyword k : KeywordInputMapper.findByObjectRecursive(rule.getId()))
outKeywords.add(k.getValue());
break;
}
}
}
model.add(snu.getId(), snu.getName(), inKeywords, outKeywords);
}
model.endBatchUpdate();
return model;
}
}