package husacct.define.analyzer;
import husacct.ServiceProvider;
import husacct.common.dto.ApplicationDTO;
import husacct.common.dto.ProjectDTO;
import husacct.common.dto.SoftwareUnitDTO;
import husacct.common.enums.States;
import husacct.define.domain.services.WarningMessageService;
import husacct.define.domain.services.stateservice.StateService;
import husacct.define.presentation.moduletree.AnalyzedModuleTree;
import husacct.define.task.AnalysedModuleComparator;
import husacct.define.task.JtreeController;
import husacct.define.task.components.AbstractCombinedComponent;
import husacct.define.task.components.AnalyzedModuleComponent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import org.apache.log4j.Logger;
public class AnalyzedUnitComparator {
private final Logger logger = Logger.getLogger(AnalyzedUnitComparator.class);
public AnalyzedModuleComponent calucalteChanges(AbstractCombinedComponent left, AbstractCombinedComponent right) {
ArrayList<AbstractCombinedComponent> toBeDeleted = new ArrayList<AbstractCombinedComponent>();
ArrayList<AbstractCombinedComponent> toBeAdded = new ArrayList<AbstractCombinedComponent>();
int leftsize = left.getChildren().size();
int rightsize = right.getChildren().size();
Collections.sort(left.getChildren());
Collections.sort(right.getChildren());
if (leftsize == rightsize) {
isequal(left, right, toBeDeleted, toBeAdded);
} else if (leftsize > rightsize) {
isLessEqual(left, right, toBeDeleted, toBeAdded);
} else if (leftsize < rightsize) {
isequal(left, right, toBeDeleted, toBeAdded);
isMoreEqual(left, right, toBeDeleted, toBeAdded);
}
for (AbstractCombinedComponent newAbstractCombinedComponent : toBeAdded) {
AnalyzedModuleComponent result = (AnalyzedModuleComponent) newAbstractCombinedComponent;
if (WarningMessageService.getInstance().hasCodeLevelWarning(result)) {
result.freeze();
left.addChild(result);
} else {
left.addChild(result);
}
}
for (AbstractCombinedComponent remove : toBeDeleted) {
AnalyzedModuleComponent unittoberemoved = ((AnalyzedModuleComponent) remove);
WarningMessageService.getInstance().addCodeLevelWarning(unittoberemoved);
AbstractCombinedComponent parent = remove.getParentofChild();
int index = parent.getChildren().indexOf(remove);
parent.getChildren().remove(index);
unittoberemoved.removeChildFromParent();
}
return (AnalyzedModuleComponent) left;
}
private void isequal(AbstractCombinedComponent left, AbstractCombinedComponent right, ArrayList<AbstractCombinedComponent> toBeDeleted, ArrayList<AbstractCombinedComponent> toBeAdded) {
for (int i = 0; i < left.getChildren().size(); i++) {
compareAbstractCombinedComponent(left.getChildren().get(i), right.getChildren().get(i), toBeDeleted, toBeAdded);
calucalteChanges(left.getChildren().get(i), right.getChildren().get(i));
}
Collections.sort(left.getChildren());
Collections.sort(right.getChildren());
}
private void isLessEqual(AbstractCombinedComponent left, AbstractCombinedComponent right, ArrayList<AbstractCombinedComponent> toBeDeleted, ArrayList<AbstractCombinedComponent> toBeAaded) {
int leftindex = left.getChildren().size();
int rightindex = right.getChildren().size() - 1;
Collections.sort(left.getChildren());
Collections.sort(right.getChildren());
for (int i = 0; i < leftindex; i++) {
if (rightindex >= i) {
if (left.getChildren().get(i).getUniqueName().equals(right.getChildren().get(i).getUniqueName())) {
ChekifTypeChanged(left, right);
} else {
toBeDeleted.add(left.getChildren().get(i));
toBeAaded.add(right.getChildren().get(i));
}
} else {
toBeDeleted.add(left.getChildren().get(i));
}
}
}
private void isMoreEqual(AbstractCombinedComponent left, AbstractCombinedComponent right, ArrayList<AbstractCombinedComponent> toBeDeleted, ArrayList<AbstractCombinedComponent> toBeAdded) {
int leftsize = left.getChildren().size();
int rightsize = right.getChildren().size();
for (int i = (rightsize - (rightsize - (leftsize))); i < rightsize; i++) {
boolean isfound = false;
for (AbstractCombinedComponent u : toBeDeleted) {
if (u.getUniqueName().equals(right.getChildren().get(i).getUniqueName())) {
isfound = true;
break;
}
}
if (!isfound) {
toBeAdded.add(right.getChildren().get(i));
}
}
}
private void compareAbstractCombinedComponent(AbstractCombinedComponent left, AbstractCombinedComponent right, ArrayList<AbstractCombinedComponent> toBeDeleted, ArrayList<AbstractCombinedComponent> toBeAaded) {
String AbstractCombinedComponentL = left.getUniqueName();
String AbstractCombinedComponentR = right.getUniqueName();
if (AbstractCombinedComponentL.equals(AbstractCombinedComponentR)) {
ChekifTypeChanged(left, right);
} else if (!AbstractCombinedComponentL.equals(AbstractCombinedComponentR)) {
toBeDeleted.add(left);
toBeAaded.add(right);
}
Collections.sort(left.getChildren());
Collections.sort(right.getChildren());
}
private void ChekifTypeChanged(AbstractCombinedComponent left, AbstractCombinedComponent right) {
if (!left.getType().equals(right.getType())) {
left.setType(right.getType());
}
}
public AnalyzedModuleComponent getSoftwareUnitTreeComponents() {
JtreeController.instance().setLoadState(true);
AnalyzedModuleComponent rootComponent = new AnalyzedModuleComponent("root", "Application", "application", "public");
ApplicationDTO application = ServiceProvider.getInstance().getControlService().getApplicationDTO();
for (ProjectDTO project : application.projects) {
AnalyzedModuleComponent projectComponent = new AnalyzedModuleComponent(project.name, project.name, "root", "public");
SoftwareUnitDTO[] moduleList = ServiceProvider.getInstance().getAnalyseService().getSoftwareUnitsInRoot();
for (SoftwareUnitDTO module : moduleList) {
this.addChildComponents(projectComponent, module);
}
rootComponent.addChild(projectComponent);
}
Collections.sort(rootComponent.getChildren());
return rootComponent;
}
private void addChildComponents(AnalyzedModuleComponent parentComponent, SoftwareUnitDTO module) {
AnalyzedModuleComponent childComponent = new AnalyzedModuleComponent(module.uniqueName, module.name, module.type, module.visibility);
SoftwareUnitDTO[] children = ServiceProvider.getInstance().getAnalyseService().getChildUnitsOfSoftwareUnit(module.uniqueName);
AnalysedModuleComparator comparator = new AnalysedModuleComparator();
Arrays.sort(children, comparator);
for (int i = 0 ; i < children.length; i++) {
if (children[i] != null){
this.addChildComponents(childComponent, children[i]);
}
else{
this.logger.warn(new Date().toString() + " Null-child in parent: " + module.uniqueName);
}
}
parentComponent.addChild(childComponent);
parentComponent.registerchildrenSize();
}
public AnalyzedModuleComponent getRootModel() {
if (ServiceProvider.getInstance().getControlService().getStates().contains(States.ANALYSED)) {
JtreeController.instance().setLoadState(true);
JtreeController.instance().setCurrentTree(new AnalyzedModuleTree(getSoftwareUnitTreeComponents()));
}
AnalyzedModuleComponent root = JtreeController.instance().getRootOfModel();
StateService.instance().registerImportedData();
return root;
}
}