Package com.gitblit.models

Source Code of com.gitblit.models.FederationModel$RepositoryStatus

/*
* Copyright 2011 gitblit.com.
*
* 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 com.gitblit.models;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.gitblit.Constants.FederationPullStatus;
import com.gitblit.utils.StringUtils;

/**
* Represents a federated server registration. Gitblit federation allows one
* Gitblit instance to pull the repositories and configuration from another
* Gitblit instance. This is a backup operation and can be considered something
* like svn-sync.
*
*/
public class FederationModel implements Serializable, Comparable<FederationModel> {

  private static final long serialVersionUID = 1L;

  public String name;

  public String url;

  public String token;

  public String frequency;

  public String folder;

  public boolean bare;

    public boolean mirror;

  public boolean mergeAccounts;

  public boolean sendStatus;

  public boolean notifyOnError;

  public List<String> exclusions = new ArrayList<String>();

  public List<String> inclusions = new ArrayList<String>();

  public Date lastPull;

  public Date nextPull;

  private Map<String, FederationPullStatus> results = new ConcurrentHashMap<String, FederationPullStatus>();

  /**
   * The constructor for a remote server configuration.
   *
   * @param serverName
   */
  public FederationModel(String serverName) {
    this.name = serverName;
    bare = true;
    mirror = true;
    this.lastPull = new Date(0);
    this.nextPull = new Date(0);
  }

  public boolean isIncluded(RepositoryModel repository) {
    // if exclusions has the all wildcard, then check for specific
    // inclusions
    if (exclusions.contains("*")) {
      for (String name : inclusions) {
        if (StringUtils.fuzzyMatch(repository.name, name)) {
          results.put(repository.name, FederationPullStatus.PENDING);
          return true;
        }
      }
      results.put(repository.name, FederationPullStatus.EXCLUDED);
      return false;
    }

    // named exclusions
    for (String name : exclusions) {
      if (StringUtils.fuzzyMatch(repository.name, name)) {
        results.put(repository.name, FederationPullStatus.EXCLUDED);
        return false;
      }
    }

    // included by default
    results.put(repository.name, FederationPullStatus.PENDING);
    return true;
  }

  /**
   * Updates the pull status of a particular repository in this federation
   * registration.
   *
   * @param repository
   * @param status
   */
  public void updateStatus(RepositoryModel repository, FederationPullStatus status) {
    if (!results.containsKey(repository.name)) {
      results.put(repository.name, FederationPullStatus.PENDING);
    }
    if (status != null) {
      results.put(repository.name, status);
    }
  }

  public List<RepositoryStatus> getStatusList() {
    List<RepositoryStatus> list = new ArrayList<RepositoryStatus>();
    for (Map.Entry<String, FederationPullStatus> entry : results.entrySet()) {
      list.add(new RepositoryStatus(entry.getKey(), entry.getValue()));
    }
    return list;
  }

  /**
   * Iterates over the current pull results and returns the lowest pull
   * status.
   *
   * @return the lowest pull status of the registration
   */
  public FederationPullStatus getLowestStatus() {
    if (results.size() == 0) {
      return FederationPullStatus.PENDING;
    }
    FederationPullStatus status = FederationPullStatus.MIRRORED;
    for (FederationPullStatus result : results.values()) {
      if (result.ordinal() < status.ordinal()) {
        status = result;
      }
    }
    return status;
  }

  /**
   * Returns true if this registration represents the result data sent by a
   * pulling Gitblit instance.
   *
   * @return true, if this is result data
   */
  public boolean isResultData() {
    return !url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://");
  }

  @Override
  public String toString() {
    return "Federated " + name + " (" + url + ")";
  }

  @Override
  public int compareTo(FederationModel o) {
    boolean r1 = isResultData();
    boolean r2 = o.isResultData();
    if ((r1 && r2) || (!r1 && !r2)) {
      // sort registrations and results by name
      return name.compareTo(o.name);
    }
    // sort registrations first
    if (r1) {
      return 1;
    }
    return -1;
  }

  /**
   * Class that encapsulates a point-in-time pull result.
   *
   */
  public static class RepositoryStatus implements Serializable, Comparable<RepositoryStatus> {

    private static final long serialVersionUID = 1L;

    public final String name;
    public final FederationPullStatus status;

    RepositoryStatus(String name, FederationPullStatus status) {
      this.name = name;
      this.status = status;
    }

    @Override
    public int compareTo(RepositoryStatus o) {
      if (status.equals(o.status)) {
        return StringUtils.compareRepositoryNames(name, o.name);
      }
      return status.compareTo(o.status);
    }
  }
}
TOP

Related Classes of com.gitblit.models.FederationModel$RepositoryStatus

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.