summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/gitblit/models/FeedEntryModel.java
blob: c94f6e966022b30c45c00e7e08244514f80cd38e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.models;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * FeedEntryModel represents an entry in a syndication (RSS) feed.
 *
 * @author James Moger
 */
public class FeedEntryModel implements Serializable, Comparable<FeedEntryModel> {

	public String repository;
	public String branch;
	public String title;
	public String author;
	public Date published;
	public String link;
	public String content;
	public String contentType;
	public List<String> tags;

	private static final long serialVersionUID = 1L;

	public FeedEntryModel() {
	}

	@Override
	public int compareTo(FeedEntryModel o) {
		return o.published.compareTo(published);
	}

	@Override
	public int hashCode() {
		return link.hashCode();
	}

	@Override
	public boolean equals(Object o) {
		if (o instanceof FeedEntryModel) {
			return hashCode() == o.hashCode();
		}
		return false;
	}
}
">:add_to_nested_set before_update( :move_in_nested_set, :if => lambda {|project| project.parent_id_changed? || project.name_changed?} ) before_destroy :destroy_children end base.extend ClassMethods base.send :include, Redmine::NestedSet::Traversing end private def target_lft siblings_rgt = self.class.where(:parent_id => parent_id).where("name < ?", name).maximum(:rgt) if siblings_rgt siblings_rgt + 1 elsif parent_id parent_lft = self.class.where(:id => parent_id).pick(:lft) unless parent_lft raise "Project id=#{id} with parent_id=#{parent_id}: parent missing or without 'lft' value" end parent_lft + 1 else 1 end end def add_to_nested_set(lock=true) lock_nested_set if lock self.lft = target_lft self.rgt = lft + 1 self.class.where("lft >= ? OR rgt >= ?", lft, lft).update_all( [ "lft = CASE WHEN lft >= :lft THEN lft + 2 ELSE lft END, " \ "rgt = CASE WHEN rgt >= :lft THEN rgt + 2 ELSE rgt END", {:lft => lft} ] ) end def move_in_nested_set lock_nested_set reload_nested_set_values a = lft b = rgt c = target_lft unless c == a if c > a # Moving to the right d = c - (b - a + 1) scope = self.class.where( ["lft BETWEEN :a AND :c - 1 OR rgt BETWEEN :a AND :c - 1", {:a => a, :c => c}] ) scope.update_all( [ "lft = CASE WHEN lft BETWEEN :a AND :b THEN lft + (:d - :a) " \ "WHEN lft BETWEEN :b + 1 AND :c - 1 THEN lft - (:b - :a + 1) ELSE lft END, " \ "rgt = CASE WHEN rgt BETWEEN :a AND :b THEN rgt + (:d - :a) " \ "WHEN rgt BETWEEN :b + 1 AND :c - 1 THEN rgt - (:b - :a + 1) ELSE rgt END", {:a => a, :b => b, :c => c, :d => d} ] ) elsif c < a # Moving to the left scope = self.class.where( "lft BETWEEN :c AND :b OR rgt BETWEEN :c AND :b", {:a => a, :b => b, :c => c} ) scope.update_all( [ "lft = CASE WHEN lft BETWEEN :a AND :b THEN lft - (:a - :c) " \ "WHEN lft BETWEEN :c AND :a - 1 THEN lft + (:b - :a + 1) ELSE lft END, " \ "rgt = CASE WHEN rgt BETWEEN :a AND :b THEN rgt - (:a - :c) " \ "WHEN rgt BETWEEN :c AND :a - 1 THEN rgt + (:b - :a + 1) ELSE rgt END", {:a => a, :b => b, :c => c, :d => d} ] ) end reload_nested_set_values end end def destroy_children unless @without_nested_set_update lock_nested_set reload_nested_set_values end children.each {|c| c.send :destroy_without_nested_set_update} unless @without_nested_set_update self.class.where("lft > ? OR rgt > ?", lft, lft).update_all( [ "lft = CASE WHEN lft > :lft THEN lft - :shift ELSE lft END, " \ "rgt = CASE WHEN rgt > :lft THEN rgt - :shift ELSE rgt END", {:lft => lft, :shift => rgt - lft + 1} ] ) end end def destroy_without_nested_set_update @without_nested_set_update = true destroy end def reload_nested_set_values self.lft, self.rgt = Project.where(:id => id).pick(:lft, :rgt) end def save_nested_set_values self.class.where(:id => id).update_all(:lft => lft, :rgt => rgt) end def move_possible?(project) new_record? || !is_or_is_ancestor_of?(project) end def lock_nested_set lock = true if /sqlserver/i.match?(self.class.connection.adapter_name) lock = "WITH (ROWLOCK HOLDLOCK UPDLOCK)" end self.class.order(:id).lock(lock).ids end def nested_set_scope self.class.order(:lft) end def same_nested_set_scope?(project) true end module ClassMethods def rebuild_tree! transaction do reorder(:id).lock.ids update_all(:lft => nil, :rgt => nil) rebuild_nodes end end private def rebuild_nodes(parent_id = nil) nodes = Project.where(:parent_id => parent_id).where(:rgt => nil, :lft => nil).reorder(:name) nodes.each do |node| node.send :add_to_nested_set, false node.send :save_nested_set_values rebuild_nodes node.id end end end end end end