@Override @Nullable public Long getParentIssueId(Long issueId) { if (issueId == null) return null; // Check if we have any incoming sub-task issue links final List<IssueLink> inwardLinks = issueLinkManager.getInwardLinks(issueId); for (final IssueLink inwardLink : inwardLinks) { if (inwardLink.getIssueLinkType().isSubTaskLinkType()) { return inwardLink.getSourceId(); } } return null; }
private void addFieldsToDoc(Document doc, Collection<IssueLink> issueLinks, Direction direction) { for (IssueLink issueLink : issueLinks) { Long linkTypeId = issueLink.getLinkTypeId(); doc.add(new Field(getDocumentFieldId(), createValue(linkTypeId), NO, NOT_ANALYZED)); doc.add(new Field(getDocumentFieldId(), createValue(linkTypeId, direction), NO, NOT_ANALYZED)); Long otherIssue = direction == Direction.OUT ? issueLink.getDestinationId() : issueLink.getSourceId(); // IN links have OTHER issue at SOURCE, OUT links have OTHER issue at DEST doc.add(new Field(getDocumentFieldId(), createValue(linkTypeId, direction, otherIssue), NO, NOT_ANALYZED)); } } }
outwardLinkCache.remove(issueLink.getSourceId()); inwardLinkCache.remove(issueLink.getDestinationId());
public void changeIssueLinkType(IssueLink issueLink, IssueLinkType swapLinkType, ApplicationUser remoteUser) { final IssueLinkType oldIssueLinkType = issueLink.getIssueLinkType(); if (!oldIssueLinkType.isSystemLinkType() && swapLinkType.isSystemLinkType()) { log.warn("Changing non-system link type to a system link type."); } else if (oldIssueLinkType.isSystemLinkType() && !swapLinkType.isSystemLinkType()) { log.warn("Changing system link type to a non-system link type."); } updateIssueLinkType(issueLink, swapLinkType); outwardLinkCache.remove(issueLink.getSourceId()); inwardLinkCache.remove(issueLink.getDestinationId()); // If the link we are swapping from is not a system link type, it means its creation should have // been recorded in 'change history', so we should update change history here. if (!oldIssueLinkType.isSystemLinkType()) { createRemoveIssueLinkChangeItems(issueLink, oldIssueLinkType, remoteUser); createCreateIssueLinkChangeItems(issueLink, swapLinkType, remoteUser); } }
@Override public FieldMap fieldMapFrom(final IssueLink value) { return new FieldMap("id", value.getId()) .add("linktype", value.getLinkTypeId()) .add("source", value.getSourceId()) .add("destination", value.getDestinationId()) .add("sequence", value.getSequence()); } }
Long workingIssueId = isCopyingInwardLinks ? issueLink.getSourceId() : issueLink.getDestinationId();
outwardLinkCache.remove(issueLink.getSourceId()); inwardLinkCache.remove(issueLink.getDestinationId());
@Override public SingleIssueLinkResult getIssueLink(Long issueLinkId, ApplicationUser user) { Assertions.notNull("issueLinkId", issueLinkId); IssueLink issueLink = issueLinkManager.getIssueLink(issueLinkId); if (issueLink == null) { SimpleErrorCollection simpleErrorCollection = new SimpleErrorCollection(); simpleErrorCollection.addErrorMessage(beanFactory.getInstance(user).getText("rest.issue.link.not.found", issueLinkId.toString())); return new SingleIssueLinkResult(simpleErrorCollection, null); } MutableIssue sourceIssue = issueManager.getIssueObject(issueLink.getSourceId()); ErrorCollection sourceIssueErrors = validateIssuePermission(user, sourceIssue, Permissions.BROWSE); MutableIssue destinationIssue = issueManager.getIssueObject(issueLink.getDestinationId()); ErrorCollection destinationIssueErrors = validateIssuePermission(user, destinationIssue, Permissions.BROWSE); if (sourceIssueErrors.hasAnyErrors() || destinationIssueErrors.hasAnyErrors()) { sourceIssueErrors.getErrors().putAll(destinationIssueErrors.getErrors()); sourceIssueErrors.getErrorMessages().addAll(destinationIssueErrors.getErrorMessages()); return new SingleIssueLinkResult(sourceIssueErrors, null); } return new SingleIssueLinkResult(new SimpleErrorCollection(), issueLink); }
IssueService.IssueResult sourceIssueResult = issueService.getIssue(authContext.getUser(), issueLink.getSourceId()); IssueService.IssueResult destinationIssueResult = issueService.getIssue(authContext.getUser(), issueLink.getDestinationId()); if (!sourceIssueResult.isValid() || !destinationIssueResult.isValid())
IssueService.IssueResult sourceIssueResult = issueService.getIssue(authContext.getUser(), issueLink.getSourceId()); IssueService.IssueResult destinationIssueResult = issueService.getIssue(authContext.getUser(), issueLink.getDestinationId()); if (!sourceIssueResult.isValid() || !destinationIssueResult.isValid())
public void resetSequences(final List<IssueLink> issueLinks) { dbConnectionManager.execute(dbConnection -> { dbConnection.setAutoCommit(false); long i = 0; for (final IssueLink issueLink : issueLinks) { dbConnection.update(QIssueLink.ISSUE_LINK) .set(QIssueLink.ISSUE_LINK.sequence, i) .where(QIssueLink.ISSUE_LINK.id.eq(issueLink.getId())) .execute(); i++; } dbConnection.commit(); // Make sure we don't clear the cache until after the DB is committed, else we get a race condition // whereby another thread can put stale values back into the cache. for (IssueLink issueLink : issueLinks) { outwardLinkCache.remove(issueLink.getSourceId()); inwardLinkCache.remove(issueLink.getDestinationId()); } }); }