blob: f78b592fe8f376e290e52fe67b4a64f703070e17 [file] [log] [blame]
/**
* 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;
}
}