/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: info@xamjwg.org
*/
/*
* Created on Sep 18, 2005
*/
package org.lobobrowser.primary.clientlets;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lobobrowser.clientlet.Clientlet;
import org.lobobrowser.clientlet.ClientletRequest;
import org.lobobrowser.clientlet.ClientletResponse;
import org.lobobrowser.clientlet.ClientletSelector;
import org.lobobrowser.primary.clientlets.download.DownloadClientlet;
import org.lobobrowser.primary.clientlets.html.HtmlClientlet;
import org.lobobrowser.primary.clientlets.img.ImageClientlet;
public class PrimaryClientletSelector implements ClientletSelector {
private static final Logger logger = Logger.getLogger(PrimaryClientletSelector.class.getName());
public PrimaryClientletSelector() {
super();
}
public Clientlet select(final ClientletRequest request, final ClientletResponse response) {
// Don't try to catch too much here.
// Clientlets here are not overriddable.
final String mimeType = response.getMimeType();
if (logger.isLoggable(Level.INFO)) {
logger.info("select(): mimeType=" + mimeType);
}
final String mimeTypeTL = mimeType == null ? null : mimeType.toLowerCase();
if ("text/html".equals(mimeTypeTL) || "image/svg+xml".equals(mimeTypeTL) || "application/xhtml+xml".equals(mimeTypeTL) || "application/xml".equals(mimeTypeTL)) {
// TODO: XHTML needs its own clientlet.
return new HtmlClientlet();
} else if ("image/jpeg".equals(mimeTypeTL) || "image/jpg".equals(mimeTypeTL) || "image/gif".equals(mimeTypeTL)
|| "image/png".equals(mimeTypeTL) || "image/bmp".equals(mimeTypeTL) || "image/x-ms-bmp".equals(mimeTypeTL)) {
return new ImageClientlet();
} else if ((mimeType == null) || "application/octet-stream".equals(mimeTypeTL) || "content/unknown".equals(mimeTypeTL)) {
final String path = response.getResponseURL().getPath();
final int lastDotIdx = path.lastIndexOf('.');
final String extension = lastDotIdx == -1 ? "" : path.substring(lastDotIdx + 1);
final String extensionTL = extension.toLowerCase();
if ("html".equals(extensionTL) || "htm".equals(extensionTL) || (extensionTL.length() == 0)) {
return new HtmlClientlet();
} else if ("gif".equals(extensionTL) || "jpg".equals(extensionTL) || "png".equals(extensionTL)) {
return new ImageClientlet();
} else {
return null;
}
} else {
return null;
}
}
public Clientlet lastResortSelect(final ClientletRequest request, final ClientletResponse response) {
final String mimeType = response.getMimeType();
final String mimeTypeTL = mimeType == null ? null : mimeType.toLowerCase();
if ((mimeTypeTL != null) && mimeTypeTL.startsWith("text/")) {
return new TextClientlet();
} else if ("application/xhtml+xml".equals(mimeTypeTL)) {
// TODO: XHTML needs its own clientlet.
return new HtmlClientlet();
} else if ("application/json".equals(mimeTypeTL)) {
// TODO: JSON needs its own clientlet.
return new TextClientlet();
} else {
final String path = response.getResponseURL().getPath();
final int lastDotIdx = path.lastIndexOf('.');
final String extension = lastDotIdx == -1 ? "" : path.substring(lastDotIdx + 1);
final String extensionTL = extension.toLowerCase();
if ("xhtml".equals(extensionTL)) {
return new HtmlClientlet();
} else if ("txt".equals(extensionTL) || "xml".equals(extensionTL) || "svg".equals(extensionTL) || "rss".equals(extensionTL)
|| "xaml".equals(extensionTL)) {
return new TextClientlet();
} else if (mimeType == null) {
// If mime-type is completely missing,
// disregard extension and assume HTML.
// Works for
// DLink router authentication page.
return new HtmlClientlet();
} else {
return new DownloadClientlet();
}
}
}
}