package org.bbaw.pdr.ae.base.commands; import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import java.util.Vector; import org.bbaw.pdr.ae.common.NLMessages; import org.bbaw.pdr.ae.control.core.UserRichtsChecker; import org.bbaw.pdr.ae.control.facade.Facade; import org.bbaw.pdr.ae.control.interfaces.IDBManager; import org.bbaw.pdr.ae.model.Aspect; import org.bbaw.pdr.ae.model.Person; import org.bbaw.pdr.ae.view.control.PDRObjectsProvider; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.commands.IHandlerListener; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.progress.UIJob; public class RemoveDuplicateAspectsHandler implements IHandler { /** user rights checker. */ private UserRichtsChecker _urChecker = new UserRichtsChecker(); private Facade _facade = Facade.getInstanz(); private PDRObjectsProvider _objectsProvider = new PDRObjectsProvider(); private Comparator<Aspect> aspectIDComparator; @Override public void addHandlerListener(IHandlerListener handlerListener) { } @Override public void dispose() { } @Override public Object execute(ExecutionEvent event) throws ExecutionException { if (!_urChecker.isUserGuest()) { ProgressMonitorDialog dialog = new ProgressMonitorDialog( HandlerUtil.getActiveShell(event).getShell()); dialog.setCancelable(true); try { dialog.run(true, true, new IRunnableWithProgress() { private Object _updateStatus; @Override public void run(final IProgressMonitor monitor) { // Activator.getDefault().getPreferenceStore().getString("REPOSITORY_URL")); if (monitor.isCanceled()) { monitor.setCanceled(true); } removeDuplicates(monitor); } } ); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { } return null; } return null; } private void removeDuplicates(IProgressMonitor monitor) { Set<Aspect> toDelete = new HashSet<Aspect>(); monitor.beginTask("Check Person and Aspects", _facade.getAllPersons().values().size()); for (Person p : _facade.getAllPersons().values()) { System.out.println(p.getDisplayName()); if (monitor.isCanceled()) { monitor.setCanceled(true); } _objectsProvider.setInput(p); Vector<Aspect> aspects = _objectsProvider.getAspects(); Collections.sort(aspects, getAspectIDComparator()); System.out.println(aspects.size()); if (aspects != null && !aspects.isEmpty()) { Set<Aspect> toCompare = new HashSet<Aspect>(); Set<Aspect> tempToDelete = new HashSet<Aspect>(); // fill set to compare all for (Aspect a : aspects) { toCompare.add(a); } Aspect leftAspect = null; int index = 0; // compare while (!toCompare.isEmpty() && index < aspects.size()) { tempToDelete.clear(); leftAspect = aspects.get(index); toCompare.remove(leftAspect); for (Aspect a : toCompare) { if (equalsContentRelation(leftAspect, a)) { tempToDelete.add(a); } } index++; toCompare.removeAll(tempToDelete); toDelete.addAll(tempToDelete); if (monitor.isCanceled()) { monitor.setCanceled(true); } } } monitor.worked(1); } System.out.println("Aspects to remove: " + toDelete.size()); IDBManager dbm = _facade.getDBManager(); monitor.beginTask("Delete Duplicate Aspects. Number of Aspects to delete: " + toDelete.size(), toDelete.size()); for (Aspect a : toDelete) { try { dbm.delete(a.getPdrId(), "aspect"); } catch (Exception e) { e.printStackTrace(); } if (monitor.isCanceled()) { monitor.setCanceled(true); } monitor.worked(1); } UIJob job = new UIJob("Feedbackup") { @Override public IStatus runInUIThread(final IProgressMonitor monitor) { _facade.refreshAllData(); return Status.OK_STATUS; } }; job.setUser(true); job.schedule(); } private boolean equalsContentRelation(Aspect leftAspect, Aspect aspect) { if (!leftAspect.equalsContent(aspect)) { return false; } if (leftAspect.getRelationDim() != null && aspect.getRelationDim() != null) { if (leftAspect.getRelationDim().getRelationStms()!= null && aspect.getRelationDim().getRelationStms() != null) { //test if (leftAspect.getRelationDim().getRelationStms().size() > 3) { System.out.println("jetzt"); } if (!(leftAspect.getRelationDim().getRelationStms().size() == aspect.getRelationDim().getRelationStms().size())) { return false; } for (int i = 0; i < leftAspect.getRelationDim().getRelationStms().size(); i++) { if (!(leftAspect.getRelationDim().getRelationStms().get(i).equals(aspect.getRelationDim().getRelationStms().get(i)) || leftAspect.getRelationDim().getRelationStms().get(i).similarRelations(aspect.getRelationDim().getRelationStms().get(i), leftAspect.getPdrId(), aspect.getPdrId(), leftAspect.getOwningObjectId(), leftAspect.getOwningObjectId()))) { return false; } } } else if ((leftAspect.getRelationDim().getRelationStms() == null && aspect.getRelationDim().getRelationStms() != null) || (leftAspect.getRelationDim().getRelationStms() != null && aspect.getRelationDim().getRelationStms() == null)) { return false; } } else if ((leftAspect.getRelationDim() != null && aspect.getRelationDim() == null) || (leftAspect.getRelationDim() == null && aspect.getRelationDim() != null)) { return false; } return true; } private Comparator<Aspect> getAspectIDComparator() { if (aspectIDComparator == null) { aspectIDComparator = new Comparator<Aspect>() { @Override public int compare(Aspect a1, Aspect a2) { if (a1 != null && a2 != null) { if (a1.getPdrId() != null && a2.getPdrId() != null) { return a1.getPdrId().getId() - a2.getPdrId().getId(); } } return 0; } }; } return aspectIDComparator; } @Override public boolean isEnabled() { return true; } @Override public boolean isHandled() { return true; } @Override public void removeHandlerListener(IHandlerListener handlerListener) { } }