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

搜索引擎

开发平台:

Java

  1. package net.javacoding.jspider.core.storage.jdbc;
  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.logging.LogFactory;
  8. import net.javacoding.jspider.core.logging.Log;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. import java.sql.*;
  12. import java.util.ArrayList;
  13. /**
  14.  * $Id: ResourceDAOImpl.java,v 1.11 2003/04/19 19:00:46 vanrogu Exp $
  15.  */
  16. class ResourceDAOImpl implements ResourceDAOSPI {
  17.     public static final String ATTRIBUTE_ID = "id";
  18.     public static final String ATTRIBUTE_SITE = "site";
  19.     public static final String ATTRIBUTE_URL = "url";
  20.     public static final String ATTRIBUTE_STATE = "state";
  21.     public static final String ATTRIBUTE_MIME = "mimetype";
  22.     public static final String ATTRIBUTE_TIME = "timems";
  23.     public static final String ATTRIBUTE_SIZE = "size";
  24.     public static final String ATTRIBUTE_FOLDER = "folder";
  25.     public static final String ATTRIBUTE_HTTP_STATUS = "httpstatus";
  26.     protected DBUtil dbUtil;
  27.     protected StorageSPI storage;
  28.     protected Log log;
  29.     public ResourceDAOImpl(StorageSPI storage, DBUtil dbUtil) {
  30.         this.storage = storage;
  31.         this.dbUtil = dbUtil;
  32.         this.log = LogFactory.getLog(ResourceDAOImpl.class);
  33.     }
  34.     public void registerURLReference(URL url, URL refererURL) {
  35.         ResourceInternal resource = getResource(url);
  36.         Statement st = null;
  37.         ResultSet rs = null;
  38.         if (refererURL != null) {
  39.             ResourceInternal referer = getResource(refererURL);
  40.             try {
  41.                 int from = referer.getId();
  42.                 int to = resource.getId();
  43.                 Connection connection = dbUtil.getConnection();
  44.                 st = connection.createStatement();
  45.                 rs = st.executeQuery("select count(*) from jspider_resource_reference where referer = " + from + " and referee = " + to);
  46.                 rs.next();
  47.                 Statement st2 = connection.createStatement();
  48.                 if (rs.getInt(1) == 0) {
  49.                     st2.executeUpdate("insert into jspider_resource_reference ( referer, referee, count ) values (" + from + "," + to + ", 1)");
  50.                 } else {
  51.                     st2.executeUpdate("update jspider_resource_reference set count = count + 1 where referer = " + from + " and referee = " + to);
  52.                 }
  53.             } catch (SQLException e) {
  54.                 log.error("SQLException", e);
  55.             } finally {
  56.                 dbUtil.safeClose(rs, log);
  57.                 dbUtil.safeClose(st, log);
  58.             }
  59.         }
  60.     }
  61.     public ResourceInternal[] findAllResources() {
  62.         ArrayList al = new ArrayList();
  63.         Statement st = null;
  64.         ResultSet rs = null;
  65.         try {
  66.             Connection connection = dbUtil.getConnection();
  67.             st = connection.createStatement();
  68.             rs = st.executeQuery("select * from jspider_resource");
  69.             while (rs.next()) {
  70.                 al.add(createResourceFromRecord(rs));
  71.             }
  72.         } catch (SQLException e) {
  73.             log.error("SQLException", e);
  74.         } finally {
  75.             dbUtil.safeClose(rs, log);
  76.             dbUtil.safeClose(st, log);
  77.         }
  78.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  79.     }
  80.     public ResourceInternal[] getRefereringResources(ResourceInternal resource) {
  81.         ArrayList al = new ArrayList();
  82.         Statement st = null;
  83.         ResultSet rs = null;
  84.         try {
  85.             Connection connection = dbUtil.getConnection();
  86.             st = connection.createStatement();
  87.             rs = st.executeQuery("select * from jspider_resource, jspider_resource_reference where jspider_resource.id = jspider_resource_reference.referer and jspider_resource_reference.referee = " + resource.getId());
  88.             while (rs.next()) {
  89.                 al.add(createResourceFromRecord(rs));
  90.             }
  91.         } catch (SQLException e) {
  92.             log.error("SQLException", e);
  93.         } finally {
  94.             dbUtil.safeClose(rs, log);
  95.             dbUtil.safeClose(st, log);
  96.         }
  97.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  98.     }
  99.     public ResourceReferenceInternal[] getOutgoingReferences(ResourceInternal resource) {
  100.         ArrayList al = new ArrayList();
  101.         Statement st = null;
  102.         ResultSet rs = null;
  103.         try {
  104.             Connection connection = dbUtil.getConnection();
  105.             st = connection.createStatement();
  106.             rs = st.executeQuery("select referer.url as referer, referee.url as referee, count from jspider_resource referer, jspider_resource referee, jspider_resource_reference where jspider_resource_reference.referer = " + resource.getId() + " and jspider_resource_reference.referee = referee.id and jspider_resource_reference.referer = referer.id");
  107.             while (rs.next()) {
  108.                 al.add(createResourceReferenceFromRecord(rs));
  109.             }
  110.         } catch (SQLException e) {
  111.             log.error("SQLException", e);
  112.         } finally {
  113.             dbUtil.safeClose(rs, log);
  114.             dbUtil.safeClose(st, log);
  115.         }
  116.         return (ResourceReferenceInternal[]) al.toArray(new ResourceReferenceInternal[al.size()]);
  117.     }
  118.     public ResourceReferenceInternal[] getIncomingReferences(ResourceInternal resource) {
  119.         ArrayList al = new ArrayList();
  120.         Statement st = null;
  121.         ResultSet rs = null;
  122.         try {
  123.             Connection connection = dbUtil.getConnection();
  124.             st = connection.createStatement();
  125.             rs = st.executeQuery("select referer.url as referer, referee.url as referee, count from jspider_resource referer, jspider_resource referee, jspider_resource_reference where jspider_resource_reference.referee = " + resource.getId() + " and jspider_resource_reference.referee = referee.id and jspider_resource_reference.referer = referer.id");
  126.             while (rs.next()) {
  127.                 al.add(createResourceReferenceFromRecord(rs));
  128.             }
  129.         } catch (SQLException e) {
  130.             log.error("SQLException", e);
  131.         } finally {
  132.             dbUtil.safeClose(rs, log);
  133.             dbUtil.safeClose(st, log);
  134.         }
  135.         return (ResourceReferenceInternal[]) al.toArray(new ResourceReferenceInternal[al.size()]);
  136.     }
  137.     public ResourceInternal[] getReferencedResources(ResourceInternal resource) {
  138.         ArrayList al = new ArrayList();
  139.         Statement st = null;
  140.         ResultSet rs = null;
  141.         try {
  142.             Connection connection = dbUtil.getConnection();
  143.             st = connection.createStatement();
  144.             rs = st.executeQuery("select * from jspider_resource, jspider_resource_reference where jspider_resource.id = jspider_resource_reference.referee and jspider_resource_reference.referer = " + resource.getId());
  145.             while (rs.next()) {
  146.                 al.add(createResourceFromRecord(rs));
  147.             }
  148.         } catch (SQLException e) {
  149.             log.error("SQLException", e);
  150.         } finally {
  151.             dbUtil.safeClose(rs, log);
  152.             dbUtil.safeClose(st, log);
  153.         }
  154.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  155.     }
  156.     public ResourceInternal[] findByFolder(FolderInternal folder) {
  157.         ArrayList al = new ArrayList();
  158.         Statement st = null;
  159.         ResultSet rs = null;
  160.         try {
  161.             Connection connection = dbUtil.getConnection();
  162.             st = connection.createStatement();
  163.             rs = st.executeQuery("select * from jspider_resource where folder=" + folder.getId());
  164.             while (rs.next()) {
  165.                 al.add(createResourceFromRecord(rs));
  166.             }
  167.         } catch (SQLException e) {
  168.             log.error("SQLException", e);
  169.         } finally {
  170.             dbUtil.safeClose(rs, log);
  171.             dbUtil.safeClose(st, log);
  172.         }
  173.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  174.     }
  175.     public ResourceInternal[] getBySite(SiteInternal site) {
  176.         ArrayList al = new ArrayList();
  177.         Statement st = null;
  178.         ResultSet rs = null;
  179.         try {
  180.             Connection connection = dbUtil.getConnection();
  181.             st = connection.createStatement();
  182.             rs = st.executeQuery("select * from jspider_resource where site=" + site.getId());
  183.             while (rs.next()) {
  184.                 al.add(createResourceFromRecord(rs));
  185.             }
  186.         } catch (SQLException e) {
  187.             log.error("SQLException", e);
  188.         } finally {
  189.             dbUtil.safeClose(rs, log);
  190.             dbUtil.safeClose(st, log);
  191.         }
  192.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  193.     }
  194.     public ResourceInternal[] getRootResources(SiteInternal site) {
  195.         ArrayList al = new ArrayList();
  196.         Statement st = null;
  197.         ResultSet rs = null;
  198.         try {
  199.             Connection connection = dbUtil.getConnection();
  200.             st = connection.createStatement();
  201.             rs = st.executeQuery("select * from jspider_resource where site=" + site.getId() + " and folder=0");
  202.             while (rs.next()) {
  203.                 al.add(createResourceFromRecord(rs));
  204.             }
  205.         } catch (SQLException e) {
  206.             log.error("SQLException", e);
  207.         } finally {
  208.             dbUtil.safeClose(rs, log);
  209.             dbUtil.safeClose(st, log);
  210.         }
  211.         return (ResourceInternal[]) al.toArray(new ResourceInternal[al.size()]);
  212.     }
  213.     public synchronized void setSpidered(URL url, URLSpideredOkEvent event) {
  214.         ResourceInternal resource = getResource(url);
  215.         resource.setFetched(event.getHttpStatus(), event.getSize(), event.getTimeMs(), event.getMimeType(), null, event.getHeaders());
  216.         save(resource);
  217.         resource.setBytes(event.getBytes());
  218.     }
  219.     public synchronized void setIgnoredForParsing(URL url) throws InvalidStateTransitionException {
  220.         ResourceInternal resource = getResource(url);
  221.         resource.setParseIgnored();
  222.         save(resource);
  223.     }
  224.     public synchronized void setIgnoredForFetching(URL url, URLFoundEvent event) throws InvalidStateTransitionException {
  225.         ResourceInternal resource = getResource(url);
  226.         resource.setFetchIgnored();
  227.         save(resource);
  228.     }
  229.     public synchronized void setForbidden(URL url, URLFoundEvent event) throws InvalidStateTransitionException {
  230.         ResourceInternal resource = getResource(url);
  231.         resource.setForbidden();
  232.         save(resource);
  233.     }
  234.     public synchronized void setError(URL url, ResourceParsedErrorEvent event) throws InvalidStateTransitionException {
  235.         ResourceInternal resource = getResource(url);
  236.         resource.setParseError();
  237.         save(resource);
  238.     }
  239.     public synchronized void setParsed(URL url, ResourceParsedOkEvent event) throws InvalidStateTransitionException {
  240.         ResourceInternal resource = getResource(url);
  241.         resource.setParsed();
  242.         save(resource);
  243.     }
  244.     public synchronized void setError(URL url, URLSpideredErrorEvent event) throws InvalidStateTransitionException {
  245.         ResourceInternal resource = getResource(url);
  246.         resource.setFetchError(event.getHttpStatus(), event.getHeaders());
  247.         save(resource);
  248.     }
  249.     public ResourceInternal getResource(int id) {
  250.         ResourceInternal resource = null;
  251.         Statement st = null;
  252.         ResultSet rs = null;
  253.         try {
  254.             st = dbUtil.getConnection().createStatement();
  255.             rs = st.executeQuery("select * from jspider_resource where id='" + id + "'");
  256.             if (rs.next()) {
  257.                 resource = createResourceFromRecord(rs);
  258.             }
  259.         } catch (SQLException e) {
  260.             log.error("SQLException", e);
  261.         } finally {
  262.             dbUtil.safeClose(rs, log);
  263.             dbUtil.safeClose(st, log);
  264.         }
  265.         return resource;
  266.     }
  267.     public ResourceInternal getResource(URL url) {
  268.         ResourceInternal resource = null;
  269.         Statement st = null;
  270.         ResultSet rs = null;
  271.         if (url != null) {
  272.             try {
  273.                 st = dbUtil.getConnection().createStatement();
  274.                 rs = st.executeQuery("select * from jspider_resource where url='" + url + "'");
  275.                 if (rs.next()) {
  276.                     resource = createResourceFromRecord(rs);
  277.                 }
  278.             } catch (SQLException e) {
  279.                 log.error("SQLException", e);
  280.             } finally {
  281.                 dbUtil.safeClose(rs, log);
  282.                 dbUtil.safeClose(st, log);
  283.             }
  284.         }
  285.         return resource;
  286.     }
  287.     public void create(int id, ResourceInternal resource) {
  288.         Connection connection = dbUtil.getConnection();
  289.         StringBuffer sb = new StringBuffer();
  290.         Statement st = null;
  291.         sb.append("insert into jspider_resource (");
  292.         sb.append("id,");
  293.         sb.append("url,");
  294.         sb.append("site,");
  295.         sb.append("state,");
  296.         sb.append("httpstatus,");
  297.         sb.append("timems,");
  298.         sb.append("folder");
  299.         sb.append(") values (");
  300.         sb.append(DBUtil.format(id));
  301.         sb.append(",");
  302.         sb.append(DBUtil.format(resource.getURL()));
  303.         sb.append(",");
  304.         sb.append(DBUtil.format(resource.getSiteId()));
  305.         sb.append(",");
  306.         sb.append(DBUtil.format(resource.getState()));
  307.         sb.append(",");
  308.         sb.append(DBUtil.format(resource.getHttpStatusInternal()));
  309.         sb.append(",");
  310.         sb.append(DBUtil.format(resource.getTimeMsInternal()));
  311.         sb.append(",");
  312.         FolderInternal folder = (FolderInternal) resource.getFolder();
  313.         int folderId = (folder == null) ? 0 : folder.getId();
  314.         sb.append(DBUtil.format(folderId));
  315.         sb.append(")");
  316.         try {
  317.             st = connection.createStatement();
  318.             st.executeUpdate(sb.toString());
  319.         } catch (SQLException e) {
  320.             log.error("SQLException", e);
  321.         } finally {
  322.             dbUtil.safeClose(st, log);
  323.         }
  324.     }
  325.     public void save(ResourceInternal resource) {
  326.         Connection connection = dbUtil.getConnection();
  327.         StringBuffer sb = new StringBuffer();
  328.         Statement st = null;
  329.         sb.append("update jspider_resource set ");
  330.         sb.append("state=");
  331.         sb.append(DBUtil.format(resource.getState()));
  332.         sb.append(",mimetype=");
  333.         sb.append(DBUtil.format(resource.getMimeInternal()));
  334.         sb.append(",httpstatus=");
  335.         sb.append(DBUtil.format(resource.getHttpStatusInternal()));
  336.         sb.append(",size=");
  337.         sb.append(DBUtil.format(resource.getSizeInternal()));
  338.         sb.append(",timems=");
  339.         sb.append(DBUtil.format(resource.getTimeMsInternal()));
  340.         sb.append(" where id=");
  341.         sb.append(DBUtil.format(resource.getId()));
  342.         try {
  343.             st = connection.createStatement();
  344.             st.executeUpdate(sb.toString());
  345.         } catch (SQLException e) {
  346.             log.error("SQLException", e);
  347.         } finally {
  348.             dbUtil.safeClose(st, log);
  349.         }
  350.     }
  351.     protected ResourceInternal createResourceFromRecord(ResultSet rs) throws SQLException {
  352.         int id = rs.getInt(ATTRIBUTE_ID);
  353.         int folderId = rs.getInt(ATTRIBUTE_FOLDER);
  354.         int siteId = rs.getInt(ATTRIBUTE_SITE);
  355.         String urlString = rs.getString(ATTRIBUTE_URL);
  356.         int state = rs.getInt(ATTRIBUTE_STATE);
  357.         String mime = rs.getString(ATTRIBUTE_MIME);
  358.         int time = rs.getInt(ATTRIBUTE_TIME);
  359.         int size = rs.getInt(ATTRIBUTE_SIZE);
  360.         int httpStatus = rs.getInt(ATTRIBUTE_HTTP_STATUS);
  361.         FolderInternal folder = storage.getFolderDAO().findById(folderId);
  362.         URL url = null;
  363.         try {
  364.             url = new URL(urlString);
  365.         } catch (MalformedURLException e) {
  366.             log.error("MalformedURLException", e);
  367.         }
  368.         ResourceInternal ri = new ResourceInternal(storage, id, siteId, url, null, folder);
  369.         ri.setSize(size);
  370.         ri.setTime(time);
  371.         ri.setState(state);
  372.         ri.setMime(mime);
  373.         ri.setHttpStatus(httpStatus);
  374.         return ri;
  375.     }
  376.     protected ResourceReferenceInternal createResourceReferenceFromRecord(ResultSet rs) throws SQLException {
  377.         ResourceReferenceInternal rr = null;
  378.         try {
  379.             String refererURL = rs.getString("referer");
  380.             String refereeURL = rs.getString("referee");
  381.             URL referer = new URL(refererURL);
  382.             URL referee = new URL(refereeURL);
  383.             int count = rs.getInt("count");
  384.             rr = new ResourceReferenceInternal(storage, referer, referee, count);
  385.         } catch (MalformedURLException e) {
  386.             log.error("MalformedURLException", e);
  387.         }
  388.         return rr;
  389.     }
  390. }