/*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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 org.jboss.arquillian.container.spi.client.protocol.metadata;
import java.net.URI;
/**
* Servlet
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @author <a href="mailto:ian@ianbrandt.com">Ian Brandt</a>
* @version $Revision: $
*/
public class Servlet {
static final String HTTP_SCHEME = "http://";
static final String ROOT_CONTEXT = "/";
private final String name;
private final String contextRoot;
private String host;
private int port;
public Servlet(String name, String contextRoot) {
if (name == null) {
throw new IllegalArgumentException("name must not be null");
}
if (contextRoot == null) {
throw new IllegalArgumentException("contextRoot must not be null");
}
this.name = name;
this.contextRoot = cleanContextRoot(contextRoot);
}
/**
* Set the {@link HTTPContext} for this servlet. This is required for
* <code>Servlet</code> to be fully initialized. Don't use
* {@link #equals(Object)} prior to setting the <code>HTTPContext</code>,
* which most likely implies not adding this to a collection beforehand
* either.
*
* @param context
* the context to set
*
* @throws IllegalArgumentException
* if the context host is null
* @see {@link HTTPContext#add(Servlet)}
*/
void setParent(HTTPContext context) {
if (context.getHost() == null) {
throw new IllegalArgumentException(context.getClass().getSimpleName() + " host must not be null");
}
this.host = context.getHost();
this.port = context.getPort();
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the contextRoot
*/
public String getContextRoot() {
return contextRoot;
}
/**
* Get the URI to the Servlet's context.
*
* @return the base URI, e.g. "http://localhost:8888/"
*/
public URI getBaseURI() {
return URI.create(getBaseURIAsString());
}
/**
* Get the URI to the Servlet.
*
* @return the base URI, e.g. "http://localhost:8888/Test"
*/
public URI getFullURI() {
return URI.create(getBaseURIAsString() + name);
}
private String getBaseURIAsString() {
return HTTP_SCHEME + host + ":" + port + contextRoot + "/";
}
/**
* @throws IllegalStateException
* if host is null
* @see {@link #setParent(HTTPContext)}
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
assertHostState();
final int prime = 31;
int result = 1;
result = prime * result + ((contextRoot == null) ? 0 : contextRoot.hashCode());
result = prime * result + ((host == null) ? 0 : host.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + port;
return result;
}
/**
* @throws IllegalStateException
* if host is null
* @see {@link #setParent(HTTPContext)}
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
assertHostState();
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Servlet)) {
return false;
}
Servlet other = (Servlet) obj;
if (contextRoot == null) {
if (other.contextRoot != null) {
return false;
}
} else if (!contextRoot.equals(other.contextRoot)) {
return false;
}
if (host == null) {
if (other.host != null) {
return false;
}
} else if (!host.equals(other.host)) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
if (port != other.port) {
return false;
}
return true;
}
@Override
public String toString() {
return "Servlet [name=" + name + ", contextRoot=" + contextRoot + "]";
}
private String cleanContextRoot(String contextRoot) {
if (!contextRoot.startsWith("/")) {
contextRoot = "/" + contextRoot;
}
// ARQ-554
if (contextRoot.equals(ROOT_CONTEXT)) {
contextRoot = "";
}
return contextRoot;
}
private void assertHostState() {
if (host == null) {
throw new IllegalStateException("host must not be null (see setParent(...))");
}
}
}