/*
* CompareModel.java
*
* Created on 18 May 2005, 05:33
*/
package org.owasp.webscarab.plugin.compare;
import EDU.oswego.cs.dl.util.concurrent.Sync;
import org.owasp.webscarab.model.FrameworkModel;
import org.owasp.webscarab.model.ConversationModel;
import org.owasp.webscarab.model.AbstractConversationModel;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.plugin.AbstractPluginModel;
import java.util.Collections;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.logging.Logger;
/**
*
* @author rogan
*/
public class CompareModel extends AbstractPluginModel {
private FrameworkModel _model = null;
private Map<ConversationID, Integer> _distances = new HashMap<ConversationID, Integer>();
private ArrayList<ConversationID> _compared = new ArrayList<ConversationID>();
private DiffModel _diffModel;
private Logger _logger = Logger.getLogger(getClass().getName());
/** Creates a new instance of CompareModel */
public CompareModel(FrameworkModel model) {
_model = model;
_diffModel = new DiffModel(model);
}
public ConversationModel getConversationModel() {
return _model.getConversationModel();
}
public ConversationModel getComparisonModel() {
return _diffModel;
}
public void clearConversations() {
try {
_rwl.writeLock().acquire();
_distances.clear();
_compared.clear();
_rwl.readLock().acquire();
_rwl.writeLock().release();
_diffModel.fireConversationsChanged();
_rwl.readLock().release();
} catch (InterruptedException ie) {
_logger.warning("Interrupted! " + ie);
}
}
public void setDistance(ConversationID id, int distance) {
try {
_rwl.writeLock().acquire();
_distances.put(id, new Integer(distance));
int insert = Collections.binarySearch(_compared, id);
if (insert < 0) {
_compared.add(-insert-1, id);
}
_logger.info("Adding conversation " + id + " distance " + distance + " at " + insert);
_rwl.readLock().acquire();
_rwl.writeLock().release();
if (insert < 0)
_diffModel.fireConversationAdded(id, -insert-1);
_rwl.readLock().release();
} catch (InterruptedException ie) {
_logger.warning("Interrupted! " + ie);
}
}
public Integer getDistance(ConversationID id) {
try {
_rwl.readLock().acquire();
return (Integer) _distances.get(id);
} catch (InterruptedException ie) {
_logger.warning("Interrupted! " + ie);
return null;
} finally {
_rwl.readLock().release();
}
}
private class DiffModel extends AbstractConversationModel {
public DiffModel(FrameworkModel model) {
super(model);
}
public ConversationID getConversationAt(int index) {
try {
_rwl.readLock().acquire();
return (ConversationID) _compared.get(index);
} catch (InterruptedException ie) {
_logger.warning("Interrupted! " + ie);
return null;
} finally {
_rwl.readLock().release();
}
}
public int getConversationCount() {
try {
_rwl.readLock().acquire();
return _compared.size();
} catch (InterruptedException ie) {
_logger.warning("Interrupted! " + ie);
return -1;
} finally {
_rwl.readLock().release();
}
}
public int getIndexOfConversation(ConversationID id) {
try {
_rwl.readLock().acquire();
return Collections.binarySearch(_compared, id);
} catch (InterruptedException ie) {
_logger.warning("Interrupted! " + ie);
return -1;
} finally {
_rwl.readLock().release();
}
}
public Sync readLock() {
return _rwl.readLock();
}
public void fireConversationsChanged() {
super.fireConversationsChanged();
}
public void fireConversationAdded(ConversationID id, int position) {
super.fireConversationAdded(id, position);
}
}
}