1 package net.javacoding.jspider.core.storage.impl; 2 3 import net.javacoding.jspider.core.storage.ResourceDAO; 4 import net.javacoding.jspider.core.storage.exception.InvalidStateTransitionException; 5 import net.javacoding.jspider.core.storage.spi.ResourceDAOSPI; 6 import net.javacoding.jspider.core.storage.spi.StorageSPI; 7 import net.javacoding.jspider.core.event.impl.*; 8 import net.javacoding.jspider.core.logging.Log; 9 import net.javacoding.jspider.core.model.*; 10 import net.javacoding.jspider.core.util.URLUtil; 11 import net.javacoding.jspider.api.model.*; 12 13 import java.net.URL ; 14 import java.util.Date ; 15 16 19 class ResourceDAOImpl implements ResourceDAO { 20 21 protected int counter; 22 protected Log log; 23 protected StorageSPI storage; 24 protected ResourceDAOSPI spi; 25 26 protected int folderCounter; 27 28 public ResourceDAOImpl ( Log log, StorageSPI storage, ResourceDAOSPI spi ) { 29 this.log = log; 30 this.storage = storage; 31 this.spi = spi; 32 this.counter = 0; 33 this.folderCounter = 0; 34 } 35 36 public Resource registerURL(URL url) { 37 FolderInternal folder = ensureFolders(url); 38 int id = ++counter; 39 ResourceInternal resource = spi.getResource(url); 40 if (resource == null) { 41 SiteInternal site = storage.getSiteDAO().find(URLUtil.getSiteURL(url)); 42 if (site == null) { 43 log.warn("unable to register resource " + url + " because Site object wasn't found"); 44 } else { 45 resource = new ResourceInternal(storage, id, site, url, new Date (), folder); 46 spi.create(id, resource); 47 } 48 } 49 return resource; 50 } 51 52 public void registerURLReference(URL url, URL referer) { 53 spi.registerURLReference(url, referer); 54 } 55 56 public Resource[] getAllResources() { 57 return spi.findAllResources(); 58 } 59 60 public Resource[] getRefereringResources(Resource resource) { 61 ResourceInternal ri = TypeTranslator.translate(resource); 62 return spi.getRefereringResources(ri); 63 } 64 65 public Resource[] getReferencedResources(Resource resource) { 66 ResourceInternal ri = TypeTranslator.translate(resource); 67 return spi.getReferencedResources(ri); 68 } 69 70 public ResourceReference[] getIncomingReferences(Resource resource) { 71 return new ResourceReference[0]; 72 } 73 74 public ResourceReference[] getOutgoingReferences(Resource resource) { 75 ResourceInternal ri = TypeTranslator.translate(resource); 76 return spi.getOutgoingReferences(ri); 77 } 78 79 public Resource[] getRootResources(Site site) { 80 SiteInternal si = (SiteInternal)site; 81 return spi.getRootResources(si); 82 } 83 84 public Resource[] getBySite(Site site) { 85 SiteInternal si = TypeTranslator.translate(site); 86 return spi.getBySite(si); 87 } 88 89 public Resource[] findByFolder(Folder folder) { 90 FolderInternal fi = TypeTranslator.translate(folder); 91 return spi.findByFolder(fi); 92 } 93 94 public Resource getResource(URL url) { 95 return spi.getResource(url); 96 } 97 98 public void setSpidered(URL url, URLSpideredOkEvent event) { 99 spi.setSpidered(url, event); 100 } 101 102 public void setIgnoredForParsing(URL url) throws InvalidStateTransitionException { 103 spi.setIgnoredForParsing(url); 104 } 105 106 public void setIgnoredForFetching(URL url, URLFoundEvent event) throws InvalidStateTransitionException { 107 spi.setIgnoredForFetching(url, event); 108 } 109 110 public void setForbidden(URL url, URLFoundEvent event) throws InvalidStateTransitionException { 111 spi.setForbidden(url, event); 112 } 113 114 public void setError(URL url, ResourceParsedErrorEvent event) throws InvalidStateTransitionException { 115 spi.setError(url, event); 116 } 117 118 public void setParsed(URL url, ResourceParsedOkEvent event) throws InvalidStateTransitionException { 119 spi.setParsed(url, event); 120 } 121 122 public void setError(URL url, URLSpideredErrorEvent event) throws InvalidStateTransitionException { 123 spi.setError(url, event); 124 } 125 126 127 protected FolderInternal ensureFolders(URL url) { 128 URL siteURL = URLUtil.getSiteURL(url); 129 SiteInternal site = storage.getSiteDAO().find(siteURL); 130 131 String [] folderNames = URLUtil.getFolderNames(url); 132 133 FolderInternal folder = null; 134 if (folderNames.length > 0) { 135 folder = (FolderInternal)site.getRootFolder(folderNames[0]); 136 if (folder == null) { 137 int id = ++folderCounter; 138 folder = storage.getFolderDAO().createFolder(id, site, folderNames[0]); 139 } 140 if ( folderNames.length > 1 ) { 141 folder = ensureRecursively(folder, folderNames, 1); 142 } 143 } 144 return folder; 145 } 146 147 protected FolderInternal ensureRecursively(FolderInternal folder, String [] folderNames, int depth) { 148 FolderInternal subFolder = (FolderInternal)folder.getFolder(folderNames[depth]); 149 if (subFolder == null) { 150 int id = ++folderCounter; 151 subFolder = storage.getFolderDAO().createFolder(id, folder, folderNames[depth]); 152 } 153 if ((depth + 1) < folderNames.length) { 154 subFolder = ensureRecursively(subFolder, folderNames, depth + 1); 155 } 156 return subFolder; 157 } 158 } 159 | Popular Tags |