org.apache.beehive.controls.runtime.generator.AptEventField Maven / Gradle / Ivy
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*
* $Header:$
*/
package org.apache.beehive.controls.runtime.generator;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import com.sun.mirror.declaration.FieldDeclaration;
import com.sun.mirror.declaration.TypeDeclaration;
import com.sun.mirror.declaration.TypeParameterDeclaration;
import com.sun.mirror.type.DeclaredType;
import com.sun.mirror.type.ReferenceType;
import com.sun.mirror.type.TypeMirror;
/**
* The AptEventField class represents a field type that is also an event source
*/
abstract public class AptEventField extends AptField
{
public AptEventField(FieldDeclaration fieldDecl)
{
super(fieldDecl);
}
/**
* Inits the ControlInterface associated with this event field. The public interface
* for controls and contextual services, and their associated events can be modeled in the
* same way. Subclasses will override this to assign an appropriate interface.
*/
abstract protected AptControlInterface initControlInterface();
/**
* Computes the binding from any formal type parameters declared on the control interface
* to bound types on the field declaration.
*/
private void initTypeParameterBindings()
{
//
// Get an iterator to both the declared type arguments and the original type
// declaration on the associated control interface
//
DeclaredType fieldType = (DeclaredType)_fieldDecl.getType();
Iterator paramBoundIter = fieldType.getActualTypeArguments().iterator();
TypeDeclaration intfDecl = (TypeDeclaration)_controlIntf.getTypeDeclaration();
Iterator paramDeclIter =
intfDecl.getFormalTypeParameters().iterator();
//
// Iterate through them in parallel, creating a mapping from the original formal
// type parameter name to the actual bound type. In parallel, also build up a
// representation of the bound type declaration.
//
// NOTE: If no type binding is done on the field declaration, then loop below
// will not execute and no mappings/empty bound decl will be the result.
//
StringBuffer sb = new StringBuffer();
boolean isFirst = true;
while (paramBoundIter.hasNext())
{
TypeMirror paramBound = paramBoundIter.next();
TypeParameterDeclaration paramDecl = paramDeclIter.next();
//
// Save a mapping from the formal type name to the bound mirror type
//
_typeBindingMap.put(paramDecl.getSimpleName(), paramBound);
if (isFirst)
{
sb.append("<");
isFirst = false;
}
else
sb.append(", ");
sb.append(paramBound);
}
if (!isFirst)
sb.append(">");
_boundParameterDecl = sb.toString();
}
/**
* Returns the ControlInterface associated with this event field
*/
public AptControlInterface getControlInterface()
{
if (_controlIntf == null)
{
_controlIntf = initControlInterface();
if (_controlIntf != null)
initTypeParameterBindings();
}
return _controlIntf;
}
/**
* Gets the EventAdaptor for a particular EventSet
*/
public EventAdaptor getEventAdaptor(AptEventSet eventSet)
{
return _eventAdaptors.get(eventSet);
}
/**
* Adds a EventAdaptor for a particular EventSet
*/
public void addEventAdaptor(AptEventSet eventSet, EventAdaptor eventAdaptor)
{
assert !_eventAdaptors.containsKey(eventSet);
_eventAdaptors.put(eventSet, eventAdaptor);
}
/**
* Returns all EventAdaptors for this EventField
*/
public Collection getEventAdaptors()
{
return _eventAdaptors.values();
}
/**
* Returns the bound parameter declaration for this event field
*/
public String getBoundParameters()
{
return _boundParameterDecl;
}
/**
* Returns the formal type binding map (from name to bound type) for the event field
*/
public HashMap getTypeBindingMap()
{
return _typeBindingMap;
}
HashMap _eventAdaptors =
new HashMap();
String _boundParameterDecl;
HashMap _typeBindingMap = new HashMap();
private AptControlInterface _controlIntf;
}