blob: c48c0a1c45de6a7fdf80bf2df7b8e89b4c7fbdfb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency
* All rights reserved. This program and the accompanying materials
* are 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:
* Pierre Allard,
* Regent L'Archeveque - initial API and implementation
*
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.core.topology.impl;
import org.eclipse.apogy.core.ApogyCoreFactory;
import org.eclipse.apogy.core.ResultsListNode;
import org.eclipse.apogy.core.environment.AbstractWorksite;
import org.eclipse.apogy.core.environment.ApogyCoreEnvironmentPackage;
import org.eclipse.apogy.core.environment.ApogyEnvironment;
import org.eclipse.apogy.core.environment.Worksite;
import org.eclipse.apogy.core.environment.WorksiteNode;
import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorPackage;
import org.eclipse.apogy.core.invocator.Context;
import org.eclipse.apogy.core.invocator.ResultsList;
import org.eclipse.apogy.core.topology.ApogyCoreTopologyFactory;
import org.eclipse.apogy.core.topology.ApogySystemAPIsNode;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
public class ApogyEnvironmentNodeCustomImpl extends ApogyEnvironmentNodeImpl {
private Adapter adapter = null;
@Override
public void setApogyEnvironment(ApogyEnvironment newApogyEnvironment) {
updateApogyEnvironment(getApogyEnvironment(), newApogyEnvironment);
super.setApogyEnvironment(newApogyEnvironment);
}
public void setWorksiteNode(WorksiteNode newWorksiteNode) {
// Detach previous worksite node if applicable.
if (getWorksiteNode() != null)
getChildren().remove(getWorksiteNode());
// Attache new worksite node if applicable.
if (newWorksiteNode != null)
getChildren().add(newWorksiteNode);
super.setWorksiteNode(newWorksiteNode);
}
@Override
public ResultsListNode getResultsListNode() {
if (super.getResultsListNode() == null) {
this.resultsListNode = ApogyCoreFactory.eINSTANCE.createResultsListNode();
this.resultsListNode.setDescription("Results" + getNodeId());
this.resultsListNode.setNodeId("RESULTS");
// Attaches the results.
getReferencedChildren().add(this.resultsListNode);
this.resultsListNode.setParent(this);
}
return super.getResultsListNode();
}
@Override
public ApogySystemAPIsNode getApogySystemAPIsNode() {
if (super.getApogySystemAPIsNode() == null) {
this.apogySystemAPIsNode = ApogyCoreTopologyFactory.eINSTANCE.createApogySystemAPIsNode();
this.apogySystemAPIsNode.setNodeId("APOGY_SYSTEMS");
this.apogySystemAPIsNode.setDescription("Root node of all Apogy Systems topologies.");
// Attaches the Systems
getChildren().add(this.apogySystemAPIsNode);
this.apogySystemAPIsNode.setApogyEnvironment(getApogyEnvironment());
}
return super.getApogySystemAPIsNode();
}
@Override
public void dispose() {
setApogyEnvironment(null);
getWorksiteNode().setWorksite(null);
setWorksiteNode(null);
getResultsListNode().setResultsList(null);
getApogySystemAPIsNode().setApogyEnvironment(null);
getChildren().clear();
}
private void updateApogyEnvironment(ApogyEnvironment oldApogyEnvironment, ApogyEnvironment newApogyEnvironment) {
ResultsList oldResultsList = null;
ResultsList newResultsList = null;
AbstractWorksite oldWorksite = null;
AbstractWorksite newWorksite = null;
if (oldApogyEnvironment != null) {
// Unregister from old environment, if applicable.
oldApogyEnvironment.eAdapters().remove(getAdapter());
// Gets the old worksite.
oldWorksite = oldApogyEnvironment.getActiveWorksite();
// If the Context was set
if (oldApogyEnvironment.getActiveContext() != null) {
if (oldApogyEnvironment.getActiveContext().getDataProductsList() != null) {
oldResultsList = oldApogyEnvironment.getActiveContext().getDataProductsList()
.getOperationCallResultsList();
}
}
}
// Sets up the newEnvironement
if (newApogyEnvironment != null) {
if (newApogyEnvironment.getName() != null) {
setNodeId(newApogyEnvironment.getName());
}
setDescription("Apogy Environment Node");
setNodeId("APOGY_ENVIRONMENT");
// Gets the new Worksite.
newWorksite = newApogyEnvironment.getActiveWorksite();
// Register listener to the new ApogyEnvironment.
newApogyEnvironment.eAdapters().add(getAdapter());
// If the context is set.
if (newApogyEnvironment.getActiveContext() != null) {
newResultsList = newApogyEnvironment.getActiveContext().getDataProductsList()
.getOperationCallResultsList();
}
}
// Updates Result list.
updateResultLists(oldResultsList, newResultsList);
// Updates Worksite
updateWorksite(oldWorksite, newWorksite);
// Updates the Systems.
updateSystems(oldApogyEnvironment, newApogyEnvironment);
}
private void updateContext(Context oldContext, Context newContext) {
ResultsList oldResultsList = null;
ResultsList newResultsList = null;
if (oldContext != null) {
// Unregister from previous Context,
oldContext.eAdapters().remove(getAdapter());
// Gets old ResultsList.
if (oldContext.getDataProductsList() != null) {
oldResultsList = oldContext.getDataProductsList().getOperationCallResultsList();
}
}
if (newContext != null) {
// Register to new Context.
newContext.eAdapters().add(getAdapter());
// Gets new ResultsList.
if (newContext.getDataProductsList() != null) {
newResultsList = newContext.getDataProductsList().getOperationCallResultsList();
}
}
// Updates Results.
updateResultLists(oldResultsList, newResultsList);
}
private void updateSystems(ApogyEnvironment oldApogyEnvironment, ApogyEnvironment newApogyEnvironment) {
getApogySystemAPIsNode().setApogyEnvironment(newApogyEnvironment);
}
private void updateResultLists(ResultsList oldResultsList, ResultsList newResultsList) {
if (oldResultsList != null)
oldResultsList.eAdapters().remove(getAdapter());
if (newResultsList != null)
newResultsList.eAdapters().add(getAdapter());
// Updates the getResultsListNode ResultList.
getResultsListNode().setResultsList(newResultsList);
}
private void updateWorksite(AbstractWorksite oldWorksite, AbstractWorksite newWorksite) {
// Updates the WorksiteNode worksite if applicable.
if (newWorksite instanceof Worksite) {
Worksite worksite = (Worksite) newWorksite;
setWorksiteNode(worksite.getWorksiteNode());
} else {
// Clears worksite.
setWorksiteNode(null);
}
}
protected Adapter getAdapter() {
if (this.adapter == null) {
this.adapter = new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
super.notifyChanged(msg);
if (msg.getNotifier() instanceof ApogyEnvironment) {
if (msg.getFeatureID(
ApogyEnvironment.class) == ApogyCoreEnvironmentPackage.APOGY_ENVIRONMENT__ACTIVE_CONTEXT) {
// Active Context has changed.
Context oldContext = (Context) msg.getOldValue();
Context newContext = (Context) msg.getOldValue();
updateContext(oldContext, newContext);
} else if (msg.getFeatureID(
ApogyEnvironment.class) == ApogyCoreEnvironmentPackage.APOGY_ENVIRONMENT__ACTIVE_WORKSITE) {
// Active Worksite has changed.
AbstractWorksite oldWorksite = (AbstractWorksite) msg.getOldValue();
AbstractWorksite newWorksite = (AbstractWorksite) msg.getNewValue();
updateWorksite(oldWorksite, newWorksite);
}
} else if (msg.getNotifier() instanceof Context) {
if (msg.getFeatureID(Context.class) == ApogyCoreInvocatorPackage.CONTEXT__DATA_PRODUCTS_LIST) {
// ResultsList has changed.
ResultsList oldResultsList = (ResultsList) msg.getOldValue();
ResultsList newResultsList = (ResultsList) msg.getNewValue();
updateResultLists(oldResultsList, newResultsList);
}
}
}
};
}
return this.adapter;
}
} // DeploymentNodeImpl