/******************************************************************************* * Copyright (c) 2016 Red Hat, Inc. Distributed under license by Red Hat, Inc. * All rights reserved. This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, and is * available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.openshift.internal.ui.wizard.resource; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.ObjectUtils; import org.jboss.tools.common.databinding.ObservablePojo; import org.jboss.tools.openshift.core.connection.Connection; import org.jboss.tools.openshift.internal.ui.treeitem.ObservableTreeItem; import org.jboss.tools.openshift.internal.ui.utils.ObservableTreeItemUtils; import com.openshift.restclient.model.IProject; /** * @author Jeff Maury * @author Andre Dietisheim */ public class NewResourceWizardModel extends ObservablePojo implements IResourcePayloadPageModel { private Connection connection; private IProject project; private List<ObservableTreeItem> projectItems = new ArrayList<>(); private String source; private Comparator<ObservableTreeItem> comparator; /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.common.IProjectPageModel#loadResources() */ @Override public void loadResources() { if (connection == null) { return; } ObservableTreeItem connectionItem = ProjectTreeItems.INSTANCE.create(connection); connectionItem.load(); List<ObservableTreeItem> projects = connectionItem.getChildren(); setProjectItems(projects); } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.common.ui.wizard.IConnectionAware#getConnection() */ @Override public Connection getConnection() { return connection; } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.common.ui.wizard.IConnectionAware#hasConnection() */ @Override public boolean hasConnection() { return connection != null; } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.common.ui.wizard.IConnectionAware#setConnection(org.jboss.tools.openshift.common.core.connection.IConnection) */ @Override public void setConnection(Connection connection) { if (ObjectUtils.equals(connection, this.connection)) { return; } firePropertyChange(PROPERTY_CONNECTION, this.connection, this.connection = connection); } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.common.ui.wizard.IConnectionAware#getContext() */ @Override public Object getContext() { return null; } private void update(IProject project, List<ObservableTreeItem> projectItems, String source) { updateProjectItems(projectItems); firePropertyChange(PROPERTY_PROJECT, this.project, this.project = getDefaultProject(project, projectItems)); firePropertyChange(PROPERTY_SOURCE, this.source, this.source = source); } private IProject getDefaultProject(IProject project, List<ObservableTreeItem> projectItems) { if (CollectionUtils.isEmpty(projectItems)) { return null; } if (project == null || !ObservableTreeItemUtils.contains(project, projectItems)) { if (comparator != null) { Collections.sort(projectItems, comparator); } project = ObservableTreeItemUtils.getFirstModel(IProject.class, projectItems); } return project; } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.common.IProjectAware#getProject() */ @Override public IProject getProject() { //System.out.println("getProject return " + project.hashCode()); return project; } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.common.IProjectAware#setProject(com.openshift.restclient.model.IProject) */ @Override public void setProject(IProject project) { update(project, this.projectItems, this.source); } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.common.IProjectAware#getProjectItems() */ @Override public List<ObservableTreeItem> getProjectItems() { return projectItems; } private void updateProjectItems(List<ObservableTreeItem> projectItems) { List<ObservableTreeItem> oldItems = new ArrayList<>(this.projectItems); // ensure we're not operating on the same list List<ObservableTreeItem> newItems = new ArrayList<>(); if (projectItems != null) { newItems.addAll(projectItems); } this.projectItems.clear(); this.projectItems.addAll(newItems); firePropertyChange(PROPERTY_PROJECT_ITEMS, oldItems, this.projectItems); } private IProject checkProject(IProject project, List<ObservableTreeItem> projects) { if (projects != null) { return (IProject) projects.stream().map(o -> o.getModel()) .filter(model -> ObjectUtils.equals(project, model)) .findFirst() .orElse(null); } else { return null; } } public void setProjectItems(List<ObservableTreeItem> projectItems) { update(checkProject(this.project, projectItems), projectItems, this.source); } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.common.IProjectAware#hasProjects() */ @Override public boolean hasProjects() { return projectItems != null && !projectItems.isEmpty(); } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.resource.IResourcePayloadPageModel#setLocalSourceFileName(java.lang.String) */ @Override public void setSource(String source) { update(this.project, this.projectItems, source); } /* (non-Javadoc) * @see org.jboss.tools.openshift.internal.ui.wizard.resource.IResourcePayloadPageModel#getLocalSourceFileName() */ @Override public String getSource() { return source; } @Override public void setProjectsComparator(Comparator<ObservableTreeItem> comparator) { this.comparator = comparator; } }