blob: 390cbb4aaf1c06bee0cb8e1b4d7819c4a1dc38e9 [file] [log] [blame]
// Copyright 2005 The Apache Software Foundation
//
// 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 org.apache.tapestry.enhance;
import org.apache.commons.logging.Log;
import org.apache.hivemind.Location;
import org.apache.hivemind.internal.Module;
import org.apache.tapestry.spec.IComponentSpecification;
import java.util.Iterator;
import java.util.List;
/**
* An enhancement worker which automatically injects HiveMind services
* into pages/components if exactly one service point exists which is
* compatible with the read-only property's type.
*
*/
public class AutowireWorker implements EnhancementWorker
{
private final Log _log;
private final Module _module;
public AutowireWorker( Module module, Log log)
{
_module = module;
_log = log;
}
public void performEnhancement( EnhancementOperation op, IComponentSpecification spec )
{
final List propertyNames = op.findUnclaimedAbstractProperties();
for( Iterator i = propertyNames.iterator(); i.hasNext(); ) {
String propertyName = ( String ) i.next();
Class propertyType = op.getPropertyType( propertyName );
if( propertyType == null )
propertyType = Object.class;
if (!op.canClaimAsReadOnlyProperty(propertyName))
continue;
if( _module.containsService( propertyType )) {
final Object serviceProxy = _module.getService( propertyType );
final Location location = spec.getLocation();
_log.debug( EnhanceMessages.autowiring( propertyName, spec, serviceProxy ) );
final String fieldName = op.addInjectedField( "_$" + propertyName, propertyType, serviceProxy );
EnhanceUtils.createSimpleAccessor( op, fieldName, propertyName, propertyType, location );
op.claimReadonlyProperty( propertyName );
}
}
}
}