| /* |
| * 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; |
| } |
| } |