/*
* Link.java
*
* Copyright (C) 2009-12 by RStudio, Inc.
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
package org.rstudio.studio.client.workbench.views.help.model;
import com.google.gwt.dom.client.Document;
import org.rstudio.core.client.regex.Match;
import org.rstudio.core.client.regex.Pattern;
public class Link
{
public Link(String url, String title)
{
this(url, title, false);
}
public Link(String url, String title, boolean preserveHost)
{
if (!preserveHost)
url = removeHost(url);
url_ = url ;
title_ = title ;
id_ = normalizeUrl(url_) ;
}
/**
* If the URL has the same scheme, hostname, and port as the current page,
* then drop them from the URL.
*
* For example,
* http://rstudio.com/help/base/ls
* becomes
* /help/base/ls
*/
private String removeHost(String url)
{
String pageUrl = Document.get().getURL();
Pattern p = Pattern.create("^http(s?)://[^/]+");
Match m = p.match(pageUrl, 0);
if (m == null)
{
assert false : "Couldn't parse page URL: " + url;
return url;
}
String prefix = m.getValue();
if (!url.startsWith(prefix))
return url;
else
return url.substring(prefix.length());
}
public String getUrl()
{
return url_ ;
}
public String getTitle()
{
return title_ ;
}
private static String normalizeUrl(String url)
{
return url.indexOf('#') >= 0 ? url.substring(0, url.indexOf('#')) : url ;
}
@Override
public int hashCode()
{
return (id_ == null) ? 0 : id_.hashCode() ;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true ;
if (obj == null)
return false ;
if (getClass() != obj.getClass())
return false ;
Link other = (Link) obj ;
if (id_ == null)
{
if (other.id_ != null)
return false ;
} else if (!id_.equals(other.id_))
return false ;
return true ;
}
private final String url_ ;
private final String title_ ;
private final String id_ ;
}