You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Eisenträger, Tobias <To...@arag.de> on 2011/03/15 10:32:49 UTC

ProjectStage and ResourceDependency

Hello list,

Is it possible to have different ResourceDependencies for components depending on the Project Stage?

Example - when the project is in Development Stage the context param javax.faces.PROJECT_STAGE is set to Development

<context-param>
	<param-name>javax.faces.PROJECT_STAGE</param-name>
	<param-value>Development</param-value>
</context-param>

I want this:

@ResourceDependencies({
    @ResourceDependency(name="jquery-ui.css",library="css"),
    @ResourceDependency(name="jquery.js",library="js",target="head"),
    //@ResourceDependency(name="jquery.min.js",library="js",target="head"),
    @ResourceDependency(name="jquery-ui.js",library="js",target="head")
    //@ResourceDependency(name="jquery-ui.min.js",library="js",target="head")
})
@FacesComponent("de.example.jsf2.components.Accordion")
public class Accordion extends UIPanel {

But when the Project stage is Test or Production I want this:

@ResourceDependencies({
    @ResourceDependency(name="jquery-ui.css",library="css"),
    //@ResourceDependency(name="jquery.js",library="js",target="head"),
    @ResourceDependency(name="jquery.min.js",library="js",target="head"),
    //@ResourceDependency(name="jquery-ui.js",library="js",target="head")
    @ResourceDependency(name="jquery-ui.min.js",library="js",target="head")
})@FacesComponent("de.example.jsf2.components.Accordion")
public class Accordion extends UIPanel {

Maybe there is a system in the Resources similar how you can add version numbers.

Toby


Re: ProjectStage and ResourceDependency

Posted by Jakob Korherr <ja...@gmail.com>.
That's great - you're welcome :)

However, you can cache isDevelopmentStage no matter what ProjectStage
you have. It won't change unless you redeploy your webapp.

Thus I recommend this code:

private Boolean developmentStage = null;

public boolean isDevelopmentStage()
{
    if (developmentStage == null)
    {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        developmentStage =
facesContext.isProjectStage(ProjectStage.Development);
    }
    return developmentStage;
}

This spares you one FacesContext.getCurrentInstance() -->
ThreadLocal.get() invocation per resource creation (in development
stage).

Regards,
Jakob

2011/3/15 Eisenträger, Tobias <To...@arag.de>:
> Thank you Jacob - that worked great.
>
> Here's the code for reference:
>
> Faces-config.xml:
> <application>
>        <resource-handler>
> de.example.jsf2.sample.application.CustomResourceHandler
>        </resource-handler>
> </application>
>
> CustomResourceHandler.java:
>
> package de.example.jsf2.sample.application;
>
> import javax.faces.application.ProjectStage;
> import javax.faces.application.Resource;
> import javax.faces.application.ResourceHandler;
> import javax.faces.application.ResourceHandlerWrapper;
> import javax.faces.context.FacesContext;
>
> public class CustomResourceHandler extends ResourceHandlerWrapper {
>
>        private ResourceHandler parent = null;
>        private boolean isDevelopmentStage = true;
>
>        public CustomResourceHandler(ResourceHandler parent) {
>                this.parent = parent;
>        }
>
>        @Override
>        public ResourceHandler getWrapped() {
>                return this.parent;
>        }
>
>        @Override
>        public Resource createResource(String resourceName) {
>                return super.createResource(takeOutMinIfInDevelopmentmode(resourceName));
>        }
>
>        @Override
>        public Resource createResource(String resourceName, String libraryName,String contentType) {
>                return super.createResource(takeOutMinIfInDevelopmentmode(resourceName), libraryName, contentType);
>        }
>
>        @Override
>        public Resource createResource(String resourceName, String libraryName) {
>
>                return super.createResource(takeOutMinIfInDevelopmentmode(resourceName), libraryName);
>        }
>
>        private String takeOutMinIfInDevelopmentmode(String resourceName) {
>                if(getIsDevelopmentStage()) {
>                        if(resourceName!=null && resourceName.contains(".min")) {
>                                resourceName = resourceName.replace(".min", "");
>                        }
>                }
>                return resourceName;
>        }
>
>        private boolean getIsDevelopmentStage() {
>                if(isDevelopmentStage) {
>                        FacesContext fc = FacesContext.getCurrentInstance();
>                        if (fc.isProjectStage(ProjectStage.Development)) {
>                                // isDevelopmentStage; bleibt true
>                        } else {
>                                isDevelopmentStage = false; // fuehrt logik bis zum naechsten neustart nicht mehr aus
>                        }
>                }
>                return isDevelopmentStage;
>        }
>
> }
>
> So now I can just write:
> @ResourceDependencies({
>    @ResourceDependency(name="jquery-ui.css",library="css"),
>    @ResourceDependency(name="jquery.min.js",library="js",target="head"),
>    @ResourceDependency(name="jquery-ui.min.js",library="js",target="head")
>  })
>  @FacesComponent("de.example.jsf2.components.Accordion")
>  public class Accordion extends UIPanel {
>        .....
> }
>
> and it will snip out the .min part when the Stage is Development. Nice feature is that it will only check for the stage one time if we are in Production mode.
>
> Toby
>
>> -----Ursprüngliche Nachricht-----
>> Von: sethfromaustria@gmail.com [mailto:sethfromaustria@gmail.com] Im
>> Auftrag von Jakob Korherr
>> Gesendet: Dienstag, 15. März 2011 10:59
>> An: MyFaces Discussion
>> Betreff: Re: ProjectStage and ResourceDependency
>>
>> Hi Tobias,
>>
>> You could write your own ResourceHandler (--> ResourceHandlerWrapper)
>> which wraps the createResource() methods and adjusts the filenames
>> depending on the current ProjectStage.
>>
>> Regards,
>> Jakob
>>
>> 2011/3/15 Eisenträger, Tobias <To...@...>:
>> > Hello list,
>> >
>> > Is it possible to have different ResourceDependencies for components
>> depending on the Project Stage?
>> >
>> > Example - when the project is in Development Stage the context param
>> javax.faces.PROJECT_STAGE is set to Development
>> >
>> > <context-param>
>> >        <param-name>javax.faces.PROJECT_STAGE</param-name>
>> >        <param-value>Development</param-value>
>> > </context-param>
>> >
>> > I want this:
>> >
>> > @ResourceDependencies({
>> >    @ResourceDependency(name="jquery-ui.css",library="css"),
>> >    @ResourceDependency(name="jquery.js",library="js",target="head"),
>> >
>>  //@ResourceDependency(name="jquery.min.js",library="js",target="head"),
>> >    @ResourceDependency(name="jquery-ui.js",library="js",target="head")
>> >    //@ResourceDependency(name="jquery-
>> ui.min.js",library="js",target="head")
>> > })
>> > @FacesComponent("de.example.jsf2.components.Accordion")
>> > public class Accordion extends UIPanel {
>> >
>> > But when the Project stage is Test or Production I want this:
>> >
>> > @ResourceDependencies({
>> >    @ResourceDependency(name="jquery-ui.css",library="css"),
>> >    //@ResourceDependency(name="jquery.js",library="js",target="head"),
>> >    @ResourceDependency(name="jquery.min.js",library="js",target="head"),
>> >    //@ResourceDependency(name="jquery-ui.js",library="js",target="head")
>> >    @ResourceDependency(name="jquery-
>> ui.min.js",library="js",target="head")
>> > })@FacesComponent("de.example.jsf2.components.Accordion")
>> > public class Accordion extends UIPanel {
>> >
>> > Maybe there is a system in the Resources similar how you can add version
>> numbers.
>> >
>> > Toby
>> >
>> >
>>
>>
>>
>> --
>> Jakob Korherr
>>
>> blog: http://www.jakobk.com
>> twitter: http://twitter.com/jakobkorherr
>> work: http://www.irian.at
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at

AW: ProjectStage and ResourceDependency

Posted by Eisenträger, Tobias <To...@arag.de>.
Thank you Jacob - that worked great.

Here's the code for reference:

Faces-config.xml:
<application>
  	<resource-handler>
de.example.jsf2.sample.application.CustomResourceHandler
	</resource-handler>
</application>

CustomResourceHandler.java:

package de.example.jsf2.sample.application;

import javax.faces.application.ProjectStage;
import javax.faces.application.Resource;
import javax.faces.application.ResourceHandler;
import javax.faces.application.ResourceHandlerWrapper;
import javax.faces.context.FacesContext;

public class CustomResourceHandler extends ResourceHandlerWrapper {

	private ResourceHandler parent = null;
	private boolean isDevelopmentStage = true;
	
	public CustomResourceHandler(ResourceHandler parent) {
		this.parent = parent;
	}
	
	@Override
	public ResourceHandler getWrapped() {
		return this.parent;
	}
	
	@Override
	public Resource createResource(String resourceName) {
		return super.createResource(takeOutMinIfInDevelopmentmode(resourceName));
	}

	@Override
	public Resource createResource(String resourceName, String libraryName,String contentType) {
		return super.createResource(takeOutMinIfInDevelopmentmode(resourceName), libraryName, contentType);
	}

	@Override
	public Resource createResource(String resourceName, String libraryName) {
		
		return super.createResource(takeOutMinIfInDevelopmentmode(resourceName), libraryName);
	}
	
	private String takeOutMinIfInDevelopmentmode(String resourceName) {
		if(getIsDevelopmentStage()) {
			if(resourceName!=null && resourceName.contains(".min")) {
				resourceName = resourceName.replace(".min", "");
			}
		}
		return resourceName;
	}
	
	private boolean getIsDevelopmentStage() {
		if(isDevelopmentStage) {
			FacesContext fc = FacesContext.getCurrentInstance();
			if (fc.isProjectStage(ProjectStage.Development)) {
				// isDevelopmentStage; bleibt true
			} else {
				isDevelopmentStage = false; // fuehrt logik bis zum naechsten neustart nicht mehr aus
			}
		}
		return isDevelopmentStage;
	}

}

So now I can just write:
@ResourceDependencies({
    @ResourceDependency(name="jquery-ui.css",library="css"),
    @ResourceDependency(name="jquery.min.js",library="js",target="head"),
    @ResourceDependency(name="jquery-ui.min.js",library="js",target="head")
 })
 @FacesComponent("de.example.jsf2.components.Accordion")
 public class Accordion extends UIPanel {
	.....
}

and it will snip out the .min part when the Stage is Development. Nice feature is that it will only check for the stage one time if we are in Production mode.

Toby

> -----Ursprüngliche Nachricht-----
> Von: sethfromaustria@gmail.com [mailto:sethfromaustria@gmail.com] Im
> Auftrag von Jakob Korherr
> Gesendet: Dienstag, 15. März 2011 10:59
> An: MyFaces Discussion
> Betreff: Re: ProjectStage and ResourceDependency
> 
> Hi Tobias,
> 
> You could write your own ResourceHandler (--> ResourceHandlerWrapper)
> which wraps the createResource() methods and adjusts the filenames
> depending on the current ProjectStage.
> 
> Regards,
> Jakob
> 
> 2011/3/15 Eisenträger, Tobias <To...@...>:
> > Hello list,
> >
> > Is it possible to have different ResourceDependencies for components
> depending on the Project Stage?
> >
> > Example - when the project is in Development Stage the context param
> javax.faces.PROJECT_STAGE is set to Development
> >
> > <context-param>
> >        <param-name>javax.faces.PROJECT_STAGE</param-name>
> >        <param-value>Development</param-value>
> > </context-param>
> >
> > I want this:
> >
> > @ResourceDependencies({
> >    @ResourceDependency(name="jquery-ui.css",library="css"),
> >    @ResourceDependency(name="jquery.js",library="js",target="head"),
> >
>  //@ResourceDependency(name="jquery.min.js",library="js",target="head"),
> >    @ResourceDependency(name="jquery-ui.js",library="js",target="head")
> >    //@ResourceDependency(name="jquery-
> ui.min.js",library="js",target="head")
> > })
> > @FacesComponent("de.example.jsf2.components.Accordion")
> > public class Accordion extends UIPanel {
> >
> > But when the Project stage is Test or Production I want this:
> >
> > @ResourceDependencies({
> >    @ResourceDependency(name="jquery-ui.css",library="css"),
> >    //@ResourceDependency(name="jquery.js",library="js",target="head"),
> >    @ResourceDependency(name="jquery.min.js",library="js",target="head"),
> >    //@ResourceDependency(name="jquery-ui.js",library="js",target="head")
> >    @ResourceDependency(name="jquery-
> ui.min.js",library="js",target="head")
> > })@FacesComponent("de.example.jsf2.components.Accordion")
> > public class Accordion extends UIPanel {
> >
> > Maybe there is a system in the Resources similar how you can add version
> numbers.
> >
> > Toby
> >
> >
> 
> 
> 
> --
> Jakob Korherr
> 
> blog: http://www.jakobk.com
> twitter: http://twitter.com/jakobkorherr
> work: http://www.irian.at

Re: ProjectStage and ResourceDependency

Posted by Jakob Korherr <ja...@gmail.com>.
Hi Tobias,

You could write your own ResourceHandler (--> ResourceHandlerWrapper)
which wraps the createResource() methods and adjusts the filenames
depending on the current ProjectStage.

Regards,
Jakob

2011/3/15 Eisenträger, Tobias <To...@arag.de>:
> Hello list,
>
> Is it possible to have different ResourceDependencies for components depending on the Project Stage?
>
> Example - when the project is in Development Stage the context param javax.faces.PROJECT_STAGE is set to Development
>
> <context-param>
>        <param-name>javax.faces.PROJECT_STAGE</param-name>
>        <param-value>Development</param-value>
> </context-param>
>
> I want this:
>
> @ResourceDependencies({
>    @ResourceDependency(name="jquery-ui.css",library="css"),
>    @ResourceDependency(name="jquery.js",library="js",target="head"),
>    //@ResourceDependency(name="jquery.min.js",library="js",target="head"),
>    @ResourceDependency(name="jquery-ui.js",library="js",target="head")
>    //@ResourceDependency(name="jquery-ui.min.js",library="js",target="head")
> })
> @FacesComponent("de.example.jsf2.components.Accordion")
> public class Accordion extends UIPanel {
>
> But when the Project stage is Test or Production I want this:
>
> @ResourceDependencies({
>    @ResourceDependency(name="jquery-ui.css",library="css"),
>    //@ResourceDependency(name="jquery.js",library="js",target="head"),
>    @ResourceDependency(name="jquery.min.js",library="js",target="head"),
>    //@ResourceDependency(name="jquery-ui.js",library="js",target="head")
>    @ResourceDependency(name="jquery-ui.min.js",library="js",target="head")
> })@FacesComponent("de.example.jsf2.components.Accordion")
> public class Accordion extends UIPanel {
>
> Maybe there is a system in the Resources similar how you can add version numbers.
>
> Toby
>
>



-- 
Jakob Korherr

blog: http://www.jakobk.com
twitter: http://twitter.com/jakobkorherr
work: http://www.irian.at