Package net.sf.uadetector.internal.data.domain

Source Code of net.sf.uadetector.internal.data.domain.OperatingSystem$Builder

/*******************************************************************************
* Copyright 2012 André Rouél
*
* 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 net.sf.uadetector.internal.data.domain;

import java.io.Serializable;
import java.util.Collections;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;
import javax.annotation.concurrent.NotThreadSafe;

import net.sf.qualitycheck.Check;
import net.sf.uadetector.OperatingSystemFamily;
import net.sf.uadetector.UserAgent;
import net.sf.uadetector.VersionNumber;

@Immutable
public final class OperatingSystem implements Identifiable, Serializable {

  @NotThreadSafe
  public static final class Builder {

    @Nonnull
    private String family = "";

    @Nonnull
    private String icon = "";

    private int id = Integer.MIN_VALUE;

    @Nonnull
    private String infoUrl = "";

    @Nonnull
    private String name = "";

    @Nonnull
    private SortedSet<OperatingSystemPattern> patterns = new TreeSet<OperatingSystemPattern>();

    @Nonnull
    private String producer = "";

    @Nonnull
    private String producerUrl = "";

    @Nonnull
    private String url = "";

    public Builder() {
      // default constructor
    }

    /**
     * Creates a new instance of a builder with the data of the passed builder.
     *
     * @param builder
     *            builder containing the data to be copied
     * @throws net.sf.qualitycheck.exception.IllegalNullArgumentException
     *             if the given argument is {@code null}
     */
    protected Builder(@Nonnull final Builder builder) {
      Check.notNull(builder, "builder");

      family = builder.family;
      icon = builder.icon;
      id = builder.id;
      infoUrl = builder.infoUrl;
      name = builder.name;
      patterns.addAll(builder.patterns);
      producer = builder.producer;
      producerUrl = builder.producerUrl;
      url = builder.url;
    }

    public Builder(@Nonnull final OperatingSystem operatingSystem) {
      Check.notNull(operatingSystem, "operatingSystem");
      id = Check.notNegative(operatingSystem.getId(), "operatingSystem.getId()");
      name = Check.notNull(operatingSystem.getName(), "operatingSystem.getName()");
      family = Check.notNull(operatingSystem.getFamily(), "operatingSystem.getFamily()");
      infoUrl = Check.notNull(operatingSystem.getInfoUrl(), "operatingSystem.getInfoUrl()");
      patterns = new TreeSet<OperatingSystemPattern>(Check.notNull(operatingSystem.getPatterns(), "operatingSystem.getPatterns()"));
      producer = Check.notNull(operatingSystem.getProducer(), "operatingSystem.getProducer()");
      producerUrl = Check.notNull(operatingSystem.getProducerUrl(), "operatingSystem.getProducerUrl()");
      url = Check.notNull(operatingSystem.getUrl(), "operatingSystem.getUrl()");
      icon = Check.notNull(operatingSystem.getIcon(), "operatingSystem.getIcon()");
    }

    @Nonnull
    public Builder addPatterns(@Nonnull final Set<OperatingSystemPattern> patterns) {
      Check.notNull(patterns, "patterns");

      this.patterns.addAll(patterns);
      return this;
    }

    @Nonnull
    public OperatingSystem build() {
      return new OperatingSystem(id, name, family, infoUrl, patterns, producer, producerUrl, url, icon);
    }

    /**
     * Creates a copy (with all its data) of the current builder.
     *
     * @return a new instance of the current builder, never {@code null}
     */
    @Nonnull
    public OperatingSystem.Builder copy() {
      return new Builder(this);
    }

    @Nonnull
    public String getFamily() {
      return family;
    }

    @Nonnull
    public String getIcon() {
      return icon;
    }

    public int getId() {
      return id;
    }

    @Nonnull
    public String getInfoUrl() {
      return infoUrl;
    }

    @Nonnull
    public String getName() {
      return name;
    }

    @Nonnull
    public SortedSet<OperatingSystemPattern> getPatterns() {
      return patterns;
    }

    @Nonnull
    public String getProducer() {
      return producer;
    }

    @Nonnull
    public String getProducerUrl() {
      return producerUrl;
    }

    @Nonnull
    public String getUrl() {
      return url;
    }

    @Nonnull
    public Builder setFamily(@Nonnull final String family) {
      this.family = Check.notNull(family, "family");
      return this;
    }

    @Nonnull
    public Builder setIcon(@Nonnull final String icon) {
      this.icon = Check.notNull(icon, "icon");
      return this;
    }

    @Nonnull
    public Builder setId(@Nonnegative final int id) {
      this.id = Check.notNegative(id, "id");
      return this;
    }

    @Nonnull
    public Builder setId(@Nonnull final String id) {
      Check.notEmpty(id, "id");

      this.setId(Integer.parseInt(id.trim()));
      return this;
    }

    @Nonnull
    public Builder setInfoUrl(@Nonnull final String infoUrl) {
      this.infoUrl = Check.notNull(infoUrl, "infoUrl");
      return this;
    }

    @Nonnull
    public Builder setName(@Nonnull final String name) {
      this.name = Check.notNull(name, "name");
      return this;
    }

    @Nonnull
    public Builder setPatterns(@Nonnull final SortedSet<OperatingSystemPattern> patterns) {
      this.patterns = new TreeSet<OperatingSystemPattern>(Check.notNull(patterns, "patterns"));
      return this;
    }

    @Nonnull
    public Builder setProducer(@Nonnull final String producer) {
      this.producer = Check.notNull(producer, "producer");
      return this;
    }

    @Nonnull
    public Builder setProducerUrl(@Nonnull final String producerUrl) {
      this.producerUrl = Check.notNull(producerUrl, "producerUrl");
      return this;
    }

    @Nonnull
    public Builder setUrl(@Nonnull final String url) {
      this.url = Check.notNull(url, "url");
      return this;
    }

  }

  private static final long serialVersionUID = -5330180544816352323L;

  private static int buildHashCode(@Nonnegative final int id, @Nonnull final String name, @Nonnull final String family,
      @Nonnull final String infoUrl, @Nonnull final SortedSet<OperatingSystemPattern> patterns, @Nonnull final String producer,
      @Nonnull final String producerUrl, @Nonnull final String url, @Nonnull final String icon) {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    result = prime * result + name.hashCode();
    result = prime * result + family.hashCode();
    result = prime * result + infoUrl.hashCode();
    result = prime * result + patterns.hashCode();
    result = prime * result + producer.hashCode();
    result = prime * result + producerUrl.hashCode();
    result = prime * result + url.hashCode();
    result = prime * result + icon.hashCode();
    return result;
  }

  @Nonnull
  private final String family;

  private final int hash;

  @Nonnull
  private final String icon;

  @Nonnegative
  private final int id;

  @Nonnull
  private final String infoUrl;

  @Nonnull
  private final String name;

  @Nonnull
  private final SortedSet<OperatingSystemPattern> patterns;

  @Nonnull
  private final String producer;

  @Nonnull
  private final String producerUrl;

  @Nonnull
  private final String url;

  public OperatingSystem(@Nonnegative final int id, @Nonnull final String name, @Nonnull final String family,
      @Nonnull final String infoUrl, @Nonnull final SortedSet<OperatingSystemPattern> patterns, @Nonnull final String producer,
      @Nonnull final String producerUrl, @Nonnull final String url, @Nonnull final String icon) {
    this.id = Check.notNegative(id, "id");
    this.name = Check.notNull(name, "name");
    this.family = Check.notNull(family, "family");
    this.infoUrl = Check.notNull(infoUrl, "infoUrl");
    this.patterns = Collections.unmodifiableSortedSet(new TreeSet<OperatingSystemPattern>(Check.notNull(patterns, "patterns")));
    this.producer = Check.notNull(producer, "producer");
    this.producerUrl = Check.notNull(producerUrl, "producerUrl");
    this.url = Check.notNull(url, "url");
    this.icon = Check.notNull(icon, "icon");
    hash = buildHashCode(id, name, family, infoUrl, patterns, producer, producerUrl, url, icon);
  }

  /**
   * Copies all information of the current operating system entry to the given user agent builder.
   *
   * @param builder
   *            user agent builder
   */
  public void copyTo(@Nonnull final UserAgent.Builder builder) {
    final OperatingSystemFamily f = OperatingSystemFamily.evaluate(family);
    final VersionNumber version = VersionNumber.parseOperatingSystemVersion(f, builder.getUserAgentString());
    builder.setOperatingSystem(new net.sf.uadetector.OperatingSystem(f, family, icon, name, producer, producerUrl, url, version));
  }

  @Override
  public boolean equals(final Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final OperatingSystem other = (OperatingSystem) obj;
    if (id != other.id) {
      return false;
    }
    if (!name.equals(other.name)) {
      return false;
    }
    if (!family.equals(other.family)) {
      return false;
    }
    if (!infoUrl.equals(other.infoUrl)) {
      return false;
    }
    if (!patterns.equals(other.patterns)) {
      return false;
    }
    if (!producer.equals(other.producer)) {
      return false;
    }
    if (!producerUrl.equals(other.producerUrl)) {
      return false;
    }
    if (!url.equals(other.url)) {
      return false;
    }
    if (!icon.equals(other.icon)) {
      return false;
    }
    return true;
  }

  @Nonnull
  public String getFamily() {
    return family;
  }

  @Nonnull
  public String getIcon() {
    return icon;
  }

  @Override
  @Nonnegative
  public int getId() {
    return id;
  }

  @Nonnull
  public String getInfoUrl() {
    return infoUrl;
  }

  @Nonnull
  public String getName() {
    return name;
  }

  @Nonnull
  public SortedSet<OperatingSystemPattern> getPatterns() {
    return patterns;
  }

  @Nonnull
  public String getProducer() {
    return producer;
  }

  @Nonnull
  public String getProducerUrl() {
    return producerUrl;
  }

  @Nonnull
  public String getUrl() {
    return url;
  }

  @Override
  public int hashCode() {
    return hash;
  }

  @Override
  public String toString() {
    final StringBuilder builder = new StringBuilder();
    builder.append("OperatingSystem [id=");
    builder.append(id);
    builder.append(", name=");
    builder.append(name);
    builder.append(", family=");
    builder.append(family);
    builder.append(", infoUrl=");
    builder.append(infoUrl);
    builder.append(", patterns=");
    builder.append(patterns);
    builder.append(", producer=");
    builder.append(producer);
    builder.append(", producerUrl=");
    builder.append(producerUrl);
    builder.append(", url=");
    builder.append(url);
    builder.append(", icon=");
    builder.append(icon);
    builder.append("]");
    return builder.toString();
  }

}
TOP

Related Classes of net.sf.uadetector.internal.data.domain.OperatingSystem$Builder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.