001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2009 SonarSource SA
004     * mailto:contact AT sonarsource DOT com
005     *
006     * Sonar is free software; you can redistribute it and/or
007     * modify it under the terms of the GNU Lesser General Public
008     * License as published by the Free Software Foundation; either
009     * version 3 of the License, or (at your option) any later version.
010     *
011     * Sonar is distributed in the hope that it will be useful,
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014     * Lesser General Public License for more details.
015     *
016     * You should have received a copy of the GNU Lesser General Public
017     * License along with Sonar; if not, write to the Free Software
018     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019     */
020    package org.sonar.api.qualitymodel;
021    
022    import com.google.common.collect.Lists;
023    import org.apache.commons.lang.ObjectUtils;
024    import org.apache.commons.lang.StringUtils;
025    import org.apache.commons.lang.builder.ToStringBuilder;
026    import org.apache.commons.lang.builder.ToStringStyle;
027    import org.sonar.api.rules.Rule;
028    
029    import javax.persistence.*;
030    import java.util.List;
031    
032    /**
033     * @since 2.3
034     */
035    @Entity
036    @Table(name = "quality_models")
037    public final class Model implements Comparable<Model> {
038    
039      @Id
040      @Column(name = "id")
041      @GeneratedValue
042      private Integer id;
043    
044      @Column(name = "name", nullable = false, unique = true, length = 100)
045      private String name;
046    
047      @OneToMany(mappedBy = "model", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
048      private List<Characteristic> characteristics = Lists.newArrayList();
049    
050      /**
051       * Use the factory method <code>Model</code>
052       */
053      Model() {
054      }
055    
056      public static Model create() {
057        return new Model();
058      }
059    
060      public static Model createByName(String s) {
061        return new Model().setName(s);
062      }
063    
064      public Characteristic createCharacteristicByName(String name) {
065        Characteristic c = new Characteristic().setName(name, true);
066        return addCharacteristic(c);
067      }
068    
069      public Characteristic createCharacteristicByKey(String key, String name) {
070        Characteristic c = new Characteristic().setKey(key).setName(name, false);
071        return addCharacteristic(c);
072      }
073    
074      public Characteristic createCharacteristicByRule(Rule rule) {
075        Characteristic c = new Characteristic().setRule(rule);
076        return addCharacteristic(c);
077      }
078    
079      public Integer getId() {
080        return id;
081      }
082    
083      Model setId(Integer id) {
084        this.id = id;
085        return this;
086      }
087    
088      public String getName() {
089        return name;
090      }
091    
092      public List<Characteristic> getRootCharacteristics() {
093        return getCharacteristicsByDepth(Characteristic.ROOT_DEPTH);
094      }
095    
096      public Model setName(String name) {
097        this.name = StringUtils.trim(name);
098        return this;
099      }
100    
101      public Characteristic addCharacteristic(Characteristic c) {
102        c.setModel(this);
103        c.setOrder(characteristics.size() + 1);
104        characteristics.add(c);
105        return c;
106      }
107    
108      /**
109       * @return enabled characteristics
110       */
111      public List<Characteristic> getCharacteristics() {
112        return getCharacteristics(true);
113      }
114    
115      public List<Characteristic> getCharacteristics(boolean onlyEnabled) {
116        if (!onlyEnabled) {
117          return characteristics;
118        }
119        List<Characteristic> result = Lists.newArrayList();
120        for (Characteristic characteristic : characteristics) {
121          if (characteristic.getEnabled()) {
122            result.add(characteristic);
123          }
124        }
125        return result;
126      }
127    
128      /**
129       * Search for an ENABLED characteristic by its key.
130       */
131      public Characteristic getCharacteristicByKey(String key) {
132        for (Characteristic characteristic : characteristics) {
133          if (characteristic.getEnabled() && StringUtils.equals(key, characteristic.getKey())) {
134            return characteristic;
135          }
136        }
137        return null;
138      }
139    
140      /**
141       * Search for an ENABLED characteristic with the specified rule.
142       */
143      public Characteristic getCharacteristicByRule(Rule rule) {
144        if (rule != null) {
145          for (Characteristic characteristic : characteristics) {
146            if (characteristic.getEnabled() && ObjectUtils.equals(rule, characteristic.getRule())) {
147              return characteristic;
148            }
149          }
150        }
151        return null;
152      }
153    
154      /**
155       * Search for ENABLED characteristics by their depth.
156       */
157      public List<Characteristic> getCharacteristicsByDepth(int depth) {
158        List<Characteristic> result = Lists.newArrayList();
159        for (Characteristic c : characteristics) {
160          if (c.getEnabled() && c.getDepth() == depth) {
161            result.add(c);
162          }
163        }
164        return result;
165      }
166    
167      /**
168       * Search for an ENABLED characteristic by its name.
169       */
170      public Characteristic getCharacteristicByName(String name) {
171        for (Characteristic characteristic : characteristics) {
172          if (characteristic.getEnabled() && StringUtils.equals(name, characteristic.getName())) {
173            return characteristic;
174          }
175        }
176        return null;
177      }
178    
179      public Model removeCharacteristic(Characteristic characteristic) {
180        if (characteristic.getId() == null) {
181          characteristics.remove(characteristic);
182          for (Characteristic parent : characteristic.getParents()) {
183            parent.removeChild(characteristic);
184          }
185        } else {
186          characteristic.setEnabled(false);
187        }
188        for (Characteristic child : characteristic.getChildren()) {
189          removeCharacteristic(child);
190        }
191        return this;
192      }
193    
194      @Override
195      public boolean equals(Object o) {
196        if (this == o) {
197          return true;
198        }
199        if (o == null || getClass() != o.getClass()) {
200          return false;
201        }
202    
203        Model model = (Model) o;
204        if (name != null ? !name.equals(model.name) : model.name != null) {
205          return false;
206        }
207        return true;
208      }
209    
210      @Override
211      public int hashCode() {
212        return name != null ? name.hashCode() : 0;
213      }
214    
215      @Override
216      public String toString() {
217        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
218            .append("id", id)
219            .append("name", name)
220            .toString();
221      }
222    
223      public int compareTo(Model o) {
224        return getName().compareTo(o.getName());
225      }
226    
227    }