1 16 package org.outerj.daisy.repository.serverimpl.linkextraction; 17 18 import org.outerj.daisy.repository.commonimpl.variant.CommonVariantManager; 19 import org.outerj.daisy.repository.commonimpl.AuthenticatedUser; 20 import org.outerj.daisy.linkextraction.LinkCollector; 21 import org.outerj.daisy.linkextraction.LinkType; 22 import org.outerj.daisy.repository.RepositoryException; 23 import org.outerj.daisy.util.Constants; 24 25 import java.util.HashMap ; 26 import java.util.Collection ; 27 import java.util.regex.Matcher ; 28 29 public class LinkCollectorImpl implements LinkCollector { 30 private HashMap linksByKey = new HashMap (); 31 private long sourceDocId; 32 private long sourceBranchId; 33 private long sourceLanguageId; 34 private long sourcePartId; 35 private boolean inLastVersion; 36 private boolean inLiveVersion; 37 private CommonVariantManager variantManager; 38 private AuthenticatedUser systemUser; 39 40 protected LinkCollectorImpl(long sourceDocId, long sourceBranchId, long sourceLanguageId, 41 CommonVariantManager variantManager, AuthenticatedUser systemUser) { 42 this.sourceDocId = sourceDocId; 43 this.sourceBranchId = sourceBranchId; 44 this.sourceLanguageId = sourceLanguageId; 45 this.variantManager = variantManager; 46 this.systemUser = systemUser; 47 } 48 49 protected void changeTo(long sourcePartId, boolean inLastVersion, boolean inLiveVersion) { 50 this.sourcePartId = sourcePartId; 51 this.inLastVersion = inLastVersion; 52 this.inLiveVersion = inLiveVersion; 53 } 54 55 public void addLink(LinkType linkType, long targetDocId, long targetBranchId, long targetLanguageId, long version) { 56 LinkInfo linkInfo = new LinkInfo(sourceDocId, sourceBranchId, sourceLanguageId, sourcePartId, inLastVersion, inLiveVersion, targetDocId, targetBranchId, targetLanguageId, version, linkType); 57 addLink(linkInfo); 58 } 59 60 private void addLink(LinkInfo linkInfo) { 61 String key = linkInfo.getKey(); 62 LinkInfo existingLinkInfo = (LinkInfo)linksByKey.get(key); 63 if (existingLinkInfo != null) 64 existingLinkInfo.merge(linkInfo); 65 else 66 linksByKey.put(key, linkInfo); 67 } 68 69 public void addLink(LinkType linkType, String daisyLink) { 70 long[] target = getDaisyLink(daisyLink); 71 if (target != null) 72 addLink(new LinkInfo(sourceDocId, sourceBranchId, sourceLanguageId, sourcePartId, inLastVersion, inLiveVersion, target[0], target[1], target[2], target[3], linkType)); 73 } 74 75 public void addLink(LinkType linkType, long documentId, long branchId, long languageId) { 76 addLink(new LinkInfo(sourceDocId, sourceBranchId, sourceLanguageId, sourcePartId, inLastVersion, inLiveVersion, documentId, branchId, languageId, -1, linkType)); 77 } 78 79 public long getBranchId(String branchNameOrId) throws RepositoryException { 80 return variantManager.getBranch(branchNameOrId, false, systemUser).getId(); 81 } 82 83 public long getLanguageId(String languageNameOrId) throws RepositoryException { 84 return variantManager.getLanguage(languageNameOrId, false, systemUser).getId(); 85 } 86 87 public Collection getLinks() { 88 return linksByKey.values(); 89 } 90 91 protected long[] getDaisyLink(String link) { 92 if (link != null) { 93 Matcher matcher = Constants.DAISY_LINK_PATTERN.matcher(link); 94 if (matcher.matches()) { 95 long targetDocumentId = Long.parseLong(matcher.group(1)); 96 97 String branchString = matcher.group(3); 98 String languageString = matcher.group(5); 99 String versionString = matcher.group(7); 100 101 long targetBranchId; 102 long targetLanguageId; 103 long targetVersionId = -1; 105 if (branchString == null || branchString.length() == 0) { 106 targetBranchId = sourceBranchId; 107 } else { 108 try { 109 targetBranchId = variantManager.getBranch(branchString, false, systemUser).getId(); 110 } catch (RepositoryException e) { 111 return null; 113 } 114 } 115 116 if (languageString == null || languageString.length() == 0) { 117 targetLanguageId = sourceLanguageId; 118 } else { 119 if (Character.isDigit(languageString.charAt(0))) { 120 targetLanguageId = Long.parseLong(languageString); 121 } else { 122 try { 123 targetLanguageId = variantManager.getLanguage(languageString, false, systemUser).getId(); 124 } catch (RepositoryException e) { 125 return null; 127 } 128 } 129 } 130 131 if (versionString != null) { 132 if (versionString.equals("LAST")) { 133 targetVersionId = -2; } else { 135 targetVersionId = Long.parseLong(versionString); 136 } 137 } 138 return new long[] {targetDocumentId, targetBranchId, targetLanguageId, targetVersionId}; 139 } 140 } 141 return null; 142 } 143 } 144 145 | Popular Tags |