/*
* Created on 15.2.2003
*/
package com.idega.util;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import com.idega.core.builder.business.BuilderServiceFactory;
import com.idega.core.builder.business.ICBuilderConstants;
import com.idega.core.builder.data.ICPage;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.util.datastructures.MultivaluedHashMap;
import com.idega.util.text.TextSoap;
/**
* @author laddi
*/
public class URLUtil {
private static final String IB_PAGE_PARAMETER = ICBuilderConstants.IB_PAGE_PARAMETER;
private MultivaluedHashMap _parameters;
private String _path;
private String _page;
private String _protocol;
private String _host;
private int _port = -1;
boolean _convertSpecialCharacters = true;
/**
*
*/
public URLUtil(String URL) {
parseURL(URL);
}
public URLUtil(IWApplicationContext iwac, ICPage page) {
this(iwac, ((Integer)page.getPrimaryKey()).intValue());
}
public URLUtil(IWApplicationContext iwac, int pageID) {
try {
parseURL(BuilderServiceFactory.getBuilderService(iwac).getPageURI(pageID));
}
catch (RemoteException e) {
e.printStackTrace();
}
}
public URLUtil(String URL, boolean convertSpecialCharacters) {
this._convertSpecialCharacters = convertSpecialCharacters;
parseURL(URL);
}
private void parseURL(String URL) {
try {
URL url = new URL(URL);
setProtocol(url.getProtocol());
setHost(url.getHost());
setPort(url.getPort());
setPath(url.getPath());
parseQuery(url.getQuery());
}
catch (MalformedURLException mue) {
//mue.printStackTrace();
if (URL.indexOf("?") != -1) {
setPath(URL.substring(0, URL.indexOf("?")));
if (URL.length() > URL.indexOf("?") + 1) {
parseQuery(URL.substring(URL.indexOf("?") + 1));
}
}
else {
setPath(URL);
}
}
}
private void parseQuery(String query) {
if (query != null) {
StringTokenizer tokens = new StringTokenizer(query, "&");
while (tokens.hasMoreTokens()) {
String parameter = tokens.nextToken();
StringTokenizer token = new StringTokenizer(parameter, "=");
while (token.hasMoreTokens()) {
String name = token.nextToken();
if (token.hasMoreTokens()) {
String value = token.nextToken();
addParameter(name, value);
}
}
}
}
}
public String toString() {
StringBuffer returnString = new StringBuffer();
if (getProtocol() != null) {
returnString.append(getProtocol()).append("://");
}
if (getHost() != null) {
returnString.append(getHost());
}
if (getPort() != 80 && getPort() != -1) {
returnString.append(":").append(getPort());
}
if (getPath() != null) {
returnString.append(getPath());
}
returnString.append(getParameters());
return returnString.toString();
}
private String getParameters() {
StringBuffer parameters = new StringBuffer();
if (this._parameters != null) {
parameters.append("?");
int index = 0;
Iterator iter = this._parameters.keySet().iterator();
while (iter.hasNext()) {
String name = (String) iter.next();
Collection values = this._parameters.getCollection(name);
if (name != null && values != null) {
Iterator iterator = values.iterator();
while (iterator.hasNext()) {
String value = (String) iterator.next();
if (index > 0) {
parameters.append("&");
}
parameters.append(name);
parameters.append("=");
parameters.append(value);
index++;
}
}
}
}
if (this._convertSpecialCharacters) {
return TextSoap.convertSpecialCharacters(parameters.toString());
}
else {
return parameters.toString();
}
}
/**
* @return String
*/
public String getPath() {
return this._path;
}
/**
* Sets the path.
* @param path The path to set
*/
public void setPath(String path) {
this._path = path;
}
public void addParameter(String name, String value) {
if (this._parameters == null) {
this._parameters = new MultivaluedHashMap();
}
if (name != null && !name.equalsIgnoreCase("null")) {
this._parameters.put(name, value);
}
}
public void addParameter(String name, int value) {
addParameter(name, String.valueOf(value));
}
public void removeParameter(String name) {
if (this._parameters != null) {
this._parameters.remove(name);
}
}
public void removeParameterValue(String name, String value) {
if (this._parameters != null) {
Collection values = this._parameters.getCollection(name);
if (values != null) {
values.remove(value);
}
}
}
public boolean containsParameter(String name) {
if (this._parameters != null) {
return this._parameters.containsKey(name);
}
return false;
}
public boolean containtsParameterValue(String name, String value) {
if (this._parameters != null) {
Collection values = this._parameters.getCollection(name);
if (values != null) {
return values.contains(value);
}
}
return false;
}
public void setPage(ICPage page) {
if ((page != null) && (page.getID() != -1)) {
addParameter(IB_PAGE_PARAMETER, page.getPrimaryKey().toString());
}
}
public void setPage(int pageID) {
addParameter(IB_PAGE_PARAMETER, pageID);
}
/**
* @return String
*/
public String getHost() {
return this._host;
}
/**
* @return int
*/
public int getPort() {
return this._port;
}
/**
* @return String
*/
public String getProtocol() {
return this._protocol;
}
/**
* Sets the host.
* @param host The host to set
*/
public void setHost(String host) {
this._host = host;
}
/**
* Sets the port.
* @param port The port to set
*/
public void setPort(int port) {
this._port = port;
}
/**
* Sets the protocol.
* @param protocol The protocol to set
*/
public void setProtocol(String protocol) {
this._protocol = protocol;
}
}