ResourceDAOImpl.java
上传用户:qing5858
上传日期:2015-10-27
资源大小:6056k
文件大小:9k
源码类别:

搜索引擎

开发平台:

Java

  1. package net.javacoding.jspider.core.storage.memory;
  2. import net.javacoding.jspider.core.event.impl.*;
  3. import net.javacoding.jspider.core.model.*;
  4. import net.javacoding.jspider.core.storage.spi.ResourceDAOSPI;
  5. import net.javacoding.jspider.core.storage.spi.StorageSPI;
  6. import net.javacoding.jspider.core.storage.exception.InvalidStateTransitionException;
  7. import net.javacoding.jspider.core.util.URLUtil;
  8. import java.net.URL;
  9. import java.util.*;
  10. /**
  11.  * $Id: ResourceDAOImpl.java,v 1.12 2003/04/11 16:37:07 vanrogu Exp $
  12.  */
  13. class ResourceDAOImpl implements ResourceDAOSPI {
  14.     protected StorageSPI storage;
  15.     protected Map knownURLs;
  16.     protected Map byId;
  17.     protected Set spideredResources; /* urls visited by a spider, but not yet parsed */
  18.     protected Set ignoredForFetchingResources; /* urls ignored because of rule decisions */
  19.     protected Set ignoredForParsingResources; /* urls ignored because non-HTML */
  20.     protected Set forbiddenResources; /* forbidden urls */
  21.     protected Set fetchErrorResources; /* urls that could not be visited by the spider */
  22.     protected Set parseErrorResources; /* resources that could not be parsed correctly */
  23.     protected Set parsedResources; /* urls that were spidered AND interpreted */
  24.     protected Map referers;
  25.     protected Map referees;
  26.     protected Map byFolder;
  27.     protected Map rootResources;
  28.     public ResourceDAOImpl(StorageSPI storage) {
  29.         this.storage = storage;
  30.         spideredResources = new HashSet();
  31.         ignoredForFetchingResources = new HashSet();
  32.         ignoredForParsingResources = new HashSet();
  33.         forbiddenResources = new HashSet();
  34.         fetchErrorResources = new HashSet();
  35.         parseErrorResources = new HashSet();
  36.         parsedResources = new HashSet();
  37.         knownURLs = new HashMap();
  38.         this.byId = new HashMap();
  39.         this.referees = new HashMap();
  40.         this.referers = new HashMap();
  41.         this.byFolder = new HashMap();
  42.         this.rootResources = new HashMap();
  43.     }
  44.     public void create(int id, ResourceInternal resource) {
  45.         URL url = resource.getURL();
  46.             knownURLs.put(url, resource);
  47.             byId.put(new Integer(id), resource);
  48.             if (resource.getFolder() == null) {
  49.                 Set set = (Set) rootResources.get(URLUtil.getSiteURL(url));
  50.                 if (set == null) {
  51.                     set = new HashSet();
  52.                     rootResources.put(URLUtil.getSiteURL(url), set);
  53.                 }
  54.                 set.add(resource);
  55.             } else {
  56.                 Set set = (Set) byFolder.get(resource.getFolder());
  57.                 if (set == null) {
  58.                     set = new HashSet();
  59.                     byFolder.put(resource.getFolder(), set);
  60.                 }
  61.                 set.add(resource);
  62.             }
  63.     }
  64.     public void registerURLReference(URL url, URL refererURL) {
  65.         ResourceInternal resource = (ResourceInternal) knownURLs.get(url);
  66.         if (refererURL != null) {
  67.             ResourceInternal referer = (ResourceInternal) knownURLs.get(refererURL);
  68.             storeRef(referers, resource, referer, refererURL, url);
  69.             storeRef(referees, referer, resource, refererURL, url);
  70.         }
  71.     }
  72.     public ResourceInternal[] findByFolder(FolderInternal folder) {
  73.         Set set = (Set) byFolder.get(folder);
  74.         if (set == null) {
  75.             return new ResourceInternal[0];
  76.         }
  77.         return (ResourceInternal[]) set.toArray(new ResourceInternal[set.size()]);
  78.     }
  79.     protected void storeRef(Map map, ResourceInternal key, ResourceInternal data, URL referer, URL referee) {
  80.         Map refmap = (Map) map.get(key.getURL());
  81.         if (refmap == null) {
  82.             refmap = new HashMap();
  83.             map.put(key.getURL(), refmap);
  84.         }
  85.         ResourceReferenceInternal rri = (ResourceReferenceInternal) refmap.get(data.getURL());
  86.         if (rri == null) {
  87.             rri = new ResourceReferenceInternal(storage, referer, referee, 0);
  88.             refmap.put(data.getURL(), rri);
  89.         }
  90.         rri.incrementCount();
  91.     }
  92.     public ResourceInternal[] findAllResources() {
  93.         return (ResourceInternal[]) knownURLs.values().toArray(new ResourceInternal[knownURLs.size()]);
  94.     }
  95.     public ResourceInternal[] getRefereringResources(ResourceInternal resource) {
  96.         ResourceReferenceInternal[] refs = getIncomingReferences(resource);
  97.         ArrayList al = new ArrayList();
  98.         for (int i = 0; i < refs.length; i++) {
  99.             ResourceReferenceInternal ref = refs[i];
  100.             al.add(ref.getReferer());
  101.         }
  102.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  103.     }
  104.     public ResourceReferenceInternal[] getOutgoingReferences(ResourceInternal resource) {
  105.         Map map = (Map) referees.get(resource.getURL());
  106.         if (map == null) {
  107.             return new ResourceReferenceInternal[0];
  108.         } else {
  109.             return (ResourceReferenceInternal[]) map.values().toArray(new ResourceReferenceInternal[map.size()]);
  110.         }
  111.     }
  112.     public ResourceReferenceInternal[] getIncomingReferences(ResourceInternal resource) {
  113.         Map map = (Map) referers.get(resource.getURL());
  114.         if (map == null) {
  115.             return new ResourceReferenceInternal[0];
  116.         } else {
  117.             return (ResourceReferenceInternal[]) map.values().toArray(new ResourceReferenceInternal[map.size()]);
  118.         }
  119.     }
  120.     public ResourceInternal[] getReferencedResources(ResourceInternal resource) {
  121.         ResourceReferenceInternal[] refs = getOutgoingReferences(resource);
  122.         ArrayList al = new ArrayList();
  123.         for (int i = 0; i < refs.length; i++) {
  124.             ResourceReferenceInternal ref = refs[i];
  125.             al.add(ref.getReferee());
  126.         }
  127.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  128.     }
  129.     public ResourceInternal[] getBySite(SiteInternal site) {
  130.         ArrayList al = new ArrayList();
  131.         Iterator it = knownURLs.keySet().iterator();
  132.         while (it.hasNext()) {
  133.             URL url = (URL) it.next();
  134.             URL siteURL = URLUtil.getSiteURL(url);
  135.             if (site.getURL().equals(siteURL)) {
  136.                 al.add(getResource(url));
  137.             }
  138.         }
  139.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  140.     }
  141.     public ResourceInternal[] getRootResources(SiteInternal site) {
  142.         Set set = (Set) rootResources.get(site.getURL());
  143.         if ( set == null ) {
  144.             return new ResourceInternal[0];
  145.         } else {
  146.             return (ResourceInternal[]) set.toArray(new ResourceInternal[set.size()]);
  147.         }
  148.     }
  149.     public ResourceInternal getResource(int id) {
  150.         return (ResourceInternal)byId.get(new Integer(id));
  151.     }
  152.     public ResourceInternal getResource(URL url) {
  153.         return (ResourceInternal) knownURLs.get(url);
  154.     }
  155.     public synchronized void setSpidered(URL url, URLSpideredOkEvent event) {
  156.         ResourceInternal resource = getResource(url);
  157.         resource.setFetched(event.getHttpStatus(), event.getSize(), event.getTimeMs(), event.getMimeType(), null, event.getHeaders());
  158.         resource.setBytes(event.getBytes());
  159.     }
  160.     public synchronized void setIgnoredForParsing(URL url) throws InvalidStateTransitionException {
  161.         ResourceInternal resource = getResource(url);
  162.         resource.setParseIgnored();
  163.         ignoredForParsingResources.add(url);
  164.     }
  165.     public synchronized void setIgnoredForFetching(URL url, URLFoundEvent event) throws InvalidStateTransitionException {
  166.         ResourceInternal resource = getResource(url);
  167.         resource.setFetchIgnored();
  168.         ignoredForFetchingResources.add(event.getFoundURL());
  169.     }
  170.     public synchronized void setForbidden(URL url, URLFoundEvent event) throws InvalidStateTransitionException {
  171.         ResourceInternal resource = getResource(url);
  172.         resource.setForbidden();
  173.         forbiddenResources.add(event.getFoundURL());
  174.     }
  175.     public synchronized void setError(URL url, ResourceParsedErrorEvent event) throws InvalidStateTransitionException {
  176.         ResourceInternal resource = getResource(url);
  177.         resource.setParseError();
  178.         parseErrorResources.add(url);
  179.     }
  180.     public synchronized void setParsed(URL url, ResourceParsedOkEvent event) throws InvalidStateTransitionException {
  181.         ResourceInternal resource = getResource(url);
  182.         resource.setParsed();
  183.         parsedResources.add(resource);
  184.     }
  185.     public synchronized void setError(URL url, URLSpideredErrorEvent event) throws InvalidStateTransitionException {
  186.         ResourceInternal resource = getResource(url);
  187.         resource.setFetchError(event.getHttpStatus(), event.getHeaders());
  188.         fetchErrorResources.add(url);
  189.     }
  190. }