package com.limegroup.gnutella.auth; import java.util.Collections; import java.util.HashSet; import java.util.Set; import org.limewire.listener.EventListener; import org.limewire.listener.EventMulticaster; import org.limewire.listener.EventMulticasterImpl; import com.google.inject.Inject; import com.google.inject.Singleton; import com.limegroup.gnutella.URN; @Singleton class UrnValidatorImpl implements UrnValidator { private final ContentManager contentManager; private final EventMulticaster<ValidationEvent> validationMulticaster; private final Set<URN> requestingValidation; @Inject public UrnValidatorImpl(ContentManager contentManager) { this.contentManager = contentManager; this.validationMulticaster = new EventMulticasterImpl<ValidationEvent>(); this.requestingValidation = Collections.synchronizedSet(new HashSet<URN>()); } @Override public void addListener(EventListener<ValidationEvent> eventListener) { validationMulticaster.addListener(eventListener); } @Override public boolean isInvalid(URN urn) { ContentResponseData r = contentManager.getResponse(urn); return r != null && !r.isOK(); } @Override public boolean isValid(URN urn) { return contentManager.isVerified(urn); } @Override public void validate(URN urn) { if(requestingValidation.add(urn)) { contentManager.request(urn, new ContentResponseObserver() { public void handleResponse(URN urn, ContentResponseData r) { requestingValidation.remove(urn); ValidationEvent.Type type; if(r == null) { type = ValidationEvent.Type.UNKNOWN; } else if(r.isOK()) { type = ValidationEvent.Type.VALID; } else { type = ValidationEvent.Type.INVALID; } validationMulticaster.broadcast(new ValidationEvent(type, urn)); } }, 5000); } } }