/*
 * Copyright 2009 Google Inc.
 * 
 * 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.google.gwt.dev;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * Represents what a composite unique key for individual tabs in the
 * development mode window.
 */
class DevelModeTabKey {
  private final String remoteHost;
  private final String tabKey;
  private final String url;
  private final String userAgent;

  /**
   * Create a key.
   * 
   * @param userAgent user agent string (not null)
   * @param url top-level URL (may be null for old clients)
   * @param tabKey opaque identifier for a browser tab - must be unique
   *     within a particular browser (user agent + remoteSocket) or an
   *     empty string if not support (may be null for old clients)
   * @param remoteHost host portion of endpoint identifier of browser
   *     (not null)
   * @throws IllegalArgumentException if userAgent or remoteHost is null
   */
  public DevelModeTabKey(String userAgent, String url, String tabKey,
      String remoteHost) {
    if (url == null) {
      url = "";
    }
    if (tabKey == null) {
      tabKey = "";
    }
    if (userAgent == null) {
      throw new IllegalArgumentException("userAgent cannot be null");
    }
    if (remoteHost == null) {
      throw new IllegalArgumentException("remoteHost cannot be null");
    }
    this.userAgent = userAgent;
    try {
      // Strip off the query part and the hash part
      // TODO(jat): is it correct to strip off the query part?
      URL fullUrl = new URL(url);
      StringBuilder buf = new StringBuilder();
      buf.append(fullUrl.getProtocol()).append(':');
      if (fullUrl.getAuthority() != null && fullUrl.getAuthority().length() > 0) {
        buf.append("//").append(fullUrl.getAuthority());
      }
      if (fullUrl.getPath() != null) {
        buf.append(fullUrl.getPath());
      }
      url = buf.toString(); 
    } catch (MalformedURLException e) {
      // use URL as-is if it appears to be malformed
    } 
    this.url = url;
    this.tabKey = tabKey;
    this.remoteHost = remoteHost;
  }
  
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    DevelModeTabKey other = (DevelModeTabKey) obj;
    return tabKey.equals(other.tabKey) && url.equals(other.url)
        && userAgent.equals(other.userAgent)
        && remoteHost.equals(other.remoteHost);
  }
  
  public String getRemoteSocket() {
    return remoteHost;
  }
  
  public String getTabKey() {
    return tabKey;
  }

  public String getUrl() {
    return url;
  }

  public String getUserAgent() {
    return userAgent;
  }

  @Override
  public int hashCode() {
    return remoteHost.hashCode() * 7 + tabKey.hashCode() * 11
        + url.hashCode() * 13 + userAgent.hashCode() * 17;  
  }
}