001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2013 SonarSource
004     * mailto:contact AT sonarsource DOT com
005     *
006     * SonarQube 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     * SonarQube 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 License
017     * along with this program; if not, write to the Free Software Foundation,
018     * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019     */
020    package org.sonar.api.issue.internal;
021    
022    import java.io.Serializable;
023    
024    public class WorkDayDuration implements Serializable {
025    
026      private static final int DAY = 10000;
027      private static final int HOUR = 100;
028      private static final int MINUTE = 1;
029    
030      private int days;
031      private int hours;
032      private int minutes;
033    
034      private WorkDayDuration(int minutes, int hours, int days) {
035        this.minutes = minutes;
036        this.hours = hours;
037        this.days = days;
038      }
039    
040      private WorkDayDuration(long durationInLong) {
041        long time = durationInLong;
042        Long currentTime = time / DAY;
043        if (currentTime > 0) {
044          this.days = currentTime.intValue();
045          time = time - (currentTime * DAY);
046        }
047    
048        currentTime = time / HOUR;
049        if (currentTime > 0) {
050          this.hours = currentTime.intValue();
051          time = time - (currentTime * HOUR);
052        }
053    
054        currentTime = time / MINUTE;
055        if (currentTime > 0) {
056          this.minutes = currentTime.intValue();
057        }
058      }
059    
060      public static WorkDayDuration of(int minutes, int hours, int days) {
061        return new WorkDayDuration(minutes, hours, days);
062      }
063    
064      public static WorkDayDuration fromLong(long durationInLong) {
065        return new WorkDayDuration(durationInLong);
066      }
067    
068      public long toLong() {
069        return days * DAY + hours * HOUR + minutes * MINUTE;
070      }
071    
072      public int days() {
073        return days;
074      }
075    
076      public int hours() {
077        return hours;
078      }
079    
080      public int minutes() {
081        return minutes;
082      }
083    
084      @Override
085      public boolean equals(Object o) {
086        if (this == o) {
087          return true;
088        }
089        if (o == null || getClass() != o.getClass()) {
090          return false;
091        }
092        WorkDayDuration workDayDuration = (WorkDayDuration) o;
093        if (days != workDayDuration.days) {
094          return false;
095        }
096        if (hours != workDayDuration.hours) {
097          return false;
098        }
099        if (minutes != workDayDuration.minutes) {
100          return false;
101        }
102        return true;
103      }
104    
105      @Override
106      public int hashCode() {
107        int result = Integer.valueOf(days).hashCode();
108        result = 29 * result + Integer.valueOf(hours).hashCode();
109        result = 27 * result + Integer.valueOf(minutes).hashCode();
110        return result;
111      }
112    
113    }