You are viewing a plain text version of this content. The canonical link for it is here.
Posted to imperius-commits@incubator.apache.org by ke...@apache.org on 2008/01/11 18:57:14 UTC
svn commit: r611261 [9/43] - in /incubator/imperius/trunk: ./
imperius-javaspl/ imperius-javaspl/src/main/java/org/apache/imperius/javaspl/
imperius-splcore/
imperius-splcore/src/main/antlr/org/apache/imperius/spl/parser/compiler/
imperius-splcore/src/...
Modified: incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/CollectOperation.java
URL: http://svn.apache.org/viewvc/incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/CollectOperation.java?rev=611261&r1=611260&r2=611261&view=diff
==============================================================================
--- incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/CollectOperation.java (original)
+++ incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/CollectOperation.java Fri Jan 11 10:56:30 2008
@@ -1,882 +1,882 @@
-/*
- * 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.
- */
-//
-
-/**
- * @author Prashant Baliga <pr...@in.ibm.com>
- *
- */
-
-
-
-package org.apache.imperius.spl.parser.expression.primary;
-
-import java.security.InvalidParameterException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.imperius.spl.external.DataCollector;
-import org.apache.imperius.spl.external.Expression;
-import org.apache.imperius.spl.external.TypeConstants;
-import org.apache.imperius.spl.parser.compiler.symboltable.SPLSymbolTable;
-import org.apache.imperius.spl.parser.compiler.symboltable.Symbol;
-import org.apache.imperius.spl.parser.exceptions.IllegalExpressionTypeException;
-import org.apache.imperius.spl.parser.exceptions.MissingParameterException;
-import org.apache.imperius.spl.parser.exceptions.NonExistentSymbolException;
-import org.apache.imperius.spl.parser.exceptions.SPLException;
-import org.apache.imperius.spl.parser.expressions.*;
-import org.apache.imperius.spl.parser.util.*;
-import org.apache.imperius.util.SPLLogger;
-//import org.pegasus.jmpi.CIMObjectPath;
-
-//import com.ibm.ac.cimspl.CIMSPLTypeConstants;
-
-public class CollectOperation implements ReferenceExpression {
-
- private static final int COLLECT_FLAVOUR1 = 0;
- private static final int COLLECT_FLAVOUR2 = 1;
- private static final int INVALID_TYPE = 2;
- private static Logger logger = SPLLogger.getSPLLogger().getLogger();
- private static final String sourceClass="CollectOperation";
-
-
- private int collectType;
- private ArrayList paramList;
- private SPLSymbolTable symTab;
- private String returnClassName;
- private PostCollectExpression postCollectOperation;
- private TypeInfo _dataType=new TypeInfo();
-// private boolean isArray;
- private boolean noPostCollectOperation;
- private Expression referenceExpression;
- private String associationName;
- private String sourceRole;
- private String targetRole;
- private String targetClassName;
- private String targetClassPropertyName;
- private Expression expressionForTarget;
-
-
-
-// #(c:COLLECT_OP #(COLLECT_CALL paramList = exprList[collectSymbolTable]) (postExpr = methodPropArrForCollect[symTab,collectSymbolTable])? )
- public CollectOperation(ArrayList pList, Expression postCollect, SPLSymbolTable sTab) throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "CollectOperation");
- //System.out.println("creating collect expression");
-
-
-
-
-
- this.paramList = pList;
- // if no of params is 6 then flavour1 collect(refExp, associationname, srcRole, targetRole, targetClass, targetExp)
- if(pList.size() == 6)
- {
- collectType = COLLECT_FLAVOUR1;
- //System.out.println("COLLECT_FLAVOUR1");
-
- }
- else if(pList.size() == 7)
- {
-// if no of params is 7 then flavour2 collect(refExp, associationname, srcRole, targetRole, targetClass, <target class param>, targetExp)
- collectType = COLLECT_FLAVOUR2;
- //System.out.println("COLLECT_FLAVOUR2");
-
- }
- else
- {
- logger.severe(Thread.currentThread().getName()+" "+"No of parameters for collect has to be 6 or 7");
- throw new InvalidParameterException("No of parameters for collect has to be 6 or 7");
- }
-
- if(postCollect != null) // expression following collect e.g. collect(....)[1].param
- {
- postCollectOperation = (PostCollectExpression)postCollect;
- noPostCollectOperation = false;
- //System.out.println(" PostCollectOperation exists");
-
- }
- else // no expression following collect e.g. collect(...) implies return is an array of targetclass instances (flavour 1) or param values (flavour 2)
- {
- _dataType.setIsArray(true);
- noPostCollectOperation = true;
- //System.out.println("no PostCollectOperation");
-
- }
-
- this.symTab = sTab;
-
-
- // validate the expression
- if (!validate())
- {
- logger.severe(Thread.currentThread().getName()+" "+"validation error:");
- throw new SPLException("validation error:");
- }
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "CollectOperation");
-
-
- }
-
- public boolean validate() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validate");
-
- boolean result = false;
- if(collectType != INVALID_TYPE)
- {
- if(collectType == COLLECT_FLAVOUR1)
- {
- //System.out.println(" validateCollectFlavour1");
-
- result = validateCollectFlavour1();
- }
- else
- {
- //System.out.println(" validateCollectFlavour2");
-
- result = validateCollectFlavour2();
- }
- }
- else
- {
- logger.severe(Thread.currentThread().getName()+" "+"Missing parameters");
- throw new MissingParameterException("Missing parameters");
- }
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validate");
- return result;
-
-
- }
- // The first 4 parameters are common to both Collect flavours
- private boolean validateCommonParameters() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateCommonParameters");
- //System.out.println("validateCommonParameters ");
-
- String sourceClassValidate = null;
- if(symTab.getParentSymbolTable() != null) // the symbol table which is the parent of the collect symbol table
- sourceClassValidate = (String)symTab.getParentSymbolTable().getAnchorData().getAnchorClassList().get(0);
-
- //System.out.println("sourceClassValidate "+sourceClassValidate);
- Expression refExp = (Expression)paramList.get(0);
- if(refExp.getType().getType() != TypeConstants.referenceType) // param 0 is the source class
- {
- logger.severe(Thread.currentThread().getName()+" "+"First param to collect needs to be a reference expression");
- throw new IllegalExpressionTypeException("First param to collect needs to be a reference expression");
- }
- if(refExp instanceof ReferenceExpression)
- {
- sourceClassValidate = ((ReferenceExpression)refExp).getReferenceTypeName();
- referenceExpression = refExp;
- ReferenceExpression ref=(ReferenceExpression)refExp;
- //System.out.println(" class of refExp is "+ref.getReferenceTypeName());
-
- //refExp.
- }
- else{
- referenceExpression = refExp;
- }
-
- Expression assocExp = (Expression)paramList.get(1); // param 1 is the assoc Name
- if(assocExp.getType().getType() != TypeConstants.stringType)
- {
- logger.severe(Thread.currentThread().getName()+" "+"2nd param to collect needs to be a string expression");
-
- throw new IllegalExpressionTypeException("2nd param to collect needs to be a string expression");
- }
- associationName = (String)assocExp.evaluate();
-
- Expression roleExp = (Expression)paramList.get(2); // param 2 is role 1
- if(roleExp.getType().getType() != TypeConstants.stringType)
- {
- logger.severe(Thread.currentThread().getName()+" "+"3rd param to collect needs to be a string expression");
-
- throw new IllegalExpressionTypeException("3rd param to collect needs to be a string expression");
- }
-
- sourceRole = (String)roleExp.evaluate();
-
- roleExp = (Expression)paramList.get(3); // param 3 is role 2
- if(roleExp.getType().getType() != TypeConstants.stringType)
- {
-
- logger.severe(Thread.currentThread().getName()+" "+"4th param to collect needs to be a string expression");
-
- throw new IllegalExpressionTypeException("4th param to collect needs to be a string expression");
- }
- targetRole = (String)roleExp.evaluate();
-
- Expression targetClassExp = (Expression)paramList.get(4); // param 4 is the target class name
- if(targetClassExp.getType().getType() != TypeConstants.stringType)
- {
-
- logger.severe(Thread.currentThread().getName()+" "+"5th param to collect needs to be a string expression");
-
- throw new IllegalExpressionTypeException("5th param to collect needs to be a string expression");
- }
- targetClassName = (String)targetClassExp.evaluate();
-
- List instanceInfoList=new ArrayList();
- String qual=symTab.getDefaultQualifier();
-
- symTab.addAnchor(this.targetClassName, qual, instanceInfoList);
-
- if(refExp instanceof ReferenceExpression)
- {
- validateAssociation(sourceClassValidate,associationName,sourceRole,targetRole,targetClassName);
-
- }
- // validate that such an association actually exists
-
- // set the anchor for the collect symbol table to the targetclass name. This will populate static symbol info. for the targetclass
- //symTab.addCollectAnchor(targetClassName, qual, new ArrayList(), true);
- // NRJ
-
-// if(symTab.getAnchorClassList().size() !=1)
-// {
-// //System.out.println("symTab.getAnchorClassList().size() "+symTab.getAnchorClassList().size());
-// throw new SPLException(" symTab.getAnchorClassList().size() !=1 ");
-// }
-// else
-// {
-// symTab.addAnchor(this.targetClassName, qual, instanceInfoList);
-
-// }
- // no exceptions were thrown validation success
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateCommonParameters");
- //System.out.println("validateCommonParameters done "+true);
-
- return true;
- }
-
- //collect(refExp, associationname, srcRole, targetRole, targetClass, <target class property>, targetExp)
- private boolean validateCollectFlavour2() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour2");
- //System.out.println("validateCollectFlavour2()");
-
- // validate the common params
- validateCommonParameters();
-
- Expression propNameExp = (Expression)paramList.get(5); // the 5th parameter is a property of the targetclass
- if(propNameExp.getType().getType() != TypeConstants.stringType)
- {
-
- logger.severe(Thread.currentThread().getName()+" "+"5th param to collect needs to be a string expression");
-
- throw new IllegalExpressionTypeException("5th param to collect needs to be a string expression");
- }
- targetClassPropertyName = (String)propNameExp.evaluate();
-
- boolean recurse = false;
- if(!symTab.symbolExists(targetClassName + "." + targetClassPropertyName,recurse )) // make sure this is a valid property
- {
-
- logger.severe(targetClassName + "." + targetClassPropertyName + " does not exist");
-
- throw new NonExistentSymbolException(targetClassName + "." + targetClassPropertyName + " does not exist");
- }
- else
- {
- Symbol propSymbol = symTab.getSymbol(targetClassName + "." + targetClassPropertyName);
- this._dataType=new TypeInfo(propSymbol.getType());
- this._dataType.setIsArray(true);
- expressionForTarget = (Expression)paramList.get(6); // 6th param is an expression involving properties of the targetclass
- if(expressionForTarget.validate())
- {
- if(expressionForTarget.getType().getType() != TypeConstants.booleanType) // this expression is used to filter instances hence needs to be boolean
- {
-
- logger.severe(Thread.currentThread().getName()+" "+"6th param to collect needs to be a boolean expression");
-
- throw new IllegalExpressionTypeException("6th param to collect needs to be a boolean expression");
- }
- if(!noPostCollectOperation) // if an expression exists that follows collect
- {
-
- // REMOVED BY NRJ
- //System.out.println("Post collect expression exists");
- postCollectOperation.validate(this.targetClassName); // validate the expression
- if(postCollectOperation.Array2Exists() || postCollectOperation.isMethodOrParamExists()) {
- this._dataType=new TypeInfo(postCollectOperation.getType());
- }
- else{
- this._dataType.setIsArray(false);
- }
- }
-
-
- }
- }
- //System.out.println(" all went well, validation success validateCollectFlavour2");
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour2");
- //System.out.println("validateCollectFlavour2 done "+true);
- //System.out.println(" Type info "+this._dataType.getType()+" "+this._dataType.getIsArray());
-
- return true;
-
- }
- private boolean validateCollectFlavour1() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour1");
-
- //System.out.println("validateCollectFlavour1");
-
- //collect(<refExp>,<assocName>,<role1>,<role2>,<targetClass>,<expression>)[exp].param1[exp]
- // .param1(pList)
- // validate the common parameters
- validateCommonParameters();
-
- // 5th param is an expression used to filter the instances
- expressionForTarget = (Expression)paramList.get(5);
- if(expressionForTarget.validate()) // validate the expression
- {
- this._dataType.setReferenceTypeName(this.targetClassName);
- this._dataType.setType(TypeConstants.referenceType);
- this._dataType.setIsArray(true);
- if(expressionForTarget.getType().getType() != TypeConstants.booleanType) // needs to be boolean type
- {
-
- logger.severe(Thread.currentThread().getName()+" "+"6th param to collect needs to be a boolean expression");
-
- throw new IllegalExpressionTypeException("6th param to collect needs to be a boolean expression");
- }
- if(!noPostCollectOperation) // post collect exists e.g. collect(...)[exp].prop
- { // .prop[exp]
-
- // REMOVED BY NRJ
- //symTab.addCollectAnchor(this.targetClassName, qual, instanceInfoList, true);
-
- postCollectOperation.validate(this.targetClassName);
- TypeInfo tpe=null;
- // validate the expression
- if(postCollectOperation.isMethodOrParamExists())
- {
- tpe = postCollectOperation.getType(); // get the type
- returnClassName = targetClassName; // return type is same as the targetclass
-
- this._dataType.setIsArray(tpe.getIsArray());
- this._dataType.setType(tpe.getType());
-
- }
- }
-
-
-
-// if(tpe != PostCollectExpression.POSTCOLLECT_IS_ARRAY) // implies of the form collect(...)[exp].prop...
-// {
-// dataType = tpe; // return type is same as the type of post collect (either the type of prop or return type of array of type prop
-// // NEED TO SET isArray IF the Property is an array type with no array subscript expression
-// isArray = postCollectOperation.isArray();
-// }
-// else
-// {
-// dataType = TypeConstants.referenceType; // post collect is simply collect(...)[exp]
-// returnClassName = targetClassName; // return type is same as the targetclass
-// isArray = false; // no array
-// }
-
-
- }
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour1");
- //System.out.println("validateCollectFlavour1 done "+true);
-
- return true;
- }
-
- // validate the association
- private void validateAssociation(String sourceCIMClass, String assocName, String roleName1, String roleName2, String resultclassName) throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateAssociation");
-
- //System.out.println("validateCollectFlavour1");
-
- boolean result = false;
- DataCollector dc = DataCollectorFactory.getDataCollector();
- result = dc.associationExists(sourceCIMClass, symTab.getDefaultQualifier(), resultclassName, assocName, roleName1, roleName2);
- if(!result)
- {
-
- logger.severe(Thread.currentThread().getName()+" "+"Invalid association " + " sourceClass :"+sourceCIMClass+" namespace :"+symTab.getDefaultQualifier()+ " resultclassName :" + resultclassName + " assocName :"+ assocName+ " roleName1 :" + roleName1 + " roleName2 :"+ roleName2);
-
- throw new SPLException("Invalid association " + " sourceClass :"+sourceCIMClass+" namespace :"+symTab.getDefaultQualifier()+ " resultclassName :" + resultclassName + " assocName :"+ assocName+ " roleName1 :" + roleName1 + " roleName2 :"+ roleName2);
- }
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateAssociation");
-
-
- }
- public Object evaluate() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
-
- Object result = null;
- if(collectType == COLLECT_FLAVOUR1)
- {
- //System.out.println("evaluate COLLECT_FLAVOUR1");
- result = evaluateFlavour1();
- }
- else
- {
- //System.out.println("evaluate COLLECT_FLAVOUR2");
-
- result = evaluateFlavour2();
- }
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
-
- return result;
- }
-
- // evaluating flavour 2
- private Object evaluateFlavour2() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour2");
-
- //System.out.println("evaluate evaluateFlavour2");
-
- Object result = null;
- // evaluate the reference expression to obtain the source instance
- Object refExpressionResult = referenceExpression.evaluate();
- String referenceStr=refExpressionResult.toString();
- DataCollector dc = DataCollectorFactory.getDataCollector();
-
-// String refTypeName=dc.getReferenceTypeName(referenceStr);
- List targetClassInstanceReferences = null;
-
-
- // get instances of the targetclass that satisfy the association conditions
- if(logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" refExpressionResult evaluateFlavour2 "+referenceStr);
- //System.out.println("targetClassInstanceReferences to dc :"+refExpressionResult+" "+symTab.getDefaultQualifier()+" "+targetClassName+" "+associationName+" "+sourceRole+" "+targetRole);
-
- targetClassInstanceReferences = dc.getAssociatedInstanceReferences(refExpressionResult,symTab.getDefaultQualifier(),targetClassName,associationName,sourceRole,targetRole);
- //System.out.println("targetClassInstanceReferences "+targetClassInstanceReferences.toString());
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got associated references");
-
-// targetClassInstance = dc.getAssociatedInstanceReferences(refTypeName, symTab.getDefaultQualifier(), targetClassName,associationName,sourceRole,targetRole, refExpressionResult);
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got associated instances");
-
- // filter the List based on the target filter expression
- //System.out.println("filteredTargetClassInstanceReferences to dc :"+targetClassInstanceReferences+" "+symTab.getDefaultQualifier()+" "+this.targetClassName);
-
- List filteredTargetClassInstanceReferences = filterTargetClassInstanceReferencesWithTargetExpression(targetClassInstanceReferences , this.targetClassName,this.symTab.getDefaultQualifier());
- //System.out.println("targetClassInstanceReferences "+filteredTargetClassInstanceReferences.toString());
-
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got filtered references");
-
- ArrayList filteredTargetClassInstances = new ArrayList();
-
- Iterator filteredTargetClassInstanceReferencesIt=filteredTargetClassInstanceReferences.iterator();
- while(filteredTargetClassInstanceReferencesIt.hasNext())
- {
- Object ref=filteredTargetClassInstanceReferencesIt.next();
- Map instanceProperties=dc.getSymbolsForInstance(this.targetClassName,this.symTab.getDefaultQualifier(), ref);
- filteredTargetClassInstances.add(instanceProperties);
- }
-
-
-
-
- // The return type for flavour 2 is either an array of property values or a property value
- ArrayList listOfValuesForProperty = createListOfValuesForProperty(targetClassPropertyName,filteredTargetClassInstances);
-
- if(!noPostCollectOperation) // of the form collect(...)[exp]
- {
- result = postCollectOperation.evaluate(listOfValuesForProperty); // evaluation will pick one of the values of the listOfValuesForProperty array
- }
- else
- {
- //Integer index = (Integer)postCollectOperation.evaluate();
- //result = listOfValuesForProperty.get(index.intValue());
- result = listOfValuesForProperty; // there is no post collect therefore result is the entire array of property values
- }
-
- // return result;
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour2");
-
- return result;
-
-
-
- }
-
- //collect(<refExp>,<assocName>,<role1>,<role2>,<targetClass>,<expression>)[exp].param1[exp]
- // .param1(pList)
- private Object evaluateFlavour1() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour1");
- //System.out.println("evaluate evaluateFlavour1");
-
-
- Object result = null;
-
- //evaluate the the first parameter to get the source instance
- Object refExpressionResult = referenceExpression.evaluate();
- String refExpressionStr=refExpressionResult.toString();
- //System.out.println("self = "+refExpressionResult);
- DataCollector dc = DataCollectorFactory.getDataCollector();
- //NRJ verify this works
-// String refTypeName = referenceExpression.getReferenceTypeName();
- //String refTypeName=dc.getReferenceTypeName(refExpressionStr);
- List targetClassInstanceReferences = null;
-
- // traverse association to get an array of target class instances. Each instance is a Map of key=values
- if(logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" refExpressionResult evaluateFlavour1 "+refExpressionStr);
-
- targetClassInstanceReferences = dc.getAssociatedInstanceReferences((Object)refExpressionResult,symTab.getDefaultQualifier(),targetClassName,associationName,sourceRole,targetRole);
- //System.out.println("targetClassInstanceReferences size "+targetClassInstanceReferences.size());
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got associated references");
-
-// targetClassInstance = dc.getAssociatedInstanceReferences(refTypeName, symTab.getDefaultQualifier(), targetClassName,associationName,sourceRole,targetRole, refExpressionResult);
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got associated instances");
-
- // filter the List based on the target filter expression
- List filteredTargetClassInstanceReferences = filterTargetClassInstanceReferencesWithTargetExpression(targetClassInstanceReferences , this.targetClassName,this.symTab.getDefaultQualifier());
- //System.out.println("filteredTargetClassInstanceReferences size "+filteredTargetClassInstanceReferences.size());
-
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got filtered references");
-
- List filteredTargetClassInstances = new ArrayList();
-
- Iterator filteredTargetClassInstanceReferencesIt=filteredTargetClassInstanceReferences.iterator();
- while(filteredTargetClassInstanceReferencesIt.hasNext())
- {
- Object ref=filteredTargetClassInstanceReferencesIt.next();
- //System.out.println("filter passed : "+ref.toString());
- Map instanceProperties=dc.getSymbolsForInstance(this.targetClassName,this.symTab.getDefaultQualifier(), ref);
- filteredTargetClassInstances.add(instanceProperties);
- }
-
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" got filtered instances");
-
- if(!noPostCollectOperation) // post collect exists
- {
- if(postCollectOperation.getType().getIsArray()) // of the form collect(...)[exp]
- {
- result = postCollectOperation.evaluate(filteredTargetClassInstances); // will return a map corresponding to the instance to be returned
- int instanceNumber=postCollectOperation.getInstanceNumer();
- //symTab.populateInstanceValuesForCollect(this.targetClassName, this.targetClassName, filteredTargetClassInstances.get(instanceNumber), (Map)result); // populate it in the hashtable to obtain the string expression for the instance
- // NRJ
- symTab.populateInstanceValuesForInstance(this.targetClassName, this.targetClassName,
- filteredTargetClassInstances.get(instanceNumber), (Map)result);
- // populate it in the hashtable to obtain the string expression for the instance
- //result = symTab.getInstance();
-
- }
- else // post collect of the form collect(...)[exp].prop
- {
- // the result will be calculated as follows for
- // a) in the case prop is not an array
- // 1. Of the array of target class instances passed as the parameter
- // use the exp to pick one of the instances
- // for this instance obtain the value of prop and return
- // b) in the case prop is an array
- // if of the form collect(...)[exp].prop[exp] and exp == 1then the result will be the props[1]
- // if of the form collect(...)[exp].prop and prop is an array then the result will be an array of prop
-
- result = postCollectOperation.evaluate(filteredTargetClassInstances);
-
- }
- }
- else // no post collect result is an array of target instances that satisfy the filter
- {
- result = filteredTargetClassInstanceReferences;
-
- }
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour1");
-
-
- return result;
- }
-
- // for flavour 2 need to extract the values for the property and create an array
- private ArrayList createListOfValuesForProperty(String propertyName, ArrayList filteredTargetClassInstances)
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "createListOfValuesForProperty");
- //System.out.println(" propertyName :"+propertyName);
- //System.out.println(" filteredTargetClassInstances.size() :"+filteredTargetClassInstances.size());
-
- ArrayList propertyList = new ArrayList();
- for(int i=0; i<filteredTargetClassInstances.size(); i++)
- {
- //System.out.println(" inside for");
- Map currMap = (Map)filteredTargetClassInstances.get(i);
- //System.out.println("currMap "+currMap.toString());
-
- Object s = (Object)currMap.get(propertyName);
- //System.out.println("adding property "+propertyName);
- //System.out.println(" object s :"+propertyName+" "+s.toString());
- propertyList.add(s);
-
- }
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "createListOfValuesForProperty");
-
- return propertyList;
- }
-
- // Given a list of Maps where each map corresponds to an instance of the target class
- // filter out the instances which satisfy the boolean condition
- /* private ArrayList filterTargetClassInstancesWithTargetExpression(List targetClassInstanceReferences) throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstancesWithTargetExpression");
-
-
- ArrayList filteredTargetClassInstances = new ArrayList();
-
- if(targetClassInstanceReferences!=null)
- {
- Iterator targetClassInstancesIt = targetClassInstanceReferences.iterator();
- while(targetClassInstancesIt.hasNext())
- {
-
-
- Object instanceRefernce = targetClassInstancesIt.next();
- DataCollector dc= DataCollectorFactory.getDataCollector();
- Map instanceProperties=dc.getSymbolsForInstance(this.targetClassName, symTab.getDefaultQualifier(), instanceRefernce);
- symTab.populateInstanceValuesForInstance(this.targetClassName, this.targetClassName, instanceRefernce, instanceProperties)populateSymbolTableWithInstanceValues(map);
- Boolean result = (Boolean)expressionForTarget.evaluate();
- if(result.booleanValue())
- {
- filteredTargetClassInstances.add(map);
- }
- }
- }
- else
- {
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" Zero instances passed in hence zero instance references filtered, therefore returning null ");
- }
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstancesWithTargetExpression");
-
- return filteredTargetClassInstances;
- }
- */
-
- private ArrayList filterTargetClassInstanceReferencesWithTargetExpression(List targetClassInstanceReferences , String className,String namespc) throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstanceReferencesWithTargetExpression");
- DataCollector dc = DataCollectorFactory.getDataCollector();
- ArrayList filteredTargetClassInstanceReferences = new ArrayList();
- if(targetClassInstanceReferences!=null)
- {
-
-
- Iterator it=targetClassInstanceReferences.iterator();
- while(it.hasNext())
- {
- Object cop=(Object)it.next();
- //System.out.println("getSymbolsForInstance "+className+" "+ namespc+" "+ cop);
- Map map = dc.getSymbolsForInstance(className, namespc, cop);
- //System.out.println("map.size() "+map.size()+" "+map.toString());
- //symTab.populateInstanceValuesForCollect(className, className, cop, map);
- //NRJ
- symTab.populateInstanceValuesForInstance(className, className, cop, map);
- Boolean result = (Boolean)expressionForTarget.evaluate();
- //System.out.println("result "+result);
- if(result.booleanValue())
- {
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" cop passed filter "+cop);
- //System.out.println("adding cop to list "+cop.toString());
-
- filteredTargetClassInstanceReferences.add(cop);
- }
- else
- {
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" cop did not pass filter "+cop);
-
-
- }
- }
- }
- else
- {
- if (logger.isLoggable(Level.FINE))
- logger.fine(Thread.currentThread().getName()+" Zero instances passed in hence zero instance references filtered, therefore returning null ");
- }
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstanceReferencesWithTargetExpression");
-
- return filteredTargetClassInstanceReferences;
- }
-
-
-
-
- public TypeInfo getType() throws SPLException {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "BasicCollectionExpression");
-
- // if dataType is not set call validate so taht it gets set in the process
- if(_dataType != null)
- {
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "getType");
- return _dataType;
-
- }
-
- else
- {
- validate();
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "getType");
-
- return _dataType;
- }
-
-
- }
-
-
- public String getReferenceTypeName() {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "getReferenceTypeName");
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "getReferenceTypeName");
-
- return returnClassName;
- }
-
-
-
- public boolean isArray() {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
-
- return this._dataType.getIsArray();
- }
-
- public String toString()
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "toString");
-
-// String className=this.getClass().getName();
-
- String str="Collect(";
-
- Iterator ExpIt=this.paramList.iterator();
- while(ExpIt.hasNext()){
- Expression exp=(Expression)ExpIt.next();
- if(exp!=null){
-
- String expstr=exp.toString();
- str+=expstr + " , ";
- }
-
- }
- str=str.substring(0, str.length()-3) +" ) ";
-// if(this.expressionForTarget!=null){
-// str+=" "+this.expressionForTarget.toString()+" ";
-// }
- if(this.postCollectOperation!=null){
- str+="."+this.postCollectOperation.toString()+" ";
- }
-// if(this.referenceExpression!=null){
-// str+=" "+this.referenceExpression.toString()+" ";
-// }
-
-// str+=" )";
-
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "toString");
-
- return str;
- }
-
- public static String getSourceClass()
- {
- return sourceClass;
- }
-
- public String getAssociationName()
- {
- return associationName;
- }
-
- public void setAssociationName(String associationName)
- {
- this.associationName = associationName;
- }
-
- public int getCollectType()
- {
- return collectType;
- }
-
- public void setCollectType(int collectType)
- {
- this.collectType = collectType;
- }
-
- public boolean isNoPostCollectOperation()
- {
- return noPostCollectOperation;
- }
-
- public void setNoPostCollectOperation(boolean noPostCollectOperation)
- {
- this.noPostCollectOperation = noPostCollectOperation;
- }
-
- public String getReturnClassName()
- {
- return returnClassName;
- }
-
- public void setReturnClassName(String returnClassName)
- {
- this.returnClassName = returnClassName;
- }
-
- public String getTargetClassName()
- {
- return targetClassName;
- }
-
- public void setTargetClassName(String targetClassName)
- {
- this.targetClassName = targetClassName;
- }
-
-
-
-}
+/*
+ * 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.
+ */
+//
+
+/**
+ * @author Prashant Baliga <pr...@in.ibm.com>
+ *
+ */
+
+
+
+package org.apache.imperius.spl.parser.expression.primary;
+
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.imperius.spl.external.DataCollector;
+import org.apache.imperius.spl.external.Expression;
+import org.apache.imperius.spl.external.TypeConstants;
+import org.apache.imperius.spl.parser.compiler.symboltable.SPLSymbolTable;
+import org.apache.imperius.spl.parser.compiler.symboltable.Symbol;
+import org.apache.imperius.spl.parser.exceptions.IllegalExpressionTypeException;
+import org.apache.imperius.spl.parser.exceptions.MissingParameterException;
+import org.apache.imperius.spl.parser.exceptions.NonExistentSymbolException;
+import org.apache.imperius.spl.parser.exceptions.SPLException;
+import org.apache.imperius.spl.parser.expressions.*;
+import org.apache.imperius.spl.parser.util.*;
+import org.apache.imperius.util.SPLLogger;
+//import org.pegasus.jmpi.CIMObjectPath;
+
+//import com.ibm.ac.cimspl.CIMSPLTypeConstants;
+
+public class CollectOperation implements ReferenceExpression {
+
+ private static final int COLLECT_FLAVOUR1 = 0;
+ private static final int COLLECT_FLAVOUR2 = 1;
+ private static final int INVALID_TYPE = 2;
+ private static Logger logger = SPLLogger.getSPLLogger().getLogger();
+ private static final String sourceClass="CollectOperation";
+
+
+ private int collectType;
+ private ArrayList paramList;
+ private SPLSymbolTable symTab;
+ private String returnClassName;
+ private PostCollectExpression postCollectOperation;
+ private TypeInfo _dataType=new TypeInfo();
+// private boolean isArray;
+ private boolean noPostCollectOperation;
+ private Expression referenceExpression;
+ private String associationName;
+ private String sourceRole;
+ private String targetRole;
+ private String targetClassName;
+ private String targetClassPropertyName;
+ private Expression expressionForTarget;
+
+
+
+// #(c:COLLECT_OP #(COLLECT_CALL paramList = exprList[collectSymbolTable]) (postExpr = methodPropArrForCollect[symTab,collectSymbolTable])? )
+ public CollectOperation(ArrayList pList, Expression postCollect, SPLSymbolTable sTab) throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "CollectOperation");
+ //System.out.println("creating collect expression");
+
+
+
+
+
+ this.paramList = pList;
+ // if no of params is 6 then flavour1 collect(refExp, associationname, srcRole, targetRole, targetClass, targetExp)
+ if(pList.size() == 6)
+ {
+ collectType = COLLECT_FLAVOUR1;
+ //System.out.println("COLLECT_FLAVOUR1");
+
+ }
+ else if(pList.size() == 7)
+ {
+// if no of params is 7 then flavour2 collect(refExp, associationname, srcRole, targetRole, targetClass, <target class param>, targetExp)
+ collectType = COLLECT_FLAVOUR2;
+ //System.out.println("COLLECT_FLAVOUR2");
+
+ }
+ else
+ {
+ logger.severe(Thread.currentThread().getName()+" "+"No of parameters for collect has to be 6 or 7");
+ throw new InvalidParameterException("No of parameters for collect has to be 6 or 7");
+ }
+
+ if(postCollect != null) // expression following collect e.g. collect(....)[1].param
+ {
+ postCollectOperation = (PostCollectExpression)postCollect;
+ noPostCollectOperation = false;
+ //System.out.println(" PostCollectOperation exists");
+
+ }
+ else // no expression following collect e.g. collect(...) implies return is an array of targetclass instances (flavour 1) or param values (flavour 2)
+ {
+ _dataType.setIsArray(true);
+ noPostCollectOperation = true;
+ //System.out.println("no PostCollectOperation");
+
+ }
+
+ this.symTab = sTab;
+
+
+ // validate the expression
+ if (!validate())
+ {
+ logger.severe(Thread.currentThread().getName()+" "+"validation error:");
+ throw new SPLException("validation error:");
+ }
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "CollectOperation");
+
+
+ }
+
+ public boolean validate() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validate");
+
+ boolean result = false;
+ if(collectType != INVALID_TYPE)
+ {
+ if(collectType == COLLECT_FLAVOUR1)
+ {
+ //System.out.println(" validateCollectFlavour1");
+
+ result = validateCollectFlavour1();
+ }
+ else
+ {
+ //System.out.println(" validateCollectFlavour2");
+
+ result = validateCollectFlavour2();
+ }
+ }
+ else
+ {
+ logger.severe(Thread.currentThread().getName()+" "+"Missing parameters");
+ throw new MissingParameterException("Missing parameters");
+ }
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validate");
+ return result;
+
+
+ }
+ // The first 4 parameters are common to both Collect flavours
+ private boolean validateCommonParameters() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateCommonParameters");
+ //System.out.println("validateCommonParameters ");
+
+ String sourceClassValidate = null;
+ if(symTab.getParentSymbolTable() != null) // the symbol table which is the parent of the collect symbol table
+ sourceClassValidate = (String)symTab.getParentSymbolTable().getAnchorData().getAnchorClassList().get(0);
+
+ //System.out.println("sourceClassValidate "+sourceClassValidate);
+ Expression refExp = (Expression)paramList.get(0);
+ if(refExp.getType().getType() != TypeConstants.referenceType) // param 0 is the source class
+ {
+ logger.severe(Thread.currentThread().getName()+" "+"First param to collect needs to be a reference expression");
+ throw new IllegalExpressionTypeException("First param to collect needs to be a reference expression");
+ }
+ if(refExp instanceof ReferenceExpression)
+ {
+ sourceClassValidate = ((ReferenceExpression)refExp).getReferenceTypeName();
+ referenceExpression = refExp;
+ ReferenceExpression ref=(ReferenceExpression)refExp;
+ //System.out.println(" class of refExp is "+ref.getReferenceTypeName());
+
+ //refExp.
+ }
+ else{
+ referenceExpression = refExp;
+ }
+
+ Expression assocExp = (Expression)paramList.get(1); // param 1 is the assoc Name
+ if(assocExp.getType().getType() != TypeConstants.stringType)
+ {
+ logger.severe(Thread.currentThread().getName()+" "+"2nd param to collect needs to be a string expression");
+
+ throw new IllegalExpressionTypeException("2nd param to collect needs to be a string expression");
+ }
+ associationName = (String)assocExp.evaluate();
+
+ Expression roleExp = (Expression)paramList.get(2); // param 2 is role 1
+ if(roleExp.getType().getType() != TypeConstants.stringType)
+ {
+ logger.severe(Thread.currentThread().getName()+" "+"3rd param to collect needs to be a string expression");
+
+ throw new IllegalExpressionTypeException("3rd param to collect needs to be a string expression");
+ }
+
+ sourceRole = (String)roleExp.evaluate();
+
+ roleExp = (Expression)paramList.get(3); // param 3 is role 2
+ if(roleExp.getType().getType() != TypeConstants.stringType)
+ {
+
+ logger.severe(Thread.currentThread().getName()+" "+"4th param to collect needs to be a string expression");
+
+ throw new IllegalExpressionTypeException("4th param to collect needs to be a string expression");
+ }
+ targetRole = (String)roleExp.evaluate();
+
+ Expression targetClassExp = (Expression)paramList.get(4); // param 4 is the target class name
+ if(targetClassExp.getType().getType() != TypeConstants.stringType)
+ {
+
+ logger.severe(Thread.currentThread().getName()+" "+"5th param to collect needs to be a string expression");
+
+ throw new IllegalExpressionTypeException("5th param to collect needs to be a string expression");
+ }
+ targetClassName = (String)targetClassExp.evaluate();
+
+ List instanceInfoList=new ArrayList();
+ String qual=symTab.getDefaultQualifier();
+
+ symTab.addAnchor(this.targetClassName, qual, instanceInfoList);
+
+ if(refExp instanceof ReferenceExpression)
+ {
+ validateAssociation(sourceClassValidate,associationName,sourceRole,targetRole,targetClassName);
+
+ }
+ // validate that such an association actually exists
+
+ // set the anchor for the collect symbol table to the targetclass name. This will populate static symbol info. for the targetclass
+ //symTab.addCollectAnchor(targetClassName, qual, new ArrayList(), true);
+ // NRJ
+
+// if(symTab.getAnchorClassList().size() !=1)
+// {
+// //System.out.println("symTab.getAnchorClassList().size() "+symTab.getAnchorClassList().size());
+// throw new SPLException(" symTab.getAnchorClassList().size() !=1 ");
+// }
+// else
+// {
+// symTab.addAnchor(this.targetClassName, qual, instanceInfoList);
+
+// }
+ // no exceptions were thrown validation success
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateCommonParameters");
+ //System.out.println("validateCommonParameters done "+true);
+
+ return true;
+ }
+
+ //collect(refExp, associationname, srcRole, targetRole, targetClass, <target class property>, targetExp)
+ private boolean validateCollectFlavour2() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour2");
+ //System.out.println("validateCollectFlavour2()");
+
+ // validate the common params
+ validateCommonParameters();
+
+ Expression propNameExp = (Expression)paramList.get(5); // the 5th parameter is a property of the targetclass
+ if(propNameExp.getType().getType() != TypeConstants.stringType)
+ {
+
+ logger.severe(Thread.currentThread().getName()+" "+"5th param to collect needs to be a string expression");
+
+ throw new IllegalExpressionTypeException("5th param to collect needs to be a string expression");
+ }
+ targetClassPropertyName = (String)propNameExp.evaluate();
+
+ boolean recurse = false;
+ if(!symTab.symbolExists(targetClassName + "." + targetClassPropertyName,recurse )) // make sure this is a valid property
+ {
+
+ logger.severe(targetClassName + "." + targetClassPropertyName + " does not exist");
+
+ throw new NonExistentSymbolException(targetClassName + "." + targetClassPropertyName + " does not exist");
+ }
+ else
+ {
+ Symbol propSymbol = symTab.getSymbol(targetClassName + "." + targetClassPropertyName);
+ this._dataType=new TypeInfo(propSymbol.getType());
+ this._dataType.setIsArray(true);
+ expressionForTarget = (Expression)paramList.get(6); // 6th param is an expression involving properties of the targetclass
+ if(expressionForTarget.validate())
+ {
+ if(expressionForTarget.getType().getType() != TypeConstants.booleanType) // this expression is used to filter instances hence needs to be boolean
+ {
+
+ logger.severe(Thread.currentThread().getName()+" "+"6th param to collect needs to be a boolean expression");
+
+ throw new IllegalExpressionTypeException("6th param to collect needs to be a boolean expression");
+ }
+ if(!noPostCollectOperation) // if an expression exists that follows collect
+ {
+
+ // REMOVED BY NRJ
+ //System.out.println("Post collect expression exists");
+ postCollectOperation.validate(this.targetClassName); // validate the expression
+ if(postCollectOperation.Array2Exists() || postCollectOperation.isMethodOrParamExists()) {
+ this._dataType=new TypeInfo(postCollectOperation.getType());
+ }
+ else{
+ this._dataType.setIsArray(false);
+ }
+ }
+
+
+ }
+ }
+ //System.out.println(" all went well, validation success validateCollectFlavour2");
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour2");
+ //System.out.println("validateCollectFlavour2 done "+true);
+ //System.out.println(" Type info "+this._dataType.getType()+" "+this._dataType.getIsArray());
+
+ return true;
+
+ }
+ private boolean validateCollectFlavour1() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour1");
+
+ //System.out.println("validateCollectFlavour1");
+
+ //collect(<refExp>,<assocName>,<role1>,<role2>,<targetClass>,<expression>)[exp].param1[exp]
+ // .param1(pList)
+ // validate the common parameters
+ validateCommonParameters();
+
+ // 5th param is an expression used to filter the instances
+ expressionForTarget = (Expression)paramList.get(5);
+ if(expressionForTarget.validate()) // validate the expression
+ {
+ this._dataType.setReferenceTypeName(this.targetClassName);
+ this._dataType.setType(TypeConstants.referenceType);
+ this._dataType.setIsArray(true);
+ if(expressionForTarget.getType().getType() != TypeConstants.booleanType) // needs to be boolean type
+ {
+
+ logger.severe(Thread.currentThread().getName()+" "+"6th param to collect needs to be a boolean expression");
+
+ throw new IllegalExpressionTypeException("6th param to collect needs to be a boolean expression");
+ }
+ if(!noPostCollectOperation) // post collect exists e.g. collect(...)[exp].prop
+ { // .prop[exp]
+
+ // REMOVED BY NRJ
+ //symTab.addCollectAnchor(this.targetClassName, qual, instanceInfoList, true);
+
+ postCollectOperation.validate(this.targetClassName);
+ TypeInfo tpe=null;
+ // validate the expression
+ if(postCollectOperation.isMethodOrParamExists())
+ {
+ tpe = postCollectOperation.getType(); // get the type
+ returnClassName = targetClassName; // return type is same as the targetclass
+
+ this._dataType.setIsArray(tpe.getIsArray());
+ this._dataType.setType(tpe.getType());
+
+ }
+ }
+
+
+
+// if(tpe != PostCollectExpression.POSTCOLLECT_IS_ARRAY) // implies of the form collect(...)[exp].prop...
+// {
+// dataType = tpe; // return type is same as the type of post collect (either the type of prop or return type of array of type prop
+// // NEED TO SET isArray IF the Property is an array type with no array subscript expression
+// isArray = postCollectOperation.isArray();
+// }
+// else
+// {
+// dataType = TypeConstants.referenceType; // post collect is simply collect(...)[exp]
+// returnClassName = targetClassName; // return type is same as the targetclass
+// isArray = false; // no array
+// }
+
+
+ }
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateCollectFlavour1");
+ //System.out.println("validateCollectFlavour1 done "+true);
+
+ return true;
+ }
+
+ // validate the association
+ private void validateAssociation(String sourceCIMClass, String assocName, String roleName1, String roleName2, String resultclassName) throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validateAssociation");
+
+ //System.out.println("validateCollectFlavour1");
+
+ boolean result = false;
+ DataCollector dc = DataCollectorFactory.getDataCollector();
+ result = dc.associationExists(sourceCIMClass, symTab.getDefaultQualifier(), resultclassName, assocName, roleName1, roleName2);
+ if(!result)
+ {
+
+ logger.severe(Thread.currentThread().getName()+" "+"Invalid association " + " sourceClass :"+sourceCIMClass+" namespace :"+symTab.getDefaultQualifier()+ " resultclassName :" + resultclassName + " assocName :"+ assocName+ " roleName1 :" + roleName1 + " roleName2 :"+ roleName2);
+
+ throw new SPLException("Invalid association " + " sourceClass :"+sourceCIMClass+" namespace :"+symTab.getDefaultQualifier()+ " resultclassName :" + resultclassName + " assocName :"+ assocName+ " roleName1 :" + roleName1 + " roleName2 :"+ roleName2);
+ }
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validateAssociation");
+
+
+ }
+ public Object evaluate() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
+
+ Object result = null;
+ if(collectType == COLLECT_FLAVOUR1)
+ {
+ //System.out.println("evaluate COLLECT_FLAVOUR1");
+ result = evaluateFlavour1();
+ }
+ else
+ {
+ //System.out.println("evaluate COLLECT_FLAVOUR2");
+
+ result = evaluateFlavour2();
+ }
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
+
+ return result;
+ }
+
+ // evaluating flavour 2
+ private Object evaluateFlavour2() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour2");
+
+ //System.out.println("evaluate evaluateFlavour2");
+
+ Object result = null;
+ // evaluate the reference expression to obtain the source instance
+ Object refExpressionResult = referenceExpression.evaluate();
+ String referenceStr=refExpressionResult.toString();
+ DataCollector dc = DataCollectorFactory.getDataCollector();
+
+// String refTypeName=dc.getReferenceTypeName(referenceStr);
+ List targetClassInstanceReferences = null;
+
+
+ // get instances of the targetclass that satisfy the association conditions
+ if(logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" refExpressionResult evaluateFlavour2 "+referenceStr);
+ //System.out.println("targetClassInstanceReferences to dc :"+refExpressionResult+" "+symTab.getDefaultQualifier()+" "+targetClassName+" "+associationName+" "+sourceRole+" "+targetRole);
+
+ targetClassInstanceReferences = dc.getAssociatedInstanceReferences(refExpressionResult,symTab.getDefaultQualifier(),targetClassName,associationName,sourceRole,targetRole);
+ //System.out.println("targetClassInstanceReferences "+targetClassInstanceReferences.toString());
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got associated references");
+
+// targetClassInstance = dc.getAssociatedInstanceReferences(refTypeName, symTab.getDefaultQualifier(), targetClassName,associationName,sourceRole,targetRole, refExpressionResult);
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got associated instances");
+
+ // filter the List based on the target filter expression
+ //System.out.println("filteredTargetClassInstanceReferences to dc :"+targetClassInstanceReferences+" "+symTab.getDefaultQualifier()+" "+this.targetClassName);
+
+ List filteredTargetClassInstanceReferences = filterTargetClassInstanceReferencesWithTargetExpression(targetClassInstanceReferences , this.targetClassName,this.symTab.getDefaultQualifier());
+ //System.out.println("targetClassInstanceReferences "+filteredTargetClassInstanceReferences.toString());
+
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got filtered references");
+
+ ArrayList filteredTargetClassInstances = new ArrayList();
+
+ Iterator filteredTargetClassInstanceReferencesIt=filteredTargetClassInstanceReferences.iterator();
+ while(filteredTargetClassInstanceReferencesIt.hasNext())
+ {
+ Object ref=filteredTargetClassInstanceReferencesIt.next();
+ Map instanceProperties=dc.getSymbolsForInstance(this.targetClassName,this.symTab.getDefaultQualifier(), ref);
+ filteredTargetClassInstances.add(instanceProperties);
+ }
+
+
+
+
+ // The return type for flavour 2 is either an array of property values or a property value
+ ArrayList listOfValuesForProperty = createListOfValuesForProperty(targetClassPropertyName,filteredTargetClassInstances);
+
+ if(!noPostCollectOperation) // of the form collect(...)[exp]
+ {
+ result = postCollectOperation.evaluate(listOfValuesForProperty); // evaluation will pick one of the values of the listOfValuesForProperty array
+ }
+ else
+ {
+ //Integer index = (Integer)postCollectOperation.evaluate();
+ //result = listOfValuesForProperty.get(index.intValue());
+ result = listOfValuesForProperty; // there is no post collect therefore result is the entire array of property values
+ }
+
+ // return result;
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour2");
+
+ return result;
+
+
+
+ }
+
+ //collect(<refExp>,<assocName>,<role1>,<role2>,<targetClass>,<expression>)[exp].param1[exp]
+ // .param1(pList)
+ private Object evaluateFlavour1() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour1");
+ //System.out.println("evaluate evaluateFlavour1");
+
+
+ Object result = null;
+
+ //evaluate the the first parameter to get the source instance
+ Object refExpressionResult = referenceExpression.evaluate();
+ String refExpressionStr=refExpressionResult.toString();
+ //System.out.println("self = "+refExpressionResult);
+ DataCollector dc = DataCollectorFactory.getDataCollector();
+ //NRJ verify this works
+// String refTypeName = referenceExpression.getReferenceTypeName();
+ //String refTypeName=dc.getReferenceTypeName(refExpressionStr);
+ List targetClassInstanceReferences = null;
+
+ // traverse association to get an array of target class instances. Each instance is a Map of key=values
+ if(logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" refExpressionResult evaluateFlavour1 "+refExpressionStr);
+
+ targetClassInstanceReferences = dc.getAssociatedInstanceReferences((Object)refExpressionResult,symTab.getDefaultQualifier(),targetClassName,associationName,sourceRole,targetRole);
+ //System.out.println("targetClassInstanceReferences size "+targetClassInstanceReferences.size());
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got associated references");
+
+// targetClassInstance = dc.getAssociatedInstanceReferences(refTypeName, symTab.getDefaultQualifier(), targetClassName,associationName,sourceRole,targetRole, refExpressionResult);
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got associated instances");
+
+ // filter the List based on the target filter expression
+ List filteredTargetClassInstanceReferences = filterTargetClassInstanceReferencesWithTargetExpression(targetClassInstanceReferences , this.targetClassName,this.symTab.getDefaultQualifier());
+ //System.out.println("filteredTargetClassInstanceReferences size "+filteredTargetClassInstanceReferences.size());
+
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got filtered references");
+
+ List filteredTargetClassInstances = new ArrayList();
+
+ Iterator filteredTargetClassInstanceReferencesIt=filteredTargetClassInstanceReferences.iterator();
+ while(filteredTargetClassInstanceReferencesIt.hasNext())
+ {
+ Object ref=filteredTargetClassInstanceReferencesIt.next();
+ //System.out.println("filter passed : "+ref.toString());
+ Map instanceProperties=dc.getSymbolsForInstance(this.targetClassName,this.symTab.getDefaultQualifier(), ref);
+ filteredTargetClassInstances.add(instanceProperties);
+ }
+
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" got filtered instances");
+
+ if(!noPostCollectOperation) // post collect exists
+ {
+ if(postCollectOperation.getType().getIsArray()) // of the form collect(...)[exp]
+ {
+ result = postCollectOperation.evaluate(filteredTargetClassInstances); // will return a map corresponding to the instance to be returned
+ int instanceNumber=postCollectOperation.getInstanceNumer();
+ //symTab.populateInstanceValuesForCollect(this.targetClassName, this.targetClassName, filteredTargetClassInstances.get(instanceNumber), (Map)result); // populate it in the hashtable to obtain the string expression for the instance
+ // NRJ
+ symTab.populateInstanceValuesForInstance(this.targetClassName, this.targetClassName,
+ filteredTargetClassInstances.get(instanceNumber), (Map)result);
+ // populate it in the hashtable to obtain the string expression for the instance
+ //result = symTab.getInstance();
+
+ }
+ else // post collect of the form collect(...)[exp].prop
+ {
+ // the result will be calculated as follows for
+ // a) in the case prop is not an array
+ // 1. Of the array of target class instances passed as the parameter
+ // use the exp to pick one of the instances
+ // for this instance obtain the value of prop and return
+ // b) in the case prop is an array
+ // if of the form collect(...)[exp].prop[exp] and exp == 1then the result will be the props[1]
+ // if of the form collect(...)[exp].prop and prop is an array then the result will be an array of prop
+
+ result = postCollectOperation.evaluate(filteredTargetClassInstances);
+
+ }
+ }
+ else // no post collect result is an array of target instances that satisfy the filter
+ {
+ result = filteredTargetClassInstanceReferences;
+
+ }
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluateFlavour1");
+
+
+ return result;
+ }
+
+ // for flavour 2 need to extract the values for the property and create an array
+ private ArrayList createListOfValuesForProperty(String propertyName, ArrayList filteredTargetClassInstances)
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "createListOfValuesForProperty");
+ //System.out.println(" propertyName :"+propertyName);
+ //System.out.println(" filteredTargetClassInstances.size() :"+filteredTargetClassInstances.size());
+
+ ArrayList propertyList = new ArrayList();
+ for(int i=0; i<filteredTargetClassInstances.size(); i++)
+ {
+ //System.out.println(" inside for");
+ Map currMap = (Map)filteredTargetClassInstances.get(i);
+ //System.out.println("currMap "+currMap.toString());
+
+ Object s = (Object)currMap.get(propertyName);
+ //System.out.println("adding property "+propertyName);
+ //System.out.println(" object s :"+propertyName+" "+s.toString());
+ propertyList.add(s);
+
+ }
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "createListOfValuesForProperty");
+
+ return propertyList;
+ }
+
+ // Given a list of Maps where each map corresponds to an instance of the target class
+ // filter out the instances which satisfy the boolean condition
+ /* private ArrayList filterTargetClassInstancesWithTargetExpression(List targetClassInstanceReferences) throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstancesWithTargetExpression");
+
+
+ ArrayList filteredTargetClassInstances = new ArrayList();
+
+ if(targetClassInstanceReferences!=null)
+ {
+ Iterator targetClassInstancesIt = targetClassInstanceReferences.iterator();
+ while(targetClassInstancesIt.hasNext())
+ {
+
+
+ Object instanceRefernce = targetClassInstancesIt.next();
+ DataCollector dc= DataCollectorFactory.getDataCollector();
+ Map instanceProperties=dc.getSymbolsForInstance(this.targetClassName, symTab.getDefaultQualifier(), instanceRefernce);
+ symTab.populateInstanceValuesForInstance(this.targetClassName, this.targetClassName, instanceRefernce, instanceProperties)populateSymbolTableWithInstanceValues(map);
+ Boolean result = (Boolean)expressionForTarget.evaluate();
+ if(result.booleanValue())
+ {
+ filteredTargetClassInstances.add(map);
+ }
+ }
+ }
+ else
+ {
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" Zero instances passed in hence zero instance references filtered, therefore returning null ");
+ }
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstancesWithTargetExpression");
+
+ return filteredTargetClassInstances;
+ }
+ */
+
+ private ArrayList filterTargetClassInstanceReferencesWithTargetExpression(List targetClassInstanceReferences , String className,String namespc) throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstanceReferencesWithTargetExpression");
+ DataCollector dc = DataCollectorFactory.getDataCollector();
+ ArrayList filteredTargetClassInstanceReferences = new ArrayList();
+ if(targetClassInstanceReferences!=null)
+ {
+
+
+ Iterator it=targetClassInstanceReferences.iterator();
+ while(it.hasNext())
+ {
+ Object cop=(Object)it.next();
+ //System.out.println("getSymbolsForInstance "+className+" "+ namespc+" "+ cop);
+ Map map = dc.getSymbolsForInstance(className, namespc, cop);
+ //System.out.println("map.size() "+map.size()+" "+map.toString());
+ //symTab.populateInstanceValuesForCollect(className, className, cop, map);
+ //NRJ
+ symTab.populateInstanceValuesForInstance(className, className, cop, map);
+ Boolean result = (Boolean)expressionForTarget.evaluate();
+ //System.out.println("result "+result);
+ if(result.booleanValue())
+ {
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" cop passed filter "+cop);
+ //System.out.println("adding cop to list "+cop.toString());
+
+ filteredTargetClassInstanceReferences.add(cop);
+ }
+ else
+ {
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" cop did not pass filter "+cop);
+
+
+ }
+ }
+ }
+ else
+ {
+ if (logger.isLoggable(Level.FINE))
+ logger.fine(Thread.currentThread().getName()+" Zero instances passed in hence zero instance references filtered, therefore returning null ");
+ }
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "filterTargetClassInstanceReferencesWithTargetExpression");
+
+ return filteredTargetClassInstanceReferences;
+ }
+
+
+
+
+ public TypeInfo getType() throws SPLException {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "BasicCollectionExpression");
+
+ // if dataType is not set call validate so taht it gets set in the process
+ if(_dataType != null)
+ {
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "getType");
+ return _dataType;
+
+ }
+
+ else
+ {
+ validate();
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "getType");
+
+ return _dataType;
+ }
+
+
+ }
+
+
+ public String getReferenceTypeName() {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "getReferenceTypeName");
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "getReferenceTypeName");
+
+ return returnClassName;
+ }
+
+
+
+ public boolean isArray() {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
+
+ return this._dataType.getIsArray();
+ }
+
+ public String toString()
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "toString");
+
+// String className=this.getClass().getName();
+
+ String str="Collect(";
+
+ Iterator ExpIt=this.paramList.iterator();
+ while(ExpIt.hasNext()){
+ Expression exp=(Expression)ExpIt.next();
+ if(exp!=null){
+
+ String expstr=exp.toString();
+ str+=expstr + " , ";
+ }
+
+ }
+ str=str.substring(0, str.length()-3) +" ) ";
+// if(this.expressionForTarget!=null){
+// str+=" "+this.expressionForTarget.toString()+" ";
+// }
+ if(this.postCollectOperation!=null){
+ str+="."+this.postCollectOperation.toString()+" ";
+ }
+// if(this.referenceExpression!=null){
+// str+=" "+this.referenceExpression.toString()+" ";
+// }
+
+// str+=" )";
+
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "toString");
+
+ return str;
+ }
+
+ public static String getSourceClass()
+ {
+ return sourceClass;
+ }
+
+ public String getAssociationName()
+ {
+ return associationName;
+ }
+
+ public void setAssociationName(String associationName)
+ {
+ this.associationName = associationName;
+ }
+
+ public int getCollectType()
+ {
+ return collectType;
+ }
+
+ public void setCollectType(int collectType)
+ {
+ this.collectType = collectType;
+ }
+
+ public boolean isNoPostCollectOperation()
+ {
+ return noPostCollectOperation;
+ }
+
+ public void setNoPostCollectOperation(boolean noPostCollectOperation)
+ {
+ this.noPostCollectOperation = noPostCollectOperation;
+ }
+
+ public String getReturnClassName()
+ {
+ return returnClassName;
+ }
+
+ public void setReturnClassName(String returnClassName)
+ {
+ this.returnClassName = returnClassName;
+ }
+
+ public String getTargetClassName()
+ {
+ return targetClassName;
+ }
+
+ public void setTargetClassName(String targetClassName)
+ {
+ this.targetClassName = targetClassName;
+ }
+
+
+
+}
Propchange: incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/CollectOperation.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/MacroExpression.java
URL: http://svn.apache.org/viewvc/incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/MacroExpression.java?rev=611261&r1=611260&r2=611261&view=diff
==============================================================================
--- incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/MacroExpression.java (original)
+++ incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/MacroExpression.java Fri Jan 11 10:56:30 2008
@@ -1,161 +1,161 @@
-/*
- * 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.
- */
-//
-
-/**
- * @author Neeraj Joshi <jn...@us.ibm.com>
- *
- */
-
-package org.apache.imperius.spl.parser.expression.primary;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.imperius.spl.external.Expression;
-import org.apache.imperius.spl.parser.compiler.symboltable.MacroSymbol;
-import org.apache.imperius.spl.parser.compiler.symboltable.PropertySymbol;
-import org.apache.imperius.spl.parser.compiler.symboltable.SPLSymbolTable;
-import org.apache.imperius.spl.parser.compiler.symboltable.Symbol;
-import org.apache.imperius.spl.parser.exceptions.SPLException;
-import org.apache.imperius.spl.parser.statements.impl.MacroDefinition;
-import org.apache.imperius.spl.parser.util.TypeInfo;
-import org.apache.imperius.spl.parser.util.TypeResolver;
-import org.apache.imperius.util.SPLLogger;
-
-
-public class MacroExpression implements Expression
-{
-
- private TypeInfo _returnType;
-
- private MacroDefinition _macroDefn;
-
- private List _passedParams;
-
-
- private static Logger logger = SPLLogger.getSPLLogger().getLogger();
- private static final String sourceClass="MacroExpression";
-
- private boolean _isArray = false;
-
- private String _referenceTypeName = "";
-
- public boolean isArray()
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
-
- return _isArray;
- }
-
- public MacroExpression(MacroSymbol ms, ArrayList pList,
- SPLSymbolTable symTab) throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "MacroExpression");
-
-
- _returnType = ms.getType();
- if(TypeResolver.isReference(_returnType))
- {
- _referenceTypeName = ms.getReferenceTypeName();
- }
- _macroDefn = ms.getMacroDefn();
- _passedParams = pList;
-
- validate();
- if(_macroDefn.isArray())
- {
- _isArray = true;
- }
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "MacroExpression");
-
- }
-
- public Object evaluate() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
-
- // TODO Auto-generated method stub
- SPLSymbolTable macroSymbolTable = _macroDefn.getMacroSymTab();
-
- populateMacroSymbolTable(macroSymbolTable, _passedParams);
- Object result = _macroDefn.evaluate();
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
-
- return result;
- }
-
- private void populateMacroSymbolTable(SPLSymbolTable macroSymbolTable,
- List passedParams2) throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "populateMacroSymbolTable");
-
- Map symbolMap = macroSymbolTable.getSymbolMap();
- Iterator keySetIt = symbolMap.keySet().iterator();
- Iterator passedParamIt = passedParams2.iterator();
- while (keySetIt.hasNext() && passedParamIt.hasNext())
- {
- String symbolName = (String) keySetIt.next();
- Symbol sym = (Symbol) symbolMap.get(symbolName);
-
- Expression currentParam = (Expression) passedParamIt.next();
- Object value = currentParam.evaluate();
- //System.out.println("symbolName,value : "+symbolName+" "+ value);
- ((PropertySymbol) sym).setValue(value);
- }
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "populateMacroSymbolTable");
-
-
- }
-
- public TypeInfo getType()
- {
-
- return _returnType;
- }
-
- public boolean validate() throws SPLException
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validate");
-
- List formalParams = _macroDefn.getArgList();
- TypeResolver.validateActualParameterTypes(formalParams, _passedParams);
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validate");
-
- return true;
- }
-
- public String toString()
- {
- logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "toString");
-
- String str = _macroDefn.getMacroName()+" ( "+_macroDefn.getMacroExpression().toString()+" ) ";
-
- logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "toString");
-
- return str;
- }
-
- public String getReferenceTypeName() throws SPLException
- {
-
- return _referenceTypeName;
- }
-
-}
+/*
+ * 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.
+ */
+//
+
+/**
+ * @author Neeraj Joshi <jn...@us.ibm.com>
+ *
+ */
+
+package org.apache.imperius.spl.parser.expression.primary;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.apache.imperius.spl.external.Expression;
+import org.apache.imperius.spl.parser.compiler.symboltable.MacroSymbol;
+import org.apache.imperius.spl.parser.compiler.symboltable.PropertySymbol;
+import org.apache.imperius.spl.parser.compiler.symboltable.SPLSymbolTable;
+import org.apache.imperius.spl.parser.compiler.symboltable.Symbol;
+import org.apache.imperius.spl.parser.exceptions.SPLException;
+import org.apache.imperius.spl.parser.statements.impl.MacroDefinition;
+import org.apache.imperius.spl.parser.util.TypeInfo;
+import org.apache.imperius.spl.parser.util.TypeResolver;
+import org.apache.imperius.util.SPLLogger;
+
+
+public class MacroExpression implements Expression
+{
+
+ private TypeInfo _returnType;
+
+ private MacroDefinition _macroDefn;
+
+ private List _passedParams;
+
+
+ private static Logger logger = SPLLogger.getSPLLogger().getLogger();
+ private static final String sourceClass="MacroExpression";
+
+ private boolean _isArray = false;
+
+ private String _referenceTypeName = "";
+
+ public boolean isArray()
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "isArray");
+
+ return _isArray;
+ }
+
+ public MacroExpression(MacroSymbol ms, ArrayList pList,
+ SPLSymbolTable symTab) throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "MacroExpression");
+
+
+ _returnType = ms.getType();
+ if(TypeResolver.isReference(_returnType))
+ {
+ _referenceTypeName = ms.getReferenceTypeName();
+ }
+ _macroDefn = ms.getMacroDefn();
+ _passedParams = pList;
+
+ validate();
+ if(_macroDefn.isArray())
+ {
+ _isArray = true;
+ }
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "MacroExpression");
+
+ }
+
+ public Object evaluate() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
+
+ // TODO Auto-generated method stub
+ SPLSymbolTable macroSymbolTable = _macroDefn.getMacroSymTab();
+
+ populateMacroSymbolTable(macroSymbolTable, _passedParams);
+ Object result = _macroDefn.evaluate();
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "evaluate");
+
+ return result;
+ }
+
+ private void populateMacroSymbolTable(SPLSymbolTable macroSymbolTable,
+ List passedParams2) throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "populateMacroSymbolTable");
+
+ Map symbolMap = macroSymbolTable.getSymbolMap();
+ Iterator keySetIt = symbolMap.keySet().iterator();
+ Iterator passedParamIt = passedParams2.iterator();
+ while (keySetIt.hasNext() && passedParamIt.hasNext())
+ {
+ String symbolName = (String) keySetIt.next();
+ Symbol sym = (Symbol) symbolMap.get(symbolName);
+
+ Expression currentParam = (Expression) passedParamIt.next();
+ Object value = currentParam.evaluate();
+ //System.out.println("symbolName,value : "+symbolName+" "+ value);
+ ((PropertySymbol) sym).setValue(value);
+ }
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "populateMacroSymbolTable");
+
+
+ }
+
+ public TypeInfo getType()
+ {
+
+ return _returnType;
+ }
+
+ public boolean validate() throws SPLException
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "validate");
+
+ List formalParams = _macroDefn.getArgList();
+ TypeResolver.validateActualParameterTypes(formalParams, _passedParams);
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "validate");
+
+ return true;
+ }
+
+ public String toString()
+ {
+ logger.entering(sourceClass,Thread.currentThread().getName()+" "+ "toString");
+
+ String str = _macroDefn.getMacroName()+" ( "+_macroDefn.getMacroExpression().toString()+" ) ";
+
+ logger.exiting(sourceClass,Thread.currentThread().getName()+" "+ "toString");
+
+ return str;
+ }
+
+ public String getReferenceTypeName() throws SPLException
+ {
+
+ return _referenceTypeName;
+ }
+
+}
Propchange: incubator/imperius/trunk/imperius-splcore/src/main/java/org/apache/imperius/spl/parser/expression/primary/MacroExpression.java
------------------------------------------------------------------------------
svn:eol-style = native