ch.sentric.URL.java Source code

Java tutorial

Introduction

Here is the source code for ch.sentric.URL.java

Source

/**
 * Copyright 2013 The Apache Software Foundation
 *
 * 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 ch.sentric;

import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;

import org.apache.commons.lang3.StringUtils;

/**
 * The url class.
 */
public class URL {
    private final String givenInputUrl;

    private String scheme;
    private Authority authority;
    private Query query;
    private Path path;
    private String fragment;

    /**
     * The constructor, initializing a url from {@link String}.
     * 
     * @param url
     *            as string
     * @throws MalformedURLException
     *             when url could not be parsed
     */
    public URL(final String url) throws MalformedURLException {
        this.givenInputUrl = url;
        this.parse(url);
    }

    /**
     * The constructor, initializing a url from {@link URI}.
     * 
     * @param uri
     *            as URI
     * @throws MalformedURLException
     *             when url could not be parsed
     */
    public URL(final URI uri) throws MalformedURLException {
        this.givenInputUrl = uri.toString();
        parse(uri.toString());
    }

    private void parse(final String url) throws MalformedURLException {
        final java.net.URL urlObj = new java.net.URL(url);

        this.scheme = urlObj.getProtocol();
        final HostName hostName = new HostNameFactory().build(urlObj.getHost());
        this.authority = new Authority(hostName, urlObj.getPort(), urlObj.getUserInfo());
        this.query = new QueryFactory().build(urlObj.getQuery());
        this.path = new Path(urlObj.getPath());
        this.fragment = urlObj.getRef();
    }

    /**
     * Returns a {@link URI} representation of this object or null when not
     * valid. All fragments will be removed from the original URL.
     * 
     * @return the uri
     * @throws URISyntaxException
     *             when the uri couldn't be parsed
     */
    public URI getURI() throws URISyntaxException {
        URI uri = null;
        if (StringUtils.isNotBlank(getFragment())) {
            uri = new URI(getUrlWithoutFragment());
        } else {
            uri = new URI(getGivenInputUrl());
        }
        return uri;
    }

    public String getUrlWithoutFragment() {
        return getGivenInputUrl().substring(0, getGivenInputUrl().indexOf("#"));
    }

    public String getGivenInputUrl() {
        return this.givenInputUrl;
    }

    public String getScheme() {
        return this.scheme;
    }

    public Authority getAuthority() {
        return this.authority;
    }

    public Query getQuery() {
        return this.query;
    }

    public Path getPath() {
        return this.path;
    }

    public String getFragment() {
        return this.fragment;
    }

    /**
     * Replaces white spaces with '+' characters, removes jsession and phpsessid
     * parameters.
     * 
     * @return a url without white spaces and jession or phpsessid
     */
    public String getRepairedUrl() {
        return this.scheme + "://" + this.authority.getAsString() + this.path.getReEncoded().getAsString()
                + this.query.getAsString(true, false) + (this.fragment == null ? "" : "#" + this.fragment);
    }

    public String getNormalizedUrl() {
        return this.authority.getOptimizedForProximityOrder() + this.path.getReEncoded().getAsString()
                + this.query.getAsString(true, true);
    }

    /**
     * Resolve the ip address from the authority.
     * 
     * @return ip address as string
     * @throws UnknownHostException
     *             when ip can not be resolved
     */
    public String resolveIp() throws UnknownHostException {
        final String ip = InetAddress.getByName(this.getAuthority().getAsString()).getHostAddress();
        if (ip.equals("127.0.0.1")) {
            throw new UnknownHostException("IP" + ip + "not valid");
        }
        return ip;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (this.authority == null ? 0 : this.authority.hashCode());
        result = prime * result + (this.fragment == null ? 0 : this.fragment.hashCode());
        result = prime * result + (this.givenInputUrl == null ? 0 : this.givenInputUrl.hashCode());
        result = prime * result + (this.path == null ? 0 : this.path.hashCode());
        result = prime * result + (this.query == null ? 0 : this.query.hashCode());
        result = prime * result + (this.scheme == null ? 0 : this.scheme.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final URL other = (URL) obj;
        if (this.authority == null) {
            if (other.authority != null) {
                return false;
            }
        } else if (!this.authority.equals(other.authority)) {
            return false;
        }
        if (this.fragment == null) {
            if (other.fragment != null) {
                return false;
            }
        } else if (!this.fragment.equals(other.fragment)) {
            return false;
        }
        if (this.givenInputUrl == null) {
            if (other.givenInputUrl != null) {
                return false;
            }
        } else if (!this.givenInputUrl.equals(other.givenInputUrl)) {
            return false;
        }
        if (this.path == null) {
            if (other.path != null) {
                return false;
            }
        } else if (!this.path.equals(other.path)) {
            return false;
        }
        if (this.query == null) {
            if (other.query != null) {
                return false;
            }
        } else if (!this.query.equals(other.query)) {
            return false;
        }
        if (this.scheme == null) {
            if (other.scheme != null) {
                return false;
            }
        } else if (!this.scheme.equals(other.scheme)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return this.givenInputUrl;
    }
}