package husacct.analyse.domain.famix;
import husacct.analyse.abstraction.dto.ClassDTO;
import husacct.analyse.abstraction.dto.LibraryDTO;
import husacct.analyse.abstraction.dto.PackageDTO;
import husacct.analyse.abstraction.export.XmlFileExporterAnalysedModel;
import husacct.analyse.abstraction.export.XmlFileImporterAnalysedModel;
import husacct.analyse.domain.IModelPersistencyService;
import husacct.analyse.domain.IModelQueryService;
import husacct.common.dto.AbstractDTO;
import husacct.common.dto.DependencyDTO;
import husacct.common.dto.UmlLinkDTO;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;
import javax.naming.directory.InvalidAttributesException;
import org.apache.log4j.Logger;
import org.jdom2.Element;
public class FamixPersistencyServiceImpl implements IModelPersistencyService {
private FamixModel theModel;
private IModelQueryService queryService;
private TreeMap<String, FamixClass> classesTreeMap;
private TreeMap<String, FamixLibrary> librarieTreeMap;
XmlFileExporterAnalysedModel xmlFileExporter;
XmlFileImporterAnalysedModel xmlFileImporter;
private Logger husacctLogger = Logger.getLogger(XmlFileExporterAnalysedModel.class);
// The following Famix types have to be exported and imported in strict order: Packages, Classes, Libraries, Dependencies, UmlLinks;
// The first three need to be sorted on uniqueName.
public FamixPersistencyServiceImpl(IModelQueryService queryService) {
theModel = FamixModel.getInstance();
this.queryService = queryService;
}
//EXPORT
@Override
public Element exportAnalysisModel() {
xmlFileExporter = new XmlFileExporterAnalysedModel();
writePackagesToXML();
writeClassesToXML();
writeLibrariesToXML();
writeDependenciesToXML();
writeUmlLinksToXML();
return xmlFileExporter.getXML();
}
private void writePackagesToXML() {
for (String packageKey : theModel.packages.keySet()) {
FamixPackage fPackage = theModel.packages.get(packageKey);
xmlFileExporter.writePackageToXml(fPackage.getDTO());
}
}
private void writeClassesToXML() {
this.classesTreeMap = new TreeMap<String, FamixClass>(theModel.classes);
for (String classKey : classesTreeMap.keySet()) {
FamixClass fClass = classesTreeMap.get(classKey);
xmlFileExporter.writeClassToXml(fClass.getDTO());
}
}
private void writeLibrariesToXML() {
this.librarieTreeMap = new TreeMap<String, FamixLibrary>(theModel.libraries);
for (String Key : librarieTreeMap.keySet()) {
FamixLibrary f = librarieTreeMap.get(Key);
xmlFileExporter.writeLibraryToXml(f.getDTO());
}
}
private void writeDependenciesToXML() {
for (DependencyDTO dependency : queryService.getAllDependencies()) {
xmlFileExporter.writeDependencyToXml(dependency);
}
}
private void writeUmlLinksToXML() {
for (String classUniqueName : classesTreeMap.keySet()) {
for (UmlLinkDTO umlLink : queryService.getUmlLinksFromClassToOtherClasses(classUniqueName)) {
xmlFileExporter.writeUmlLinkToXml(umlLink);
}
}
}
// IMPORT
@Override
public void importAnalysisModel(Element analyseElement) {
queryService.clearModel();
xmlFileImporter = new XmlFileImporterAnalysedModel(analyseElement);
readPackagesFromXML();
readClassesFromXML();
readLibrariesFromXML();
readDependenciesFromXML();
readUmlLinksFromXML();
queryService.buildCache();
}
private void readPackagesFromXML() {
List<PackageDTO> list = xmlFileImporter.readPackagesfromXml();
for (PackageDTO dto: list) {
FamixPackage fobj = new FamixPackage();
HashMap<String, Class<?>> fobjFieldsMap = getHashMapWithFields(fobj);
writeDtoToFamixObject(dto, fobj, fobjFieldsMap);
}
}
private void readClassesFromXML() {
List<ClassDTO> list = xmlFileImporter.readClassesfromXml();
for (ClassDTO dto: list) {
FamixClass fobj = new FamixClass();
HashMap<String, Class<?>> fobjFieldsMap = getHashMapWithFields(fobj);
writeDtoToFamixObject(dto, fobj, fobjFieldsMap);
}
}
private void readLibrariesFromXML() {
List<LibraryDTO> list = xmlFileImporter.readLibrariesfromXml();
for (LibraryDTO dto: list) {
FamixLibrary fobj = new FamixLibrary();
HashMap<String, Class<?>> fobjFieldsMap = getHashMapWithFields(fobj);
writeDtoToFamixObject(dto, fobj, fobjFieldsMap);
}
}
private void readDependenciesFromXML() {
List<DependencyDTO> list = xmlFileImporter.readDependenciesfromXml();
queryService.importDependencies(list);
}
private void readUmlLinksFromXML() {
List<UmlLinkDTO> list = xmlFileImporter.readUmlLinksFromXML();
for (UmlLinkDTO dto: list) {
FamixUmlLink fobj = new FamixUmlLink();
HashMap<String, Class<?>> fobjFieldsMap = getHashMapWithFields(fobj);
writeDtoToFamixObject(dto, fobj, fobjFieldsMap);
}
}
private HashMap<String, Class<?>> getHashMapWithFields(FamixObject fobj) {
Class<?> f = fobj.getClass();
List<Field> fobjFields = fobj.getFields(f);
HashMap<String, Class<?>> fobjFieldsMap = new HashMap<String, Class<?>>();
for (Field field : fobjFields) {
String name = field.getName().toString();
Class<?> type = field.getType();
fobjFieldsMap.put(name, type);
}
return fobjFieldsMap;
}
private FamixObject writeDtoToFamixObject(AbstractDTO dto, FamixObject fobj, HashMap<String, Class<?>> fobjFieldsMap) {
Class<?> d = dto.getClass();
try {
String fieldName;
Class<?> fieldType;
Field[] fields = d.getFields();
for( Field field : fields ){
if ((field.getName() != null)) {
fieldName = field.getName().toString();
if (fobjFieldsMap.containsKey(fieldName)) {
fieldType = field.getType();
if (fieldType.equals(fobjFieldsMap.get(fieldName))) {
Field fobjField = fobj.getClass().getField(field.getName());
fobjField.set(fobj, field.get(dto));
}
}
}
}
theModel.addObject(fobj);
} catch (IllegalAccessException e) {
husacctLogger.warn("Analyse - Couldn export package to xls: " + e.getMessage());
//e.printStackTrace();
} catch (IllegalArgumentException e) {
husacctLogger.warn("Analyse - Couldn export package to xls: " + e.getMessage());
//e.printStackTrace();
} catch (NoSuchFieldException e) {
husacctLogger.warn("Analyse - Couldn export package to xls: " + e.getMessage());
//e.printStackTrace();
} catch (SecurityException e) {
//e.printStackTrace();
} catch (InvalidAttributesException e) {
husacctLogger.warn("Analyse - Couldn export package to xls: " + e.getMessage());
//e.printStackTrace();
}
return fobj;
}
// EXPORT & IMPORT of Workspace Data
// Used for the generic mechanism to save workspace data of all components; e.g. configuration settings
@Override
public Element getWorkspaceData() {
Element rootElement = new Element("rootElementAnalyse");
// No configuration data are saved and loaded, currently.
return rootElement;
}
// Used for the generic mechanism to load workspace data of all components; e.g. configuration settings
@Override
public void loadWorkspaceData(Element rootElement) {
// No configuration data are saved and loaded, currently.
}
}