1 18 package org.apache.beehive.netui.tags.naming; 19 20 22 import org.apache.beehive.netui.script.Expression; 23 import org.apache.beehive.netui.script.ExpressionEvaluationException; 24 import org.apache.beehive.netui.script.ExpressionEvaluator; 25 import org.apache.beehive.netui.script.ExpressionEvaluatorFactory; 26 import org.apache.beehive.netui.script.common.IDataAccessProvider; 27 import org.apache.beehive.netui.util.logging.Logger; 28 29 import javax.servlet.jsp.tagext.SimpleTagSupport ; 30 import javax.servlet.jsp.tagext.Tag ; 31 import java.util.List ; 32 33 35 46 public class IndexedNameInterceptor 47 implements INameInterceptor 48 { 49 private static final Logger _logger = Logger.getInstance(IndexedNameInterceptor.class); 50 51 59 public final String rewriteName(String name, Tag currentTag) 60 throws ExpressionEvaluationException 61 { 62 if (_logger.isDebugEnabled()) _logger.debug("rewrite expression \"" + name + "\""); 63 64 IDataAccessProvider dap = getCurrentProvider(currentTag); 65 if (dap == null) 67 return name; 68 69 Expression parsed = getExpressionEvaluator().parseExpression(name); 74 assert parsed != null; 75 76 int containerCount = 0; 77 List tokens = parsed.getTokens(); 78 for (int i = 0; i < tokens.size(); i++) { 79 String tok = tokens.get(i).toString(); 80 if (i == 0) { 81 if (!tok.equals("container")) 82 break; 83 else 84 continue; 85 } 86 else if (tok.equals("container")) 88 containerCount++; 89 else if (tok.equals("item")) 90 break; 91 } 92 93 if (_logger.isDebugEnabled()) _logger.debug("container parent count: " + containerCount); 94 95 for (int i = 0; i < containerCount; i++) { 105 dap = dap.getProviderParent(); 106 } 107 108 assert dap != null; 110 111 if (containerCount > 0) { 114 name = parsed.getExpression(containerCount); 115 } 116 117 String parentNames = rewriteNameInternal(dap); 122 123 if (_logger.isDebugEnabled()) _logger.debug("name hierarchy: " + parentNames + " name: " + name); 124 125 String newName = changeContext(name, "container.item", parentNames, dap.getCurrentIndex()); 128 129 if (_logger.isDebugEnabled()) _logger.debug("rewrittenName: " + newName); 130 131 return newName; 132 } 133 134 139 protected IDataAccessProvider getCurrentProvider(Tag tag) 140 { 141 return (IDataAccessProvider) SimpleTagSupport.findAncestorWithClass(tag, IDataAccessProvider.class); 142 } 143 144 149 private final String rewriteNameInternal(IDataAccessProvider dap) 150 throws ExpressionEvaluationException 151 { 152 if (_logger.isDebugEnabled()) 153 _logger.debug("assign index to name: " + dap.getDataSource()); 154 155 Expression parsedDataSource = getExpressionEvaluator().parseExpression(dap.getDataSource()); 156 assert parsedDataSource != null; 157 158 boolean isContainerBound = (parsedDataSource.getTokens().get(0)).toString().equals("container"); 160 161 String parentName = null; 163 if (dap.getProviderParent() != null) 165 parentName = rewriteNameInternal(dap.getProviderParent()); 166 else if (dap.getProviderParent() == null || (dap.getProviderParent() != null && !isContainerBound)) { 169 return dap.getDataSource(); 170 } 171 172 if (_logger.isDebugEnabled()) { 175 _logger.debug("changeContext: DAP.dataSource=" + dap.getDataSource() + " oldContext=container newContext=" + 176 parentName + " currentIndex=" + dap.getProviderParent().getCurrentIndex() + 177 " parentName is container: " + isContainerBound); 178 } 179 180 String retVal = null; 181 String ds = dap.getDataSource(); 182 183 189 boolean isContainerItemBound = false; 190 if (isContainerBound && (parsedDataSource.getTokens().get(1)).toString().equals("item")) 191 isContainerItemBound = true; 192 193 if (isContainerItemBound) 194 retVal = changeContext(ds, "container.item", parentName, dap.getProviderParent().getCurrentIndex()); 195 else 196 retVal = changeContext(ds, "container", parentName, dap.getProviderParent().getCurrentIndex()); 197 198 if (_logger.isDebugEnabled()) _logger.debug("fully-qualified binding expression: \"" + retVal + "\""); 199 200 return retVal; 201 } 202 203 protected ExpressionEvaluator getExpressionEvaluator() 204 { 205 return ExpressionEvaluatorFactory.getInstance(); 206 } 207 208 private final String changeContext(String dataSource, String oldContext, String newContext, int index) 209 throws ExpressionEvaluationException 210 { 211 try { 212 return getExpressionEvaluator().changeContext(dataSource, oldContext, newContext, index); 213 } 214 catch (ExpressionEvaluationException ee) { 215 if (_logger.isErrorEnabled()) 216 _logger.error("An error occurred changing the binding context of the expression \"" + 217 dataSource + "\". Cause: " + ee, ee); 218 219 throw ee; 220 } 221 } 222 } 223 | Popular Tags |