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

搜索引擎

开发平台:

Java

  1. package net.javacoding.jspider.core.model;
  2. import net.javacoding.jspider.api.model.*;
  3. import net.javacoding.jspider.core.storage.exception.InvalidStateForActionException;
  4. import net.javacoding.jspider.core.storage.exception.InvalidStateTransitionException;
  5. import net.javacoding.jspider.core.storage.spi.StorageSPI;
  6. import net.javacoding.jspider.core.logging.LogFactory;
  7. import net.javacoding.jspider.core.util.URLUtil;
  8. import java.io.InputStream;
  9. import java.net.URL;
  10. import java.util.*;
  11. /**
  12.  *
  13.  * $Id: ResourceInternal.java,v 1.13 2003/04/11 16:37:04 vanrogu Exp $
  14.  *
  15.  * @author G黱ther Van Roey
  16.  */
  17. public class ResourceInternal implements ParsedResource, ParseErrorResource, ParseIgnoredResource, ForbiddenResource, FetchIgnoredResource, FetchErrorResource {
  18.     protected StorageSPI storage;
  19.     protected int site;
  20.     protected URL url;
  21.     protected Date discoveryTime;
  22.     protected FolderInternal folder;
  23.     protected int state;
  24.     protected int id;
  25.     protected int httpStatus;
  26.     protected int size;
  27.     protected int timeMs;
  28.     protected String mimeType;
  29.     protected Date fetchTime;
  30.     protected HTTPHeader[] headers;
  31.     protected Decision spiderDecision;
  32.     protected Decision parseDecision;
  33.     public ResourceInternal(StorageSPI storage, int id, int siteId, URL url, Date discoveryTime, FolderInternal folder) {
  34.         this.site = siteId;
  35.         this.storage = storage;
  36.         this.id = id;
  37.         this.url = url;
  38.         this.discoveryTime = discoveryTime;
  39.         this.folder = folder;
  40.         this.state = Resource.STATE_DISCOVERED;
  41.     }
  42.     public ResourceInternal(StorageSPI storage, int id, Site site, URL url, Date discoveryTime, FolderInternal folder) {
  43.         this(storage, id, ((SiteInternal) site).getId(), url, discoveryTime, folder);
  44.     }
  45.     public ResourceInternal(StorageSPI storage, Site site, URL url, Date discoveryTime, FolderInternal folder) {
  46.         this(storage, 0, site, url, discoveryTime, folder);
  47.     }
  48.     public void setFetched(int httpStatus, int size, int timeMs, String mimeType, Date fetchTime, HTTPHeader[] headers) {
  49.         if (state != Resource.STATE_DISCOVERED) {
  50.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  51.             throw new InvalidStateTransitionException("cannot set resource fetched - it's not in the discovered state - was " + state);
  52.         }
  53.         this.httpStatus = httpStatus;
  54.         this.size = size;
  55.         this.timeMs = timeMs;
  56.         this.mimeType = mimeType;
  57.         this.fetchTime = fetchTime;
  58.         this.headers = headers;
  59.         state = Resource.STATE_FETCHED;
  60.     }
  61.     public void setFetchError(int httpStatus, HTTPHeader[] headers) {
  62.         if (state != Resource.STATE_DISCOVERED && state != Resource.STATE_FETCH_ERROR) {
  63.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  64.             throw new InvalidStateTransitionException("cannot set resource fetch error - it's not in the discovered state - was" + state);
  65.         }
  66.         this.httpStatus = httpStatus;
  67.         this.headers = headers;
  68.         state = Resource.STATE_FETCH_ERROR;
  69.     }
  70.     public void setParseError() {
  71.         if (state != Resource.STATE_FETCHED && state != Resource.STATE_PARSE_ERROR) {
  72.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  73.             throw new InvalidStateTransitionException("cannot set resource parse error - it's not in the fetched state - was " + state);
  74.         }
  75.         state = Resource.STATE_PARSE_ERROR;
  76.     }
  77.     public void setParsed() {
  78.         if (state != Resource.STATE_FETCHED && state != Resource.STATE_PARSED) {
  79.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  80.             throw new InvalidStateTransitionException("cannot set resource parsed - it's not in the fetched state - was " + state);
  81.         }
  82.         state = Resource.STATE_PARSED;
  83.     }
  84.     public void setFetchIgnored() {
  85.         if (state != Resource.STATE_DISCOVERED && state != Resource.STATE_FETCH_IGNORED) {
  86.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  87.             throw new InvalidStateTransitionException("cannot set resource fetch_ignored - it's not in the discovered state - was " + state);
  88.         }
  89.         state = Resource.STATE_FETCH_IGNORED;
  90.     }
  91.     public void setParseIgnored() {
  92.         if (state != Resource.STATE_FETCHED && state != Resource.STATE_PARSE_IGNORED) {
  93.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  94.             throw new InvalidStateTransitionException("cannot set resource parse_ignored - it's not in the fetched state - was " + state);
  95.         }
  96.         state = Resource.STATE_PARSE_IGNORED;
  97.     }
  98.     public void setForbidden() {
  99.         if (state != Resource.STATE_DISCOVERED && state != Resource.STATE_FETCH_FORBIDDEN) {
  100.             LogFactory.getLog(Resource.class).error("error in state transition for resource " + url + ":n" + this);
  101.             throw new InvalidStateTransitionException("cannot set resource forbidden - it's not in the discovered state - was " + state);
  102.         }
  103.         state = Resource.STATE_FETCH_FORBIDDEN;
  104.     }
  105.     public int getId() {
  106.         return id;
  107.     }
  108.     public void setInt(int id) {
  109.         this.id = id;
  110.     }
  111.     public int getState() {
  112.         return state;
  113.     }
  114.     public String getFileName() {
  115.         return URLUtil.getFileName(url);
  116.     }
  117.     public URL getURL() {
  118.         return url;
  119.     }
  120.     public Site getSite() {
  121.         return folder.getSite();
  122.     }
  123.     public Folder getFolder() {
  124.         return folder;
  125.     }
  126.     public String getName() {
  127.         return url.getFile();
  128.     }
  129.     public Date getDiscoveryTime() {
  130.         return discoveryTime;
  131.     }
  132.     public Resource[] getReferers() {
  133.         return storage.getResourceDAO().getRefereringResources(this);
  134.     }
  135.     public Resource[] getReferencedResources() {
  136.         if (state != Resource.STATE_PARSED) {
  137.             throw new InvalidStateForActionException("cannot get referenced resources if not parsed");
  138.         }
  139.         return storage.getResourceDAO().getReferencedResources(this);
  140.     }
  141.     public int getHttpStatus() {
  142.         if (state == Resource.STATE_DISCOVERED) {
  143.             throw new InvalidStateForActionException("cannot get http status for a resource that's not fetched");
  144.         }
  145.         return httpStatus;
  146.     }
  147.     public int getHttpStatusInternal() {
  148.         return httpStatus;
  149.     }
  150.     public void setHttpStatus(int status) {
  151.         this.httpStatus = status;
  152.     }
  153.     public HTTPHeader[] getHeaders() {
  154.         return headers;
  155.     }
  156.     public int getTimeMs() {
  157.         if (state < Resource.STATE_FETCHED) {
  158.             throw new InvalidStateForActionException("cannot get timing for non-fetched resource");
  159.         }
  160.         return timeMs;
  161.     }
  162.     public int getTimeMsInternal() {
  163.         return timeMs;
  164.     }
  165.     public int getSize() {
  166.         if (state < Resource.STATE_FETCHED) {
  167.             throw new InvalidStateForActionException("cannot get size for non-fetched resource");
  168.         }
  169.         return size;
  170.     }
  171.     public int getSizeInternal() {
  172.         return size;
  173.     }
  174.     public String getMime() {
  175.         if (state < Resource.STATE_FETCHED) {
  176.             throw new InvalidStateForActionException("cannot get mime type for non-fetched resource");
  177.         }
  178.         return mimeType;
  179.     }
  180.     public String getMimeInternal() {
  181.         return mimeType;
  182.     }
  183.     public Date getFetchTime() {
  184.         if (state < Resource.STATE_FETCHED) {
  185.             throw new InvalidStateForActionException("cannot get fetch time for non-fetched resource");
  186.         }
  187.         return fetchTime;
  188.     }
  189.     public Date getFetchTimeInternal() {
  190.         return fetchTime;
  191.     }
  192.     public String toString() {
  193.         StringBuffer sb = new StringBuffer();
  194.         sb.append(url.toString());
  195.         sb.append("n  STATUS : ");
  196.         sb.append(translateState(state));
  197.         sb.append("n  ");
  198.         sb.append("n  SPIDER DECISION : ");
  199.         Decision sd = getSpiderDecision();
  200.         if (sd == null) {
  201.             sb.append("n  ");
  202.             sb.append("[Not yet taken]");
  203.         } else {
  204.             DecisionStep[] steps = sd.getSteps();
  205.             for (int i = 0; i < steps.length; i++) {
  206.                 DecisionStep step = steps[i];
  207.                 sb.append("n  ");
  208.                 sb.append(step.toString());
  209.             }
  210.         }
  211.         sb.append("n  ");
  212.         sb.append("n  PARSE DECISION : ");
  213.         Decision pd = getParseDecision();
  214.         if (pd == null) {
  215.             sb.append("n  ");
  216.             sb.append("[Not yet taken]");
  217.         } else {
  218.             DecisionStep[] steps = pd.getSteps();
  219.             for (int i = 0; i < steps.length; i++) {
  220.                 DecisionStep step = steps[i];
  221.                 sb.append("n  ");
  222.                 sb.append(step.toString());
  223.             }
  224.         }
  225.         sb.append("n");
  226.         switch (state) {
  227.             case STATE_DISCOVERED:
  228.                 break;
  229.             case STATE_FETCH_ERROR:
  230.                 sb.append("  HTTP Status: ");
  231.                 sb.append(this.getHttpStatus());
  232.                 Resource[] referers = this.getReferers();
  233.                 sb.append("n  REFERERS: " + referers.length);
  234.                 for (int i = 0; i < referers.length; i++) {
  235.                     Resource referer = referers[i];
  236.                     sb.append("n    ");
  237.                     sb.append(referer.getURL());
  238.                 }
  239.                 break;
  240.             case STATE_FETCH_IGNORED:
  241.                 break;
  242.             case STATE_FETCH_FORBIDDEN:
  243.                 break;
  244.             case STATE_FETCHED:
  245.                 sb.append("  HTTP Status: ");
  246.                 sb.append(this.getHttpStatus());
  247.                 sb.append(", Content size: ");
  248.                 sb.append(this.getSize());
  249.                 sb.append(", Mime Type: ");
  250.                 sb.append(this.getMime());
  251.                 sb.append(", Fetch time: ");
  252.                 sb.append(this.getTimeMs());
  253.                 break;
  254.             case STATE_PARSE_ERROR:
  255.                 break;
  256.             case STATE_PARSE_IGNORED:
  257.                 break;
  258.             case STATE_PARSED:
  259.                 sb.append("  HTTP Status: ");
  260.                 sb.append(this.getHttpStatus());
  261.                 sb.append(", Content size: ");
  262.                 sb.append(this.getSize());
  263.                 sb.append(", Mime Type: ");
  264.                 sb.append(this.getMime());
  265.                 sb.append(", Fetch time: ");
  266.                 sb.append(this.getTimeMs());
  267.                 referers = this.getReferers();
  268.                 sb.append("n  REFERERS: " + referers.length);
  269.                 for (int i = 0; i < referers.length; i++) {
  270.                     Resource referer = referers[i];
  271.                     sb.append("n    ");
  272.                     sb.append(referer.getURL());
  273.                 }
  274.                 if (state == STATE_PARSED) {
  275.                     Resource[] references = this.getReferencedResources();
  276.                     sb.append("n  REFERENCES: " + references.length);
  277.                     for (int i = 0; i < references.length; i++) {
  278.                         Resource reference = references[i];
  279.                         sb.append("n    ");
  280.                         sb.append(reference.getURL());
  281.                     }
  282.                     EMailAddress[] emails = this.getEmailAddresses();
  283.                     sb.append("n  E-MAIL ADDRESSES: " + emails.length);
  284.                     for (int i = 0; i < emails.length; i++) {
  285.                         EMailAddress email = emails[i];
  286.                         sb.append("n    ");
  287.                         sb.append(email.getAddress());
  288.                     }
  289.                 } else {
  290.                     sb.append("n  EMAIL ADDRESSES and REFERENCES not known [Resource not parsed]");
  291.                 }
  292.                 break;
  293.         }
  294.         sb.append("n");
  295.         return sb.toString();
  296.     }
  297.     protected String translateState(int state) {
  298.         switch (state) {
  299.             case Resource.STATE_DISCOVERED:
  300.                 return "DISCOVERED";
  301.             case Resource.STATE_FETCH_ERROR:
  302.                 return "FETCH_ERROR";
  303.             case Resource.STATE_PARSE_ERROR:
  304.                 return "PARSE_ERROR";
  305.             case Resource.STATE_FETCHED:
  306.                 return "FETCHED";
  307.             case Resource.STATE_FETCH_FORBIDDEN:
  308.                 return "FETCH_FORBIDDEN";
  309.             case Resource.STATE_FETCH_IGNORED:
  310.                 return "FETCH_IGNORED";
  311.             case Resource.STATE_PARSE_IGNORED:
  312.                 return "PARSE_IGNORED";
  313.             case Resource.STATE_PARSED:
  314.                 return "PARSED";
  315.             default:
  316.                 return "?!? UNKNOWN STATE ?!?";
  317.         }
  318.     }
  319.     public InputStream getInputStream() {
  320.         return storage.getContentDAO().getInputStream(id);
  321.     }
  322.     public void setBytes(byte[] bytes) {
  323.         storage.getContentDAO().setBytes(id, bytes);
  324.     }
  325.     public Date getFetchTimeStamp() {
  326.         return fetchTime;
  327.     }
  328.     public String getStateName() {
  329.         return translateState(state);
  330.     }
  331.     public Decision getSpiderDecision() {
  332.         return storage.getDecisionDAO().findSpiderDecision(this);
  333.     }
  334.     public Decision getParseDecision() {
  335.         return storage.getDecisionDAO().findParseDecision(this);
  336.     }
  337.     public void setState(int state) {
  338.         this.state = state;
  339.     }
  340.     public void setMime(String mime) {
  341.         this.mimeType = mime;
  342.     }
  343.     public void setTime(int ms) {
  344.         this.timeMs = ms;
  345.     }
  346.     public void setSize(int size) {
  347.         this.size = size;
  348.     }
  349.     public int getSiteId() {
  350.         return site;
  351.     }
  352.     public ResourceReference[] getOutgoingReferences() {
  353.         return storage.getResourceDAO().getOutgoingReferences(this) ;
  354.     }
  355.     public ResourceReference[] getIncomingReferences() {
  356.         return storage.getResourceDAO().getIncomingReferences(this) ;
  357.     }
  358.     public EMailAddress[] getEmailAddresses() {
  359.         return storage.getEMailAddressDAO().findByResource(this);
  360.     }
  361.     public EMailAddressReference[] getEmailAddressReferences() {
  362.         return storage.getEMailAddressDAO().findReferencesByResource(this);
  363.     }
  364. }