001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2014 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.batch.sensor.dependency.internal;
021    
022    import com.google.common.base.Preconditions;
023    import org.apache.commons.lang.builder.EqualsBuilder;
024    import org.apache.commons.lang.builder.HashCodeBuilder;
025    import org.sonar.api.batch.fs.InputFile;
026    import org.sonar.api.batch.sensor.SensorStorage;
027    import org.sonar.api.batch.sensor.dependency.Dependency;
028    import org.sonar.api.batch.sensor.internal.DefaultStorable;
029    
030    import javax.annotation.Nullable;
031    
032    public class DefaultDependency extends DefaultStorable implements Dependency {
033    
034      private InputFile from;
035      private InputFile to;
036      private int weight = 1;
037    
038      public DefaultDependency() {
039        super(null);
040      }
041    
042      public DefaultDependency(@Nullable SensorStorage storage) {
043        super(storage);
044      }
045    
046      @Override
047      public Dependency from(InputFile from) {
048        Preconditions.checkNotNull(from, "InputFile should be non null");
049        this.from = from;
050        return this;
051      }
052    
053      @Override
054      public Dependency to(InputFile to) {
055        Preconditions.checkNotNull(to, "InputFile should be non null");
056        this.to = to;
057        return this;
058      }
059    
060      @Override
061      public Dependency weight(int weight) {
062        Preconditions.checkArgument(weight > 1, "weight should be greater than 1");
063        this.weight = weight;
064        return this;
065      }
066    
067      @Override
068      public void doSave() {
069        Preconditions.checkState(!this.from.equals(this.to), "From and To can't be the same inputFile");
070        Preconditions.checkNotNull(this.from, "From inputFile can't be null");
071        Preconditions.checkNotNull(this.to, "To inputFile can't be null");
072        storage.store((Dependency) this);
073      }
074    
075      @Override
076      public InputFile from() {
077        return this.from;
078      }
079    
080      @Override
081      public InputFile to() {
082        return this.to;
083      }
084    
085      @Override
086      public int weight() {
087        return this.weight;
088      }
089    
090      // For testing purpose
091    
092      @Override
093      public boolean equals(Object obj) {
094        if (obj == null) {
095          return false;
096        }
097        if (obj == this) {
098          return true;
099        }
100        if (obj.getClass() != getClass()) {
101          return false;
102        }
103        DefaultDependency rhs = (DefaultDependency) obj;
104        return new EqualsBuilder()
105          .append(from, rhs.from)
106          .append(to, rhs.to)
107          .append(weight, rhs.weight)
108          .isEquals();
109      }
110    
111      @Override
112      public int hashCode() {
113        return new HashCodeBuilder(27, 45).
114          append(from).
115          append(to).
116          append(weight).
117          toHashCode();
118      }
119    
120    }