All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.got5.tapestry5.jquery.services.ImportJQueryUIWorker Maven / Gradle / Ivy

package org.got5.tapestry5.jquery.services;

import org.apache.tapestry5.Asset;
import org.apache.tapestry5.SymbolConstants;
import org.apache.tapestry5.annotations.SetupRender;
import org.apache.tapestry5.func.F;
import org.apache.tapestry5.func.Flow;
import org.apache.tapestry5.func.Mapper;
import org.apache.tapestry5.func.Worker;
import org.apache.tapestry5.ioc.annotations.Symbol;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
import org.apache.tapestry5.ioc.internal.util.TapestryException;
import org.apache.tapestry5.model.MutableComponentModel;
import org.apache.tapestry5.plastic.MethodAdvice;
import org.apache.tapestry5.plastic.MethodInvocation;
import org.apache.tapestry5.plastic.PlasticClass;
import org.apache.tapestry5.plastic.PlasticMethod;
import org.apache.tapestry5.services.AssetSource;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.TransformConstants;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.TransformationSupport;
import org.got5.tapestry5.jquery.ImportJQueryUI;
import org.got5.tapestry5.jquery.JQuerySymbolConstants;
import org.got5.tapestry5.jquery.internal.TapestryJQueryExceptionMessages;


public class ImportJQueryUIWorker implements ComponentClassTransformWorker2
{
	
	private final AssetSource assetSource;

    private final JavaScriptSupport javaScriptSupport;
    
    private final String jqueryUIBase;

    private final String themePath;
    
    private final boolean productionMode;

    public ImportJQueryUIWorker(AssetSource assetSource,

            JavaScriptSupport javaScriptSupport, Request request, 
            
            @Symbol(JQuerySymbolConstants.JQUERY_UI_PATH)
            String jqueryUIBase,

            @Symbol(SymbolConstants.PRODUCTION_MODE)
            boolean productionMode, 
            
    		@Symbol(JQuerySymbolConstants.JQUERY_UI_DEFAULT_THEME)
    		String themePath)
    {
        this.assetSource = assetSource;
        this.javaScriptSupport = javaScriptSupport;
                
        this.jqueryUIBase = jqueryUIBase;
        this.productionMode = productionMode;
        this.themePath = themePath;
    }
    
	public void transform(PlasticClass plasticClass,
			TransformationSupport support, MutableComponentModel model) {

		final ImportJQueryUI annotation = plasticClass.getAnnotation(ImportJQueryUI.class);
		
		PlasticMethod setupRender = plasticClass.introduceMethod(TransformConstants.SETUP_RENDER_DESCRIPTION);
		
		if(annotation != null){
			
			if(annotation.value().length > 0){
				
				final Flow assetFlow = F.flow(annotation.value()).map(expandSimpleName).map(pathToAsset);
				
				setupRender.addAdvice(new MethodAdvice() {
					
					public void advise(MethodInvocation invocation) {
						
						assetFlow.each(importLibrary);

		                invocation.proceed();
					}
				});
			}
		}
		
		if(model.isPage()){
			setupRender.addAdvice(new MethodAdvice() {
				
				public void advise(MethodInvocation invocation) {
					
					String path = (annotation!=null && InternalUtils.isNonBlank(annotation.theme())) ? annotation.theme() : themePath;
					
					javaScriptSupport.importStylesheet(assetSource.getExpandedAsset(path));
					
					invocation.proceed();
					
				}
			});
		}
		
		model.addRenderPhase(SetupRender.class);
		
	}
	
	private final Mapper expandSimpleName = new Mapper()
    {
        public String map(String name)
        {
        	final StringBuilder relativePath = new StringBuilder()
                .append(productionMode ? "/minified/" : "/")
                .append(name)
                .append(productionMode ? ".min.js" : ".js");
            return jqueryUIBase + relativePath.toString();
        }
    };

    private final Mapper pathToAsset = new Mapper()
    {
        public Asset map(String path)
        {
        	Asset asset = assetSource.getExpandedAsset(path);
        	
        	return asset;

        }
    };

    private final Worker importLibrary = new Worker()
    {
        public void work(Asset value)
        {  
        	javaScriptSupport.importJavaScriptLibrary(value);
        }
    };

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy