package uml2parser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import logging.Log;
import org.xml.sax.Attributes;
/**
*
* @author Prashant Shukla
* When we parse a XMI file. This we have a list of elements that are present in the file
* This list only contains the top level elements.
*
*/
public class ModelFileInfo {
XmiIdToElementMap xmiIdElement;
private HashMap <String, XmiElement> hrefToElementMap = new HashMap <String, XmiElement>();
/**
* Name of the file that was parsed.
*/
private String fileName;
/**
* Name of the file with out path.
*/
private String fileNameNoPath;
/**
* Name of the file with out path.
*/
private String fileNameNoExtension;
/**
* List of top level elements in this XMI file
*/
private List<XmiElement> list;
/**
* Constructor
* @param fileName
*/
public ModelFileInfo(String fileName) {
this.fileName = fileName;
if (this.fileName != null) {
String[] fileParts = fileName.split("[\\\\|/]");
setFileNameNoPath(fileParts[fileParts.length - 1]);
}
if (fileNameNoPath != null) {
String[] fileParts = fileNameNoPath.split("\\.");
setFileNameNoExtension(fileParts[0]);
}
xmiIdElement = new XmiIdToElementMap();
list= new ArrayList<XmiElement>();
}
/**
* returns the name of the file.
* @return
*/
public String getFileName() {
return fileName;
}
/**
* Add a element to the list.
* @param elem
*/
public void addElement(XmiElement elem) {
//Log.LogCreate().Info(elem.getElementName());
list.add(elem);
String id = elem.getElementId();
if (id != null) {
xmiIdElement.addElement(id,elem);
}
String href = elem.getAttributeValue("href");
if (href != null) {
this.hrefToElementMap.put(href, elem);
}
}
/**
* Returns the
* @param idx
* @return
*/
public XmiElement getElement(int idx) {
XmiElement retElem = null;
if (idx >= 0 && idx < list.size()) {
retElem = list.get(idx);
}
return retElem;
}
/**
*
* @param parentElem
* @param childElem
*/
public void AddChildElement(XmiElement parentElem, XmiElement childElem) {
for (int i = 0 ; i < list.size(); i++) {
if (ElementIteratorToAddChildElem(parentElem, childElem, list.get(i)) == true)
break;
}
}
/**
*
* @param parentElem
* @param childElem
* @param listElem
* @return
*/
private boolean ElementIteratorToAddChildElem(XmiElement parentElem, XmiElement childElem, XmiElement listElem) {
boolean retval = false;
if (parentElem.getElementId() == null ) {
if (parentElem.getElementName().equals(listElem.getElementName())) {
//Log.LogCreate().Info("AddChildElement : " + parentElem.getElementName() + " childElem " + childElem.getElementName());
parentElem.addChildElement(childElem);
String id = childElem.getElementId();
if(id != null) {
xmiIdElement.addElement(id,childElem);
}
String href = childElem.getAttributeValue("href");
if (href != null) {
this.hrefToElementMap.put(href, childElem);
}
retval = true;
}
} else if (parentElem.getElementId().equals(listElem.getElementId())){
//Log.LogCreate().Info("AddChildElement : " + parentElem.getElementName() + " childElem " + childElem.getElementName());
parentElem.addChildElement(childElem);
String id = childElem.getElementId();
if(id != null) {
xmiIdElement.addElement(id,childElem);
}
String href = childElem.getAttributeValue("href");
if (href != null) {
this.hrefToElementMap.put(href, childElem);
}
retval = true;
} else {
List <XmiElement> list = listElem.getChildElemList();
for (int i = 0; i < list.size(); i++) {
if (ElementIteratorToAddChildElem (parentElem, childElem, list.get(i))) {
retval = true;
break;
}
}
}
return retval;
}
/**
*
* @param ElemName
* @return
*/
public List<XmiElement> findElementsByName(String ElemName) {
List<XmiElement> elementList = new ArrayList<XmiElement>();
//Log.LogCreate().Info("findElementsByName: elementList size" + String.valueOf(elementList.size()) );
for (int i = 0; i < list.size(); i++) {
XmiElement elem= getElement(i);
ElementIterator(elem,ElemName,elementList);
}
return elementList;
}
/**
*
* @param name
* @param elemname
* @param elementList
*/
private void ElementIterator(XmiElement name, String elemname,List<XmiElement> elementList) {
List <XmiElement> childElementlist = name.getChildElemList();
//Log.LogCreate().Info("ElementIterator: Element name " + name.getElementName());
if(name.getElementName().equals(elemname)) {
elementList.add(name);
}
if(childElementlist != null) {
//Log.LogCreate().Info("ElementIterator:" + name.getElementName() +" elementList size " + String.valueOf(childElementlist.size()) );
// iterate the xmiElement which contains all the information
for (int i = 0; i < childElementlist.size(); i++) {
ElementIterator(childElementlist.get(i),elemname,elementList);
}
}
return;
}
/**
*
* @param id
* @return
*/
public boolean findElementsById(String id) {
boolean retval = false;
for (int i = 0; i < list.size(); i++) {
XmiElement elem= getElement(i);
retval = ElementIteratorById(elem,id);
if (retval)
break;
}
return retval;
}
/**
*
* @param name
* @param elemId
* @return
*/
private boolean ElementIteratorById(XmiElement name, String elemId) {
List <XmiElement> childElementlist = name.getChildElemList();
if(name.getElementId() != null && name.getElementId().equals(elemId)) {
name.setFoundMatch(true);
return true;
}
if(childElementlist != null) {
// iterate the xmiElement which contains all the information
for (int i = 0; i < childElementlist.size(); i++) {
if (ElementIteratorById(childElementlist.get(i),elemId) == true)
return true;
}
}
return false;
}
public XmiElement getXmiElementFromId(String id) {
return xmiIdElement.getElementFromId(id);
}
public XmiElement getXmiElementFromHref(String href) {
return hrefToElementMap.get(href);
}
/**
* @param the fileNameNoPath to set
*/
private void setFileNameNoPath(String fileNameNoPath) {
if (fileNameNoPath != null) {
this.fileNameNoPath = fileNameNoPath;
} else {
this.fileNameNoPath = "";
}
}
/**
* @return the FileName without the path
*/
public String getFileNameNoPath() {
return fileNameNoPath;
}
/**
* @return the fileNameNoExtension
*/
public String getFileNameNoExtension() {
return fileNameNoExtension;
}
/**
* @param fileNameNoExtension the fileNameNoExtension to set
*/
private void setFileNameNoExtension(String fileNameNoExtension) {
if (fileNameNoExtension != null) {
this.fileNameNoExtension = fileNameNoExtension;
} else {
this.fileNameNoExtension = "";
}
}
}