package controller.upload;
import repository.ContextDAO;
import repository.DiagramDAO;
import uml2parser.*;
import logging.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.*;
import java.sql.SQLException;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EReference;
import domain.Diagram;
import domain.DiagramContext;
import domain.DiagramType;
/**
*
* @author shuklp
*
*/
public class UmlUploadProcessor implements UploadProcessor {
List<FileInfo> fileList;
private final static String PAPYRUS_CLASS_DIAG = "PapyrusUMLClassDiagram";
private final static String PAPYRUS_SEQUENCE_DIAG = "PapyrusUMLSequenceDiagram";
private final static String PAPYRUS_NOTATION_ELEM = "notation:Diagram";
private final static String PAPYRUS_PACKAGED_ELEM = "packagedElement";
private boolean isClassDiag = false;
private boolean isSeqDiag = false;
private List<String> activeIdList;
private XmiElement classXmiDiag;
private XmiElement sequenceXmiDiag;
private ModelFileInfo modelUmlInfo;
private String Umlfilename;
private FileInfo umlInfo;
private String diagramPath;
private int id;
public UmlUploadProcessor(List<FileInfo> list, String path, int id) {
fileList = list;
activeIdList = new ArrayList<String>();
diagramPath = path;
this.id = id;
}
@Override
public void process(int projectId) {
// first process the .notation file
FileInfo info = getFile(UploadProcessorFactory.NOTATION_EXTENSION);
ModelFileInfo notationmodelInfo = new ModelFileInfo(
info.getDestFilePath() + info.getFileName());
ParseXmi notationXmi = new ParseXmi(notationmodelInfo);
notationXmi.parseDoc();
// Parse the UML File
umlInfo = getFile(UploadProcessorFactory.UML_EXTENSION);
modelUmlInfo = new ModelFileInfo(umlInfo.getDestFilePath()
+ umlInfo.getFileName());
ParseXmi umlXmi = new ParseXmi(modelUmlInfo);
Umlfilename = umlInfo.getFileName();
umlXmi.parseDoc();
// Does the diagram support Class diagrams & sequence diagrams
List<XmiElement> elemList = notationmodelInfo
.findElementsByName(PAPYRUS_NOTATION_ELEM);
if (elemList.size() > 0) {
for (int i = 0; i < elemList.size(); i++) {
XmiElement xmi = elemList.get(i);
List<Attribute> attriblist = xmi.getAttrib();
for (int j = 0; j < attriblist.size(); j++) {
Attribute attr = attriblist.get(j);
if (attr.getName().equals("type")) {
switch (attr.getValue()) {
case PAPYRUS_CLASS_DIAG: {
// TODO: We are currently only supporting one class
// diagram per
// Notation file. We can enhance this in future.
classXmiDiag = xmi;
isClassDiag = true;
}
break;
// Add Sequence Diagrams Support
case PAPYRUS_SEQUENCE_DIAG: {
sequenceXmiDiag = xmi;
isSeqDiag = true;
}
break;
default: {
break;
}
}
}
}
}
}
if (isClassDiag) {
new Uml2ClassUploadProcessor().process(projectId);
String folder = diagramPath + "/";
String umlFileName = umlInfo.getFileName();
//String diagramType = "class";//Removed with introduction of new DiagramType Enum
this.storeDatabase(folder, umlFileName, id, DiagramType.CLASS, projectId);
}
if (isSeqDiag) {
new Uml2SequenceDiagramUploadProcessor().process(projectId);
String folder = diagramPath + "/";
String umlFileName = umlInfo.getFileName();
//String diagramType = "sequence"; //Removed with introduction of new DiagramType Enum
logging.Log.LogCreate().Info("Image_File_Name:"+ umlFileName + ".png");
logging.Log.LogCreate().Info("Folder:"+ folder);
this.storeDatabase(folder, umlFileName, id, DiagramType.SEQUENCE, projectId);
}
}
/*
* function to store upload diagram information into database.
*/
private void storeDatabase(String folder, String umlFileName, int userID, DiagramType diagramType, int projectId) {
try {
//int projectId = 2 ; // needs to be passed in as in UploadServlet
logging.Log.LogCreate().Info(folder + " " + umlFileName);
String baseFileName = umlFileName.substring(0, umlFileName.length() - ".uml".length());
Diagram diagramObj = new Diagram();
diagramObj.setDiagramName(umlFileName + ".png");
diagramObj.setFilePath(folder + umlFileName);
diagramObj.setMerged(0);
diagramObj.setUserId(userID);
diagramObj.setProjectId(projectId);
diagramObj.setDiFileName(baseFileName + ".di");
diagramObj.setNotationFileName(baseFileName + ".notation");
diagramObj.setDiFilepath(folder);
diagramObj.setFileType("XMI");
diagramObj.setNotationFilePath(folder);
DiagramContext cd = ContextDAO.getContext(projectId);
diagramObj.setContextId(ContextDAO.getContext(projectId).getDiagramContextId());
//support for enum type| we have to make sure, that the diagramType supplied here is in accordance to the Enum
diagramObj.setDiagramType(diagramType);
//diagramObj.setDiagramType(diagramType);
DiagramDAO.addDiagram(diagramObj);
/*
EditingHistory editObj = new EditingHistory();
editObj.setDiagramId(diagramObj.getDiagramId());
editObj.setUserId(userID);
EditingHistoryDAO.addHistory(editObj);
*/
} catch (IllegalArgumentException e) {
}
catch (SQLException sqlE){
sqlE.printStackTrace();
}
}
// private
/**
*
* @param name
*/
private void ElementIterator(XmiElement name) {
List<XmiElement> childElementlist = name.getChildElemList();
if (childElementlist != null) {
// iterate the xmiElement which contains all the information
for (int i = 0; i < childElementlist.size(); i++) {
ElementIterator(childElementlist.get(i));
}
}
List<Attribute> attribList = name.getAttrib();
for (int j = 0; j < attribList.size(); j++) {
Attribute attrib = attribList.get(j);
if (attrib.getName().equals("href")) {
int beginIndex = attrib.getValue().indexOf('#');
String value = attrib.getValue().substring(beginIndex + 1);
// Log.LogCreate().Info("Active IDs " + value);
activeIdList.add(value);
}
}
}
private FileInfo getFile(String extension) {
FileInfo info = null;
for (int i = 0; i < fileList.size(); i++) {
String extn = fileList
.get(i)
.getFileName()
.substring(
fileList.get(i).getFileName().lastIndexOf(".") + 1,
fileList.get(i).getFileName().length());
if (extn.equals(extension)) {
info = fileList.get(i);
break;
}
}
return info;
}
private class UML2AssocClass {
String className = null;
String AssocType = null;
String AssocClass = null;
String upperVal = "1";
String lowerVal = "1";
String AssocName = null;
String AssocupperVal = "1";
String AssocLowerVal = "1";
}
/**
*
* Still thinking if we need to break this up into two class Sequence
* diagram and the Class diagram.
*
*/
private class Uml2ClassUploadProcessor extends ClassPngFile {
public void process(int projectId) {
ElementIterator(classXmiDiag);
boolean foundError = false;
// now find the elements in the class
for (int i = 0; i < activeIdList.size(); i++) {
if (modelUmlInfo.findElementsById(activeIdList.get(i)) == false) {
foundError = true;
break;
}
}
if (foundError == false) {
// Convert this into a java file.
// Build a list of Class.
List<XmiElement> classList = new ArrayList<XmiElement>();
List<XmiElement> assoclist = new ArrayList<XmiElement>();
List<XmiElement> packagedElemList = modelUmlInfo
.findElementsByName(PAPYRUS_PACKAGED_ELEM);
for (int i = 0; i < packagedElemList.size(); i++) {
if (packagedElemList.get(i).getFoundMatch()) {
List<Attribute> attrlist = packagedElemList.get(i)
.getAttrib();
for (int k = 0; k < attrlist.size(); k++) {
if (attrlist.get(k).getName().equals("xmi:type")
&& attrlist.get(k).getValue()
.equals("uml:Class")) {
// Log.LogCreate().Info("Valid class name = " +
// packagedElemList.get(i).getAttributeValue("name"));
classList.add(packagedElemList.get(i));
}
if (attrlist.get(k).getName().equals("xmi:type") && attrlist.get(k).getValue().equals("uml:Association")) {
assoclist.add(packagedElemList.get(i));
//Log.LogCreate().Info("Valid Assoc name = " + packagedElemList.get(i).getAttributeValue("name"));
}
}
}
}
// parse the contents of assoclist and find the correct association
// Log.LogCreate().Info("Calling CreateJava file");
CreateJavaFile(classList,assoclist);
ClassPngFile.createPngFile(Umlfilename, Umlfilename + ".java",
umlInfo.getDestFilePath(), umlInfo.getLibPath());
}
}
private void CreateJavaFile(List<XmiElement> classList, List<XmiElement> assocList) {
// Create Stream Writer
BufferedWriter out;
try {
// for each package
File javaFile = new File(fileList.get(0).getDestFilePath()
+ Umlfilename + ".java");
FileWriter fstream = new FileWriter(javaFile);
out = new BufferedWriter(fstream);
out.write("import java.util.Date;\n");
out.write("import java.util.*; \n");
out.write("import java.io.*; \n");
List<UML2AssocClass> assocClassList = new ArrayList<UML2AssocClass>();
// iterate thru an array list of classes
for (int i = 0 ; i < assocList.size(); i++) {
List<XmiElement> childlist = assocList.get(i).getChildElemList();
if (childlist.size() == 1) {
continue;
} else {
UML2AssocClass assoc = new UML2AssocClass();
assoc.AssocName = assocList.get(i).getAttributeValue("name");
//Log.LogCreate().Info("assocname = " + assoc.AssocName);
// check if aggregration type is present
int k =0;
for (XmiElement ownedElem: childlist) {
k++;
String aggrVal = ownedElem.getAttributeValue("aggregation");
if (aggrVal != null) {
//Log.LogCreate().Info("aggrVal = " + aggrVal);
XmiElement xmi = modelUmlInfo.getXmiElementFromId(ownedElem.getAttributeValue("type"));
assoc.AssocClass = xmi.getAttributeValue("name");
if (aggrVal.equals("shared")) {
assoc.AssocType = "@has";
} else if (aggrVal.equals("composite")) {
assoc.AssocType = "@composed";
}
List<XmiElement> valList = ownedElem.getChildElemList();
for (XmiElement val:valList) {
if (val.getElementName().equals("lowerValue")){
assoc.AssocLowerVal = val.getAttributeValue("value");
}
else if (val.getElementName().equals("upperValue")) {
assoc.AssocupperVal = val.getAttributeValue("value");
}
}
} else if (assoc.className == null){
XmiElement xmi = modelUmlInfo.getXmiElementFromId(ownedElem.getAttributeValue("type"));
assoc.className = xmi.getAttributeValue("name");
//Log.LogCreate().Info("className = " + assoc.className);
List<XmiElement> valList = ownedElem.getChildElemList();
for (XmiElement val:valList) {
if (val.getElementName().equals("lowerValue")){
assoc.lowerVal = val.getAttributeValue("value");
}
else if (val.getElementName().equals("upperValue")) {
assoc.upperVal = val.getAttributeValue("value");
}
}
}
if (k == childlist.size() && assoc.AssocType == null) {
assoc.AssocType = "@assoc";
XmiElement xmi = modelUmlInfo.getXmiElementFromId(ownedElem.getAttributeValue("type"));
assoc.AssocClass = xmi.getAttributeValue("name");
//Log.LogCreate().Info(" NULL AssocClass = " + assoc.AssocClass);
List<XmiElement> valList = ownedElem.getChildElemList();
for (XmiElement val:valList) {
if (val.getElementName().equals("lowerValue")){
assoc.AssocLowerVal = val.getAttributeValue("value");
}
else if (val.getElementName().equals("upperValue")) {
assoc.AssocupperVal = val.getAttributeValue("value");
}
}
}
}
assocClassList.add(assoc);
}
}
for (int i = 0; i < classList.size(); i++) {
XmiElement cls = classList.get(i);
List<XmiElement> childlist = cls.getChildElemList();
String tempClassName = "";
String className = "";
className = cls.getAttributeValue("name");
tempClassName = className;
// To determine if we have any generalizaton
for (int j = 0; j < childlist.size(); j++) {
// Check if there is any element named "generalizaion
XmiElement childElem = childlist.get(j);
if (childElem.getElementName().equals("generalization")) {
// Parent element xmiElement
String id = childElem.getAttributeValue("general");
XmiElement parentElement = modelUmlInfo
.getXmiElementFromId(id);
className += " extends "
+ parentElement.getAttributeValue("name");
}
}
out.write("/**\n");
out.write("* @opt types\n");
out.write("* @opt attributes\n");
out.write("* @opt operations\n");
for (UML2AssocClass assoc:assocClassList) {
//Log.LogCreate().Info("assocname = " + assoc.className + " " + className);
if (assoc.className.equals(tempClassName)) {
String assocString = "";
if (assoc.lowerVal == null) {
assocString = "* " + assoc.AssocType + " " + assoc.upperVal + " " + assoc.AssocName;
} else {
assocString = "* " + assoc.AssocType + " " + assoc.lowerVal + ".." + assoc.upperVal + " " + assoc.AssocName;
}
if (assoc.AssocLowerVal == null) {
assocString += " " + assoc.AssocupperVal + " " + assoc.AssocClass + "\n";
} else {
assocString += " " + assoc.AssocLowerVal+ ".." + assoc.AssocupperVal + " " + assoc.AssocClass + "\n";
}
out.write(assocString);
//out.write("* " + assoc.AssocType + " " + assoc.lowerVal + " " + assoc.AssocName + " " + assoc.AssocClass + "\n");
}
}
for (int j = 0; j < childlist.size(); j++ ) {
XmiElement childElem = childlist.get(j);
if (childElem == null )
continue;
if (childElem.getElementName().equals("ownedAttribute")) {
List<Attribute> attriblistchild = childElem.getAttrib();
String name = childElem.getAttributeValue("association");
if (name != null ) {
//Log.LogCreate().Info("Assoc " + childElem.getAttributeValue("name"));
String assocName = childElem.getAttributeValue("name");
XmiElement assocClass = modelUmlInfo.getXmiElementFromId(childElem.getAttributeValue("type"));
List<XmiElement> valList = childElem.getChildElemList();
String lowerValue = "*", upperValue = "*";
for (XmiElement val:valList) {
if (val.getElementName().equals("lowerValue")){
lowerValue = val.getAttributeValue("value");
}
else if (val.getElementName().equals("upperValue")) {
upperValue = val.getAttributeValue("value");
}
}
String assocString = "";
if (lowerValue == null) {
assocString = "* @assoc " + upperValue + " " + assocName + " * " + assocClass.getAttributeValue("name") + "\n";
} else {
assocString = "* @assoc " + lowerValue + ".." + upperValue + " " + assocName + " * " + assocClass.getAttributeValue("name") + "\n";
}
out.write(assocString);
}
}
}
out.write("*/\n");
out.write("public class " + className + "{\n");
out.write("\n");
// out.write("/**\n");
for (int j = 0; j < childlist.size(); j++) {
XmiElement childElem = childlist.get(j);
//logging.Log.LogCreate().Info("Creating Attribute list" );
if (childElem == null ) {
//logging.Log.LogCreate().Info("ChildElem is null" );
continue;
}
if (childElem.getFoundMatch()) {
// Operations
if (childElem.getElementName().equals(
"ownedOperation")) {
//logging.Log.LogCreate().Info("Creating ownedOperation" );
List<Attribute> attriblistchild = childElem.getAttrib();
for (int idx = 0; idx < attriblistchild.size(); idx++) {
if (attriblistchild.get(idx).getName()
.equals("name")) {
String operationName = attriblistchild
.get(idx).getValue();
out.write("\tvoid " + operationName
+ "();\n");
break;
}
}
} else if (childElem.getElementName().equals(
"ownedAttribute")) {
//logging.Log.LogCreate().Info("Creating ownedAttribute" );
// Here we only will process the Attributes
List<Attribute> attriblistchild = childElem.getAttrib();
String attrStr = "";
String type = "";
String name = "";
for (int idx = 0; idx < attriblistchild.size(); idx++) {
if (attriblistchild.get(idx).getName()
.equals("name")) {
name = attriblistchild.get(idx)
.getValue();
logging.Log.LogCreate().Info("Attribute name = " + name);
break;
}
}
List<XmiElement> attrList = childElem
.getChildElemList();
for (int idx = 0; idx < attrList.size(); idx++) {
if (attrList.get(idx).getElementName()
.equals("type")) {
XmiElement elem = attrList.get(idx);
if (elem.getAttributeValue("xmi:type")
.equals("uml:PrimitiveType")) {
String hrefVal = elem
.getAttributeValue("href");
hrefVal = hrefVal.substring(
hrefVal.indexOf('#') + 1,
hrefVal.length());
switch (hrefVal) {
case "LiteralString":
case "String":
type = "String";
break;
case "Integer":
type = "int";
break;
case "Real":
type = "double";
break;
case "Boolean":
type = "boolean";
break;
case "UnlimitdNatural":
type = "long";
break;
default:
type ="int";
break;
}
}
}
}
if (type!= null && !type.isEmpty())
out.write("\t" + type + " " + name + ";\n");
else {
out.write("\t int " + name + ";\n");
}
}
}
}
out.write("}\n");
}
out.close();
fstream.close();
logging.Log.LogCreate().Info("Completed created java file");
} catch (Exception e) {
Log.LogCreate().Info(
"Got an error creating the file...." + e.getMessage());
}
}
}
public class Uml2SequenceDiagramUploadProcessor extends SequencePngFile{
public void process(int projectId) {
Log.LogCreate().Info("Uml2SequenceDiagramUploadProcessor");
ElementIterator(sequenceXmiDiag);
boolean foundError = false;
// PicElement is a structure specifically for creating .pic statement
PicElement picElem = new PicElement();
// now find the elements in the class
for (int i = 0 ; i < activeIdList.size(); i++) {
if (modelUmlInfo.findElementsById(activeIdList.get(i)) == false) {
Log.LogCreate().Info("Uml2SequenceDiagramUploadProcessor : Found error while iterating active element list");
foundError = true;
break;
}
}
Log.LogCreate().Info("Uml2SequenceDiagramUploadProcessor : active list size = " + String.valueOf(activeIdList.size()) );
if (foundError == false) {
Log.LogCreate().Info("Uml2SequenceDiagramUploadProcessor : ");
// Build a list of lifelines, messages and fragments
// The fragment list sequence presents the message sequence
List <XmiElement> fragmentList = new ArrayList<XmiElement> ();
List <XmiElement> lifelineList = new ArrayList<XmiElement> ();
List <XmiElement> messageList = new ArrayList<XmiElement> ();
List <String> msgIdList = new ArrayList<String> ();
List<XmiElement> packagedElemList = modelUmlInfo.findElementsByName(PAPYRUS_PACKAGED_ELEM);
Log.LogCreate().Info("Uml2SequenceDiagramUploadProcessor : packagedElemList size = " + String.valueOf(packagedElemList.size()) );
for (int i = 0 ; i < packagedElemList.size(); i++) {
List<XmiElement> childElems = packagedElemList.get(i).getChildElemList();
Log.LogCreate().Info("Uml2SequenceDiagramUploadProcessor : childElems size = " + String.valueOf(childElems.size()) );
for (int j = 0; j < childElems.size(); j++)
if (childElems.get(j).getFoundMatch() || childElems.get(j).getElementName().equals("fragment")) {
if (childElems.get(j).getElementName().equals("fragment")) {
Log.LogCreate().Info("Found fragment list =" + childElems.get(j).getElementId() );
fragmentList.add(childElems.get(j));
if(childElems.get(j).getAttributeValue("xmi:type").equals("uml:MessageOccurrenceSpecification") && childElems.get(j).getAttributeValue("name").startsWith("MessageSend")) {
Log.LogCreate().Info("Found fragment mesglist =" + childElems.get(j).getAttributeValue("message"));
msgIdList.add(childElems.get(j).getAttributeValue("message"));
}
}
if (childElems.get(j).getElementName().equals("lifeline")) {
Log.LogCreate().Info("Found lifeline list =" + childElems.get(j).getElementId());
lifelineList.add(childElems.get(j));
}
if (childElems.get(j).getElementName().equals("message")) {
Log.LogCreate().Info("Found message list =" + childElems.get(j).getElementId());
messageList.add(childElems.get(j));
}
}
}
for (int i = 0 ; i < lifelineList.size() ; i++) {
XmiElementLifeLine xmiElemLifLin = new XmiElementLifeLine(lifelineList.get(i));
xmiElemLifLin.process();
picElem.getLifelineList().add(xmiElemLifLin);
}
// Create XmiElementMessage item and put it into messageList of Pic class
for (int i = 0 ; i < messageList.size() ; i++) {
XmiElementMessage xmiElemMsg = new XmiElementMessage(messageList.get(i));
xmiElemMsg.process();
for (XmiElement fragment:fragmentList) {
if (fragment.getElementId().equals(messageList.get(i).getAttributeValue("sendEvent"))||fragment.getElementId().equals(messageList.get(i).getAttributeValue("receiveEvent"))) {
for (XmiElement lifeline:lifelineList)
{
if (lifeline.getElementId().equals(fragment.getAttributeValue("covered")) && fragment.getAttributeValue("name").startsWith("MessageSend"))
{
Log.LogCreate().Info("Adding to xmiElemMsg list =" + lifeline.getElementId());
XmiElementLifeLine xmiElemLifeLine = picElem.getLifeline(lifeline);
xmiElemMsg.setSender(xmiElemLifeLine);
}
if (lifeline.getElementId().equals(fragment.getAttributeValue("covered")) && fragment.getAttributeValue("name").startsWith("MessageRecv"))
{
XmiElementLifeLine xmiElemLifeLine = picElem.getLifeline(lifeline);
xmiElemMsg.setReceiver(xmiElemLifeLine);
}
}
}
}
Log.LogCreate().Info("Locating message list =" + messageList.get(i).getElementId());
// add xmiElementMessage with the correct order
if (msgIdList.contains(messageList.get(i).getElementId())) {
Log.LogCreate().Info("Adding to pic list =" + messageList.get(i).getElementId());
picElem.getMessageList().add(msgIdList.indexOf(messageList.get(i).getElementId()), xmiElemMsg);
}
}
for (int i = 0 ; i < lifelineList.size() ; i++) {
XmiElementLifeLine xmiElemLifLin = picElem.getLifeline(lifelineList.get(i));
String coveryByVal = lifelineList.get(i).getAttributeValue("coveredBy");
String [] coveryByValList = coveryByVal.split(" ");
List<String> coveryByList = new ArrayList<String>();
logging.Log.LogCreate().Info("Size of coveryByList " + String.valueOf(coveryByValList.length));
for (int j = 0 ; j < coveryByValList.length; j++) {
coveryByList.add(coveryByValList[j]);
}
logging.Log.LogCreate().Info("Size of messageList " + String.valueOf(messageList.size()));
for(XmiElement msg:messageList) {
if (msg.getAttributeValue("messageSort")!=null && msg.getAttributeValue("messageSort").equals("createMessage") && coveryByList.contains(msg.getAttributeValue("receiveEvent"))) {
xmiElemLifLin.setLifelineType("placeholder_object");
logging.Log.LogCreate().Info("Creating placeholder object = " + xmiElemLifLin.elem.getElementId());
break;
}
else {
xmiElemLifLin.setLifelineType("object");
logging.Log.LogCreate().Info("Creating object = " + xmiElemLifLin.elem.getElementId());
}
}
}
/** Then call method to translate PicELement into .pic statement and create .png file**/
CreatePicFile(picElem);
SequencePngFile.createPngFile(Umlfilename, Umlfilename + ".pic", umlInfo.getDestFilePath(), umlInfo.getLibPath());
}
}
private void CreatePicFile(PicElement picElem) {
// Create Stream Writer
BufferedWriter out;
try {
// for each package
File picfile = new File(fileList.get(0).getDestFilePath()
+ Umlfilename + ".pic");
FileWriter fstream = new FileWriter(picfile);
out = new BufferedWriter(fstream);
out.write(".PS\n");
out.write("copy \"" + umlInfo.getDestFilePath() + "sequence.pic\"; \n");
String[] LifelineNic = new String[picElem.getLifelineList().size()];
out.write("#Define objects \n");
logging.Log.LogCreate().Info("Lifeline size = " + String.valueOf(picElem.getLifelineList().size()));
for (int i = 0; i < picElem.getLifelineList().size(); i++) {
//logging.Log.LogCreate().Info("picElem.getLifelineList() " + obj.getLifelineName());
XmiElementLifeLine obj= picElem.getLifelineList().get(i);
String objType,objName;
objType = obj.getLifelineType();
objName = obj.getLifelineName();
logging.Log.LogCreate().Info("picElem.getLifelineList() " + obj.getLifelineName());
LifelineNic[i] = (String) objName.substring(0, 1).toUpperCase()+i;
obj.setLifelineNic(LifelineNic[i]);
if(objType.equals("object"))
out.write(objType+"("+LifelineNic[i]+",\""+objName+"\");\n");
else
out.write(objType+"("+LifelineNic[i]+");\n");
}
logging.Log.LogCreate().Info("adding step " );
out.write("step();\n");
logging.Log.LogCreate().Info("adding Message " );
out.write("#Message sequences \n");
int senderNum= 0, same =0;
Sender[] Sender =new Sender[50];
logging.Log.LogCreate().Info("getMessageList size = " + String.valueOf(picElem.getMessageList().size()));
/*
for(int m = 0; m<picElem.getMessageList().size(); m++)
{
String msgSender;
XmiElementMessage msg= picElem.getMessageList().get(m);
msgSender = msg.getSender().getLifelineNic();
if(Sender[0].name==null)
{
Sender[0].setname(msgSender);
senderNum++;
Sender[0].num++;
}
else
{
int n = 0;
for(n = 0;n<senderNum&&!Sender[n].name.equals(msgSender);n++)
{
same = 1;
}
if(Sender[n].name.equals(msgSender))
{
same = 0;
Sender[n].num++;
}
if(same == 1)
{
Sender[senderNum].name=msgSender;
Sender[senderNum].num++;
senderNum++;
}
}
}
*/
logging.Log.LogCreate().Info("Sender complete= " + String.valueOf(picElem.getMessageList().size()));
for(int m = 0; m < picElem.getMessageList().size(); m++)
{
XmiElementMessage msg= picElem.getMessageList().get(m);
String msgSort,msgName,msgSender,msgReceiver;
msgSort = msg.getmessageSort();
if(msgSort == null)
{
msgSort = "message";
}
logging.Log.LogCreate().Info("msgSort = " + msgSort );
msgName = msg.getmessageName();
msgSender = msg.getSender().getLifelineNic();
msgReceiver = msg.getReceiver().getLifelineNic();
if(msg.getSender().getactiveFlag()==0)
{
//out.write("active("+ msgSender+");\n");
msg.getSender().setactiveFlag(1);
}
if(msgSort.equals("create_message"))
{
out.write(msgSort+"("+msgSender+","+msgReceiver+","+"\""+msg.getReceiver().getLifelineName()+"\");\n");
}
else
{
out.write(msgSort+"("+msgSender+","+msgReceiver+","+"\""+msgName+"\");\n");
}
for(int sn=0; sn < senderNum;sn++)
{
if(Sender[sn].name.equals(msgSender))
Sender[sn].num--;
if(Sender[sn].num==0)
out.write("inactive("+msgSender+");");
}
}
logging.Log.LogCreate().Info("Complete the lifelines");
out.write("#Complete the lifelines \n");
out.write("step(); \n");
for(int j = 0; j < picElem.getLifelineList().size(); j++)
{
XmiElementLifeLine obj= picElem.getLifelineList().get(j);
out.write("complete("+obj.getLifelineNic()+");\n");
}
out.write(".PE\n");
logging.Log.LogCreate().Info("close");
out.close();
fstream.close();
} catch (Exception e) {
Log.LogCreate().Info(
"Got an error creating the file...." + e.getMessage());
}
}
}
class PicElement {
ArrayList<XmiElementLifeLine> lifelineList;
ArrayList<XmiElementMessage> messageList;
ArrayList<XmiElementFragment> fragmentList;
PicElement() {
lifelineList = new ArrayList<XmiElementLifeLine>();
messageList = new ArrayList<XmiElementMessage>();
fragmentList = new ArrayList<XmiElementFragment>();
}
public ArrayList<XmiElementLifeLine> getLifelineList() {
return lifelineList;
}
public ArrayList<XmiElementMessage> getMessageList() {
return messageList;
}
public ArrayList<XmiElementFragment> getFragmentList() {
return fragmentList;
}
public XmiElementLifeLine getLifeline(XmiElement xmiElement) {
XmiElementLifeLine lifeline = null;
for (int i = 0; i < lifelineList.size(); i++) {
if (lifelineList.get(i).elem.equals(xmiElement)){
lifeline = lifelineList.get(i);
}
}
return lifeline;
}
}
class XmiElementLifeLine {
XmiElement elem;
String lifelineName;
/*This lifeline Type should be either object or placeholder_object*/
String lifelineType;
String lifelineNic;
int activeFlag = 0;
XmiElementLifeLine(XmiElement element) {
elem = element;
}
private void process() {
List<Attribute> temp = elem.getAttrib();
for (int i = 0; i < temp.size(); i++) {
Attribute attr = temp.get(i);
if (attr.getName().equals("name")) {
lifelineName = attr.getValue();
}
}
}
public int getactiveFlag() {
return activeFlag;
}
public void setactiveFlag(int activeFlag) {
this.activeFlag = activeFlag;
}
public String getLifelineType() {
return lifelineType;
}
public void setLifelineType(String lifelineType) {
this.lifelineType = lifelineType;
}
public String getLifelineName() {
return lifelineName;
}
public void setLifelineName(String lifelineName) {
this.lifelineName = lifelineName;
}
public String getLifelineNic() {
return lifelineNic;
}
public void setLifelineNic(String lifelineNic) {
this.lifelineNic = lifelineNic;
}
}
class XmiElementMessage {
XmiElement elem;
String messageName;
String messageSort;
XmiElementLifeLine sender;
XmiElementLifeLine receiver;
XmiElementMessage(XmiElement element) {
elem = element;
}
private void process() {
List<Attribute> temp = elem.getAttrib();
for (int i = 0; i < temp.size(); i++) {
Attribute attr = temp.get(i);
if (attr.getName().equals("name")) {
messageName = attr.getValue();
logging.Log.LogCreate().Info("messageName = " + messageName);
}
if (attr.getName().equals("messageSort")) {
String attrValue = attr.getValue();
if(attrValue.equals("createMessage")) {
messageSort = "create_message";
break;
}
else if(attrValue.equals("reply")) {
messageSort = "return_message";
break;
}
else if(attrValue.equals("deleteMessage")) {
messageSort = "destroy_message";
break;
}
else {
messageSort = "message";
break;
}
}
}
}
public String getmessageName() {
return messageName;
}
public String getmessageSort() {
return messageSort;
}
public XmiElementLifeLine getSender() {
return sender;
}
public void setSender(XmiElementLifeLine sender) {
this.sender = sender;
}
public XmiElementLifeLine getReceiver() {
return receiver;
}
public void setReceiver(XmiElementLifeLine receiver) {
this.receiver = receiver;
}
}
// Still thinking if we need this class since the properties differ based on the fragment type
class XmiElementFragment {
}
class Sender
{
int num =0;
String name = null;
public void num(int num) {
this.num = num;
}
public int getnum() {
return num;
}
public void setname(String name) {
this.name = name;
}
public String getname() {
return name;
}
}
}