]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-3755 rename COST to EFFORT_TO_FIX
authorSimon Brandhof <simon.brandhof@gmail.com>
Fri, 3 May 2013 20:42:05 +0000 (22:42 +0200)
committerSimon Brandhof <simon.brandhof@gmail.com>
Fri, 3 May 2013 20:49:12 +0000 (22:49 +0200)
47 files changed:
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/issue/IssueHandlers.java
sonar-batch/src/main/java/org/sonar/batch/issue/DeprecatedViolations.java
sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java
sonar-core/src/main/java/org/sonar/core/issue/DefaultIssueBuilder.java
sonar-core/src/main/java/org/sonar/core/issue/IssueUpdater.java
sonar-core/src/main/java/org/sonar/core/issue/db/IssueDto.java
sonar-core/src/main/resources/org/sonar/core/issue/db/IssueMapper.xml
sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl
sonar-core/src/test/java/org/sonar/core/issue/DefaultIssueBuilderTest.java
sonar-core/src/test/java/org/sonar/core/issue/db/IssueDaoTest.java
sonar-core/src/test/java/org/sonar/core/issue/db/IssueDtoTest.java
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_all.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_assigned.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_component_root.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_date_creation.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_ids.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_key.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_query.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_by_rules.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_issue_ids_and_components_ids.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_open_issues.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueDaoTest/should_select_returned_sorted_result.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_insert_new_issues-result.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_update_issues-result.xml
sonar-core/src/test/resources/org/sonar/core/issue/db/IssueStorageTest/should_update_issues.xml
sonar-core/src/test/resources/org/sonar/core/persistence/DryRunDatabaseFactoryTest/should_create_database_with_issues.xml
sonar-plugin-api/src/main/java/org/sonar/api/issue/Issuable.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/IssueHandler.java
sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java [deleted file]
sonar-server/src/main/java/org/sonar/server/issue/ServerIssueActions.java
sonar-server/src/main/java/org/sonar/server/issue/WebIssuesInternal.java [new file with mode: 0644]
sonar-server/src/main/java/org/sonar/server/platform/Platform.java
sonar-server/src/main/java/org/sonar/server/rule/WebRules.java
sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb
sonar-server/src/main/webapp/WEB-INF/app/controllers/resource_controller.rb
sonar-server/src/main/webapp/WEB-INF/app/models/internal.rb
sonar-server/src/main/webapp/WEB-INF/app/views/issue/_issue.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/issues/_list.html.erb
sonar-server/src/main/webapp/WEB-INF/app/views/resource/_issue.html.erb
sonar-server/src/main/webapp/WEB-INF/db/migrate/395_create_issues.rb
sonar-server/src/test/java/org/sonar/server/rule/WebRulesTest.java
sonar-ws-client/src/main/java/org/sonar/wsclient/issue/Issue.java
sonar-ws-client/src/main/java/org/sonar/wsclient/issue/NewIssue.java
sonar-ws-client/src/test/java/org/sonar/wsclient/issue/IssueParserTest.java
sonar-ws-client/src/test/java/org/sonar/wsclient/issue/NewIssueTest.java
sonar-ws-client/src/test/resources/org/sonar/wsclient/issue/IssueParserTest/search.json

index dbdc000ce0bc00f5ef065b0921eedddfbff361f3..ef60b59c944a081eb8b30a46fae8b58fc77439ee 100644 (file)
@@ -101,6 +101,12 @@ public class IssueHandlers implements BatchExtension {
       return this;
     }
 
