/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.constellation.process.service;
import org.constellation.process.AbstractCstlProcess;
import org.constellation.provider.DataProvider;
import org.constellation.provider.DataProviders;
import org.constellation.provider.coveragesgroup.CoveragesGroupProvider;
import org.constellation.provider.coveragesgroup.xml.*;
import org.geotoolkit.process.ProcessException;
import org.opengis.parameter.ParameterValueGroup;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.constellation.process.service.AddDataToMapContextDescriptor.*;
import org.geotoolkit.util.NamesExt;
import static org.geotoolkit.parameter.Parameters.getOrCreate;
import org.opengis.util.GenericName;
/**
*
* @author guilhem
*/
public class AddDataToMapContext extends AbstractCstlProcess {
public AddDataToMapContext(final ParameterValueGroup input) {
super(INSTANCE,input);
}
/**
* Quick constructor
* @param providerID
* @param groupName
* @param layerName
* @param layerProvider
* @param layerStyle
*/
public AddDataToMapContext (final String providerID, final String groupName, final String layerName,
final String layerProvider, final StyleReference layerStyle) {
this(toParameters(providerID, groupName, layerName, layerProvider, layerStyle));
}
private static ParameterValueGroup toParameters(final String providerID, final String groupName, final String layerName,
final String layerProvider, final StyleReference layerStyle){
final ParameterValueGroup params = INSTANCE.getInputDescriptor().createValue();
getOrCreate(CONTEXT_PROVIDER_ID, params).setValue(providerID);
getOrCreate(CONTEXT_NAME, params).setValue(groupName);
getOrCreate(DATA_NAME, params).setValue(layerName);
getOrCreate(DATA_PROVIDER_ID, params).setValue(layerProvider);
getOrCreate(LAYER_STYLE, params).setValue(layerStyle);
return params;
}
@Override
protected void execute() throws ProcessException {
fireProcessStarted("Start Add to map Context");
final String providerID = getOrCreate(CONTEXT_PROVIDER_ID, inputParameters).stringValue();
final String groupName = getOrCreate(CONTEXT_NAME, inputParameters).stringValue();
final String layerName = getOrCreate(DATA_NAME, inputParameters).stringValue();
final String layerProvider = getOrCreate(DATA_PROVIDER_ID, inputParameters).stringValue();
final StyleReference layerStyle = (StyleReference) getOrCreate(LAYER_STYLE, inputParameters).getValue();
final DataProvider p = DataProviders.getInstance().getProvider(providerID);
if (p != null && p instanceof CoveragesGroupProvider) {
final CoveragesGroupProvider coveragesGroupProvider = (CoveragesGroupProvider) p;
final DataReference dataRef = new DataReference("${providerLayerType|" + layerProvider + "|" + layerName + "}");
final MapLayer layer = new MapLayer(dataRef, layerStyle);
try {
final GenericName key = NamesExt.create(groupName);
MapContext rawMapContext = coveragesGroupProvider.getRawMapContext(key);
if (rawMapContext != null) {
rawMapContext.getMapItem().getMapItems().add(layer);
} else {
final List<MapItem> items = new ArrayList<>();
items.add(layer);
final MapItem item = new MapItem(items);
rawMapContext = new MapContext(item, groupName);
}
coveragesGroupProvider.addRawMapContext(key, rawMapContext);
DataProviders.getInstance().getProvider(providerID).reload();
} catch (JAXBException | IOException ex) {
throw new ProcessException("JAXB error during add data to map context", this, ex);
}
} else {
throw new ProcessException("Unable to find a provider:" + providerID, this, null);
}
}
}