IBM Support

How to capture metrics on user code contributions using the Rhapsody API

Question & Answer


Question

How do you capture metrics on user code contribution using the IBM Rational Rhapsody API?

Cause

You would like to capture the number of lines of user code within a project.

Answer

 
Disclaimer

All source code and/or binaries attached to this document are referred to here as "the Program". IBM is not providing program services of any kind for the Program. IBM is providing the Program on an "AS IS" basis without warranty of any kind. IBM WILL NOT BE LIABLE FOR ANY ACTUAL, DIRECT, SPECIAL, INCIDENTAL, OR INDIRECT DAMAGES OR FOR ANY ECONOMIC CONSEQUENTIAL DAMAGES (INCLUDING LOST PROFITS OR SAVINGS), EVEN IF IBM, OR ITS RESELLER, HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.



Procedure:
  1. Use the getNestedElementsByMetaClass(java.lang.String metaClass, int recursive)<[/code>] method to obtain each model element that could potentially contain user-code

  2. Use the numerous accessor methods to get the user code contents

  3. Then separate them using the ";" as a delimiter

For example:



import java.util.List;

import com.telelogic.rhapsody.core.IRPApplication;
import com.telelogic.rhapsody.core.IRPOperation;
import com.telelogic.rhapsody.core.IRPProject;
import com.telelogic.rhapsody.core.IRPState;
import com.telelogic.rhapsody.core.IRPTransition;
import com.telelogic.rhapsody.core.IRPType;
import com.telelogic.rhapsody.core.RhapsodyAppServer;


public class process {

public static int numOperations, numOperationLines;
public static int numStates, numStateLines;
public static int numTrans, numTranLines;
public static int numTypes, numTypeLines;


public static void main(String[] args) {
IRPApplication app = RhapsodyAppServer.getActiveRhapsodyApplication();
IRPProject prj = app.activeProject();

/// Operations including global functions
List<IRPOperation> operations = prj.getNestedElementsByMetaClass("Operation", 1).toList();
for(IRPOperation op : operations) {
numOperations++;
numOperationLines = numOperationLines + countLines(op.getBody());
// Ada Local Variables
if(app.getLanguage().equals("Ada")) {
numOperationLines = numOperationLines + countLines(op.getPropertyValue("Ada_CG.Operation.LocalVariablesDeclaration"));

}
}

// States
List<IRPState> states = prj.getNestedElementsByMetaClass("State", 1).toList();
for(IRPState state : states) {
numStates++;
numStateLines = numStateLines + countLines(state.getEntryAction());
numStateLines = numStateLines + countLines(state.getExitAction());
}

// Transitions
List<IRPTransition> transitions = prj.getNestedElementsByMetaClass("Transition", 1).toList();
for (IRPTransition transition : transitions) {
numTrans++;
if (transition.getItsTrigger() != null)
numTranLines = numTranLines + countLines(transition.getItsTrigger().getBody());
if (transition.getItsGuard() != null)
numTranLines = numTranLines + countLines(transition.getItsGuard().getBody());
if (transition.getItsAction() != null)
numTranLines = numTranLines + countLines(transition.getItsAction().getBody());
}

// Types
List<IRPType> types = prj.getNestedElementsByMetaClass("Type", 1).toList();
for (IRPType type : types) {
if (!type.getName().equals("")) {
numTypes++;
if(type.getKind().equals("Language")) {
numTypeLines = numTypeLines + countLines(type.getDeclaration());
}
}
}

System.out.println(numOperations + " Operations searched : " + numOperationLines + " lines found");
System.out.println(numStates + " States searched : " + numStateLines + " lines found");
System.out.println(numTrans + " Transitions searched : " + numTranLines + " lines found");
System.out.println(numTypes + " Types searched : " + numTypeLines + " lines found");
int total = numOperationLines + numStateLines + numTranLines + numTypeLines;
System.out.println("Total lines = " + total);
}

public static int countLines(String sBody) {
int count = 0;
String[] aLines = sBody.split(";");
// one empty line does not count!
if ((aLines.length == 1) & (aLines[0].equals("")))
return 0;
else
return aLines.length;
}

}


For more details see the API Javadoc (INSTALLATION LOCATION:\Rational\Rhapsody\8.0.5\Doc\java_api\index.html).

[{"Product":{"code":"SSB2MU","label":"IBM Engineering Systems Design Rhapsody"},"Business Unit":{"code":"BU059","label":"IBM Software w\/o TPS"},"Component":"General Information","Platform":[{"code":"PF016","label":"Linux"},{"code":"PF033","label":"Windows"}],"Version":"7.6;7.6.0.1;7.6.1;7.6.1.1;7.6.1.2;7.6.1.3;7.6.1.4;7.6.1.5;8.0;8.0.1;8.0.2;8.0.3;8.0.4;8.0.5;8.0.6;8.1;8.1.1","Edition":"","Line of Business":{"code":"LOB59","label":"Sustainability Software"}}]

Product Synonym

Rational Rhapsody

Document Information

Modified date:
27 May 2022

UID

swg21689250