Java tutorial
/* * Copyright 2016-2018 by Devon Bowen. * * This file is part of Easotope. * * Easotope is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License. * * Additional permission under GNU GPL version 3 section 7: * If you modify this Program, or any covered work, by linking or combining * it with the Eclipse Rich Client Platform (or a modified version of that * library), containing parts covered by the terms of the Eclipse Public * License, the licensors of this Program grant you additional permission * to convey the resulting work. Corresponding Source for a non-source form * of such a combination shall include the source code for the parts of the * Eclipse Rich Client Platform used as well as that of the covered work. * * Easotope is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Easotope. If not, see <http://www.gnu.org/licenses/>. */ package org.easotope.client.rawdata.navigator.sample; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import javax.annotation.PostConstruct; import org.easotope.client.Messages; import org.easotope.client.core.part.EasotopePart; import org.easotope.client.rawdata.navigator.PartManager; import org.easotope.client.rawdata.project.ProjectPart; import org.easotope.client.rawdata.replicate.SampleReplicatePart; import org.easotope.client.rawdata.sample.SamplePart; import org.easotope.framework.commands.Command; import org.easotope.framework.dbcore.DatabaseConstants; import org.easotope.framework.dbcore.tables.User; import org.easotope.shared.admin.cache.user.UserCache; import org.easotope.shared.admin.cache.user.userlist.UserCacheUserListGetListener; import org.easotope.shared.admin.cache.user.userlist.UserList; import org.easotope.shared.admin.cache.user.userlist.UserListItem; import org.easotope.shared.core.cache.logininfo.LoginInfoCache; import org.easotope.shared.core.cache.logininfo.logininfo.LoginInfoCacheLoginInfoGetListener; import org.easotope.shared.core.tables.Permissions; import org.easotope.shared.core.tables.Preferences; import org.easotope.shared.rawdata.cache.input.InputCache; import org.easotope.shared.rawdata.cache.input.projectlist.InputCacheProjectListGetListener; import org.easotope.shared.rawdata.cache.input.projectlist.ProjectList; import org.easotope.shared.rawdata.cache.input.projectlist.ProjectListItem; import org.easotope.shared.rawdata.cache.input.replicatelist.InputCacheReplicateListGetListener; import org.easotope.shared.rawdata.cache.input.replicatelist.ReplicateList; import org.easotope.shared.rawdata.cache.input.replicatelist.ReplicateListItem; import org.easotope.shared.rawdata.cache.input.samplelist.InputCacheSampleListGetListener; import org.easotope.shared.rawdata.cache.input.samplelist.SampleList; import org.easotope.shared.rawdata.cache.input.samplelist.SampleListItem; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; public class SampleNavigator extends EasotopePart implements UserCacheUserListGetListener, InputCacheProjectListGetListener, InputCacheSampleListGetListener, InputCacheReplicateListGetListener, LoginInfoCacheLoginInfoGetListener { private Action createProject; private Action editProject; private Action createSample; private Action editSample; private Action createReplicate; private Action editReplicate; private TreeViewer treeViewer; private static final String ROOT = "root"; private static final String USER_PREFIX = "u"; private static final String PROJECT_PREFIX = "p"; private static final String SAMPLE_PREFIX = "s"; private static final String REPLICATE_PREFIX = "r"; private HashMap<String, TreeElement> treeElementLookup = new HashMap<String, TreeElement>(); private HashMap<Integer, String> waitingOnCommandIds = new HashMap<Integer, String>(); private HashSet<String> waitingOnTreeElements = new HashSet<String>(); @PostConstruct public void postConstruct() { treeViewer = new TreeViewer(getParent(), SWT.VIRTUAL); treeViewer.setContentProvider(new ContentProvider(this)); treeViewer.setUseHashlookup(true); treeViewer.setComparator(new ViewerComparator()); treeViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection thisSelection = (IStructuredSelection) event.getSelection(); Object selectedNode = thisSelection.getFirstElement(); if (selectedNode instanceof ProjectElement) { ProjectElement projectElement = (ProjectElement) selectedNode; HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SamplePart.INPUTURI_PARAM_USER, String.valueOf(projectElement.getUserElement().getId())); parameters.put(ProjectPart.INPUTURI_PARAM_PROJECT, String.valueOf(projectElement.getId())); PartManager.openPart(SampleNavigator.this, ProjectPart.ELEMENTID_BASE, ProjectPart.class.getName(), parameters, true); } else if (selectedNode instanceof SampleElement) { SampleElement sampleElement = (SampleElement) selectedNode; HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SamplePart.INPUTURI_PARAM_USER, String.valueOf(sampleElement.getProjectElement().getUserElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_PROJECT, String.valueOf(sampleElement.getProjectElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_SAMPLE, String.valueOf(sampleElement.getId())); PartManager.openPart(SampleNavigator.this, SamplePart.ELEMENTID_BASE, SamplePart.class.getName(), parameters, true); } else if (selectedNode instanceof ReplicateElement) { ReplicateElement replicateElement = (ReplicateElement) selectedNode; HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SampleReplicatePart.INPUTURI_PARAM_REPLICATE, String.valueOf(replicateElement.getId())); PartManager.openPart(SampleNavigator.this, SampleReplicatePart.ELEMENTID_BASE, SampleReplicatePart.class.getName(), parameters, true); } } }); TreeElement root = new TreeElement(0, null); root.setNameDateAndHasChildren("root", 0, true); treeElementLookup.put(ROOT, root); treeViewer.setInput(root); createProject = new Action() { @Override public void run() { createProject(); } }; createProject.setText(Messages.sampleNavigator_addProject); editProject = new Action() { @Override public void run() { editProject(); } }; editProject.setText(Messages.sampleNavigator_editProject); createSample = new Action() { @Override public void run() { createSample(); } }; createSample.setText(Messages.sampleNavigator_addSample); editSample = new Action() { @Override public void run() { editSample(); } }; editSample.setText(Messages.sampleNavigator_editSample); createReplicate = new Action() { @Override public void run() { createReplicate(); } }; createReplicate.setText(Messages.sampleNavigator_addReplicate); editReplicate = new Action() { @Override public void run() { editReplicate(); } }; editReplicate.setText(Messages.sampleNavigator_editReplicate); MenuManager menuMgr = new MenuManager(); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { fillContextMenu(manager); } }); Menu menu = menuMgr.createContextMenu(treeViewer.getControl()); treeViewer.getControl().setMenu(menu); UserCache.getInstance().addListener(this); InputCache.getInstance().addListener(this); LoginInfoCache.getInstance().addListener(this); int commandId = UserCache.getInstance().userListGet(this); addWaitingReminder(commandId, ROOT); } private void addWaitingReminder(int commandId, String treeElement) { if (commandId == Command.UNDEFINED_ID) { return; } waitingOnCommandIds.put(commandId, treeElement); waitingOnTreeElements.add(treeElement); getParent().setCursor(getParent().getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); } private void removeWaitingReminder(int commandId) { if (commandId == Command.UNDEFINED_ID) { return; } waitingOnTreeElements.remove(waitingOnCommandIds.get(commandId)); waitingOnCommandIds.remove(commandId); if (waitingOnCommandIds.size() == 0) { getParent().setCursor(null); } } void getProjects(int userId) { int commandId = InputCache.getInstance().projectListGet(this, userId); addWaitingReminder(commandId, USER_PREFIX + userId); } void getSamples(int projectId) { int commandId = InputCache.getInstance().sampleListGet(this, projectId); addWaitingReminder(commandId, PROJECT_PREFIX + projectId); } void getReplicates(int sampleId) { int commandId = InputCache.getInstance().replicateListGet(this, true, sampleId, DatabaseConstants.EMPTY_DB_ID, DatabaseConstants.EMPTY_DB_ID); addWaitingReminder(commandId, SAMPLE_PREFIX + sampleId); } private void fillContextMenu(IMenuManager manager) { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); TreeElement selectedElement = (TreeElement) selection.getFirstElement(); if (selectedElement == null) { return; } if (selectedElement instanceof UserElement) { manager.add(createProject); } else if (selectedElement instanceof ProjectElement) { manager.add(editProject); manager.add(createSample); } else if (selectedElement instanceof SampleElement) { manager.add(editSample); manager.add(createReplicate); } else if (selectedElement instanceof ReplicateElement) { manager.add(editReplicate); } } private void createProject() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); UserElement userElement = (UserElement) selection.getFirstElement(); if (userElement == null) { return; } HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(ProjectPart.INPUTURI_PARAM_USER, String.valueOf(userElement.getId())); PartManager.openPart(this, ProjectPart.ELEMENTID_BASE, ProjectPart.class.getName(), parameters, false); } private void editProject() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); ProjectElement projectElement = (ProjectElement) selection.getFirstElement(); if (projectElement == null) { return; } HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(ProjectPart.INPUTURI_PARAM_PROJECT, String.valueOf(projectElement.getId())); PartManager.openPart(this, ProjectPart.ELEMENTID_BASE, ProjectPart.class.getName(), parameters, true); } private void createSample() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); ProjectElement projectElement = (ProjectElement) selection.getFirstElement(); if (projectElement == null) { return; } HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SamplePart.INPUTURI_PARAM_USER, String.valueOf(projectElement.getUserElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_PROJECT, String.valueOf(projectElement.getId())); PartManager.openPart(this, SamplePart.ELEMENTID_BASE, SamplePart.class.getName(), parameters, false); } private void editSample() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); SampleElement sampleElement = (SampleElement) selection.getFirstElement(); if (sampleElement == null) { return; } HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SamplePart.INPUTURI_PARAM_USER, String.valueOf(sampleElement.getProjectElement().getUserElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_PROJECT, String.valueOf(sampleElement.getProjectElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_SAMPLE, String.valueOf(sampleElement.getId())); PartManager.openPart(this, SamplePart.ELEMENTID_BASE, SamplePart.class.getName(), parameters, true); } private void createReplicate() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); SampleElement sampleElement = (SampleElement) selection.getFirstElement(); if (sampleElement == null) { return; } HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SamplePart.INPUTURI_PARAM_USER, String.valueOf(sampleElement.getProjectElement().getUserElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_PROJECT, String.valueOf(sampleElement.getProjectElement().getId())); parameters.put(SamplePart.INPUTURI_PARAM_SAMPLE, String.valueOf(sampleElement.getId())); PartManager.openPart(this, SampleReplicatePart.ELEMENTID_BASE, SampleReplicatePart.class.getName(), parameters, false); } private void editReplicate() { IStructuredSelection selection = (IStructuredSelection) treeViewer.getSelection(); ReplicateElement replicateElement = (ReplicateElement) selection.getFirstElement(); if (replicateElement == null) { return; } SampleElement sampleElement = replicateElement.getSampleElement(); ProjectElement projectElement = sampleElement.getProjectElement(); UserElement userElement = projectElement.getUserElement(); HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put(SampleReplicatePart.INPUTURI_PARAM_USER, String.valueOf(userElement.getId())); parameters.put(SampleReplicatePart.INPUTURI_PARAM_PROJECT, String.valueOf(projectElement.getId())); parameters.put(SampleReplicatePart.INPUTURI_PARAM_SAMPLE, String.valueOf(sampleElement.getId())); parameters.put(SampleReplicatePart.INPUTURI_PARAM_REPLICATE, String.valueOf(replicateElement.getId())); PartManager.openPart(this, SampleReplicatePart.ELEMENTID_BASE, SampleReplicatePart.class.getName(), parameters, true); } @Override public Display getDisplay() { return getParent().getDisplay(); } @Override public boolean stillCallabled() { return getParent() != null && !getParent().isDisposed(); } @Override public void userListGetCompleted(int commandId, UserList userList) { TreeElement root = treeElementLookup.get(ROOT); ArrayList<TreeElement> children = new ArrayList<TreeElement>(); boolean canEditAllReplicates = LoginInfoCache.getInstance().getPermissions().isCanEditAllReplicates(); int currentUserId = LoginInfoCache.getInstance().getUser().getId(); for (Integer userId : userList.keySet()) { if (!canEditAllReplicates && userId != currentUserId) { continue; } UserListItem userListItem = userList.get(userId); TreeElement userElement = treeElementLookup.get(USER_PREFIX + userId); if (userElement == null) { userElement = new UserElement(userId, root); treeElementLookup.put(USER_PREFIX + userId, userElement); } userElement.setNameDateAndHasChildren(userListItem.getName(), 0, userListItem.hasChildren()); children.add(userElement); } root.setChildren(children); if (!treeViewer.isBusy()) { treeViewer.refresh(root, true); } removeWaitingReminder(commandId); } @Override public void userListUpdated(int commandId, UserList userList) { if (waitingOnTreeElements.contains(ROOT)) { return; } final TreeElement rootElement = (TreeElement) treeElementLookup.get(ROOT); boolean canEditAllReplicates = LoginInfoCache.getInstance().getPermissions().isCanEditAllReplicates(); int currentUserId = LoginInfoCache.getInstance().getUser().getId(); for (Integer userId : userList.keySet()) { if (!canEditAllReplicates && userId != currentUserId) { continue; } UserListItem userListItem = userList.get(userId); TreeElement userElement = (TreeElement) treeElementLookup.get(USER_PREFIX + userId); if (userElement == null) { userElement = new UserElement(userId, rootElement); rootElement.setHasChildren(true); rootElement.addChildIfChildrenAreLoaded(userElement); } userElement.setNameDateAndHasChildren(userListItem.getName(), 0, userListItem.hasChildren()); treeElementLookup.put(USER_PREFIX + userId, userElement); } if (!treeViewer.isBusy()) { treeViewer.refresh(rootElement, true); } } @Override public void userListGetError(int commandId, String message) { raiseError(message); removeWaitingReminder(commandId); } @Override public void projectListGetCompleted(int commandId, ProjectList projectList) { final TreeElement user = treeElementLookup.get(USER_PREFIX + projectList.getUserId()); ArrayList<TreeElement> children = new ArrayList<TreeElement>(); for (Integer projectId : projectList.keySet()) { TreeElement project = treeElementLookup.get(PROJECT_PREFIX + projectId); if (project == null) { project = new ProjectElement(projectId, (UserElement) user); treeElementLookup.put(PROJECT_PREFIX + projectId, project); } project.setParent(user); ProjectListItem projectListItem = projectList.get(projectId); project.setNameDateAndHasChildren(projectListItem.getProject().getName(), 0, projectListItem.hasChildren()); children.add(project); } user.setChildren(children); if (!treeViewer.isBusy()) { treeViewer.refresh(user, true); } removeWaitingReminder(commandId); } @Override public void projectListUpdated(int commandId, ProjectList projectList) { if (waitingOnTreeElements.contains(USER_PREFIX + projectList.getUserId())) { return; } TreeElement userElement = treeElementLookup.get(USER_PREFIX + projectList.getUserId()); if (userElement == null) { return; } if (userElement.getChildren(this) == null) { userElement.setHasChildren(projectList.size() != 0); if (!treeViewer.isBusy()) { treeViewer.refresh(userElement, true); } return; } HashSet<TreeElement> refreshTreeElements = new HashSet<TreeElement>(); refreshTreeElements.add(userElement); ArrayList<ProjectElement> toBeRemoved = new ArrayList<ProjectElement>(); for (TreeElement treeElement : userElement.getChildren(this)) { ProjectElement projectElement = (ProjectElement) treeElement; if (!projectList.containsKey(projectElement.getId())) { toBeRemoved.add(projectElement); } } for (ProjectElement projectElement : toBeRemoved) { userElement.removeChild(projectElement); refreshTreeElements.add(userElement); if (projectElement.getParent() == userElement) { projectElement.setParent(null); } } for (Integer projectId : projectList.keySet()) { ProjectListItem projectListItem = projectList.get(projectId); TreeElement projectElement = treeElementLookup.get(PROJECT_PREFIX + projectId); if (projectElement == null) { projectElement = new ProjectElement(projectId, (UserElement) userElement); userElement.setHasChildren(true); } projectElement.setParent(userElement); userElement.addChildIfChildrenAreLoaded(projectElement); projectElement.setNameDateAndHasChildren(projectListItem.getProject().getName(), 0, projectListItem.hasChildren()); treeElementLookup.put(PROJECT_PREFIX + projectId, projectElement); } if (!treeViewer.isBusy()) { for (TreeElement treeElement : refreshTreeElements) { treeViewer.refresh(treeElement, true); } } } @Override public void projectListGetError(int commandId, String message) { raiseError(message); removeWaitingReminder(commandId); } @Override public void sampleListGetCompleted(int commandId, SampleList sampleList) { TreeElement project = treeElementLookup.get(PROJECT_PREFIX + sampleList.getProjectId()); ArrayList<TreeElement> children = new ArrayList<TreeElement>(); for (Integer sampleId : sampleList.keySet()) { TreeElement sample = treeElementLookup.get(SAMPLE_PREFIX + sampleId); if (sample == null) { sample = new SampleElement(sampleId, (ProjectElement) project); treeElementLookup.put(SAMPLE_PREFIX + sampleId, sample); } sample.setParent(project); SampleListItem sampleListItem = sampleList.get(sampleId); sample.setNameDateAndHasChildren(sampleListItem.getSample().getName(), 0, sampleListItem.hasChildren()); children.add(sample); } project.setChildren(children); if (!treeViewer.isBusy()) { treeViewer.refresh(project, true); } removeWaitingReminder(commandId); } @Override public void sampleListUpdated(int commandId, SampleList sampleList) { if (waitingOnTreeElements.contains(PROJECT_PREFIX + sampleList.getProjectId())) { return; } TreeElement projectElement = treeElementLookup.get(PROJECT_PREFIX + sampleList.getProjectId()); if (projectElement == null) { return; } if (projectElement.getChildren(this) == null) { projectElement.setHasChildren(sampleList.size() != 0); if (!treeViewer.isBusy()) { treeViewer.refresh(projectElement, true); } return; } HashSet<TreeElement> refreshTreeElements = new HashSet<TreeElement>(); refreshTreeElements.add(projectElement); ArrayList<SampleElement> toBeRemoved = new ArrayList<SampleElement>(); for (TreeElement treeElement : projectElement.getChildren(this)) { SampleElement sampleElement = (SampleElement) treeElement; if (!sampleList.containsKey(sampleElement.getId())) { toBeRemoved.add(sampleElement); } } for (SampleElement sampleElement : toBeRemoved) { projectElement.removeChild(sampleElement); refreshTreeElements.add(projectElement); if (sampleElement.getParent() == projectElement) { sampleElement.setParent(null); } } for (Integer sampleId : sampleList.keySet()) { SampleListItem sampleListItem = sampleList.get(sampleId); TreeElement sampleElement = treeElementLookup.get(SAMPLE_PREFIX + sampleId); if (sampleElement == null) { sampleElement = new SampleElement(sampleId, (ProjectElement) projectElement); projectElement.setHasChildren(true); } sampleElement.setParent(projectElement); projectElement.addChildIfChildrenAreLoaded(sampleElement); sampleElement.setNameDateAndHasChildren(sampleListItem.getSample().getName(), 0, sampleListItem.hasChildren()); treeElementLookup.put(SAMPLE_PREFIX + sampleId, sampleElement); } if (!treeViewer.isBusy()) { for (TreeElement treeElement : refreshTreeElements) { treeViewer.refresh(treeElement, true); } } } @Override public void sampleListGetError(int commandId, String message) { raiseError(message); removeWaitingReminder(commandId); } @Override public void sampleListDeleted(int projectId) { //TODO how to handle this? } @Override public void replicateListGetCompleted(int commandId, ReplicateList replicateList) { int sampleId = replicateList.getSampleId(); TreeElement sample = treeElementLookup.get(SAMPLE_PREFIX + sampleId); ArrayList<TreeElement> children = new ArrayList<TreeElement>(); for (Integer replicateId : replicateList.keySet()) { TreeElement replicate = treeElementLookup.get(REPLICATE_PREFIX + replicateId); if (replicate == null) { replicate = new ReplicateElement(replicateId, (SampleElement) sample); treeElementLookup.put(REPLICATE_PREFIX + replicateId, replicate); } ReplicateListItem replicateListItem = replicateList.get(replicateId); replicate.setNameDateAndHasChildren(null, replicateListItem.getDate(), false); children.add(replicate); } sample.setChildren(children); if (!treeViewer.isBusy()) { treeViewer.refresh(sample, true); } removeWaitingReminder(commandId); } @Override public void replicateListUpdated(int commandId, ReplicateList replicateList) { if (waitingOnTreeElements.contains(SAMPLE_PREFIX + replicateList.getSampleId())) { return; } if (!replicateList.isGetSamples() || replicateList.getSampleId() == DatabaseConstants.EMPTY_DB_ID || replicateList.getMassSpecId() != DatabaseConstants.EMPTY_DB_ID || replicateList.getUserId() != DatabaseConstants.EMPTY_DB_ID) { return; } TreeElement sampleElement = treeElementLookup.get(SAMPLE_PREFIX + replicateList.getSampleId()); if (sampleElement == null) { return; } if (sampleElement.getChildren(this) == null) { sampleElement.setHasChildren(replicateList.size() != 0); if (!treeViewer.isBusy()) { treeViewer.refresh(sampleElement, true); } return; } ArrayList<ReplicateElement> toBeRemoved = new ArrayList<ReplicateElement>(); for (TreeElement treeElement : sampleElement.getChildren(this)) { ReplicateElement replicateElement = (ReplicateElement) treeElement; if (!replicateList.containsKey(replicateElement.getId())) { toBeRemoved.add(replicateElement); } } for (ReplicateElement replicateElement : toBeRemoved) { sampleElement.removeChild(replicateElement); // ReplicateElement savedReplicateElement = (ReplicateElement) treeElementLookup.get(REPLICATE_PREFIX + replicateElement.getId()); // // if (savedReplicateElement.getSampleElement() == sampleElement) { // treeElementLookup.remove(REPLICATE_PREFIX + replicateElement.getId()); // } } HashSet<Integer> alreadyHasIds = new HashSet<Integer>(); for (TreeElement treeElement : sampleElement.getChildren(this)) { alreadyHasIds.add(treeElement.getId()); } for (Integer replicateId : replicateList.keySet()) { if (alreadyHasIds.contains(replicateId)) { continue; } ReplicateListItem replicateListItem = replicateList.get(replicateId); ReplicateElement replicateElement = new ReplicateElement(replicateId, (SampleElement) sampleElement); replicateElement.setNameDateAndHasChildren(null, replicateListItem.getDate(), false); treeElementLookup.put(REPLICATE_PREFIX + replicateId, replicateElement); sampleElement.setHasChildren(true); sampleElement.addChildIfChildrenAreLoaded(replicateElement); } if (!treeViewer.isBusy()) { treeViewer.refresh(sampleElement, true); } } @Override public void replicateListGetError(int commandId, String message) { raiseError(message); removeWaitingReminder(commandId); } @Override public void loginInfoUpdated(int commandId, User user, Permissions permissions, Preferences preferences) { if (!waitingOnTreeElements.contains(ROOT)) { int userListGetCommandId = UserCache.getInstance().userListGet(SampleNavigator.this); addWaitingReminder(userListGetCommandId, ROOT); } } }