/* This file is part of Green.
*
* Copyright (C) 2005 The Research Foundation of State University of New York
* All Rights Under Copyright Reserved, The Research Foundation of S.U.N.Y.
*
* Green is free software, licensed under the terms of the Eclipse
* Public License, version 1.0. The license is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package edu.buffalo.cse.green.relationship.association;
import static edu.buffalo.cse.green.preferences.VariableAffix.*;
import edu.buffalo.cse.green.preferences.VariableAffix;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Statement;
import edu.buffalo.cse.green.relationships.CardinalRelationshipGenerator;
/**
* @see edu.buffalo.cse.green.relationship.CardinalRelationshipGenerator
*
* @author bcmartin
*/
public class AssociationGenerator extends CardinalRelationshipGenerator {
/**
* @see edu.buffalo.cse.green.relationships.RelationshipGenerator#needChooseTypeDialog()
*/
protected boolean needChooseTypeDialog() {
return false;
}
/**
* @see edu.buffalo.cse.green.relationships.RelationshipGenerator#process(org.eclipse.jdt.core.dom.Block)
*/
protected boolean process(Block node) {
if (!correctTypeToGenerate()) return true;
if (!inConstructor()) return true;
generateFields();
List<Statement> statements = (AbstractList<Statement>) node
.statements();
// generate a generic variable name
String baseName = getBaseVariableName();
if (isGeneric()) {
// create a unique variable name for the parameter
String paramName = generateVariableName(VariableAffix.getAffixString(ParameterPrefix)
+ baseName
+ VariableAffix.getAffixString(ParameterSuffix));
// retrieve the generated field name
String fieldName = getFieldNames().get(0);
Assignment ass = createAssignment(fieldName, name(paramName));
// insert the parameter
MethodDeclaration method = (MethodDeclaration) node.getParent();
addParameterizedParameter(method, getTargetType(), paramName);
// add the assignment to the block
statements.add(getAST().newExpressionStatement(ass));
// create the appropriate number of method invocations
for (int x = 0; x > _cardinality; x--) {
List<Expression> list = new ArrayList<Expression>();
list.add(createInvocation(createTypeReference(
getActualTargetType())));
statements.add(createMethodInvocation(fieldName, "add",
list));
}
// add the variable name(s) to the appropriate list(s)
getLocalDeclarations().add(paramName);
} else {
for (int x = 0; x < _cardinality; x++) {
// create a unique variable name for the parameter
String paramName = generateVariableName(baseName);
// retrieve the generated field name
String fieldName = getFieldNames().get(x);
// create the field assignment
Assignment ass = createAssignment(fieldName,
getAST().newSimpleName(paramName));
// insert the parameter
MethodDeclaration method = (MethodDeclaration) node.getParent();
addNormalParameter(method, getTargetType(), paramName);
// add the assignment to the block
statements.add(getAST().newExpressionStatement(ass));
// add the variable name(s) to the appropriate list(s)
getLocalDeclarations().add(paramName);
}
}
return true;
}
/* (non-Javadoc)
* @see edu.buffalo.cse.green.relationships.RelationshipGenerator#needConstructor()
*/
@Override
protected boolean needConstructor() {
return true;
}
}