001 /* 002 * $Id: BeanProviderAccessor.java 1187867 2011-10-23 11:35:10Z simonetripodi $ 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 */ 020 /** 021 * 022 */ 023 package org.apache.commons.ognl.test.objects; 024 025 import org.apache.commons.ognl.ObjectPropertyAccessor; 026 import org.apache.commons.ognl.OgnlContext; 027 import org.apache.commons.ognl.OgnlException; 028 import org.apache.commons.ognl.OgnlRuntime; 029 import org.apache.commons.ognl.PropertyAccessor; 030 import org.apache.commons.ognl.enhance.ExpressionCompiler; 031 import org.apache.commons.ognl.enhance.UnsupportedCompilationException; 032 033 import java.util.Map; 034 035 /** 036 * Implementation of provider that works with {@link BeanProvider} instances. 037 */ 038 public class BeanProviderAccessor 039 extends ObjectPropertyAccessor 040 implements PropertyAccessor 041 { 042 @Override 043 public Object getProperty( Map<String, Object> context, Object target, Object name ) 044 throws OgnlException 045 { 046 BeanProvider provider = (BeanProvider) target; 047 String beanName = (String) name; 048 049 return provider.getBean( beanName ); 050 } 051 052 /** 053 * Returns true if the name matches a bean provided by the provider. Otherwise invokes the super implementation. 054 **/ 055 056 @Override 057 public boolean hasGetProperty( Map<String, Object> context, Object target, Object oname ) 058 throws OgnlException 059 { 060 BeanProvider provider = (BeanProvider) target; 061 String beanName = ( (String) oname ).replaceAll( "\"", "" ); 062 063 return provider.getBean( beanName ) != null; 064 } 065 066 @Override 067 public String getSourceAccessor( OgnlContext context, Object target, Object name ) 068 { 069 BeanProvider provider = (BeanProvider) target; 070 String beanName = ( (String) name ).replaceAll( "\"", "" ); 071 072 if ( provider.getBean( beanName ) != null ) 073 { 074 context.setCurrentAccessor( BeanProvider.class ); 075 context.setCurrentType( provider.getBean( beanName ).getClass() ); 076 077 ExpressionCompiler.addCastString( context, 078 "((" 079 + OgnlRuntime.getCompiler( context ).getInterfaceClass( provider.getBean( beanName ).getClass() ).getName() 080 + ")" ); 081 082 return ".getBean(\"" + beanName + "\"))"; 083 } 084 085 return super.getSourceAccessor( context, target, name ); 086 } 087 088 @Override 089 public String getSourceSetter( OgnlContext context, Object target, Object name ) 090 { 091 throw new UnsupportedCompilationException( "Can't set beans on BeanProvider." ); 092 } 093 }