package husacct.define.domain.services;
import husacct.define.domain.module.ModuleStrategy;
import husacct.define.domain.services.stateservice.StateService;
import husacct.define.domain.warningmessages.CodeLevelWarning;
import husacct.define.domain.warningmessages.ImplementationLevelWarning;
import husacct.define.domain.warningmessages.WarningMessage;
import husacct.define.task.components.AbstractCombinedComponent;
import husacct.define.task.components.AnalyzedModuleComponent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Observable;
import java.util.Observer;
public class WarningMessageService extends Observable implements Observer {
private ArrayList<WarningMessage> warnings= new ArrayList<WarningMessage>();
private ArrayList<Observer> observers = new ArrayList<Observer>();
private static WarningMessageService instance=null;
private ArrayList<CodeLevelWarning> codelevelWarnings = new ArrayList<CodeLevelWarning>();
public static WarningMessageService getInstance() {
if(instance==null) {
return instance =new WarningMessageService();
}else {
return instance;
}
}
public WarningMessageService() {
}
public void removeWarning(WarningMessage warning) {
int index = warnings.indexOf(warning);
warnings.remove(index);
observers.remove(warning);
notifyAllObservers(this,"warningremoved");
}
public ArrayList<WarningMessage> getWarningMessages() {
return warnings;
}
public boolean hasWarnings() {
return warnings.size()+codelevelWarnings.size()==0;
}
public boolean hasCodeLevelWarning(AnalyzedModuleComponent analyzedModuleToChek) {
boolean haswarning=false;
Iterator<CodeLevelWarning> it = codelevelWarnings.iterator();
while (it.hasNext()) {
AnalyzedModuleComponent analyzedModule = it.next().getNotCodeLevelModule();
String leftUniqName= analyzedModule.getUniqueName().toLowerCase();
String rightUniqName = analyzedModuleToChek.getUniqueName().toLowerCase();
if(leftUniqName.equals(rightUniqName))
{
haswarning=true;
it.remove();
break;
}
}
return haswarning;
}
public void processModule(ModuleStrategy module){
if (module.getId()!=0) {
if (module.isMapped()) {
removeImplementationWarning(module);
} else {
createModuleWarning(module);
}
}
}
public void removeImplementationWarning(ModuleStrategy module) {
for (WarningMessage warning : warnings) {
if(warning instanceof ImplementationLevelWarning)
{
long idOfWarningModule = ((ImplementationLevelWarning)warning).getModule().getId();
if(module.getId()==idOfWarningModule)
{
int index= warnings.indexOf(warning);
warnings.remove(index);
break;
}
}
}
notifyAllObservers(this, "removedModule");
}
private void createModuleWarning(ModuleStrategy module) {
ImplementationLevelWarning warning = new ImplementationLevelWarning(module);
this.warnings.add(warning);
addObserver(warning);
notifyAllObservers(this,"createModule");
}
@Override
public void addObserver(Observer o)
{
observers.add(o);
}
public void notifyAllObservers(Observable o, Object arg) {
for (Observer observer : observers) {
observer.update(this, arg);
}
}
public boolean isCodeLevelWarning(String uniqname) {
boolean haswarning=false;
for (WarningMessage message : warnings) {
if (message instanceof CodeLevelWarning) {
AnalyzedModuleComponent analyzedModule = ((CodeLevelWarning) message).getNotCodeLevelModule();
String leftUniqName= analyzedModule.getUniqueName().toLowerCase();
String rightUniqName =uniqname;
if(leftUniqName.equals(rightUniqName)){
haswarning=true;
break;
}
}
}
return haswarning;
}
public void addCodeLevelWarning(AnalyzedModuleComponent unitTobeRestored) {
ArrayList<AbstractCombinedComponent> list =new ArrayList<AbstractCombinedComponent>();
list.addAll(getnestedValues(unitTobeRestored));
if (unitTobeRestored.isMapped()) {
codelevelWarnings.add(new CodeLevelWarning(unitTobeRestored));
}
for (AbstractCombinedComponent ab : list) {
codelevelWarnings.add(new CodeLevelWarning((AnalyzedModuleComponent) ab));
}
}
private ArrayList<AbstractCombinedComponent> getnestedValues(AnalyzedModuleComponent an) {
ArrayList<AbstractCombinedComponent> mapped = new ArrayList<AbstractCombinedComponent>();
for (AbstractCombinedComponent unit : an.getChildren()) {
mapped=(searchWithTailRecursive(unit,mapped));
}
return mapped;
}
private ArrayList<AbstractCombinedComponent> searchWithTailRecursive(AbstractCombinedComponent unit, ArrayList<AbstractCombinedComponent> mapped) {
AnalyzedModuleComponent io = (AnalyzedModuleComponent)unit;
if (io.isMapped()) {
mapped.add(io);
}
for (AbstractCombinedComponent ab : io.getChildren()) {
searchWithTailRecursive(ab, mapped);
}
return mapped;
}
@Override
public void update(Observable arg0, Object arg1) {
}
public void removeCodeLevelWarningss(String softwareUnit) {
for (Iterator<CodeLevelWarning> warning = codelevelWarnings.iterator(); warning.hasNext();) {
CodeLevelWarning message = warning.next();
if (message instanceof CodeLevelWarning) {
AnalyzedModuleComponent analyzedModule = message.getNotCodeLevelModule();
String leftUniqName= analyzedModule.getUniqueName().toLowerCase();
String rightUniqName =softwareUnit ;
if(leftUniqName.equals(rightUniqName)){
int index = warnings.indexOf(message);
warnings.remove(index);
break;
}
}
}
}
public void notifyAllObservers() {
notifyAllObservers(this, new Object());
}
public Object[] getvalueat(int index)
{
return warnings.get(index).getValue();
}
public ArrayList<CodeLevelWarning> getNotCodeLevelWarnings() {
return codelevelWarnings;
}
public void updateWarnings() {
}
public void registerNotMappedUnits(AnalyzedModuleComponent root) {
for (AbstractCombinedComponent unit : root.getChildren()) {
StateService.instance().getAnalzedModuleRegistry().registerAnalyzedUnit((AnalyzedModuleComponent)unit);
registerNotMappedUnits((AnalyzedModuleComponent)unit);
}
/*for (AbstractCombinedComponent unit : StateService.instance().getmappedUnits()) {
//JtreeController.instance().removeTreeItem((AnalyzedModuleComponent)unit);
//StateService.instance().getAnalzedModuleRegistry().removeAnalyzedUnit((AnalyzedModuleComponent)unit);
}
*/
}
public String warningsCount() {
// TODO Auto-generated method stub
return warnings.size()+codelevelWarnings.size()+"";
}
public void clearImplementationLevelWarnings() {
warnings = new ArrayList<WarningMessage>();
}
public void resetNotAnalyzed() {
codelevelWarnings = new ArrayList<CodeLevelWarning>();
}
}