You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sl...@apache.org on 2009/02/05 00:55:29 UTC
svn commit: r740940 [4/9] - in /myfaces/core/branches/2_0_0:
api/src/main/java/javax/faces/webapp/pdl/facelets/
api/src/main/resources/META-INF/ impl/src/main/java/com/
impl/src/main/java/com/sun/ impl/src/main/java/com/sun/facelets/
impl/src/main/java...
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/ELText.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/ELText.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/ELText.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/ELText.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,443 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ExpressionFactory;
+import javax.el.ValueExpression;
+import javax.faces.context.ResponseWriter;
+
+import com.sun.facelets.util.FastWriter;
+
+/**
+ * Handles parsing EL Strings in accordance with the EL-API Specification. The parser accepts either <code>${..}</code>
+ * or <code>#{..}</code>.
+ *
+ * @author Jacob Hookom
+ * @version $Id: ELText.java,v 1.8 2008/07/13 19:01:42 rlubke Exp $
+ */
+public class ELText
+{
+
+ private static final class LiteralValueExpression extends ValueExpression
+ {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private final String text;
+
+ public LiteralValueExpression(String text)
+ {
+ this.text = text;
+ }
+
+ public boolean isLiteralText()
+ {
+ return false;
+ }
+
+ public int hashCode()
+ {
+ return 0;
+ }
+
+ public String getExpressionString()
+ {
+ return this.text;
+ }
+
+ public boolean equals(Object obj)
+ {
+ return false;
+ }
+
+ public void setValue(ELContext context, Object value)
+ {
+ }
+
+ public boolean isReadOnly(ELContext context)
+ {
+ return false;
+ }
+
+ public Object getValue(ELContext context)
+ {
+ return null;
+ }
+
+ public Class getType(ELContext context)
+ {
+ return null;
+ }
+
+ public Class getExpectedType()
+ {
+ return null;
+ }
+
+ }
+
+ private static final class ELTextComposite extends ELText
+ {
+ private final ELText[] txt;
+
+ public ELTextComposite(ELText[] txt)
+ {
+ super(null);
+ this.txt = txt;
+ }
+
+ public void write(Writer out, ELContext ctx) throws ELException, IOException
+ {
+ for (int i = 0; i < this.txt.length; i++)
+ {
+ this.txt[i].write(out, ctx);
+ }
+ }
+
+ public void writeText(ResponseWriter out, ELContext ctx) throws ELException, IOException
+ {
+ for (int i = 0; i < this.txt.length; i++)
+ {
+ this.txt[i].writeText(out, ctx);
+ }
+ }
+
+ public String toString(ELContext ctx)
+ {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < this.txt.length; i++)
+ {
+ sb.append(this.txt[i].toString(ctx));
+ }
+ return sb.toString();
+ }
+
+ /*
+ * public String toString(ELContext ctx) { StringBuffer sb = new StringBuffer(); for (int i = 0; i <
+ * this.txt.length; i++) { sb.append(this.txt[i].toString(ctx)); } return sb.toString(); }
+ */
+
+ public String toString()
+ {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < this.txt.length; i++)
+ {
+ sb.append(this.txt[i].toString());
+ }
+ return sb.toString();
+ }
+
+ public boolean isLiteral()
+ {
+ return false;
+ }
+
+ public ELText apply(ExpressionFactory factory, ELContext ctx)
+ {
+ int len = this.txt.length;
+ ELText[] nt = new ELText[len];
+ for (int i = 0; i < len; i++)
+ {
+ nt[i] = this.txt[i].apply(factory, ctx);
+ }
+ return new ELTextComposite(nt);
+ }
+ }
+
+ private static final class ELTextVariable extends ELText
+ {
+ private final ValueExpression ve;
+
+ public ELTextVariable(ValueExpression ve)
+ {
+ super(ve.getExpressionString());
+ this.ve = ve;
+ }
+
+ public boolean isLiteral()
+ {
+ return false;
+ }
+
+ public ELText apply(ExpressionFactory factory, ELContext ctx)
+ {
+ return new ELTextVariable(factory.createValueExpression(ctx, this.ve.getExpressionString(), String.class));
+ }
+
+ public void write(Writer out, ELContext ctx) throws ELException, IOException
+ {
+ Object v = this.ve.getValue(ctx);
+ if (v != null)
+ {
+ out.write((String) v);
+ }
+ }
+
+ public String toString(ELContext ctx) throws ELException
+ {
+ Object v = this.ve.getValue(ctx);
+ if (v != null)
+ {
+ return v.toString();
+ }
+
+ return null;
+ }
+
+ public void writeText(ResponseWriter out, ELContext ctx) throws ELException, IOException
+ {
+ Object v = this.ve.getValue(ctx);
+ if (v != null)
+ {
+ out.writeText((String) v, null);
+ }
+ }
+ }
+
+ protected final String literal;
+
+ public ELText(String literal)
+ {
+ this.literal = literal;
+ }
+
+ /**
+ * If it's literal text
+ *
+ * @return true if the String is literal (doesn't contain <code>#{..}</code> or <code>${..}</code>)
+ */
+ public boolean isLiteral()
+ {
+ return true;
+ }
+
+ /**
+ * Return an instance of <code>this</code> that is applicable given the ELContext and ExpressionFactory state.
+ *
+ * @param factory
+ * the ExpressionFactory to use
+ * @param ctx
+ * the ELContext to use
+ * @return an ELText instance
+ */
+ public ELText apply(ExpressionFactory factory, ELContext ctx)
+ {
+ return this;
+ }
+
+ /**
+ * Allow this instance to write to the passed Writer, given the ELContext state
+ *
+ * @param out
+ * Writer to write to
+ * @param ctx
+ * current ELContext state
+ * @throws ELException
+ * @throws IOException
+ */
+ public void write(Writer out, ELContext ctx) throws ELException, IOException
+ {
+ out.write(this.literal);
+ }
+
+ public void writeText(ResponseWriter out, ELContext ctx) throws ELException, IOException
+ {
+ out.writeText(this.literal, null);
+ }
+
+ /**
+ * Evaluates the ELText to a String
+ *
+ * @param ctx
+ * current ELContext state
+ * @throws ELException
+ * @return the evaluated String
+ */
+ public String toString(ELContext ctx) throws ELException
+ {
+ return this.literal;
+ }
+
+ public String toString()
+ {
+ return this.literal;
+ }
+
+ /**
+ * Parses the passed string to determine if it's literal or not
+ *
+ * @param in
+ * input String
+ * @return true if the String is literal (doesn't contain <code>#{..}</code> or <code>${..}</code>)
+ */
+ public static boolean isLiteral(String in)
+ {
+ ELText txt = parse(in);
+ return txt == null || txt.isLiteral();
+ }
+
+ /**
+ * Factory method for creating an unvalidated ELText instance. NOTE: All expressions in the passed String are
+ * treated as {@link com.sun.facelets.el.LiteralValueExpression LiteralValueExpressions}.
+ *
+ * @param in
+ * String to parse
+ * @return ELText instance that knows if the String was literal or not
+ * @throws javax.el.ELException
+ */
+ public static ELText parse(String in) throws ELException
+ {
+ return parse(null, null, in);
+ }
+
+ /**
+ * Factory method for creating a validated ELText instance. When an Expression is hit, it will use the
+ * ExpressionFactory to create a ValueExpression instance, resolving any functions at that time. <p/> Variables and
+ * properties will not be evaluated.
+ *
+ * @param fact
+ * ExpressionFactory to use
+ * @param ctx
+ * ELContext to validate against
+ * @param in
+ * String to parse
+ * @return ELText that can be re-applied later
+ * @throws javax.el.ELException
+ */
+ public static ELText parse(ExpressionFactory fact, ELContext ctx, String in) throws ELException
+ {
+ char[] ca = in.toCharArray();
+ int i = 0;
+ char c = 0;
+ int len = ca.length;
+ int end = len - 1;
+ boolean esc = false;
+ int vlen = 0;
+
+ StringBuffer buff = new StringBuffer(128);
+ List text = new ArrayList();
+ ELText t = null;
+ ValueExpression ve = null;
+
+ while (i < len)
+ {
+ c = ca[i];
+ if ('\\' == c)
+ {
+ esc = !esc;
+ if (esc && i < end && (ca[i + 1] == '$' || ca[i + 1] == '#'))
+ {
+ i++;
+ continue;
+ }
+ }
+ else if (!esc && ('$' == c || '#' == c))
+ {
+ if (i < end)
+ {
+ if ('{' == ca[i + 1])
+ {
+ if (buff.length() > 0)
+ {
+ text.add(new ELText(buff.toString()));
+ buff.setLength(0);
+ }
+ vlen = findVarLength(ca, i);
+ if (ctx != null && fact != null)
+ {
+ ve = fact.createValueExpression(ctx, new String(ca, i, vlen), String.class);
+ t = new ELTextVariable(ve);
+ }
+ else
+ {
+ t = new ELTextVariable(new LiteralValueExpression(new String(ca, i, vlen)));
+ }
+ text.add(t);
+ i += vlen;
+ continue;
+ }
+ }
+ }
+ esc = false;
+ buff.append(c);
+ i++;
+ }
+
+ if (buff.length() > 0)
+ {
+ text.add(new ELText(new String(buff.toString())));
+ buff.setLength(0);
+ }
+
+ if (text.size() == 0)
+ {
+ return null;
+ }
+ else if (text.size() == 1)
+ {
+ return (ELText) text.get(0);
+ }
+ else
+ {
+ ELText[] ta = (ELText[]) text.toArray(new ELText[text.size()]);
+ return new ELTextComposite(ta);
+ }
+ }
+
+ private static int findVarLength(char[] ca, int s) throws ELException
+ {
+ int i = s;
+ int len = ca.length;
+ char c = 0;
+ int str = 0;
+ while (i < len)
+ {
+ c = ca[i];
+ if ('\\' == c && i < len - 1)
+ {
+ i++;
+ }
+ else if ('\'' == c || '"' == c)
+ {
+ if (str == c)
+ {
+ str = 0;
+ }
+ else
+ {
+ str = c;
+ }
+ }
+ else if (str == 0 && ('}' == c))
+ {
+ return i - s + 1;
+ }
+ i++;
+ }
+ throw new ELException("EL Expression Unbalanced: ... " + new String(ca, s, i - s));
+ }
+
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyELContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyELContext.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyELContext.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyELContext.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,294 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.ELResolver;
+import javax.el.FunctionMapper;
+import javax.el.PropertyNotWritableException;
+import javax.el.VariableMapper;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.el.EvaluationException;
+import javax.faces.el.PropertyNotFoundException;
+import javax.faces.el.PropertyResolver;
+import javax.faces.el.VariableResolver;
+
+/**
+ *
+ *
+ * @author Jacob Hookom
+ * @version $Id: LegacyELContext.java,v 1.8 2008/07/13 19:01:42 rlubke Exp $
+ * @deprecated
+ */
+public final class LegacyELContext extends ELContext
+{
+
+ private static final String[] IMPLICIT_OBJECTS = new String[] { "application", "applicationScope", "cookie",
+ "facesContext", "header", "headerValues",
+ "initParam", "param", "paramValues", "request",
+ "requestScope", "session", "sessionScope", "view" };
+
+ private final static FunctionMapper functions = new EmptyFunctionMapper();
+
+ private final FacesContext faces;
+
+ private final ELResolver resolver;
+
+ private final VariableMapper variables;
+
+ public LegacyELContext(FacesContext faces)
+ {
+ this.faces = faces;
+ this.resolver = new LegacyELResolver();
+ this.variables = new DefaultVariableMapper();
+ }
+
+ public ELResolver getELResolver()
+ {
+ return this.resolver;
+ }
+
+ public FunctionMapper getFunctionMapper()
+ {
+ return functions;
+ }
+
+ public VariableMapper getVariableMapper()
+ {
+ return this.variables;
+ }
+
+ public FacesContext getFacesContext()
+ {
+ return this.faces;
+ }
+
+ private final class LegacyELResolver extends ELResolver
+ {
+
+ public Class getCommonPropertyType(ELContext context, Object base)
+ {
+ return Object.class;
+ }
+
+ public Iterator getFeatureDescriptors(ELContext context, Object base)
+ {
+ return Collections.EMPTY_LIST.iterator();
+ }
+
+ private VariableResolver getVariableResolver()
+ {
+ return faces.getApplication().getVariableResolver();
+ }
+
+ private PropertyResolver getPropertyResolver()
+ {
+ return faces.getApplication().getPropertyResolver();
+ }
+
+ public Class getType(ELContext context, Object base, Object property)
+ {
+ if (property == null)
+ {
+ return null;
+ }
+ try
+ {
+ context.setPropertyResolved(true);
+ if (base == null)
+ {
+ Object obj = this.getVariableResolver().resolveVariable(faces, property.toString());
+ return (obj != null) ? obj.getClass() : null;
+ }
+ else
+ {
+ if (base instanceof List || base.getClass().isArray())
+ {
+ return this.getPropertyResolver().getType(base, Integer.parseInt(property.toString()));
+ }
+ else
+ {
+ return this.getPropertyResolver().getType(base, property);
+ }
+ }
+ }
+ catch (PropertyNotFoundException e)
+ {
+ throw new javax.el.PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (EvaluationException e)
+ {
+ throw new ELException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public Object getValue(ELContext context, Object base, Object property)
+ {
+ if (property == null)
+ {
+ return null;
+ }
+ try
+ {
+ context.setPropertyResolved(true);
+ if (base == null)
+ {
+ return this.getVariableResolver().resolveVariable(faces, property.toString());
+ }
+ else
+ {
+ if (base instanceof List || base.getClass().isArray())
+ {
+ return this.getPropertyResolver().getValue(base, Integer.parseInt(property.toString()));
+ }
+ else
+ {
+ return this.getPropertyResolver().getValue(base, property);
+ }
+ }
+ }
+ catch (PropertyNotFoundException e)
+ {
+ throw new javax.el.PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (EvaluationException e)
+ {
+ throw new ELException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public boolean isReadOnly(ELContext context, Object base, Object property)
+ {
+ if (property == null)
+ {
+ return true;
+ }
+ try
+ {
+ context.setPropertyResolved(true);
+ if (base == null)
+ {
+ return false; // what can I do?
+ }
+ else
+ {
+ if (base instanceof List || base.getClass().isArray())
+ {
+ return this.getPropertyResolver().isReadOnly(base, Integer.parseInt(property.toString()));
+ }
+ else
+ {
+ return this.getPropertyResolver().isReadOnly(base, property);
+ }
+ }
+ }
+ catch (PropertyNotFoundException e)
+ {
+ throw new javax.el.PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (EvaluationException e)
+ {
+ throw new ELException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public void setValue(ELContext context, Object base, Object property, Object value)
+ {
+ if (property == null)
+ {
+ throw new PropertyNotWritableException("Null Property");
+ }
+ try
+ {
+ context.setPropertyResolved(true);
+ if (base == null)
+ {
+ if (Arrays.binarySearch(IMPLICIT_OBJECTS, property.toString()) >= 0)
+ {
+ throw new PropertyNotWritableException("Implicit Variable Not Setable: " + property);
+ }
+ else
+ {
+ Map scope = this.resolveScope(property.toString());
+ this.getPropertyResolver().setValue(scope, property, value);
+ }
+ }
+ else
+ {
+ if (base instanceof List || base.getClass().isArray())
+ {
+ this.getPropertyResolver().setValue(base, Integer.parseInt(property.toString()), value);
+ }
+ else
+ {
+ this.getPropertyResolver().setValue(base, property, value);
+ }
+ }
+ }
+ catch (PropertyNotFoundException e)
+ {
+ throw new javax.el.PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (EvaluationException e)
+ {
+ throw new ELException(e.getMessage(), e.getCause());
+ }
+
+ }
+
+ private final Map resolveScope(String var)
+ {
+ ExternalContext ext = faces.getExternalContext();
+
+ // cycle through the scopes to find a match, if no
+ // match is found, then return the requestScope
+ Map map = ext.getRequestMap();
+ if (!map.containsKey(var))
+ {
+ map = ext.getSessionMap();
+ if (!map.containsKey(var))
+ {
+ map = ext.getApplicationMap();
+ if (!map.containsKey(var))
+ {
+ map = ext.getRequestMap();
+ }
+ }
+ }
+ return map;
+ }
+ }
+
+ private final static class EmptyFunctionMapper extends FunctionMapper
+ {
+
+ public Method resolveFunction(String prefix, String localName)
+ {
+ return null;
+ }
+
+ }
+
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyMethodBinding.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyMethodBinding.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyMethodBinding.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyMethodBinding.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,91 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.io.Serializable;
+
+import javax.el.ELException;
+import javax.el.MethodExpression;
+import javax.faces.context.FacesContext;
+import javax.faces.el.EvaluationException;
+import javax.faces.el.MethodBinding;
+import javax.faces.el.MethodNotFoundException;
+
+/**
+ * For legacy ActionSources
+ *
+ * @author Jacob Hookom
+ * @version $Id: LegacyMethodBinding.java,v 1.7 2008/07/13 19:01:43 rlubke Exp $
+ * @deprecated
+ */
+public final class LegacyMethodBinding extends MethodBinding implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private final MethodExpression m;
+
+ public LegacyMethodBinding(MethodExpression m)
+ {
+ this.m = m;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.el.MethodBinding#getType(javax.faces.context.FacesContext)
+ */
+ public Class getType(FacesContext context) throws MethodNotFoundException
+ {
+ try
+ {
+ return m.getMethodInfo(ELAdaptor.getELContext(context)).getReturnType();
+ }
+ catch (javax.el.MethodNotFoundException e)
+ {
+ throw new MethodNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new EvaluationException(e.getMessage(), e.getCause());
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.el.MethodBinding#invoke(javax.faces.context.FacesContext, java.lang.Object[])
+ */
+ public Object invoke(FacesContext context, Object[] params) throws EvaluationException, MethodNotFoundException
+ {
+ try
+ {
+ return m.invoke(ELAdaptor.getELContext(context), params);
+ }
+ catch (javax.el.MethodNotFoundException e)
+ {
+ throw new MethodNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new EvaluationException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public String getExpressionString()
+ {
+ return m.getExpressionString();
+ }
+}
\ No newline at end of file
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyValueBinding.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyValueBinding.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyValueBinding.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/LegacyValueBinding.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,141 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.PropertyNotWritableException;
+import javax.el.ValueExpression;
+import javax.faces.context.FacesContext;
+import javax.faces.el.EvaluationException;
+import javax.faces.el.PropertyNotFoundException;
+import javax.faces.el.ValueBinding;
+
+/**
+ *
+ *
+ * @author Jacob Hookom
+ * @version $Id: LegacyValueBinding.java,v 1.6 2008/07/13 19:01:43 rlubke Exp $
+ * @deprecated
+ */
+public final class LegacyValueBinding extends ValueBinding implements Externalizable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private ValueExpression delegate;
+
+ public LegacyValueBinding()
+ {
+ super();
+ }
+
+ public LegacyValueBinding(ValueExpression ve)
+ {
+ this.delegate = ve;
+ }
+
+ public Object getValue(FacesContext context) throws EvaluationException, PropertyNotFoundException
+ {
+ ELContext ctx = ELAdaptor.getELContext(context);
+ try
+ {
+ return this.delegate.getValue(ctx);
+ }
+ catch (javax.el.PropertyNotFoundException e)
+ {
+ throw new PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new EvaluationException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public void setValue(FacesContext context, Object value) throws EvaluationException, PropertyNotFoundException
+ {
+ ELContext ctx = ELAdaptor.getELContext(context);
+ try
+ {
+ this.delegate.setValue(ctx, value);
+ }
+ catch (PropertyNotWritableException e)
+ {
+ throw new PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (javax.el.PropertyNotFoundException e)
+ {
+ throw new PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new EvaluationException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public boolean isReadOnly(FacesContext context) throws EvaluationException, PropertyNotFoundException
+ {
+ ELContext ctx = ELAdaptor.getELContext(context);
+ try
+ {
+ return this.delegate.isReadOnly(ctx);
+ }
+ catch (javax.el.PropertyNotFoundException e)
+ {
+ throw new PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new EvaluationException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public Class getType(FacesContext context) throws EvaluationException, PropertyNotFoundException
+ {
+ ELContext ctx = ELAdaptor.getELContext(context);
+ try
+ {
+ return this.delegate.getType(ctx);
+ }
+ catch (javax.el.PropertyNotFoundException e)
+ {
+ throw new PropertyNotFoundException(e.getMessage(), e.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new EvaluationException(e.getMessage(), e.getCause());
+ }
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+ {
+ this.delegate = (ValueExpression) in.readObject();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ out.writeObject(this.delegate);
+ }
+
+ public String getExpressionString()
+ {
+ return this.delegate.getExpressionString();
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagMethodExpression.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagMethodExpression.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagMethodExpression.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagMethodExpression.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,132 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.MethodExpression;
+import javax.el.MethodInfo;
+import javax.el.MethodNotFoundException;
+import javax.el.PropertyNotFoundException;
+
+import com.sun.facelets.tag.TagAttribute;
+
+/**
+ *
+ *
+ * @author Jacob Hookom
+ * @version $Id: TagMethodExpression.java,v 1.7 2008/07/13 19:01:43 rlubke Exp $
+ */
+public final class TagMethodExpression extends MethodExpression implements Externalizable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private String attr;
+ private MethodExpression orig;
+
+ public TagMethodExpression()
+ {
+ super();
+ }
+
+ public TagMethodExpression(TagAttribute attr, MethodExpression orig)
+ {
+ this.attr = attr.toString();
+ this.orig = orig;
+ }
+
+ public MethodInfo getMethodInfo(ELContext context)
+ {
+ try
+ {
+ return this.orig.getMethodInfo(context);
+ }
+ catch (PropertyNotFoundException pnfe)
+ {
+ throw new PropertyNotFoundException(this.attr + ": " + pnfe.getMessage(), pnfe.getCause());
+ }
+ catch (MethodNotFoundException mnfe)
+ {
+ throw new MethodNotFoundException(this.attr + ": " + mnfe.getMessage(), mnfe.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new ELException(this.attr + ": " + e.getMessage(), e.getCause());
+ }
+ }
+
+ public Object invoke(ELContext context, Object[] params)
+ {
+ try
+ {
+ return this.orig.invoke(context, params);
+ }
+ catch (PropertyNotFoundException pnfe)
+ {
+ throw new PropertyNotFoundException(this.attr + ": " + pnfe.getMessage(), pnfe.getCause());
+ }
+ catch (MethodNotFoundException mnfe)
+ {
+ throw new MethodNotFoundException(this.attr + ": " + mnfe.getMessage(), mnfe.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new ELException(this.attr + ": " + e.getMessage(), e.getCause());
+ }
+ }
+
+ public String getExpressionString()
+ {
+ return this.orig.getExpressionString();
+ }
+
+ public boolean equals(Object obj)
+ {
+ return this.orig.equals(obj);
+ }
+
+ public int hashCode()
+ {
+ return this.orig.hashCode();
+ }
+
+ public boolean isLiteralText()
+ {
+ return this.orig.isLiteralText();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ out.writeObject(this.orig);
+ out.writeUTF(this.attr);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+ {
+ this.orig = (MethodExpression) in.readObject();
+ this.attr = in.readUTF();
+ }
+
+ public String toString()
+ {
+ return this.attr + ": " + this.orig;
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagValueExpression.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagValueExpression.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagValueExpression.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/TagValueExpression.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,165 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.PropertyNotFoundException;
+import javax.el.PropertyNotWritableException;
+import javax.el.ValueExpression;
+
+import com.sun.facelets.tag.TagAttribute;
+
+/**
+ *
+ *
+ * @author Jacob Hookom
+ * @version $Id: TagValueExpression.java,v 1.7 2008/07/13 19:01:42 rlubke Exp $
+ */
+public final class TagValueExpression extends ValueExpression implements Externalizable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private ValueExpression orig;
+
+ private String attr;
+
+ public TagValueExpression()
+ {
+ super();
+ }
+
+ public TagValueExpression(TagAttribute attr, ValueExpression orig)
+ {
+ this.attr = attr.toString();
+ this.orig = orig;
+ }
+
+ public Class getExpectedType()
+ {
+ return this.orig.getExpectedType();
+ }
+
+ public Class getType(ELContext context)
+ {
+ try
+ {
+ return this.orig.getType(context);
+ }
+ catch (PropertyNotFoundException pnfe)
+ {
+ throw new PropertyNotFoundException(this.attr + ": " + pnfe.getMessage(), pnfe.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new ELException(this.attr + ": " + e.getMessage(), e.getCause());
+ }
+ }
+
+ public Object getValue(ELContext context)
+ {
+ try
+ {
+ return this.orig.getValue(context);
+ }
+ catch (PropertyNotFoundException pnfe)
+ {
+ throw new PropertyNotFoundException(this.attr + ": " + pnfe.getMessage(), pnfe.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new ELException(this.attr + ": " + e.getMessage(), e.getCause());
+ }
+ }
+
+ public boolean isReadOnly(ELContext context)
+ {
+ try
+ {
+ return this.orig.isReadOnly(context);
+ }
+ catch (PropertyNotFoundException pnfe)
+ {
+ throw new PropertyNotFoundException(this.attr + ": " + pnfe.getMessage(), pnfe.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new ELException(this.attr + ": " + e.getMessage(), e.getCause());
+ }
+ }
+
+ public void setValue(ELContext context, Object value)
+ {
+ try
+ {
+ this.orig.setValue(context, value);
+ }
+ catch (PropertyNotFoundException pnfe)
+ {
+ throw new PropertyNotFoundException(this.attr + ": " + pnfe.getMessage(), pnfe.getCause());
+ }
+ catch (PropertyNotWritableException pnwe)
+ {
+ throw new PropertyNotWritableException(this.attr + ": " + pnwe.getMessage(), pnwe.getCause());
+ }
+ catch (ELException e)
+ {
+ throw new ELException(this.attr + ": " + e.getMessage(), e.getCause());
+ }
+ }
+
+ public boolean equals(Object obj)
+ {
+ return this.orig.equals(obj);
+ }
+
+ public String getExpressionString()
+ {
+ return this.orig.getExpressionString();
+ }
+
+ public int hashCode()
+ {
+ return this.orig.hashCode();
+ }
+
+ public boolean isLiteralText()
+ {
+ return this.orig.isLiteralText();
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+ {
+ this.orig = (ValueExpression) in.readObject();
+ this.attr = in.readUTF();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ out.writeObject(this.orig);
+ out.writeUTF(this.attr);
+ }
+
+ public String toString()
+ {
+ return this.attr + ": " + this.orig;
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/VariableMapperWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/VariableMapperWrapper.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/VariableMapperWrapper.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/VariableMapperWrapper.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,87 @@
+/**
+ * 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.sun.facelets.el;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.el.ELException;
+import javax.el.ValueExpression;
+import javax.el.VariableMapper;
+
+/**
+ * Utility class for wrapping another VariableMapper with a new context, represented by a {@link java.util.Map Map}.
+ * Modifications occur to the Map instance, but resolve against the wrapped VariableMapper if the Map doesn't contain
+ * the ValueExpression requested.
+ *
+ * @author Jacob Hookom
+ * @version $Id: VariableMapperWrapper.java,v 1.7 2008/07/13 19:01:43 rlubke Exp $
+ */
+public final class VariableMapperWrapper extends VariableMapper
+{
+
+ private final VariableMapper target;
+
+ private Map vars;
+
+ /**
+ *
+ */
+ public VariableMapperWrapper(VariableMapper orig)
+ {
+ super();
+ this.target = orig;
+ }
+
+ /**
+ * First tries to resolve agains the inner Map, then the wrapped ValueExpression.
+ *
+ * @see javax.el.VariableMapper#resolveVariable(java.lang.String)
+ */
+ public ValueExpression resolveVariable(String variable)
+ {
+ ValueExpression ve = null;
+ try
+ {
+ if (this.vars != null)
+ {
+ ve = (ValueExpression) this.vars.get(variable);
+ }
+ if (ve == null)
+ {
+ return this.target.resolveVariable(variable);
+ }
+ return ve;
+ }
+ catch (StackOverflowError e)
+ {
+ throw new ELException("Could not Resolve Variable [Overflow]: " + variable, e);
+ }
+ }
+
+ /**
+ * Set the ValueExpression on the inner Map instance.
+ *
+ * @see javax.el.VariableMapper#setVariable(java.lang.String, javax.el.ValueExpression)
+ */
+ public ValueExpression setVariable(String variable, ValueExpression expression)
+ {
+ if (this.vars == null)
+ {
+ this.vars = new HashMap();
+ }
+ return (ValueExpression) this.vars.put(variable, expression);
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/package.html
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/package.html?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/package.html (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/el/package.html Wed Feb 4 23:55:25 2009
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<!--
+ 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.
+
+ $Id: package.html,v 1.3 2008/07/13 19:01:43 rlubke Exp $
+-->
+</head>
+<body bgcolor="white">
+A collection of classes to support EL integration.
+</body>
+</html>
\ No newline at end of file
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFacelet.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFacelet.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFacelet.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFacelet.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,346 @@
+/**
+ * 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.sun.facelets.impl;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.net.URL;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.el.ELException;
+import javax.el.ExpressionFactory;
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+import com.sun.facelets.Facelet;
+import javax.faces.webapp.pdl.facelets.FaceletContext;
+import javax.faces.webapp.pdl.facelets.FaceletException;
+import javax.faces.webapp.pdl.facelets.FaceletHandler;
+import com.sun.facelets.tag.jsf.ComponentSupport;
+
+/**
+ * Default Facelet implementation.
+ *
+ * @author Jacob Hookom
+ * @version $Id: DefaultFacelet.java,v 1.11 2008/07/13 19:01:52 rlubke Exp $
+ */
+final class DefaultFacelet extends Facelet
+{
+
+ private static final Logger log = Logger.getLogger("facelets.facelet");
+
+ private final static String APPLIED_KEY = "com.sun.facelets.APPLIED";
+
+ private final String alias;
+
+ private final ExpressionFactory elFactory;
+
+ private final DefaultFaceletFactory factory;
+
+ private final long createTime;
+
+ private final long refreshPeriod;
+
+ private final Map relativePaths;
+
+ private final FaceletHandler root;
+
+ private final URL src;
+
+ public DefaultFacelet(DefaultFaceletFactory factory, ExpressionFactory el, URL src, String alias,
+ FaceletHandler root)
+ {
+ this.factory = factory;
+ this.elFactory = el;
+ this.src = src;
+ this.root = root;
+ this.alias = alias;
+ this.createTime = System.currentTimeMillis();
+ this.refreshPeriod = this.factory.getRefreshPeriod();
+ this.relativePaths = new WeakHashMap();
+ }
+
+ /**
+ * @see com.sun.facelets.Facelet#apply(javax.faces.context.FacesContext, javax.faces.component.UIComponent)
+ */
+ public void apply(FacesContext facesContext, UIComponent parent) throws IOException, FacesException,
+ FaceletException, ELException
+ {
+ DefaultFaceletContext ctx = new DefaultFaceletContext(facesContext, this);
+ this.refresh(parent);
+ ComponentSupport.markForDeletion(parent);
+ this.root.apply(ctx, parent);
+ ComponentSupport.finalizeForDeletion(parent);
+ this.markApplied(parent);
+ }
+
+ private final void refresh(UIComponent c)
+ {
+ if (this.refreshPeriod > 0)
+ {
+
+ // finally remove any children marked as deleted
+ int sz = c.getChildCount();
+ if (sz > 0)
+ {
+ UIComponent cc = null;
+ List cl = c.getChildren();
+ ApplyToken token;
+ while (--sz >= 0)
+ {
+ cc = (UIComponent) cl.get(sz);
+ if (!cc.isTransient())
+ {
+ token = (ApplyToken) cc.getAttributes().get(APPLIED_KEY);
+ if (token != null && token.time < this.createTime && token.alias.equals(this.alias))
+ {
+ if (log.isLoggable(Level.INFO))
+ {
+ DateFormat df = SimpleDateFormat.getTimeInstance();
+ log.info("Facelet[" + this.alias + "] was modified @ "
+ + df.format(new Date(this.createTime)) + ", flushing component applied @ "
+ + df.format(new Date(token.time)));
+ }
+ cl.remove(sz);
+ }
+ }
+ }
+ }
+
+ // remove any facets marked as deleted
+ if (c.getFacets().size() > 0)
+ {
+ Collection col = c.getFacets().values();
+ UIComponent fc;
+ ApplyToken token;
+ for (Iterator itr = col.iterator(); itr.hasNext();)
+ {
+ fc = (UIComponent) itr.next();
+ if (!fc.isTransient())
+ {
+ token = (ApplyToken) fc.getAttributes().get(APPLIED_KEY);
+ if (token != null && token.time < this.createTime && token.alias.equals(this.alias))
+ {
+ if (log.isLoggable(Level.INFO))
+ {
+ DateFormat df = SimpleDateFormat.getTimeInstance();
+ log.info("Facelet[" + this.alias + "] was modified @ "
+ + df.format(new Date(this.createTime)) + ", flushing component applied @ "
+ + df.format(new Date(token.time)));
+ }
+ itr.remove();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private final void markApplied(UIComponent parent)
+ {
+ if (this.refreshPeriod > 0)
+ {
+ Iterator itr = parent.getFacetsAndChildren();
+ UIComponent c;
+ Map attr;
+ ApplyToken token = new ApplyToken(this.alias, System.currentTimeMillis() + this.refreshPeriod);
+ while (itr.hasNext())
+ {
+ c = (UIComponent) itr.next();
+ if (!c.isTransient())
+ {
+ attr = c.getAttributes();
+ if (!attr.containsKey(APPLIED_KEY))
+ {
+ attr.put(APPLIED_KEY, token);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Return the alias name for error messages and logging
+ *
+ * @return alias name
+ */
+ public String getAlias()
+ {
+ return this.alias;
+ }
+
+ /**
+ * Return this Facelet's ExpressionFactory instance
+ *
+ * @return internal ExpressionFactory instance
+ */
+ public ExpressionFactory getExpressionFactory()
+ {
+ return this.elFactory;
+ }
+
+ /**
+ * The time when this Facelet was created, NOT the URL source code
+ *
+ * @return final timestamp of when this Facelet was created
+ */
+ public long getCreateTime()
+ {
+ return this.createTime;
+ }
+
+ /**
+ * Delegates resolution to DefaultFaceletFactory reference. Also, caches URLs for relative paths.
+ *
+ * @param path
+ * a relative url path
+ * @return URL pointing to destination
+ * @throws IOException
+ * if there is a problem creating the URL for the path specified
+ */
+ private URL getRelativePath(String path) throws IOException
+ {
+ URL url = (URL) this.relativePaths.get(path);
+ if (url == null)
+ {
+ url = this.factory.resolveURL(this.src, path);
+ this.relativePaths.put(path, url);
+ }
+ return url;
+ }
+
+ /**
+ * The URL this Facelet was created from.
+ *
+ * @return the URL this Facelet was created from
+ */
+ public URL getSource()
+ {
+ return this.src;
+ }
+
+ /**
+ * Given the passed FaceletContext, apply our child FaceletHandlers to the passed parent
+ *
+ * @see FaceletHandler#apply(FaceletContext, UIComponent)
+ * @param ctx
+ * the FaceletContext to use for applying our FaceletHandlers
+ * @param parent
+ * the parent component to apply changes to
+ * @throws IOException
+ * @throws FacesException
+ * @throws FaceletException
+ * @throws ELException
+ */
+ private void include(DefaultFaceletContext ctx, UIComponent parent) throws IOException, FacesException,
+ FaceletException, ELException
+ {
+ this.refresh(parent);
+ this.root.apply(new DefaultFaceletContext(ctx, this), parent);
+ this.markApplied(parent);
+ }
+
+ /**
+ * Used for delegation by the DefaultFaceletContext. First pulls the URL from {@link #getRelativePath(String)
+ * getRelativePath(String)}, then calls {@link #include(FaceletContext, UIComponent, URL) include(FaceletContext,
+ * UIComponent, URL)}.
+ *
+ * @see FaceletContext#includeFacelet(UIComponent, String)
+ * @param ctx
+ * FaceletContext to pass to the included Facelet
+ * @param parent
+ * UIComponent to apply changes to
+ * @param path
+ * relative path to the desired Facelet from the FaceletContext
+ * @throws IOException
+ * @throws FacesException
+ * @throws FaceletException
+ * @throws ELException
+ */
+ public void include(DefaultFaceletContext ctx, UIComponent parent, String path) throws IOException, FacesException,
+ FaceletException, ELException
+ {
+ URL url = this.getRelativePath(path);
+ this.include(ctx, parent, url);
+ }
+
+ /**
+ * Grabs a DefaultFacelet from referenced DefaultFaceletFacotry
+ *
+ * @see DefaultFaceletFactory#getFacelet(URL)
+ * @param ctx
+ * FaceletContext to pass to the included Facelet
+ * @param parent
+ * UIComponent to apply changes to
+ * @param url
+ * URL source to include Facelet from
+ * @throws IOException
+ * @throws FacesException
+ * @throws FaceletException
+ * @throws ELException
+ */
+ public void include(DefaultFaceletContext ctx, UIComponent parent, URL url) throws IOException, FacesException,
+ FaceletException, ELException
+ {
+ DefaultFacelet f = (DefaultFacelet) this.factory.getFacelet(url);
+ f.include(ctx, parent);
+ }
+
+ private static class ApplyToken implements Externalizable
+ {
+ public String alias;
+
+ public long time;
+
+ public ApplyToken()
+ {
+ }
+
+ public ApplyToken(String alias, long time)
+ {
+ this.alias = alias;
+ this.time = time;
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+ {
+ this.alias = in.readUTF();
+ this.time = in.readLong();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException
+ {
+ out.writeUTF(this.alias);
+ out.writeLong(this.time);
+ }
+ }
+
+ public String toString()
+ {
+ return this.alias;
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletContext.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletContext.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletContext.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,401 @@
+/**
+ * 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.sun.facelets.impl;
+
+import javax.faces.webapp.pdl.facelets.FaceletContext;
+import javax.faces.webapp.pdl.facelets.FaceletException;
+import com.sun.facelets.TemplateClient;
+import com.sun.facelets.el.DefaultVariableMapper;
+import com.sun.facelets.el.ELAdaptor;
+
+import javax.el.*;
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import java.io.IOException;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * Default FaceletContext implementation.
+ *
+ * A single FaceletContext is used for all Facelets involved in an invocation of
+ * {@link com.sun.facelets.Facelet#apply(FacesContext, UIComponent) Facelet#apply(FacesContext, UIComponent)}. This
+ * means that included Facelets are treated the same as the JSP include directive.
+ *
+ * @author Jacob Hookom
+ * @version $Id: DefaultFaceletContext.java,v 1.4.4.3 2006/03/25 01:01:53 jhook Exp $
+ */
+final class DefaultFaceletContext extends FaceletContext
+{
+
+ private final FacesContext faces;
+
+ private final ELContext ctx;
+
+ private final DefaultFacelet facelet;
+ private final List faceletHierarchy;
+
+ private VariableMapper varMapper;
+
+ private FunctionMapper fnMapper;
+
+ private final Map ids;
+ private final Map prefixes;
+ private String prefix;
+ // TODO: change to StringBuilder when JDK1.5 support is available in Facelets
+ private final StringBuffer uniqueIdBuilder = new StringBuffer(30);
+
+ public DefaultFaceletContext(DefaultFaceletContext ctx, DefaultFacelet facelet)
+ {
+ this.ctx = ctx.ctx;
+ this.clients = ctx.clients;
+ this.faces = ctx.faces;
+ this.fnMapper = ctx.fnMapper;
+ this.ids = ctx.ids;
+ this.prefixes = ctx.prefixes;
+ this.varMapper = ctx.varMapper;
+ this.faceletHierarchy = new ArrayList(ctx.faceletHierarchy.size() + 1);
+ this.faceletHierarchy.addAll(ctx.faceletHierarchy);
+ this.faceletHierarchy.add(facelet);
+ this.facelet = facelet;
+ }
+
+ public DefaultFaceletContext(FacesContext faces, DefaultFacelet facelet)
+ {
+ this.ctx = ELAdaptor.getELContext(faces);
+ this.ids = new HashMap();
+ this.prefixes = new HashMap();
+ this.clients = new ArrayList(5);
+ this.faces = faces;
+ this.faceletHierarchy = new ArrayList(1);
+ this.faceletHierarchy.add(facelet);
+ this.facelet = facelet;
+ this.varMapper = this.ctx.getVariableMapper();
+ if (this.varMapper == null)
+ {
+ this.varMapper = new DefaultVariableMapper();
+ }
+ this.fnMapper = this.ctx.getFunctionMapper();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#getFacesContext()
+ */
+ public FacesContext getFacesContext()
+ {
+ return this.faces;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#getExpressionFactory()
+ */
+ public ExpressionFactory getExpressionFactory()
+ {
+ return this.facelet.getExpressionFactory();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#setVariableMapper(javax.el.VariableMapper)
+ */
+ public void setVariableMapper(VariableMapper varMapper)
+ {
+ // Assert.param("varMapper", varMapper);
+ this.varMapper = varMapper;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#setFunctionMapper(javax.el.FunctionMapper)
+ */
+ public void setFunctionMapper(FunctionMapper fnMapper)
+ {
+ // Assert.param("fnMapper", fnMapper);
+ this.fnMapper = fnMapper;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#includeFacelet(javax.faces.component.UIComponent, java.lang.String)
+ */
+ public void includeFacelet(UIComponent parent, String relativePath) throws IOException, FacesException, ELException
+ {
+ this.facelet.include(this, parent, relativePath);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELContext#getFunctionMapper()
+ */
+ public FunctionMapper getFunctionMapper()
+ {
+ return this.fnMapper;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELContext#getVariableMapper()
+ */
+ public VariableMapper getVariableMapper()
+ {
+ return this.varMapper;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELContext#getContext(java.lang.Class)
+ */
+ public Object getContext(Class key)
+ {
+ return this.ctx.getContext(key);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.el.ELContext#putContext(java.lang.Class, java.lang.Object)
+ */
+ public void putContext(Class key, Object contextObject)
+ {
+ this.ctx.putContext(key, contextObject);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#generateUniqueId(java.lang.String)
+ */
+ public String generateUniqueId(String base)
+ {
+
+ if (prefix == null)
+ {
+ // TODO: change to StringBuilder when JDK1.5 support is available
+ StringBuffer builder = new StringBuffer(faceletHierarchy.size() * 30);
+ for (int i = 0; i < faceletHierarchy.size(); i++)
+ {
+ DefaultFacelet facelet = (DefaultFacelet) faceletHierarchy.get(i);
+ builder.append(facelet.getAlias());
+ }
+ Integer prefixInt = new Integer(builder.toString().hashCode());
+
+ Integer cnt = (Integer) prefixes.get(prefixInt);
+ if (cnt == null)
+ {
+ this.prefixes.put(prefixInt, new Integer(0));
+ prefix = prefixInt.toString();
+ }
+ else
+ {
+ int i = cnt.intValue() + 1;
+ this.prefixes.put(prefixInt, new Integer(i));
+ prefix = prefixInt + "_" + i;
+ }
+ }
+
+ Integer cnt = (Integer) this.ids.get(base);
+ if (cnt == null)
+ {
+ this.ids.put(base, new Integer(0));
+ uniqueIdBuilder.delete(0, uniqueIdBuilder.length());
+ uniqueIdBuilder.append(prefix);
+ uniqueIdBuilder.append("_");
+ uniqueIdBuilder.append(base);
+ return uniqueIdBuilder.toString();
+ }
+ else
+ {
+ int i = cnt.intValue() + 1;
+ this.ids.put(base, new Integer(i));
+ uniqueIdBuilder.delete(0, uniqueIdBuilder.length());
+ uniqueIdBuilder.append(prefix);
+ uniqueIdBuilder.append("_");
+ uniqueIdBuilder.append(base);
+ uniqueIdBuilder.append("_");
+ uniqueIdBuilder.append(i);
+ return uniqueIdBuilder.toString();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#getAttribute(java.lang.String)
+ */
+ public Object getAttribute(String name)
+ {
+ if (this.varMapper != null)
+ {
+ ValueExpression ve = this.varMapper.resolveVariable(name);
+ if (ve != null)
+ {
+ return ve.getValue(this);
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#setAttribute(java.lang.String, java.lang.Object)
+ */
+ public void setAttribute(String name, Object value)
+ {
+ if (this.varMapper != null)
+ {
+ if (value == null)
+ {
+ this.varMapper.setVariable(name, null);
+ }
+ else
+ {
+ this.varMapper.setVariable(name, this.facelet.getExpressionFactory()
+ .createValueExpression(value, Object.class));
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.faces.webapp.pdl.facelets.FaceletContext#includeFacelet(javax.faces.component.UIComponent, java.net.URL)
+ */
+ public void includeFacelet(UIComponent parent, URL absolutePath) throws IOException, FacesException, ELException
+ {
+ this.facelet.include(this, parent, absolutePath);
+ }
+
+ public ELResolver getELResolver()
+ {
+ return this.ctx.getELResolver();
+ }
+
+ private final List clients;
+
+ public void popClient(TemplateClient client)
+ {
+ if (!this.clients.isEmpty())
+ {
+ Iterator itr = this.clients.iterator();
+ while (itr.hasNext())
+ {
+ if (itr.next().equals(client))
+ {
+ itr.remove();
+ return;
+ }
+ }
+ }
+ throw new IllegalStateException(client + " not found");
+ }
+
+ public void pushClient(final TemplateClient client)
+ {
+ this.clients.add(0, new TemplateManager(this.facelet, client, true));
+ }
+
+ public void extendClient(final TemplateClient client)
+ {
+ this.clients.add(new TemplateManager(this.facelet, client, false));
+ }
+
+ public boolean includeDefinition(UIComponent parent, String name) throws IOException, FaceletException,
+ FacesException, ELException
+ {
+ boolean found = false;
+ TemplateManager client;
+
+ for (int i = 0, size = this.clients.size(); i < size && !found; i++)
+ {
+ client = ((TemplateManager) this.clients.get(i));
+ if (client.equals(this.facelet))
+ continue;
+ found = client.apply(this, parent, name);
+ }
+
+ return found;
+ }
+
+ private final static class TemplateManager implements TemplateClient
+ {
+ private final DefaultFacelet owner;
+
+ private final TemplateClient target;
+
+ private final boolean root;
+
+ private final Set names = new HashSet();
+
+ public TemplateManager(DefaultFacelet owner, TemplateClient target, boolean root)
+ {
+ this.owner = owner;
+ this.target = target;
+ this.root = root;
+ }
+
+ public boolean apply(FaceletContext ctx, UIComponent parent, String name) throws IOException, FacesException,
+ FaceletException, ELException
+ {
+ String testName = (name != null) ? name : "facelets._NULL_DEF_";
+ if (this.names.contains(testName))
+ {
+ return false;
+ }
+ else
+ {
+ this.names.add(testName);
+ boolean found = false;
+ found = this.target.apply(new DefaultFaceletContext((DefaultFaceletContext) ctx, this.owner), parent,
+ name);
+ this.names.remove(testName);
+ return found;
+ }
+ }
+
+ public boolean equals(Object o)
+ {
+ // System.out.println(this.owner.getAlias() + " == " +
+ // ((DefaultFacelet) o).getAlias());
+ return this.owner == o || this.target == o;
+ }
+
+ public boolean isRoot()
+ {
+ return this.root;
+ }
+ }
+
+ public boolean isPropertyResolved()
+ {
+ return this.ctx.isPropertyResolved();
+ }
+
+ public void setPropertyResolved(boolean resolved)
+ {
+ this.ctx.setPropertyResolved(resolved);
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletFactory.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletFactory.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultFaceletFactory.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,260 @@
+/**
+ * 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.sun.facelets.impl;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.el.ELException;
+import javax.faces.FacesException;
+import javax.faces.context.FacesContext;
+
+import com.sun.facelets.Facelet;
+import javax.faces.webapp.pdl.facelets.FaceletException;
+import com.sun.facelets.FaceletFactory;
+import javax.faces.webapp.pdl.facelets.FaceletHandler;
+import com.sun.facelets.compiler.Compiler;
+import com.sun.facelets.util.ParameterCheck;
+import com.sun.facelets.util.Resource;
+
+/**
+ * Default FaceletFactory implementation.
+ *
+ * @author Jacob Hookom
+ * @version $Id: DefaultFaceletFactory.java,v 1.10 2007/04/09 01:13:17 youngm Exp $
+ */
+public final class DefaultFaceletFactory extends FaceletFactory
+{
+
+ protected final static Logger log = Logger.getLogger("facelets.factory");
+
+ private final Compiler compiler;
+
+ private Map facelets;
+
+ private Map relativeLocations;
+
+ private final ResourceResolver resolver;
+
+ private final URL baseUrl;
+
+ private final long refreshPeriod;
+
+ public DefaultFaceletFactory(Compiler compiler, ResourceResolver resolver) throws IOException
+ {
+ this(compiler, resolver, -1);
+ }
+
+ public DefaultFaceletFactory(Compiler compiler, ResourceResolver resolver, long refreshPeriod)
+ {
+ ParameterCheck.notNull("compiler", compiler);
+ ParameterCheck.notNull("resolver", resolver);
+ this.compiler = compiler;
+ this.facelets = new HashMap();
+ this.relativeLocations = new HashMap();
+ this.resolver = resolver;
+ this.baseUrl = resolver.resolveUrl("/");
+ // this.location = url;
+ log.fine("Using ResourceResolver: " + resolver);
+ this.refreshPeriod = (refreshPeriod >= 0) ? refreshPeriod * 1000 : -1;
+ log.fine("Using Refresh Period: " + this.refreshPeriod);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.sun.facelets.FaceletFactory#getFacelet(java.lang.String)
+ */
+ public Facelet getFacelet(String uri) throws IOException, FaceletException, FacesException, ELException
+ {
+ URL url = (URL) this.relativeLocations.get(uri);
+ if (url == null)
+ {
+ url = this.resolveURL(this.baseUrl, uri);
+ if (url != null)
+ {
+ Map newLoc = new HashMap(this.relativeLocations);
+ newLoc.put(uri, url);
+ this.relativeLocations = newLoc;
+ }
+ else
+ {
+ throw new IOException("'" + uri + "' not found.");
+ }
+ }
+ return this.getFacelet(url);
+ }
+
+ /**
+ * Resolves a path based on the passed URL. If the path starts with '/', then resolve the path against
+ * {@link javax.faces.context.ExternalContext#getResource(java.lang.String)
+ * javax.faces.context.ExternalContext#getResource(java.lang.String)}. Otherwise create a new URL via
+ * {@link URL#URL(java.net.URL, java.lang.String) URL(URL, String)}.
+ *
+ * @param source
+ * base to resolve from
+ * @param path
+ * relative path to the source
+ * @return resolved URL
+ * @throws IOException
+ */
+ public URL resolveURL(URL source, String path) throws IOException
+ {
+ if (path.startsWith("/"))
+ {
+ URL url = this.resolver.resolveUrl(path);
+ if (url == null)
+ {
+ throw new FileNotFoundException(path + " Not Found in ExternalContext as a Resource");
+ }
+ return url;
+ }
+ else
+ {
+ return new URL(source, path);
+ }
+ }
+
+ /**
+ * Create a Facelet from the passed URL. This method checks if the cached Facelet needs to be refreshed before
+ * returning. If so, uses the passed URL to build a new instance;
+ *
+ * @param url
+ * source url
+ * @return Facelet instance
+ * @throws IOException
+ * @throws FaceletException
+ * @throws FacesException
+ * @throws ELException
+ */
+ public Facelet getFacelet(URL url) throws IOException, FaceletException, FacesException, ELException
+ {
+ ParameterCheck.notNull("url", url);
+ String key = url.toString();
+ DefaultFacelet f = (DefaultFacelet) this.facelets.get(key);
+ if (f == null || this.needsToBeRefreshed(f))
+ {
+ f = this.createFacelet(url);
+ if (this.refreshPeriod != 0)
+ {
+ Map newLoc = new HashMap(this.facelets);
+ newLoc.put(key, f);
+ this.facelets = newLoc;
+ }
+ }
+ return f;
+ }
+
+ /**
+ * Template method for determining if the Facelet needs to be refreshed.
+ *
+ * @param facelet
+ * Facelet that could have expired
+ * @return true if it needs to be refreshed
+ */
+ protected boolean needsToBeRefreshed(DefaultFacelet facelet)
+ {
+ // if set to 0, constantly reload-- nocache
+ if (this.refreshPeriod == 0)
+ return true;
+ // if set to -1, never reload
+ if (this.refreshPeriod == -1)
+ return false;
+ long ttl = facelet.getCreateTime() + this.refreshPeriod;
+ URL url = facelet.getSource();
+ InputStream is = null;
+ if (System.currentTimeMillis() > ttl)
+ {
+ try
+ {
+ URLConnection conn = url.openConnection();
+ is = conn.getInputStream();
+ long atl = conn.getLastModified();
+ return atl == 0 || atl > ttl;
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Error Checking Last Modified for " + facelet.getAlias(), e);
+ }
+ finally
+ {
+ if (is != null)
+ {
+ try
+ {
+ is.close();
+ }
+ catch (Exception e)
+ {
+ // do nothing
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Uses the internal Compiler reference to build a Facelet given the passed URL.
+ *
+ * @param url
+ * source
+ * @return a Facelet instance
+ * @throws IOException
+ * @throws FaceletException
+ * @throws FacesException
+ * @throws ELException
+ */
+ private DefaultFacelet createFacelet(URL url) throws IOException, FaceletException, FacesException, ELException
+ {
+ if (log.isLoggable(Level.FINE))
+ {
+ log.fine("Creating Facelet for: " + url);
+ }
+ String alias = "/" + url.getFile().replaceFirst(this.baseUrl.getFile(), "");
+ try
+ {
+ FaceletHandler h = this.compiler.compile(url, alias);
+ DefaultFacelet f = new DefaultFacelet(this, this.compiler.createExpressionFactory(), url, alias, h);
+ return f;
+ }
+ catch (FileNotFoundException fnfe)
+ {
+ throw new FileNotFoundException("Facelet " + alias + " not found at: " + url.toExternalForm());
+ }
+ }
+
+ /**
+ * Compiler this factory uses
+ *
+ * @return final Compiler instance
+ */
+ public Compiler getCompiler()
+ {
+ return this.compiler;
+ }
+
+ public long getRefreshPeriod()
+ {
+ return refreshPeriod;
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultResourceResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultResourceResolver.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultResourceResolver.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/DefaultResourceResolver.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,50 @@
+/**
+ * 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.sun.facelets.impl;
+
+import java.io.IOException;
+import java.net.URL;
+
+import javax.faces.FacesException;
+import javax.faces.context.FacesContext;
+
+import com.sun.facelets.util.Resource;
+
+public class DefaultResourceResolver implements ResourceResolver
+{
+
+ public DefaultResourceResolver()
+ {
+ super();
+ }
+
+ public URL resolveUrl(String path)
+ {
+ try
+ {
+ return Resource.getResourceUrl(FacesContext.getCurrentInstance(), path);
+ }
+ catch (IOException e)
+ {
+ throw new FacesException(e);
+ }
+ }
+
+ public String toString()
+ {
+ return "DefaultResourceResolver";
+ }
+
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/ResourceResolver.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/ResourceResolver.java?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/ResourceResolver.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/ResourceResolver.java Wed Feb 4 23:55:25 2009
@@ -0,0 +1,22 @@
+/**
+ * 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.sun.facelets.impl;
+
+import java.net.URL;
+
+public interface ResourceResolver
+{
+ public URL resolveUrl(String path);
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/package.html
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/package.html?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/package.html (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/impl/package.html Wed Feb 4 23:55:25 2009
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<!--
+ 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.
+
+ $Id: package.html,v 1.3 2008/07/13 19:01:52 rlubke Exp $
+-->
+</head>
+<body bgcolor="white">
+Default implementation of the Facelets API.
+</body>
+</html>
\ No newline at end of file
Added: myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/package.html
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/package.html?rev=740940&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/package.html (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/com/sun/facelets/package.html Wed Feb 4 23:55:25 2009
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+<!--
+ 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.
+
+ $Id: package.html,v 1.3 2008/07/13 19:01:40 rlubke Exp $
+-->
+</head>
+<body bgcolor="white">
+Public Facelet API. Most developers should be able to utilizing the framework using
+the public classes and interfaces.
+<p/>
+An application that wishes to use Facelets as a ViewHandler, they must specify the
+following in their <code>faces-config.xml</code> (@see com.sun.facelets.FaceletViewHandler).
+<pre><code>
+<application>
+ <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
+</application>
+</code></pre>
+<p/>
+Below is sample code for using Facelets at the API level with JavaServer Faces.
+<pre><code>
+// get the view to render
+FacesContext context = FacesContext.getCurrentInstance();
+UIViewRoot viewToRender = context.getViewRoot();
+
+// grab our FaceletFactory and create a Facelet
+FaceletFactory factory = FaceletFactory.getInstance();
+Facelet f = factory.getFacelet(viewToRender.getViewId());
+
+// populate UIViewRoot
+f.apply(context, viewToRender);
+</code></pre>
+</body>
+</html>
\ No newline at end of file