/*
* Copyright 2008 Alin Dreghiciu.
*
* 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.ops4j.pax.url.war.internal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;
import org.ops4j.pax.swissbox.bnd.BndUtils;
import org.ops4j.pax.url.war.ServiceConstants;
/**
* Url connection for war protocol handler.
*
* @author Alin Dreghiciu
* @since 0.1.0, January 14, 2008
*/
public class WarConnection
extends AbstractConnection
{
private static final String JAVAX_SERVLET_HTTP = "javax.servlet.http";
private static final String JAVAX_SERVLET = "javax.servlet";
private static final String JAVAX_JSP = "javax.servlet.jsp";
private static final String JAVAX_JSP_JSTL = "javax.servlet.jsp.jstl";
private static final String APACHE_JASPER = "org.apache.jasper";
private static final String APACHE_TAGLIBS = "org.apache.taglibs";
private static final String SUN_EL = "com.sun.el";
/**
* @see AbstractConnection#AbstractConnection(URL, Configuration)
*/
public WarConnection( final URL url,
final Configuration config )
throws MalformedURLException
{
super( url, config );
}
/**
* Creates a set of default instructions.
*
* @see AbstractConnection#getInstructions()
*/
protected Properties getInstructions()
throws MalformedURLException
{
final Properties instructions = BndUtils.parseInstructions(getURL().getQuery());
// war file to be processed
instructions.setProperty( ServiceConstants.INSTR_WAR_URL, getURL().getPath() );
// default import packages
if( !instructions.containsKey( "Import-Package" ) )
{
String packages = "javax.servlet,"
+ "javax.servlet.http,"
+ "javax.servlet.jsp; resolution:=optional,"
+ "javax.servlet.jsp.el; resolution:=optional,"
+ "javax.servlet.jsp.jstl.*; resolution:=optional,"
+ "javax.*; resolution:=optional,"
+ "org.apache.jasper.*;resolution:=optional," //extra dependencies for JSP/JSF War Bundles
+ "org.apache.taglibs.*;resolution:=optional,"
+ "com.sun.el.*;resolution:=optional,"
+ "org.xml.*; resolution:=optional,"
+ "org.w3c.*; resolution:=optional";
instructions.setProperty(
"Import-Package",
packages
);
} else {
// Certain Packages are always needed and therefore should be appended.
String importPackages = instructions.getProperty("Import-Package");
if ((importPackages.contains(JAVAX_SERVLET) )|| (importPackages.contains(JAVAX_SERVLET_HTTP) )) {
//found javax.servlet
//check if javax.servlet or javax.servlet.http is contained.
boolean servletFound = false;
boolean servletHttpFound = false;
String[] imports = importPackages.split(",");
for (String importstmt : imports) {
if (importstmt.contains(JAVAX_SERVLET)) {
if (importstmt.length() > JAVAX_SERVLET.length() && importstmt.charAt(JAVAX_SERVLET.length()) == '.') {
//we found a javax.servlet.
//check if it is a javax.servlet.http
if (importstmt.contains(JAVAX_SERVLET_HTTP))
servletHttpFound = true;
} else {
servletFound = true;
}
}
}
if (!servletFound) {
importPackages += ","+JAVAX_SERVLET;
}
if (!servletHttpFound) {
importPackages += ","+JAVAX_SERVLET_HTTP;
}
} else { //both are missing
importPackages += ","+JAVAX_SERVLET+","+JAVAX_SERVLET_HTTP;
}
if (!importPackages.contains(JAVAX_JSP)) {
importPackages += ","+JAVAX_JSP+";resolution:=optional";
importPackages += ","+JAVAX_JSP+".el;resolution:=optional";
importPackages += ","+JAVAX_JSP_JSTL+".*;resolution:=optional";
}
if (!importPackages.contains(APACHE_JASPER)) {
importPackages += ","+APACHE_JASPER+".*;resolution:=optional";
}
if (!importPackages.contains(APACHE_TAGLIBS)) {
importPackages += ","+APACHE_TAGLIBS+".*;resolution:=optional";
}
if (!importPackages.contains(SUN_EL)) {
importPackages += ","+SUN_EL+".*;resolution:=optional";
}
instructions.setProperty("Import-Package", importPackages);
}
if( getConfiguration().getImportPaxLoggingPackages() )
{
String importPackages = instructions.getProperty("Import-Package");
String provider = ";provider=paxlogging;resolution:=optional";
importPackages +=
",org.apache.commons.logging" + provider +
",org.apache.commons.logging.impl" + provider +
",org.apache.log4j" + provider +
",org.apache.log4j.spi" + provider +
",org.apache.log4j.xml" + provider +
",org.slf4j" + provider +
",org.slf4j.helpers" + provider +
",org.slf4j.spi" + provider;
instructions.setProperty("Import-Package", importPackages);
}
// default no export packages
if( !instructions.containsKey( "Export-Package" ) )
{
instructions.setProperty(
"Export-Package",
"!*"
);
}
// remove unnecessary headers
if( !instructions.containsKey( "-removeheaders" ) )
{
instructions.setProperty(
"-removeheaders",
"Private-Package,"
+ "Ignore-Package"
);
}
return instructions;
}
}