blob: 761753a9d9fe43e711b385d4c9bc039e647f9f35 [file] [log] [blame]
/*
* 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.
*/
package org.netbeans.modules.beans;
import java.lang.reflect.Modifier;
import java.beans.Introspector;
import java.text.MessageFormat;
import java.util.List;
import java.util.Iterator;
import java.util.Collections;
import java.util.ArrayList;
/** Singleton with static methods for generating bodies of and
* additional elements for bean patterns.
* @author Petr Hrebejk
*/
final class BeanPatternGenerator {
// private static final String THIS_QUALIFIER = "this."; // NOI18N
// /** Constant for one Tab */
// private static final String TAB = " "; // NOI18N
// /** Constant for two Tabs */
// private static final String TABx2 = TAB + TAB;
// /** Constant for three Tabs */
// private static final String TABx3 = TABx2 + TAB;
//
// /**
// * Helper method; creates a suitable string for referencing an instance field.
// * @param base the base name to create the string from
// * @param adjustName
// */
// static String createFieldName(String base, boolean adjustName, boolean paramClash) {
// if (!adjustName) {
// if (!paramClash)
// return base;
// else
// return new StringBuffer(THIS_QUALIFIER).append(base).toString();
// } else {
// String propertyStyle = PropertyActionSettings.getDefault().getPropStyle();
// return new StringBuffer(propertyStyle).append(base).toString();
// }
// }
//
// /** Generates the body of the setter method of Property.
// * @param name Name of the property
// * @param type Type of the property
// * @param bound Is the property bound?
// * @param constrained Is the property constrained?
// * @param withSet Should be the set command of property private field generated.
// * @param withSupport Generate the firing of (Veto|Property)Change Events?
// * @param supportName Name of field containing <CODE>PropertyChangeListeners</CODE>.
// * @param vetoSupportName Name of field containing <CODE>VetoableChangeListeners</CODE>.
// * @return Sring containing the body of the setter method.
// */
// static String propertySetterBody(String name, Type type,
// boolean bound, boolean constrained,
// boolean withSet, boolean withSupport,
// String supportName, String vetoSupportName) throws JmiException {
// return propertySetterBody(name, type, bound, constrained, withSet, withSupport, supportName,
// vetoSupportName, true);
// }
//
// static String propertySetterBody(String name, Type type,
// boolean bound, boolean constrained,
// boolean withSet, boolean withSupport,
// String supportName, String vetoSupportName, boolean adjustName) throws JmiException {
// assert JMIUtils.isInsideTrans();
// StringBuffer setterBody = new StringBuffer( 200 );
// String decoratedName = createFieldName(name, adjustName, true);
//
// setterBody.append( "\n" ); // NOI18N
// if ( withSupport ) {
// /* Generates body in the form:
// PropType oldPropName = this.propName;
// this.propName = propName;
// changes.firePropertyChange(propName, oldPropName, propName );
// */
//
// setterBody.append( TAB + type.getName() );
// setterBody.append( " old" ).append( Pattern.capitalizeFirstLetter( name ) ); // NOI18N
// setterBody.append( " = " ).append( decoratedName ).append( ";\n"); // NOI18N
//
// if ( constrained ) {
// setterBody.append( TAB + vetoSupportName ).append( ".fireVetoableChange(\"").append( name ).append( "\", " ); // NOI18N
//
// if ( type instanceof PrimitiveType) {
// setterBody.append( "new ").append( getWrapperClassName( type )).append( " (" ); // NOI18N
// setterBody.append( "old" ).append( Pattern.capitalizeFirstLetter( name ) ); // NOI18N
// setterBody.append( "), " ); // NOI18N
// setterBody.append( "new ").append( getWrapperClassName( type )).append( " (" ); // NOI18N
// setterBody.append( name ).append( "));\n" ); // NOI18N
// }
// else {
// setterBody.append( "old" ).append( Pattern.capitalizeFirstLetter( name ) ); // NOI18N
// setterBody.append( ", " ).append( name ).append( ");\n" ); // NOI18N
// }
// if ( !bound ) {
// setterBody.append( TAB ).append( decoratedName ); // NOI18N
// setterBody.append( " = " ).append( name ).append( ";\n"); // NOI18N
// }
// }
// if ( bound ) {
// setterBody.append( TAB ).append( decoratedName ); // NOI18N
// setterBody.append( " = " ).append( name ).append( ";\n"); // NOI18N
// setterBody.append( TAB + supportName ).append( ".firePropertyChange (\"").append( name ).append( "\", " ); // NOI18N
//
// if ( type instanceof PrimitiveType) {
// setterBody.append( "new ").append( getWrapperClassName( type )).append( " (" ); // NOI18N
// setterBody.append( "old" ).append( Pattern.capitalizeFirstLetter( name ) ); // NOI18N
// setterBody.append( "), " ); // NOI18N
// setterBody.append( "new ").append( getWrapperClassName( type )).append( " (" ); // NOI18N
// setterBody.append( name ).append( "));\n" ); // NOI18N
// }
// else {
// setterBody.append( "old" ).append( Pattern.capitalizeFirstLetter( name ) ); // NOI18N
// setterBody.append( ", " ).append( name ).append( ");\n" ); // NOI18N
// }
// }
// }
// else if ( withSet ) {
// /* Generates body in the form:
// this.propName = propName;
// */
// setterBody.append( TAB ).append( decoratedName ); // NOI18N
// setterBody.append( " = " ).append( name ).append( ";\n" ); // NOI18N
// }
// return setterBody.toString();
// }
//
// /** Generates the body of the setter method of IndexedProperty.
// * @param name Name of the property
// * @param indexedType Indexed type of the property
// * @param bound Is the property bound?
// * @param constrained Is the property constrained?
// * @param withSet Should be the set command of property private field generated.
// * @param withSupport Generate the firing of (Veto|Property)Change Events?
// * @param supportName Name of field containing <CODE>PropertyChangeListeners</CODE>.
// * @param vetoSupportName Name of field containing <CODE>VetoableChangeListeners</CODE>.
// * @return Sring containing the body of the setter method.
// */
// static String idxPropertySetterBody( String name, Type indexedType,
// boolean bound, boolean constrained,
// boolean withSet, boolean withSupport,
// String supportName,
// String vetoSupportName ) throws JmiException {
// return idxPropertySetterBody(name, indexedType, bound, constrained,
// withSet, withSupport, supportName, vetoSupportName, true);
// }
//
// static String idxPropertySetterBody( String name, Type indexedType,
// boolean bound, boolean constrained,
// boolean withSet, boolean withSupport,
// String supportName,
// String vetoSupportName, boolean adjustName ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// StringBuffer setterBody = new StringBuffer( 200 );
// String decoratedName = createFieldName(name, adjustName, true);
// setterBody.append( "\n" ); // NOI18N
//
// if ( withSupport && constrained ) {
//
// setterBody.append( TAB + indexedType.getName() );
// setterBody.append( " old" ).append( Pattern.capitalizeFirstLetter( name ) ); // NOI18N
// setterBody.append( " = " ).append( decoratedName ); // NOI18N
// setterBody.append( "[index];\n"); // NOI18N
// }
//
// if ( withSet || withSupport ) {
// /* Generates body in the form:
// this.propName = propName;
// */
// setterBody.append( TAB ).append( decoratedName ); // NOI18N
// setterBody.append( "[index] = " ).append( name ).append( ";\n" ); // NOI18N
// }
//
// if ( withSupport && constrained ) {
// setterBody.append( TAB + "try {\n" ); // NOI18N
// setterBody.append( TABx2 + vetoSupportName ).append( ".fireVetoableChange (\"").append( name ).append( "\", " ); // NOI18N
// setterBody.append( "null, null );\n" ); // NOI18N
// setterBody.append( TAB + "}\n" ); // NOI18N
// setterBody.append( TAB + "catch(java.beans.PropertyVetoException vetoException ) {\n" ); //NOI18N
// setterBody.append( TABx2 ).append( decoratedName ); // NOI18N
// setterBody.append( "[index] = old").append( Pattern.capitalizeFirstLetter( name ) ).append( ";\n" ) ; // NOI18N
// setterBody.append( TABx2 + "throw vetoException;\n" ); //NOI18N
// setterBody.append( TAB + "}\n" ); //NOI18N
// }
//
// if ( withSupport && bound ) {
// setterBody.append( TAB + supportName ).append( ".firePropertyChange (\"").append( name ).append( "\", " ); // NOI18N
// setterBody.append( "null, null );\n" ); // NOI18N
// }
//
// return setterBody.toString();
// }
//
// static String propertyGetterBody( String name, boolean withReturn ) {
// return propertyGetterBody(name, withReturn, true);
// }
//
// /** Generates the body of the getter method of Property.
// * @param name Name of the property.
// * @param withReturn Should be the return command with property private field generated?
// * @return Sring containing the body of the getter method.
// */
// static String propertyGetterBody( String name, boolean withReturn, boolean adjustName ) {
// StringBuffer getterBody = new StringBuffer( 50 );
// String decorated = createFieldName(name, adjustName, false);
// getterBody.append( "\n"); // NOI18N
// if ( withReturn ) {
// /* Generates body in the form:
// return propName;
// */
// getterBody.append( TAB + "return " ); // NOI18N
// getterBody.append( decorated ).append( ";\n" ); // NOI18N
// }
// return getterBody.toString();
// }
//
// /** Generates the body of the getter method of IndexedProperty.
// * @param name Name of the property.
// * @param withReturn Should be the return command with property private field generated?
// * @return Sring containing the body of the getter method.
// */
// static String idxPropertyGetterBody( String name, boolean withReturn ) {
// return idxPropertyGetterBody(name, withReturn, true);
// }
//
// static String idxPropertyGetterBody( String name, boolean withReturn, boolean adjustName ) {
// StringBuffer getterBody = new StringBuffer( 50 );
// String decorated = createFieldName(name, adjustName, false);
// getterBody.append( "\n"); // NOI18N
// if ( withReturn ) {
// /* Generates body in the form:
// return propName;
// */
// getterBody.append( TAB + "return " ); // NOI18N
// getterBody.append( decorated ).append( "[index];\n" ); // NOI18N
// }
// return getterBody.toString();
// }
//
//
// /** Gets the <CODE>PropertyChangeSupport</CODE> field in Class. Tryes to find
// * a field of type <CODE>PropertyChangeSupport</CODE>. If such field doesn't
// * exist creates a new one with name <CODE>propertyChangeSupport</CODE>.
// * @param ce Class to operate on.
// * @throws JmiException If the modification of the source is impossible.
// * @return Name of foun or newly created <CODE>PropertyChangeSupport</CODE> field.
// */
// static String supportField(JavaClass ce) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String supportName = null;
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(ce);
// Type pcsType = jmodel.getType().resolve("java.beans.PropertyChangeSupport"); // NOI18N
// List/*<Field>*/ fields = JMIUtils.getFields(ce);
//
// for (Iterator it = fields.iterator(); it.hasNext();) {
// Field field = (Field) it.next();
// if (JMIUtils.equalTypes(pcsType, field.getType())) {
// supportName = field.getName();
// break;
// }
// }
//
// if ( supportName == null ) { // Field not found we create new
// supportName = findFreeFieldName(ce, "propertyChangeSupport"); // NOI18N
// Field supportField = jmodel.getField().createField();
// supportField.setName(supportName);
// supportField.setType(pcsType);
// supportField.setModifiers( Modifier.PRIVATE );
// supportField.setInitialValueText( " new java.beans.PropertyChangeSupport(this)" ); // NOI18N
// supportField.setJavadocText( PatternNode.getString( "COMMENT_PropertyChangeSupport" ) );
// ce.getFeatures().add( supportField );
// }
//
// return supportName;
// }
//
// /** Gets the <CODE>VetoableChangeSupport</CODE> field in Class. Tryes to find
// * a field of type <CODE>VetoableChangeSupport</CODE>. If such field doesn't
// * exist creates a new one with name <CODE>vetoableChangeSupport</CODE>.
// * @param ce Class to operate on.
// * @throws JmiException If the modification of the source is impossible.
// * @return Name of foun or newly created <CODE>vetoableChangeSupport</CODE> field.
// */
// static String vetoSupportField( JavaClass ce ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String vetoSupportName = null;
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(ce);
// Type vcsType = jmodel.getType().resolve("java.beans.VetoableChangeSupport"); // NOI18N
// List/*<Field>*/ fields = JMIUtils.getFields(ce);
//
// for (Iterator it = fields.iterator(); it.hasNext();) { // Try to find suitable field
// Field field = (Field) it.next();
// if (JMIUtils.equalTypes(vcsType, field.getType())) {
// vetoSupportName = field.getName();
// break;
// }
// }
//
// if ( vetoSupportName == null ) { // Field not found we create new
// vetoSupportName = findFreeFieldName(ce, "vetoableChangeSupport"); // NOI18N
// Field supportField = jmodel.getField().createField();
// supportField.setName( vetoSupportName );
// supportField.setType( vcsType );
// supportField.setModifiers( Modifier.PRIVATE );
// supportField.setInitialValueText( " new java.beans.VetoableChangeSupport(this)" ); // NOI18N
// supportField.setJavadocText( PatternNode.getString( "COMMENT_VetoableChangeSupport" ) );
// ce.getFeatures().add( supportField );
// }
//
// return vetoSupportName;
// }
//
// private static String findFreeFieldName(JavaClass ce, String defName) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String name = defName;
// for (int i = 1; ce.getField(name, true) != null; i++) {
// name = defName + '_' + i;
// }
// return name;
// }
//
// /** If in the class don't exists methods for adding/removing PropertyChangeListeners
// * for given field adds them.
// * @param classElement Class to operate on.
// * @param supportName The <CODE>PropertyChangeSupport</CODE> field the methods will be generated for.
// * @throws JmiException If the modification of the source is impossible.
// */
// static void supportListenerMethods( JavaClass classElement, String supportName ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String addMethodId = "addPropertyChangeListener"; // NOI18N
// Method addMethod = null;
// String removeMethodId = "removePropertyChangeListener"; // NOI18N
// Method removeMethod = null;
// String listenerTypeId = "java.beans.PropertyChangeListener"; // NOI18N
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(classElement);
// Type listenerType = jmodel.getType().resolve(listenerTypeId);
//
// addMethod = classElement.getMethod( addMethodId, Collections.singletonList(listenerType), false);
// if ( addMethod == null ) {
// addMethod = jmodel.getMethod().createMethod();
// addMethod.setName( addMethodId );
// addMethod.setType( jmodel.getType().resolve("void") ); // NOI18N
// addMethod.setModifiers( Modifier.PUBLIC );
// Parameter param = jmodel.getParameter().createParameter();
// param.setName("l"); // NOI18N
// param.setType(listenerType);
// addMethod.getParameters().add(param);
//
// StringBuffer body = new StringBuffer( 80 );
// body.append( "\n" ).append( TAB + supportName ); // NOI18N
// body.append( ".addPropertyChangeListener(l);\n" ); // NOI18N
// addMethod.setBodyText( body.toString() );
//
// /*
// String comment = MessageFormat.format( PatternNode.getString( "COMMENT_AddPropertyChangeListener" ),
// new Object[] { listenerType.getClassName().getName() } );
// */
// addMethod.setJavadocText( PatternNode.getString( "COMMENT_AddPropertyChangeListener" ) );
// classElement.getFeatures().add( addMethod );
// }
//
// removeMethod = classElement.getMethod(removeMethodId, Collections.singletonList(listenerType), false);
// if ( removeMethod == null ) {
// removeMethod = jmodel.getMethod().createMethod();
// removeMethod.setName( removeMethodId );
// removeMethod.setType( jmodel.getType().resolve("void") ); // NOI18N
// removeMethod.setModifiers( Modifier.PUBLIC );
// Parameter param = jmodel.getParameter().createParameter();
// param.setName("l"); // NOI18N
// param.setType(listenerType);
// removeMethod.getParameters().add(param);
//
// StringBuffer body = new StringBuffer( 80 );
// body.append( "\n" ).append( TAB + supportName ); // NOI18N
// body.append( ".removePropertyChangeListener(l);\n" ); // NOI18N
// removeMethod.setBodyText( body.toString() );
// removeMethod.setJavadocText( PatternNode.getString( "COMMENT_RemovePropertyChangeListener" ) );
// classElement.getFeatures().add( removeMethod );
// }
// }
//
//
// /** If in the class don't exists methods for adding/removing VetoableChangeListeners
// * for given field adds them.
// * @param classElement Class to operate on.
// * @param supportName The <CODE>vetoableChangeSupport</CODE> field the methods will be generated for.
// * @throws JmiException If the modification of the source is impossible.
// */
// static void vetoSupportListenerMethods( JavaClass classElement, String supportName ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String addMethodId = "addVetoableChangeListener"; // NOI18N
// Method addMethod = null;
// String removeMethodId = "removeVetoableChangeListener"; // NOI18N
// Method removeMethod = null;
// String listenerTypeId = "java.beans.VetoableChangeListener"; // NOI18N
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(classElement);
// Type listenerType = jmodel.getType().resolve(listenerTypeId);
//
// addMethod = classElement.getMethod( addMethodId, Collections.singletonList(listenerType), false);
// if ( addMethod == null ) {
// addMethod = jmodel.getMethod().createMethod();
// addMethod.setName( addMethodId );
// addMethod.setType( jmodel.getType().resolve("void") ); // NOI18N
// addMethod.setModifiers( Modifier.PUBLIC );
// Parameter param = jmodel.getParameter().createParameter();
// param.setName("l"); // NOI18N
// param.setType(listenerType);
// addMethod.getParameters().add(param);
//
// StringBuffer body = new StringBuffer( 80 );
// body.append( "\n" ).append( TAB + supportName ); // NOI18N
// body.append( ".addVetoableChangeListener (l);\n" ); // NOI18N
// addMethod.setBodyText( body.toString() );
// addMethod.setJavadocText( PatternNode.getString( "COMMENT_AddVetoableChangeListener" ) );
// classElement.getFeatures().add( addMethod );
// }
//
// removeMethod = classElement.getMethod(removeMethodId, Collections.singletonList(listenerType), false);
// if ( removeMethod == null ) {
// removeMethod = jmodel.getMethod().createMethod();
// removeMethod.setName( removeMethodId );
// removeMethod.setType( jmodel.getType().resolve("void") ); // NOI18N
// removeMethod.setModifiers( Modifier.PUBLIC );
// Parameter param = jmodel.getParameter().createParameter();
// param.setName("l"); // NOI18N
// param.setType(listenerType);
// removeMethod.getParameters().add(param);
//
// StringBuffer body = new StringBuffer( 80 );
// body.append( "\n" ).append( TAB + supportName ); // NOI18N
// body.append( ".removeVetoableChangeListener (l);\n" ); // NOI18N
// removeMethod.setBodyText( body.toString() );
// removeMethod.setJavadocText( PatternNode.getString( "COMMENT_RemoveVetoableChangeListener" ) );
// classElement.getFeatures().add( removeMethod );
// }
// }
//
// /** Ensures that the listeners array list exists. Used for generating
// * multicast event source support implemented by java.util.ArrayList.
// * Searches the source for suitable field. If the field does not exists
// * creates new one.
// * @param ce Class to operate on.
// * @param type Type of the Event Listener.
// * @throws JmiException If the modification of the source is impossible.
// * @return found or newly created field.
// */
// static Field listenersArrayListField( JavaClass ce, Type type, boolean create ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// Field ret = null;
// String fieldName = null;
// String simpleTypeName = ((JavaClass) type).getSimpleName();
// String fieldNameToFind = Introspector.decapitalize( simpleTypeName ) + "List"; // NOI18N
//
// String fieldTypeId = "java.util.ArrayList"; // NOI18N
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(ce);
// Type fieldType = jmodel.getType().resolve(fieldTypeId);
//
// List/*<Field>*/ fields = JMIUtils.getFields(ce);
// for (Iterator it = fields.iterator(); it.hasNext();) { // Try to find suitable field
// Field field = (Field) it.next();
// if (JMIUtils.equalTypes(fieldType, field.getType()) && fieldNameToFind.equals(field.getName())) {
// fieldName = fieldNameToFind;
// ret = field;
// break;
// }
// }
//
// if ( fieldName == null && create) { // Field not found we create new
// fieldName = fieldNameToFind;
// Field field = jmodel.getField().createField();
// field.setName( fieldName );
// field.setType( fieldType );
// field.setModifiers( Modifier.PRIVATE | Modifier.TRANSIENT );
// String comment = MessageFormat.format( PatternNode.getString( "COMMENT_ListenerArrayList" ),
// new Object[] { simpleTypeName } );
// field.setJavadocText( comment );
//
// ce.getFeatures().add( field );
// ret = field;
// }
//
// return ret;
// }
//
// /** Ensure the listenersList exists. Used for generating
// * multicast event source support implemented by javax.swing.event.EventListenerList.
// * Searches the source for suitable field. If the field does not exists
// * creates new one.
// * @param ce Class to operate on.
// * @param type Type of the Event Listener.
// * @throws JmiException If the modification of the source is impossible.
// * @return Field newly created field.
// */
// static Field eventListenerListField( JavaClass ce, Type type, boolean create ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String fieldName = null;
// Field ret = null;
//
// String fieldTypeId = "javax.swing.event.EventListenerList"; // NOI18N
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(ce);
// Type fieldType = jmodel.getType().resolve(fieldTypeId);
// List/*<Field>*/ fields = JMIUtils.getFields(ce);
//
// for (Iterator it = fields.iterator(); it.hasNext();) { // Try to find suitable field
// Field field = (Field) it.next();
// if (JMIUtils.equalTypes(fieldType, field.getType())) {
// fieldName = field.getName();
// ret = field;
// break;
// }
// }
//
// if ( fieldName == null && create) { // Field not found we create new
// fieldName = "listenerList"; // NOI18N
// Field field = jmodel.getField().createField();
// field.setName( fieldName );
// field.setType( fieldType );
// field.setModifiers( Modifier.PRIVATE );
// field.setInitialValueText( " null" ); // NOI18N
// String comment = MessageFormat.format( PatternNode.getString( "COMMENT_EventListenerList" ),
// new Object[] { ((JavaClass) type).getSimpleName() } );
// field.setJavadocText( comment );
//
// ce.getFeatures().add( field );
// ret = field;
// }
//
// return ret;
// }
//
// /** Ensure that listener field for unicast exists. Used for generating
// * unicast event source support.
// * Searches the source for suitable field. If the field does not exists
// * creates new one.
// * @param ce Class to operate on.
// * @param type Type of the Event Listener.
// * @throws JmiException If the modification of the source is impossible.
// * @return Field newly created field.
// */
// static Field unicastListenerField( JavaClass ce, Type type, boolean create ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// Field ret = null;
// String fieldName = null;
// String typeSimpleName = ((JavaClass) type).getSimpleName();
// String fieldNameToFind = Introspector.decapitalize( typeSimpleName );
// if ( fieldNameToFind.equals( typeSimpleName ) ) {
// fieldNameToFind = "listener" + fieldNameToFind; // NOI18N
// }
//
// List/*<Field>*/ fields = JMIUtils.getFields(ce);
//
// for (Iterator it = fields.iterator(); it.hasNext();) { // Try to find suitable field
// Field field = (Field) it.next();
// if (JMIUtils.equalTypes(type, field.getType()) && fieldNameToFind.equals(field.getName())) {
// fieldName = fieldNameToFind;
// ret = field;
// break;
// }
// }
//
// if ( fieldName == null && create) { // Field not found we create new
// fieldName = fieldNameToFind;
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(ce);
// Field field = jmodel.getField().createField();
// field.setName( fieldName );
// field.setType( type );
// field.setModifiers( Modifier.PRIVATE | Modifier.TRANSIENT );
// field.setInitialValueText( " null" ); // NOI18N
// String comment = MessageFormat.format( PatternNode.getString( "COMMENT_UnicastEventListener" ),
// new Object[] { ((JavaClass) type).getSimpleName() } );
// field.setJavadocText( comment );
// ce.getFeatures().add( field );
// ret = field;
// }
// return ret;
// }
//
// static String mcAddBody( Type type, int implementation, String listenerList ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String fieldName = Introspector.decapitalize( ((JavaClass) type).getSimpleName() ) + "List"; // NOI18N
//
// StringBuffer body = new StringBuffer( 50 );
//
// if ( listenerList == null )
// listenerList = "listenerList"; // NOI18N
//
// body.append( "\n"); // NOI18N
//
// if ( implementation == 1 ) {
// body.append( TAB + "if (" ).append( fieldName ).append( " == null ) {\n" ); // NOI18N
// body.append( TABx2 ).append( fieldName ).append( " = new java.util.ArrayList ();\n" ); // NOI18N
// body.append( TAB ).append( "}\n" ); // NOI18N
// body.append( TAB + fieldName ).append( ".add (listener);\n" ); // NOI18N
// }
// else if ( implementation == 2 ) {
// body.append( TAB + "if (" ).append( listenerList ).append( " == null ) {\n" ); // NOI18N
// body.append( TABx2 ).append( listenerList ).append( " = new javax.swing.event.EventListenerList();\n" ); // NOI18N
// body.append( TAB ).append( "}\n" ); // NOI18N
// body.append( TAB + listenerList ).append( ".add (" ); // NOI18N
// body.append( type.getName()).append( ".class, listener);\n" ); // NOI18N
// }
//
// return body.toString();
// }
//
// static String mcRemoveBody( Type type, int implementation, String listenerList ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String fieldName = Introspector.decapitalize( ((JavaClass) type).getSimpleName() ) + "List"; // NOI18N
//
// if ( listenerList == null )
// listenerList = "listenerList"; // NOI18N
//
// StringBuffer body = new StringBuffer( 50 );
// body.append( "\n"); // NOI18N
//
// if ( implementation == 1 ) {
// body.append( TAB + "if (" ).append( fieldName ).append( " != null ) {\n" ); // NOI18N
// body.append( TABx2 + fieldName ).append( ".remove (listener);\n" ); // NOI18N
// body.append( TAB ).append( "}\n" ); // NOI18N
// }
// else if ( implementation == 2 ) {
// body.append( TAB + listenerList ).append( ".remove (" ); // NOI18N
// body.append( type.getName()).append( ".class, listener);\n" ); // NOI18N
// }
//
// return body.toString();
// }
//
// static String ucAddBody( Type type, int implementation ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String simpleTypeName = ((JavaClass) type).getSimpleName();
// String fieldName = Introspector.decapitalize( simpleTypeName );
// if ( fieldName.equals( simpleTypeName ) ) {
// fieldName = "listener" + fieldName; // NOI18N
// }
//
// StringBuffer body = new StringBuffer( 50 );
//
// body.append( "\n"); // NOI18N
//
// if ( implementation == 1 ) {
// body.append( TAB + "if (").append( fieldName ).append( " != null) {\n" ); // NOI18N
// body.append( TABx2 + "throw new java.util.TooManyListenersException ();\n" ); // NOI18N
// body.append( TAB + "}\n" ); // NOI18N
// body.append( TAB + fieldName ).append( " = listener;\n" ); // NOI18N
// }
//
// return body.toString();
// }
//
// static String ucRemoveBody( Type type, int implementation ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// String simpleTypeName = ((JavaClass) type).getSimpleName();
// String fieldName = Introspector.decapitalize( simpleTypeName );
// if ( fieldName.equals( simpleTypeName ) ) {
// fieldName = "listener" + fieldName; // NOI18N
// }
//
// StringBuffer body = new StringBuffer( 50 );
// body.append( "\n"); // NOI18N
//
// if ( implementation == 1 ) {
// body.append( TAB + fieldName ).append( " = null;\n" ); // NOI18N
// }
//
// return body.toString();
// }
//
//
// static void fireMethod( JavaClass classElement, Type type,
// Method method, int implementation,
// String listenerList,
// boolean passEvent )
// throws JmiException {
//
// assert JMIUtils.isInsideTrans();
// if ( listenerList == null )
// listenerList = "listenerList"; // NOI18N
//
// String simpleTypeName = ((JavaClass) type).getSimpleName();
// String methodId = "fire" + // NOI18N
// Pattern.capitalizeFirstLetter( simpleTypeName ) +
// Pattern.capitalizeFirstLetter( method.getName() );
//
// Method newMethod = null;
//
// Type eventType = null;
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(classElement);
// List/*<Parameter>*/ params = method.getParameters();
// if ( params.isEmpty() ) {
// eventType = jmodel.getType().resolve("java.util.EventObject"); // NOI18N
// } else {
// eventType = ((Parameter) params.get(0)).getType();
// }
//
// JavaClass eventClass = (JavaClass) eventType;
//
// //addMethod = classElement.getMethod( addMethodId, new Type[] { listenerType } );
//
// //if ( addMethod == null ) {
// newMethod = jmodel.getMethod().createMethod();
// newMethod.setName( methodId );
// newMethod.setType( jmodel.getType().resolve("void") ); // NOI18N
// newMethod.setModifiers( Modifier.PRIVATE );
//
// List/*<Parameter>*/ newMethodParams = generateFireParameters( eventClass, jmodel, passEvent );
// newMethod.getParameters().addAll( newMethodParams );
//
// StringBuffer body = new StringBuffer( 80 );
// body.append( "\n" ); // NOI18N
//
// if ( implementation == 1 ) {
// String fieldName = Introspector.decapitalize( simpleTypeName ) + "List"; // NOI18N
//
// body.append( TAB + "java.util.ArrayList list;\n" ); // NOI18N
//
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( TAB + eventType.getName() ).append( " e = new "); // NOI18N
// body.append( eventType.getName() ).append( " (" ); // NOI18N
// body.append( fireParameterstoString( newMethodParams ) );
// body.append(");\n"); // NOI18N
// }
// body.append( TAB + "synchronized (this) {\n" ); // NOI18N
// body.append( TABx2 + "if (" + fieldName + " == null) return;\n" ); // NOI18N
// body.append( TABx2 + "list = (java.util.ArrayList)" ); // NOI18N
// body.append( fieldName ).append( ".clone ();\n" + TAB +"}\n" ); // NOI18N
// body.append( TAB + "for (int i = 0; i < list.size (); i++) {\n" ); // NOI18N
// body.append( TABx2 + "((" ).append( type.getName() ); // NOI18N
// body.append( ")list.get (i)).").append( method.getName() ); // NOI18N
// body.append(" ("); // NOI18N
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( "e" ); // NOI18N
// }
// else {
// body.append( fireParameterstoString( newMethodParams ) ); // the event parameter
// }
// body.append( ");\n" + TAB + "}\n" ); // NOI18N
// }
// else if ( implementation == 2 ) {
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( TAB + eventType.getName() ).append( " e = null;\n "); // NOI18N
// }
// body.append( TAB + "if (" + listenerList + " == null) return;\n"); // NOI18N
// body.append( TAB + "Object[] listeners = ").append(listenerList).append(".getListenerList ();\n" ); // NOI18N
// body.append( TAB + "for (int i = listeners.length - 2; i >= 0; i -= 2) {\n"); // NOI18N
// body.append( TABx2 + "if (listeners[i]==" ).append( type.getName()).append( ".class) {\n" ); // NOI18N
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( TABx3 + "if (e == null)\n" ); // NOI18N
// body.append( TABx2 + TABx2 + "e = new ").append( eventType.getName() ).append( " (" ); // NOI18N
// body.append( fireParameterstoString( newMethodParams ) );
// body.append( ");\n" ); // NOI18N
// }
// body.append( TABx3 + "((").append(type.getName()).append(")listeners[i+1]).").append(method.getName()); // NOI18N
// body.append(" ("); // NOI18N
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( "e" ); // the created event // NOI18N
// }
// else {
// body.append( fireParameterstoString( newMethodParams ) ); // the event parameter
// }
// body.append( ");\n" + TABx2 + "}\n" + TAB + "}\n"); // NOI18N
// }
//
// newMethod.setBodyText( body.toString() );
//
// StringBuffer comment = new StringBuffer ( PatternNode.getString( "COMMENT_FireMethodMC" ) );
// if ( !usesConstructorParameters( eventClass, passEvent ) ) {
// comment.append( "\n@param event The event to be fired\n" ); // NOI18N
// }
// else {
// comment.append( fireParametersComment( newMethodParams, ((JavaClass) eventType).getSimpleName() ) );
// }
// newMethod.setJavadocText( comment.toString() );
//
// classElement.getFeatures().add( newMethod );
// //}
// }
//
// static void unicastFireMethod( JavaClass classElement, Type type,
// Method method, int implementation,
// boolean passEvent )
// throws JmiException {
//
// assert JMIUtils.isInsideTrans();
// String simpleTypeName = ((JavaClass) type).getSimpleName();
// String methodId = "fire" + // NOI18N
// Pattern.capitalizeFirstLetter( simpleTypeName ) +
// Pattern.capitalizeFirstLetter( method.getName() );
//
// Method newMethod = null;
//
// Type eventType = null;
// JavaModelPackage jmodel = JavaMetamodel.getManager().getJavaExtent(classElement);
// List/*<Parameter>*/ params = method.getParameters();
// if ( params.isEmpty() ) {
// eventType = jmodel.getType().resolve("java.util.EventObject"); // NOI18N
// } else {
// eventType = ((Parameter) params.get(0)).getType();
// }
//
// JavaClass eventClass = (JavaClass) eventType;
//
// //addMethod = classElement.getMethod( addMethodId, new Type[] { listenerType } );
//
// //if ( addMethod == null ) {
// newMethod = jmodel.getMethod().createMethod();
// newMethod.setName( methodId );
// newMethod.setType( jmodel.getType().resolve("void") ); // NOI18N
// newMethod.setModifiers( Modifier.PRIVATE );
//
// List/*<Parameter>*/ newMethodParams = generateFireParameters( eventClass, jmodel, passEvent );
// newMethod.getParameters().addAll( newMethodParams );
//
// StringBuffer body = new StringBuffer( 80 );
// body.append( "\n" ); // NOI18N
//
// if ( implementation == 1 ) {
// String fieldName = Introspector.decapitalize( simpleTypeName );
// if ( fieldName.equals( simpleTypeName ) ) {
// fieldName = "listener" + fieldName; // NOI18N
// }
//
// body.append(TAB + "if (" + fieldName + " == null) return;\n"); // NOI18N
//
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( TAB + eventType.getName() ).append( " e = new "); // NOI18N
// body.append( eventType.getName() ).append( " (" ); // NOI18N
// body.append( fireParameterstoString( newMethodParams ) );
// body.append(");\n"); // NOI18N
// }
//
// body.append( TAB + fieldName ).append( "." ).append( method.getName() ); // NOI18N
// body.append(" ("); // NOI18N
// if ( usesConstructorParameters( eventClass, passEvent ) ) {
// body.append( "e" ); // NOI18N
// }
// else {
// body.append( fireParameterstoString( newMethodParams ) ); // the event parameter
// }
// body.append( ");\n" ); // NOI18N
// }
//
// newMethod.setBodyText( body.toString() );
//
// StringBuffer comment = new StringBuffer ( PatternNode.getString( "COMMENT_FireMethodUC" ) );
// if ( !usesConstructorParameters( eventClass, passEvent ) ) {
// comment.append( "\n@param event The event to be fired\n" ); // NOI18N
// }
// else {
// comment.append( fireParametersComment( newMethodParams, ((JavaClass) eventType).getSimpleName()) ); // the event parameter
// }
// newMethod.setJavadocText( comment.toString() );
//
// classElement.getFeatures().add( newMethod );
// //}
// }
//
//
//
// static boolean usesConstructorParameters( JavaClass eventClass, boolean passEvent ) throws JmiException {
//
// assert JMIUtils.isInsideTrans();
// if ( passEvent || eventClass == null || eventClass.isInterface() || JMIUtils.getConstructors(eventClass).size() > 1 )
// return false;
// else
// return true;
// }
//
//
// static List/*<Parameter>*/ generateFireParameters( JavaClass eventClass, JavaModelPackage jmodel, boolean passEvent )
// throws JmiException {
//
// assert JMIUtils.isInsideTrans();
// if ( !usesConstructorParameters( eventClass, passEvent ) ) {
// Parameter param = jmodel.getParameter().createParameter();
// param.setName("event"); // NOI18N
// param.setType(eventClass);
// return Collections.singletonList(param);
// }
// else {
// Constructor constructor = (Constructor) JMIUtils.getConstructors(eventClass).get(0);
// List/*<Parameter>*/ params = constructor.getParameters();
// List/*<Parameter>*/ result = new ArrayList/*<Parameter>*/(params.size());
// for (Iterator it = params.iterator(); it.hasNext();) {
// Parameter param = (Parameter) it.next();
// Parameter newParam = jmodel.getParameter().createParameter();
// newParam.setName(param.getName()); // NOI18N
// newParam.setType(param.getType());
// result.add(newParam);
// }
// return result;
// }
//
// }
//
// static String fireParameterstoString( List/*<Parameter>*/ params ) throws JmiException {
// assert JMIUtils.isInsideTrans();
// StringBuffer buffer = new StringBuffer( 60 );
//
// for (Iterator it = params.iterator(); it.hasNext();) {
// Parameter param = (Parameter) it.next();
// buffer.append( param.getName() );
// buffer.append( ", " ); // NOI18N
// }
// if (buffer.length() > 2) {
// return buffer.substring(0, buffer.length() - 2);
// } else {
// return buffer.toString();
// }
// }
//
// static String fireParametersComment( List/*<Parameter>*/ params, String evntType ) throws JmiException {
//
// assert JMIUtils.isInsideTrans();
// StringBuffer buffer = new StringBuffer( 60 );
// int i = 0;
//
// for (Iterator it = params.iterator(); it.hasNext();) {
// Parameter param = (Parameter) it.next();
// buffer.append( "\n@param ").append( param.getName() ); // NOI18N
// buffer.append( " Parameter #" ).append( (i++) + 1 ).append( " of the <CODE>" ); // NOI18N
// buffer.append( evntType ).append( "<CODE> constructor." ); // NOI18N
// }
// buffer.append( "\n" ); // NOI18N
//
// return buffer.toString();
// }
//
// // UTILITY METHODS ----------------------------------------------------------
//
// /** For primitive {@link org.openide.src.Type type} finds class for wrapping it into object.
// * E.g. <CODE>Type.BOOLEAN -> Boolean</CODE>
// * @param type Primitive type.
// * @return Class which wraps the primitive type.
// */
// public static String getWrapperClassName(Type type) throws JmiException {
// assert JMIUtils.isInsideTrans();
// if (type instanceof ClassDefinition)
// return type.getName();
// if (!(type instanceof PrimitiveType))
// throw new IllegalStateException("Unknonw type: " + type); // NOI18N
//
// String typeName = type.getName();
// char[] ctype = typeName.toCharArray();
// switch (ctype[0]) {
// case 'b':
// if (ctype[1] == 'o') // boolean
// return "Boolean"; //NOI18N
// else
// return "Byte"; // NOI18N
// case 'd':
// return "Double"; // NOI18N
// case 'f':
// return "Float"; // NOI18N
// case 'c':
// return "Character"; // NOI18N
// case 'i':
// return "Integer"; // NOI18N
// case 'l':
// return "Long"; // NOI18N
// case 's':
// return "Short"; // NOI18N
// default:
// return "Object"; // NOI18N
// }
// }
//
}