+    @Override
+    public IssueHandler.Context setEffortToFix(@Nullable Double d) {
+      updater.setEffortToFix(issue, d);
+      return this;
+    }
+
     @Override
     public IssueHandler.Context setAttribute(String key, @Nullable String value) {
       throw new UnsupportedOperationException("TODO");
index 8ebc4150672def1079f2a482b3e7681f560ca1a7..d0db555891abe99fdb1e343277262ded4fd87303 100644 (file)
@@ -52,7 +52,7 @@ public class DeprecatedViolations implements BatchComponent {
       .createdDate(creationDate)
       .componentKey(violation.getResource().getEffectiveKey())
       .ruleKey(RuleKey.of(violation.getRule().getRepositoryKey(), violation.getRule().getKey()))
-      .cost(violation.getCost())
+      .effortToFix(violation.getCost())
       .line(violation.getLineId())
       .description(violation.getMessage())
       .severity(violation.getSeverity() != null ? violation.getSeverity().name() : Severity.MAJOR)
index 86eefaed14aa1809d29be4a0fbc70af05b35242e..2e25531216e87bfcbf99b1bd5be7bf61331216b8 100644 (file)
@@ -51,7 +51,7 @@ public class DefaultIssue implements Issue {
   private boolean manualSeverity = false;
   private String description;
   private Integer line;
-  private Double cost;
+  private Double effortToFix;
   private String status;
   private String resolution;
   private String userLogin;
@@ -140,13 +140,13 @@ public class DefaultIssue implements Issue {
     return this;
   }
 
-  public Double cost() {
-    return cost;
+  public Double effortToFix() {
+    return effortToFix;
   }
 
-  public DefaultIssue setCost(@Nullable Double c) {
-    Preconditions.checkArgument(c == null || c >= 0, "Cost must be positive (got " + c + ")");
-    this.cost = c;
+  public DefaultIssue setEffortToFix(@Nullable Double d) {
+    Preconditions.checkArgument(d == null || d >= 0, "Effort to fix must be greater than or equal 0 (got " + d + ")");
+    this.effortToFix = d;
     return this;
   }
 
index 19da2da56e26577cf186724953b64363392beb43..497e1f860af2d6829f68b1d1bb0d9ffc1a3298cb 100644 (file)
@@ -40,7 +40,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder {
   private Integer line;
   private String description;
   private String severity;
-  private Double cost;
+  private Double effortToFix;
   private boolean manual = false;
   private Date createdDate;
   private Map<String, String> attributes;
@@ -84,8 +84,8 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder {
   }
 
   @Override
-  public Issuable.IssueBuilder cost(@Nullable Double cost) {
-    this.cost = cost;
+  public Issuable.IssueBuilder effortToFix(@Nullable Double d) {
+    this.effortToFix = d;
     return this;
   }
 
@@ -124,7 +124,7 @@ public class DefaultIssueBuilder implements Issuable.IssueBuilder {
     issue.setRuleKey(ruleKey);
     issue.setDescription(description);
     issue.setSeverity(Objects.firstNonNull(severity, Severity.MAJOR));
-    issue.setCost(cost);
+    issue.setEffortToFix(effortToFix);
     issue.setLine(line);
     issue.setManual(manual);
     issue.setManualSeverity(manual);
index 60c31e673b0a7cf4f2a6d97592dd8475692a656b..4f325a5cfa2562f44ce3d17c05943a387730158b 100644 (file)
@@ -106,6 +106,10 @@ public class IssueUpdater implements BatchComponent, ServerComponent {
     issue.setCloseDate(d);
   }
 
+  public void setEffortToFix(DefaultIssue issue, @Nullable Double d) {
+    issue.setEffortToFix(d);
+  }
+
   public boolean setAttribute(DefaultIssue issue, String key, @Nullable String value, IssueChangeContext context) {
     String oldValue = issue.attribute(key);
     if (!Objects.equal(oldValue, value)) {
index 46128519883b367db62e66b134cecd9a7adf998f..6625f8e821b69be28524e6d6ef05bd5aa959510c 100644 (file)
@@ -44,7 +44,7 @@ public final class IssueDto {
   private boolean manualIssue;
   private String description;
   private Integer line;
-  private Double cost;
+  private Double effortToFix;
   private String status;
   private String resolution;
   private String checksum;
@@ -148,12 +148,12 @@ public final class IssueDto {
     return this;
   }
 
-  public Double getCost() {
-    return cost;
+  public Double getEffortToFix() {
+    return effortToFix;
   }
 
-  public IssueDto setCost(@Nullable Double cost) {
-    this.cost = cost;
+  public IssueDto setEffortToFix(@Nullable Double d) {
+    this.effortToFix = d;
     return this;
   }
 
@@ -306,7 +306,7 @@ public final class IssueDto {
       .setKey(issue.key())
       .setLine(issue.line())
       .setDescription(issue.description())
-      .setCost(issue.cost())
+      .setEffortToFix(issue.effortToFix())
       .setResolution(issue.resolution())
       .setStatus(issue.status())
       .setSeverity(issue.severity())
@@ -332,7 +332,7 @@ public final class IssueDto {
     issue.setStatus(status);
     issue.setResolution(resolution);
     issue.setDescription(description);
-    issue.setCost(cost);
+    issue.setEffortToFix(effortToFix);
     issue.setLine(line);
     issue.setSeverity(severity);
     issue.setUserLogin(userLogin);
index d96764e5c4cb640d9fa6d63d1fb008317c3f2571..4f0c14f67d2596e4ff8bb5398c8c46dbaf01a5bf 100644 (file)
@@ -14,7 +14,7 @@
     i.manual_issue as manualIssue,
     i.description as description,
     i.line as line,
-    i.cost as cost,
+    i.effort_to_fix as effortToFix,
     i.status as status,
     i.resolution as resolution,
     i.checksum as checksum,
   </sql>
 
   <insert id="insert" parameterType="Issue" useGeneratedKeys="true" keyProperty="id">
-    INSERT INTO issues (kee, resource_id, rule_id, severity, manual_severity, manual_issue, description, line, cost, status,
+    INSERT INTO issues (kee, resource_id, rule_id, severity, manual_severity, manual_issue, description, line, effort_to_fix, status,
     resolution, checksum, user_login, assignee_login, author_login, attributes, issue_creation_date, issue_update_date,
     issue_close_date, created_at, updated_at)
-    VALUES (#{kee}, #{resourceId}, #{ruleId}, #{severity}, #{manualSeverity}, #{manualIssue}, #{description}, #{line}, #{cost}, #{status},
+    VALUES (#{kee}, #{resourceId}, #{ruleId}, #{severity}, #{manualSeverity}, #{manualIssue}, #{description}, #{line}, #{effortToFix}, #{status},
     #{resolution}, #{checksum}, #{userLogin}, #{assignee}, #{authorLogin}, #{attributes}, #{issueCreationDate},
     #{issueUpdateDate}, #{issueCloseDate}, #{createdAt}, #{updatedAt})
   </insert>
     <selectKey order="BEFORE" resultType="Long" keyProperty="id">
       select issues_seq.NEXTVAL from DUAL
     </selectKey>
-    INSERT INTO issues (id, kee, resource_id, rule_id, severity, manual_severity, manual_issue, description, line, cost, status,
+    INSERT INTO issues (id, kee, resource_id, rule_id, severity, manual_severity, manual_issue, description, line, effort_to_fix, status,
     resolution, checksum, user_login, assignee_login, author_login, attributes, issue_creation_date, issue_update_date,
     issue_close_date, created_at, updated_at)
-    VALUES (#{id}, #{kee}, #{resourceId}, #{ruleId}, #{severity}, #{manualSeverity}, #{manualIssue}, #{description}, #{line}, #{cost}, #{status},
+    VALUES (#{id}, #{kee}, #{resourceId}, #{ruleId}, #{severity}, #{manualSeverity}, #{manualIssue}, #{description}, #{line}, #{effortToFix}, #{status},
     #{resolution}, #{checksum}, #{userLogin}, #{assignee}, #{authorLogin}, #{attributes}, #{issueCreationDate},
     #{issueUpdateDate}, #{issueCloseDate}, #{createdAt}, #{updatedAt})
   </insert>
@@ -63,7 +63,7 @@
       manual_issue=#{manualIssue},
       description=#{description},
       line=#{line},
-      cost=#{cost},
+      effort_to_fix=#{effortToFix},
       status=#{status},
       resolution=#{resolution},
       checksum=#{checksum},
index a57ece8a98202cb58e68fbe0362f4fed715180d5..05ca08707b31ddece684e29a6da4dcddd05830e0 100644 (file)
@@ -527,7 +527,7 @@ CREATE TABLE "ISSUES" (
   "MANUAL_ISSUE" BOOLEAN NOT NULL,
   "DESCRIPTION" VARCHAR(4000),
   "LINE" INTEGER,
-  "COST" DOUBLE,
+  "EFFORT_TO_FIX" DOUBLE,
   "STATUS" VARCHAR(20),
   "RESOLUTION" VARCHAR(20),
   "CHECKSUM" VARCHAR(1000),
index fe536ac5d9a373c796e900e39fea0056acdb2d2d..6ce9186311084c1915c2450f5722f85bf6069c2c 100644 (file)
@@ -35,7 +35,7 @@ public class DefaultIssueBuilderTest {
       .componentKey(componentKey)
       .description("the desc")
       .line(123)
-      .cost(10000.0)
+      .effortToFix(10000.0)
       .ruleKey(RuleKey.of("squid", "NullDereference"))
       .severity(Severity.CRITICAL)
       .attribute("JIRA", "FOO-123")
@@ -44,7 +44,7 @@ public class DefaultIssueBuilderTest {
 
     assertThat(issue).isNotNull();
     assertThat(issue.key()).isNotNull();
-    assertThat(issue.cost()).isEqualTo(10000.0);
+    assertThat(issue.effortToFix()).isEqualTo(10000.0);
     assertThat(issue.componentKey()).isEqualTo(componentKey);
     assertThat(issue.description()).isEqualTo("the desc");
     assertThat(issue.line()).isEqualTo(123);
index 83b9a362a6a27aadcc11aa55fc5fc338eda599e8..7592dae2f0824f088348b9d04a9efe793e9ee8f3 100644 (file)
@@ -58,7 +58,7 @@ public class IssueDaoTest extends AbstractDaoTestCase {
     assertThat(issue.isManualIssue()).isFalse();
     assertThat(issue.getDescription()).isNull();
     assertThat(issue.getLine()).isEqualTo(200);
-    assertThat(issue.getCost()).isEqualTo(4.2);
+    assertThat(issue.getEffortToFix()).isEqualTo(4.2);
     assertThat(issue.getStatus()).isEqualTo("OPEN");
     assertThat(issue.getResolution()).isEqualTo("FIXED");
     assertThat(issue.getChecksum()).isEqualTo("XXX");
index 2a5855695840abb6f46e79f57e0fa857937e4155..539229136abdc44f55b9d5b61f2a9826b29895b1 100644 (file)
@@ -61,7 +61,7 @@ public class IssueDtoTest {
         .setResourceId(1)
         .setStatus(Issue.STATUS_CLOSED)
         .setResolution(Issue.RESOLUTION_FALSE_POSITIVE)
-        .setCost(15.0)
+        .setEffortToFix(15.0)
         .setLine(6)
         .setSeverity("BLOCKER")
         .setDescription("message")
@@ -81,7 +81,7 @@ public class IssueDtoTest {
     assertThat(issue.componentKey()).isEqualTo("component-key");
     assertThat(issue.status()).isEqualTo(Issue.STATUS_CLOSED);
     assertThat(issue.resolution()).isEqualTo(Issue.RESOLUTION_FALSE_POSITIVE);
-    assertThat(issue.cost()).isEqualTo(15.0);
+    assertThat(issue.effortToFix()).isEqualTo(15.0);
     assertThat(issue.line()).isEqualTo(6);
     assertThat(issue.severity()).isEqualTo("BLOCKER");
     assertThat(issue.description()).isEqualTo("message");
index 17e12b371a58e5b98aff01f85073c0ff8d9785bd..285456d07fe1f5ab746ca2744b87d8082a3ec4eb 100644 (file)
@@ -11,7 +11,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -36,7 +36,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -63,7 +63,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 300f7a99aadc06349ed60aebd0ecb51f50157542..e09cf89e7a815a67bc292962fc6c3e733bcd3293 100644 (file)
@@ -11,7 +11,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -36,7 +36,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -63,7 +63,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 5867469c57521464793a2e9396dcdb29927170db..a55ab8c6142d23eb5a83186264e84917e2fde244 100644 (file)
@@ -10,7 +10,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="OPEN"
       resolution="[null]"
       checksum="[null]"
@@ -35,7 +35,7 @@
       manual_issue="[false]"
       description="[null]"
       line="120"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="CLOSED"
       resolution="FIXED"
       checksum="[null]"
index 40417c1bcfffb556c5a480b8e226be927264382c..dc3dce23a040b08123495447d0a9e9d401454132 100644 (file)
@@ -10,7 +10,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -35,7 +35,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 17e12b371a58e5b98aff01f85073c0ff8d9785bd..285456d07fe1f5ab746ca2744b87d8082a3ec4eb 100644 (file)
@@ -11,7 +11,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -36,7 +36,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -63,7 +63,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 8c79cc3237f85a62d97e194c55c92906ffcdc29b..8b3367cd6f0890057e262fe44e24470e72ddaf6c 100644 (file)
@@ -10,7 +10,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 64ea7b18d5428e5be7fe7eb60845433cb78893e5..29750932d6ecb86f1d67f031a17f5f3c75e39305 100644 (file)
@@ -10,7 +10,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 5cb5360442fde8d77acf410baae478fbb35199c8..9fbab6fea10b78da5cceac8fbf4609eaa31e753f 100644 (file)
@@ -11,7 +11,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -36,7 +36,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -63,7 +63,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 17e12b371a58e5b98aff01f85073c0ff8d9785bd..285456d07fe1f5ab746ca2744b87d8082a3ec4eb 100644 (file)
@@ -11,7 +11,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -36,7 +36,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -63,7 +63,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index f05c5895f2f11be045cd0fc0c3e6c6f7af9115d1..59b4add50bad13669aeeca12001f203a60d4e871 100644 (file)
@@ -10,7 +10,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="OPEN"
       resolution="[null]"
       checksum="[null]"
@@ -35,7 +35,7 @@
       manual_issue="[false]"
       description="[null]"
       line="120"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="OPEN"
       resolution="FIXED"
       checksum="[null]"
@@ -60,7 +60,7 @@
       manual_issue="[false]"
       description="[null]"
       line="120"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="CLOSED"
       resolution="FIXED"
       checksum="[null]"
index 92821838fe5b944898922ac0310238bfa5cfebe3..f6d9e75ea16bea99ca5b233027b8a2135b5767ed 100644 (file)
@@ -11,7 +11,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -36,7 +36,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
@@ -63,7 +63,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="4.2"
+      effort_to_fix="4.2"
       status="OPEN"
       resolution="FIXED"
       checksum="XXX"
index 3a0362262cc28d0190f30014fbb381de5e06b747..b1e88540c591f96d526eb7e4c91c7de0d48a7591 100644 (file)
@@ -3,7 +3,7 @@
       assignee_login="[null]"
       author_login="[null]"
       checksum="[null]"
-      cost="[null]"
+      effort_to_fix="[null]"
       description="[null]"
       line="5000"
       manual_issue="[false]"
index a82e547ed2386dd529e414794d3e309961266182..57e99d174a1afc9993a704f5bc76ec2d1618a084 100644 (file)
@@ -8,7 +8,7 @@
           assignee_login="loic"
           author_login="simon"
           checksum="FFFFF"
-          cost="[null]"
+          effort_to_fix="[null]"
           description="[null]"
           line="5000"
           manual_issue="[false]"
index 7a34c953c4b3750dc21743f5650973fa51caced8..56998d9b2a17f0fecf06160424897e209454c377 100644 (file)
@@ -8,7 +8,7 @@
           assignee_login="loic"
           author_login="simon"
           checksum="FFFFF"
-          cost="[null]"
+          effort_to_fix="[null]"
           description="[null]"
           line="3000"
           manual_issue="[false]"
index a2e0f6fced448df0e97b5fc688af24686bfd5616..1a8e204b301b588e661a5dff05d785660b688dc2 100644 (file)
@@ -28,7 +28,7 @@
       manual_issue="[false]"
       description="[null]"
       line="200"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="OPEN"
       resolution="[null]"
       checksum="[null]"
@@ -53,7 +53,7 @@
       manual_issue="[false]"
       description="[null]"
       line="120"
-      cost="[null]"
+      effort_to_fix="[null]"
       status="OPEN"
       resolution="FIXED"
       checksum="[null]"
index a901efba9dd339171d841961a33046a6084bd537..c2390849ebf493f79b953c47fd2891996aed3dd7 100644 (file)
@@ -23,6 +23,7 @@ package org.sonar.api.issue;
 import org.sonar.api.component.Perspective;
 import org.sonar.api.rule.RuleKey;
 
+import javax.annotation.Nullable;
 import java.util.Collection;
 
 /**
@@ -33,17 +34,17 @@ public interface Issuable extends Perspective {
   interface IssueBuilder {
     IssueBuilder ruleKey(RuleKey ruleKey);
 
-    IssueBuilder line(Integer line);
+    IssueBuilder line(@Nullable Integer line);
 
     IssueBuilder description(String description);
 
     IssueBuilder severity(String severity);
 
-    IssueBuilder cost(Double cost);
+    IssueBuilder effortToFix(@Nullable Double d);
 
     IssueBuilder manual(boolean b);
 
-    IssueBuilder attribute(String key, String value);
+    IssueBuilder attribute(String key, @Nullable String value);
 
     Issue build();
   }
index 6f3de886588355da544af259bfc39a9ae6a2ed39..5f30ec93678455718c5619241ea6169df60788c1 100644 (file)
@@ -22,7 +22,6 @@ package org.sonar.api.issue;
 import org.sonar.api.rule.RuleKey;
 
 import javax.annotation.CheckForNull;
-
 import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
@@ -34,6 +33,7 @@ import java.util.Map;
 public interface Issue extends Serializable {
 
   int DESCRIPTION_MAX_SIZE = 4000;
+
   String STATUS_OPEN = "OPEN";
   String STATUS_REOPENED = "REOPENED";
   String STATUS_RESOLVED = "RESOLVED";
@@ -59,8 +59,18 @@ public interface Issue extends Serializable {
   @CheckForNull
   Integer line();
 
+  /**
+   * Arbitrary distance to threshold for resolving the issue.
+   * <p/>
+   * For examples:
+   * <ul>
+   *   <li>for the rule "Avoid too complex methods" : current complexity - max allowed complexity</li>
+   *   <li>for the rule "Avoid Duplications" : number of duplicated blocks</li>
+   *   <li>for the rule "Insufficient Line Coverage" : number of lines to cover to reach the accepted threshold</li>
+   * </ul>
+   */
   @CheckForNull
-  Double cost();
+  Double effortToFix();
 
   String status();
 
index 6be61be54847756f35a771133ca1d3b7d9de81cb..c0882086d2249a1e3496265e9369ff0d7385e6e7 100644 (file)
@@ -42,6 +42,8 @@ public interface IssueHandler extends BatchExtension {
 
     Context setSeverity(String severity);
 
+    Context setEffortToFix(@Nullable Double effortToFix);
+
     Context setAuthorLogin(@Nullable String login);
 
     Context setAttribute(String key, @Nullable String value);
diff --git a/sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java b/sonar-server/src/main/java/org/sonar/server/issue/JRubyInternalIssues.java
deleted file mode 100644 (file)
index 780c498..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.server.issue;
-
-import org.sonar.api.ServerComponent;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.core.issue.DefaultIssue;
-import org.sonar.core.issue.DefaultIssueBuilder;
-import org.sonar.core.issue.FieldDiffs;
-import org.sonar.core.issue.IssueComment;
-import org.sonar.core.issue.workflow.Transition;
-import org.sonar.server.platform.UserSession;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * All the issue features that are not published to public API.
- * TODO to be renamed to WebIssuesInternal
- */
-public class JRubyInternalIssues implements ServerComponent {
-
-  private final ServerIssueActions actions;
-
-  public JRubyInternalIssues(ServerIssueActions actions) {
-    this.actions = actions;
-  }
-
-  public List<Transition> listTransitions(String issueKey) {
-    return actions.listTransitions(issueKey, UserSession.get());
-  }
-
-  public Issue doTransition(String issueKey, String transitionKey) {
-    return actions.doTransition(issueKey, transitionKey, UserSession.get());
-  }
-
-  public Issue assign(String issueKey, String transitionKey) {
-    return actions.assign(issueKey, transitionKey, UserSession.get());
-  }
-
-  public Issue setSeverity(String issueKey, String severity) {
-    return actions.setSeverity(issueKey, severity, UserSession.get());
-  }
-
-  public IssueComment addComment(String issueKey, String comment) {
-    return actions.addComment(issueKey, comment, UserSession.get());
-  }
-
-  public IssueComment[] comments(String issueKey) {
-    return actions.comments(issueKey, UserSession.get());
-  }
-
-  public FieldDiffs[] changes(String issueKey) {
-    return actions.changes(issueKey, UserSession.get());
-  }
-
-  public Issue create(Map<String, String> parameters) {
-    String componentKey = parameters.get("component");
-    // TODO verify authorization
-    // TODO check existence of component
-    DefaultIssueBuilder builder = new DefaultIssueBuilder().componentKey(componentKey);
-    String line = parameters.get("line");
-    builder.line(line != null ? Integer.parseInt(line) : null);
-    builder.description(parameters.get("description"));
-    builder.severity(parameters.get("severity"));
-    // TODO verify existence of rule
-    builder.ruleKey(RuleKey.parse(parameters.get("rule")));
-    builder.manual(true);
-    Issue issue = builder.build();
-    return actions.create((DefaultIssue) issue, UserSession.get());
-  }
-}
index 56438a7fbd3ac73b28777898dfe91de7d2b80135..a2e1811601907241ef3b1c053b8f20bbfb998309 100644 (file)
@@ -125,7 +125,7 @@ public class ServerIssueActions implements ServerComponent {
   }
 
   public Issue create(DefaultIssue issue, UserSession userSession) {
-    // TODO merge with JRubyInternalIssues
+    // TODO merge with WebIssuesInternal
     issue.setManual(true);
     issue.setUserLogin(userSession.login());
 
diff --git a/sonar-server/src/main/java/org/sonar/server/issue/WebIssuesInternal.java b/sonar-server/src/main/java/org/sonar/server/issue/WebIssuesInternal.java
new file mode 100644 (file)
index 0000000..0a2a246
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.issue;
+
+import org.sonar.api.ServerComponent;
+import org.sonar.api.issue.Issue;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.core.issue.DefaultIssue;
+import org.sonar.core.issue.DefaultIssueBuilder;
+import org.sonar.core.issue.FieldDiffs;
+import org.sonar.core.issue.IssueComment;
+import org.sonar.core.issue.workflow.Transition;
+import org.sonar.server.platform.UserSession;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * All the issue features that are not published to public API.
+ * TODO to be renamed to WebIssuesInternal
+ */
+public class WebIssuesInternal implements ServerComponent {
+
+  private final ServerIssueActions actions;
+
+  public WebIssuesInternal(ServerIssueActions actions) {
+    this.actions = actions;
+  }
+
+  public List<Transition> listTransitions(String issueKey) {
+    return actions.listTransitions(issueKey, UserSession.get());
+  }
+
+  public Issue doTransition(String issueKey, String transitionKey) {
+    return actions.doTransition(issueKey, transitionKey, UserSession.get());
+  }
+
+  public Issue assign(String issueKey, String transitionKey) {
+    return actions.assign(issueKey, transitionKey, UserSession.get());
+  }
+
+  public Issue setSeverity(String issueKey, String severity) {
+    return actions.setSeverity(issueKey, severity, UserSession.get());
+  }
+
+  public IssueComment addComment(String issueKey, String comment) {
+    return actions.addComment(issueKey, comment, UserSession.get());
+  }
+
+  public IssueComment[] comments(String issueKey) {
+    return actions.comments(issueKey, UserSession.get());
+  }
+
+  public FieldDiffs[] changes(String issueKey) {
+    return actions.changes(issueKey, UserSession.get());
+  }
+
+  public Issue create(Map<String, String> parameters) {
+    String componentKey = parameters.get("component");
+    // TODO verify authorization
+    // TODO check existence of component
+    DefaultIssueBuilder builder = new DefaultIssueBuilder().componentKey(componentKey);
+    String line = parameters.get("line");
+    builder.line(line != null ? Integer.parseInt(line) : null);
+    builder.description(parameters.get("description"));
+    builder.severity(parameters.get("severity"));
+    String effortToFix = parameters.get("effortToFix");
+    builder.effortToFix(effortToFix!=null ? Double.parseDouble(effortToFix) : null);
+    // TODO verify existence of rule
+    builder.ruleKey(RuleKey.parse(parameters.get("rule")));
+    builder.manual(true);
+    Issue issue = builder.build();
+    return actions.create((DefaultIssue) issue, UserSession.get());
+  }
+}
index 7482610dd255634d8938d5c3f2c67c1df4ed558f..650bda941d48c7ee4f1f928d6150fd29c7efe5c9 100644 (file)
@@ -246,7 +246,7 @@ public final class Platform {
     servicesContainer.addSingleton(ServerIssueActions.class);
     servicesContainer.addSingleton(ServerIssueFinder.class);
     servicesContainer.addSingleton(WebIssuesApi.class);
-    servicesContainer.addSingleton(JRubyInternalIssues.class);
+    servicesContainer.addSingleton(WebIssuesInternal.class);
 
     // rules
     servicesContainer.addSingleton(WebRules.class);
index bb56bd0f2a5e0525526a0183e56e272cf76b55e8..6a6e050091d159fcf5e71d5ced0361a0615b16de 100644 (file)
@@ -36,7 +36,7 @@ public class WebRules implements ServerComponent, Startable {
     this.i18n = i18n;
   }
 
-  public String l10nRuleName(Rule rule) {
+  public String ruleL10nName(Rule rule) {
     String name = i18n.getName(rule.getRepositoryKey(), rule.getKey(), UserSession.get().locale());
     if (name == null) {
       name = rule.getName();
@@ -44,7 +44,7 @@ public class WebRules implements ServerComponent, Startable {
     return name;
   }
 
-  public String l10nRuleDescription(Rule rule) {
+  public String ruleL10nDescription(Rule rule) {
     String desc = i18n.getDescription(rule.getRepositoryKey(), rule.getKey(), UserSession.get().locale());
     if (desc == null) {
       desc = rule.getDescription();
index cfaf0cf18f4efec17894bed29dc1a180dac4f24b..76bfc42e2c5088768492329555fef1db98027654 100644 (file)
@@ -186,8 +186,8 @@ class Api::IssuesController < Api::ApiController
     }
     json[:severity] = issue.severity if issue.severity
     json[:desc] = issue.description if issue.description
-    json[:line] = issue.line if issue.line
-    json[:cost] = issue.cost if issue.cost
+    json[:line] = issue.line.to_i if issue.line
+    json[:effortToFix] = issue.effortToFix.to_f if issue.effortToFix
     json[:userLogin] = issue.userLogin if issue.userLogin
     json[:assignee] = issue.assignee if issue.assignee
     json[:creationDate] = format_java_datetime(issue.creationDate) if issue.creationDate
@@ -208,8 +208,8 @@ class Api::IssuesController < Api::ApiController
   end
 
   def rule_to_json(rule)
-    l10n_name = Internal.rules.l10nRuleName(rule)
-    l10n_desc = Internal.rules.l10nRuleDescription(rule)
+    l10n_name = Internal.rules.ruleL10nName(rule)
+    l10n_desc = Internal.rules.ruleL10nDescription(rule)
     json = {:key => rule.getKey()}
     json[:name] = l10n_name if l10n_name
     json[:desc] = l10n_desc if l10n_desc
index c798bf21073cc8ac6fbc5d9ef520a4d85fdb9e85..c38b6afd6529b901aee40993aa52a286770379d7 100644 (file)
@@ -454,8 +454,8 @@ class ResourceController < ApplicationController
       end
     end
 
-    issues = Api.issues.find(options).issues
-    issues.each do |issue|
+    @issue_results = Api.issues.find(options)
+    @issue_results.issues.each do |issue|
       # sorted by severity => from blocker to info
       if @lines && issue.line && issue.line>0 && issue.line<=@lines.size
         @lines[issue.line-1].add_issue(issue)
index 85717fc270eb7c66eb458301e29792cd8db26018..49f5e834c4cc0e70bd0b0f9f54a2b2beafc41044 100644 (file)
@@ -23,7 +23,7 @@
 class Internal
 
   def self.issues
-    component(Java::OrgSonarServerIssue::JRubyInternalIssues.java_class)
+    component(Java::OrgSonarServerIssue::WebIssuesInternal.java_class)
   end
 
   def self.issues_api
index 9c20ecb21b8ee42b5e0745f25d26a8b2c4b5d455..a9bfe732f3450474d8289a47364836033f55ed12 100644 (file)
@@ -64,7 +64,7 @@
         <%= message('author') -%>:
       </td>
       <td class="val">
-        <% author = @issue.user_login %>
+        <% author = @issue.userLogin %>
         <%= author ? h(author) : '-' -%>
       </td>
     </tr>
@@ -87,7 +87,7 @@
 
 
     <% if @issue.rule_key %>
-      <% rule_name = Internal.rules.ruleName(I18n.locale, @issue.rule_key) %>
+      <% rule_name = Internal.rules.ruleL10nName(@issue.rule_key) %>
       <tr>
         <td class="key">
           <%= message('rule') -%>:
index 37f8a78c38e9e39d2e8b6e8819b8a13a0c82f90d..4c547c1c917ebc2f037da77fe97bb3dd4b210187 100644 (file)
@@ -29,7 +29,7 @@
         Line
       </th>
       <th width="1%">
-        Cost
+        Effort to Fix
       </th>
       <th>
         User
@@ -90,7 +90,7 @@
           <%= issue.line -%>
         </td>
         <td>
-          <%= issue.cost -%>
+          <%= issue.effortToFix -%>
         </td>
         <td>
           <%= issue.userLogin -%>
index 30bed8226d52b9c9a651cb5b7c71778b1ffff7e5..ff817a8bfd95bf5bb6a77ce81ef59ac2b2ebd914 100644 (file)
@@ -8,7 +8,7 @@
       <img src="<%= ApplicationController.root_context -%>/images/priority/<%= issue.severity -%>.png">
       &nbsp;
       <span class="rulename">
-        <% rule_name = Internal.rules.ruleName(I18n.locale, issue.rule_key) %>
+        <% rule_name = Internal.rules.ruleL10nName(@issue_results.rule(issue)) %>
         <a class="open-modal issue-rule-modal" modal-width="800" href="<%= url_for :controller => 'rules', :action => 'show', :id => issue.rule_key.to_s, :modal => 'true', :layout => 'false' -%>">
             <%= h rule_name -%>
         </a>
index e31593b837673845b9c211776c3f855641de8e3a..90883a234cadf51303ce607fb856f5a54eed4850 100644 (file)
@@ -33,7 +33,7 @@ class CreateIssues < ActiveRecord::Migration
       t.column :manual_issue,         :boolean,   :null => false
       t.column :description,          :string,    :null => true,    :limit => 4000
       t.column :line,                 :integer,   :null => true
-      t.column :cost,                 :decimal,   :null => true,    :precision => 30,   :scale => 20
+      t.column :effort_to_fix,        :decimal,   :null => true,    :precision => 30,   :scale => 20
       t.column :status,               :string ,   :null => true,    :limit => 20
       t.column :resolution,           :string ,   :null => true,    :limit => 20
       t.column :checksum,             :string ,   :null => true,    :limit => 1000
index 390010080da3629b44268b2ff33d5b8249ab8996..f2fb7fec2810c0be64a2dd88deb9ef9a7b9e9506 100644 (file)
@@ -40,7 +40,7 @@ public class WebRulesTest {
     UserSession.set(new UserSession(123, "emmerik", Locale.FRENCH));
     when(i18n.getName("squid", "AvoidCycle", Locale.FRENCH)).thenReturn("Eviter les cycles");
 
-    String name = facade.l10nRuleName(new Rule("squid", "AvoidCycle"));
+    String name = facade.ruleL10nName(new Rule("squid", "AvoidCycle"));
     assertThat(name).isEqualTo("Eviter les cycles");
   }
 
@@ -51,7 +51,7 @@ public class WebRulesTest {
 
     Rule rule = new Rule("squid", "AvoidCycle");
     rule.setName("Avoid cycles");
-    String name = facade.l10nRuleName(rule);
+    String name = facade.ruleL10nName(rule);
     assertThat(name).isEqualTo("Avoid cycles");
   }
 
@@ -60,7 +60,7 @@ public class WebRulesTest {
     UserSession.set(new UserSession(123, "emmerik", Locale.FRENCH));
     when(i18n.getDescription("squid", "AvoidCycle", Locale.FRENCH)).thenReturn("Les cycles sont le mal");
 
-    String desc = facade.l10nRuleDescription(new Rule("squid", "AvoidCycle"));
+    String desc = facade.ruleL10nDescription(new Rule("squid", "AvoidCycle"));
     assertThat(desc).isEqualTo("Les cycles sont le mal");
   }
 
@@ -71,7 +71,7 @@ public class WebRulesTest {
 
     Rule rule = new Rule("squid", "AvoidCycle");
     rule.setDescription("Cycles are evil");
-    String desc = facade.l10nRuleDescription(rule);
+    String desc = facade.ruleL10nDescription(rule);
     assertThat(desc).isEqualTo("Cycles are evil");
   }
 
index 15ac459efb414630e04596e01c442b57885cded7..62929609cd92e8fc5ba8cc584c3b8e9181a486b0 100644 (file)
@@ -63,8 +63,13 @@ public class Issue {
     return JsonUtils.getInteger(json, "line");
   }
 
+  // TODO to be removed
   public Double cost() {
-    return JsonUtils.getDouble(json, "cost");
+    return JsonUtils.getDouble(json, "effortToFix");
+  }
+
+  public Double effortToFix() {
+    return JsonUtils.getDouble(json, "effortToFix");
   }
 
   public String status() {
index 13cd69f1947953eba6601ae4bfe36c79d3d59117..24f18407ef286f264b641af099e6d5ff3d3ccf1f 100644 (file)
@@ -68,11 +68,17 @@ public class NewIssue {
     return this;
   }
 
+  // TODO to be removed
   public NewIssue cost(Double d) {
     params.put("cost", d);
     return this;
   }
 
+  public NewIssue effortToFix(Double d) {
+    params.put("effortToFix", d);
+    return this;
+  }
+
   public NewIssue attribute(String key, String value) {
     params.put("attr[" + key + "]", value);
     return this;
index fbfb01a3a60981cdd4989452347b5f30ddf7971b..007707fa42a1ac8dc6d3b597bb4482681f1761b1 100644 (file)
@@ -44,7 +44,7 @@ public class IssueParserTest {
     assertThat(first.status()).isEqualTo("OPEN");
     assertThat(first.assignee()).isEqualTo("karadoc");
     assertThat(first.description()).isEqualTo("the desc");
-    assertThat(first.cost()).isEqualTo(4.2);
+    assertThat(first.effortToFix()).isEqualTo(4.2);
     assertThat(first.userLogin()).isEqualTo("perceval");
     assertThat(first.creationDate()).isNotNull();
     assertThat(first.updateDate()).isNotNull();
@@ -56,7 +56,7 @@ public class IssueParserTest {
     Issue second = list.get(1);
     assertThat(second.key()).isEqualTo("FGHIJ");
     assertThat(second.line()).isNull();
-    assertThat(second.cost()).isNull();
+    assertThat(second.effortToFix()).isNull();
     assertThat(second.description()).isNull();
     assertThat(second.attribute("JIRA")).isNull();
     assertThat(second.attributes()).isEmpty();
index f22cbd2efe26580edcd8f5cbde316dc7c7dc0e49..f544c9ed0c9bd0e8d70b613aa5351b0c4353feda 100644 (file)
@@ -34,7 +34,7 @@ public class NewIssueTest {
   public void test_create() {
     NewIssue newIssue = NewIssue.create()
       .component("Action.java")
-      .cost(4.2)
+      .effortToFix(4.2)
       .description("the desc")
       .line(123)
       .rule("squid:AvoidCycle")
index 2d6aa72a2b623e29e67c322f393b57d5d8f0357a..369223a48f3cb7c16d18cff91962b75945583b2b 100644 (file)
@@ -9,7 +9,7 @@
       "resolution": "FIXED",
       "status": "OPEN",
       "assignee": "karadoc",
-      "cost": 4.2,
+      "effortToFix": 4.2,
       "desc": "the desc",
       "title": "the title",
       "userLogin": "perceval",