/*
* � Copyright IBM Corp. 2010, 2013
*
* 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 com.ibm.xsp.extlib.minifier;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.osgi.framework.Bundle;
import com.ibm.commons.util.DoubleMap;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.context.DojoLibrary;
import com.ibm.xsp.extlib.resources.ExtlibResourceProvider;
import com.ibm.xsp.extlib.util.ExtLibUtil;
import com.ibm.xsp.minifier.CSSResource;
import com.ibm.xsp.minifier.DojoResource;
import com.ibm.xsp.minifier.ResourceLoader;
/**
* Resource Loader that loads the resource from extlib.
*/
public class ExtLibLoader extends ResourceLoader {
public static class ExtLibDojoResource extends UrlDojoResource {
public ExtLibDojoResource(DojoLibrary dojoLibrary, String name, URL url) {
super(dojoLibrary,name,url);
}
}
public static class ExtLibDojoLocaleResource extends UrlDojoLocaleResource {
Bundle osgiBundle;
public ExtLibDojoLocaleResource(DojoLibrary dojoLibrary, String name, String baseUrl) {
super(dojoLibrary, name, baseUrl);
}
@Override
protected URL getResourceURL(String baseUrl, String name) throws IOException {
String path = baseUrl+StringUtil.replace(name, '.', '/')+".js"; //$NON-NLS-1$
// If we know the OSGi bundle containing the file, then use it
if(osgiBundle!=null) {
URL url = ExtLibUtil.getResourceURL(osgiBundle, path);
return url;
}
// Else, try to find it in the different class loaders
List<ExtLibLoaderExtension> extensions = ExtLibLoaderExtension.getExtensions();
int size = extensions.size();
for(int i=0; i<size; i++) {
Bundle b = extensions.get(i).getOSGiBundle();
URL url = ExtLibUtil.getResourceURL(b, path);
if(url!=null) {
return url;
}
}
return null;
}
// TEMP XPages bug
@Override
protected String getModulePath(String locale) {
String s = super.getModulePath(locale);
s = StringUtil.replace(s, "..", "."); //$NON-NLS-1$ //$NON-NLS-2$
return s;
}
}
public static class ExtLibCSSResource extends UrlCSSResource {
public ExtLibCSSResource(DojoLibrary dojoLibrary, String name, URL url) {
super(dojoLibrary,name,url);
}
@Override
protected String calculateUrlPrefix() {
String s = super.calculateUrlPrefix();
// If we try to access a resource through a servlet, add the prefix...
if(s.startsWith("/.ibmxspres/")) { // $NON-NLS-1$
s = "/xsp"+s; // $NON-NLS-1$
}
return s;
}
}
// Resources
private HashMap<String,CSSResource> cssResources = new HashMap<String,CSSResource>();
// private static ExtLibLoader loader;
public ExtLibLoader() {
// loader = this;
}
// ========================================================
// Handling Dojo
// ========================================================
@Override
public DojoResource getDojoResource(String name, DojoLibrary dojoLibrary) {
Map<String,DojoResource> dojoResources = getDojoResources(dojoLibrary);
DojoResource r = dojoResources.get(name);
if(r==null) {
synchronized(this) {
r = dojoResources.get(name);
if(r==null) {
r = loadDojoResource(name,dojoLibrary);
if(r!=null) {
dojoResources.put(name, r);
}
}
}
}
return r;
}
@SuppressWarnings("unchecked") //$NON-NLS-1$
private Map<String, DojoResource> getDojoResources(DojoLibrary dojoLibrary) {
return dojoLibrary.getDojoResources();
}
protected DojoResource loadDojoResource(String name, DojoLibrary dojoLibrary) {
if(name.startsWith("extlib.")) { //$NON-NLS-1$
List<ExtLibLoaderExtension> extensions = ExtLibLoaderExtension.getExtensions();
int size = extensions.size();
for(int i=0; i<size; i++) {
DojoResource r = loadDojoResource(name, dojoLibrary, extensions.get(i));
if(r!=null) {
return r;
}
}
return null;
}
// Look for resources...
if( name.startsWith("!extlib.")) { // $NON-NLS-1$
return new ExtLibDojoLocaleResource(dojoLibrary,name,ExtlibResourceProvider.BUNDLE_RES_PATH);
}
return null;
}
protected DojoResource loadDojoResource(String name, DojoLibrary dojoLibrary, ExtLibLoaderExtension ext) {
String path = ExtlibResourceProvider.BUNDLE_RES_PATH+StringUtil.replace(name, '.', '/')+".js"; //$NON-NLS-1$
URL u = ExtLibUtil.getResourceURL(ext.getOSGiBundle(), path);
if(u!=null) {
return new ExtLibDojoResource(dojoLibrary,name,u);
}
return null;
}
@Override
public void loadDojoShortcuts(DoubleMap<String, String> aliases, DoubleMap<String, String> prefixes) {
super.loadDojoShortcuts(aliases, prefixes);
List<ExtLibLoaderExtension> extensions = ExtLibLoaderExtension.getExtensions();
int size = extensions.size();
for(int i=0; i<size; i++) {
extensions.get(i).loadDojoShortcuts(aliases, prefixes);
}
}
// ========================================================
// Handling CSS
// ========================================================
@Override
public CSSResource getCSSResource(String name, DojoLibrary dojoLibrary) {
CSSResource r = cssResources.get(name);
if(r==null) {
synchronized(this) {
r = cssResources.get(name);
if(r==null) {
r = loadCSSResource(name,dojoLibrary);
if(r!=null) {
cssResources.put(name, r);
}
}
}
}
return r;
}
protected CSSResource loadCSSResource(String name, DojoLibrary dojoLibrary) {
if(name.startsWith("/.ibmxspres/.extlib/")) { //$NON-NLS-1$
List<ExtLibLoaderExtension> extensions = ExtLibLoaderExtension.getExtensions();
int size = extensions.size();
for(int i=0; i<size; i++) {
CSSResource r = loadCSSResource(name,dojoLibrary,extensions.get(i));
if(r!=null) {
return r;
}
}
}
return null;
}
protected CSSResource loadCSSResource(String name, DojoLibrary dojoLibrary, ExtLibLoaderExtension ext) {
String path = ExtlibResourceProvider.BUNDLE_RES_PATH_EXTLIB+name.substring(20);
URL u = ExtLibUtil.getResourceURL(ext.getOSGiBundle(), path);
if(u!=null) {
return new ExtLibCSSResource(dojoLibrary,name,u);
}
return null;
}
@Override
public void loadCSSShortcuts(DoubleMap<String, String> aliases, DoubleMap<String, String> prefixes) {
super.loadCSSShortcuts(aliases, prefixes);
List<ExtLibLoaderExtension> extensions = ExtLibLoaderExtension.getExtensions();
int size = extensions.size();
for(int i=0; i<size; i++) {
extensions.get(i).loadCSSShortcuts(aliases, prefixes);
}
}
}