/* * Constellation - An open source and standard compliant SDI * http://www.constellation-sdi.org * * Copyright 2014 Geomatys. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.constellation.process.provider; import static org.constellation.process.provider.CreateProviderDescriptor.PROVIDER_TYPE; import static org.constellation.process.provider.CreateProviderDescriptor.SOURCE; import static org.geotoolkit.parameter.Parameters.getOrCreate; import static org.geotoolkit.parameter.Parameters.value; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.constellation.configuration.ConfigurationException; import org.constellation.process.AbstractCstlProcess; import org.constellation.provider.DataProvider; import org.constellation.provider.DataProviderFactory; import org.constellation.provider.DataProviders; import org.constellation.provider.Provider; import org.constellation.provider.ProviderFactory; import org.constellation.provider.StyleProvider; import org.constellation.provider.StyleProviderFactory; import org.constellation.provider.StyleProviders; import org.geotoolkit.process.ProcessDescriptor; import org.geotoolkit.process.ProcessException; import org.opengis.parameter.ParameterValue; import org.opengis.parameter.ParameterValueGroup; import org.springframework.transaction.annotation.Transactional; /** * Create a new provider in constellation. * @author Quentin Boileau (Geomatys). */ public final class CreateProvider extends AbstractCstlProcess { public CreateProvider(final ProcessDescriptor desc, final ParameterValueGroup parameter) { super(desc, parameter); } /** * Quick process constructor * @param providerType * @param source * @param domainId */ public CreateProvider (final String providerType, ParameterValueGroup source, final Integer domainId) { this(CreateProviderDescriptor.INSTANCE, toParameters(providerType, source, domainId)); } private static ParameterValueGroup toParameters(final String providerType, ParameterValueGroup source, final Integer domainId){ final ParameterValueGroup params = CreateProviderDescriptor.INSTANCE.getInputDescriptor().createValue(); getOrCreate(CreateProviderDescriptor.PROVIDER_TYPE, params).setValue(providerType); getOrCreate(CreateProviderDescriptor.SOURCE, params).setValue(source); getOrCreate(CreateProviderDescriptor.DOMAIN_ID, params).setValue(domainId); return params; } @Override @Transactional protected void execute() throws ProcessException { final String providerType = value(PROVIDER_TYPE, inputParameters); final ParameterValueGroup source = value(SOURCE, inputParameters); //initialize list of available Provider services final Map<String, ProviderFactory> services = new HashMap<>(); final Collection<DataProviderFactory> availableLayerServices = DataProviders.getInstance().getFactories(); for (DataProviderFactory service: availableLayerServices) { services.put(service.getName(), service); } final Collection<StyleProviderFactory> availableStyleServices = StyleProviders.getInstance().getFactories(); for (StyleProviderFactory service: availableStyleServices) { services.put(service.getName(), service); } final ProviderFactory service = services.get(providerType); if (service != null) { //check no other provider with this id exist final String id = (String) source.parameter("id").getValue(); //LayerProvider case if (service instanceof DataProviderFactory) { final Collection<DataProvider> layerProviders = DataProviders.getInstance().getProviders(); for (final DataProvider lp : layerProviders) { if (id.equals(lp.getId())) { throw new ProcessException("Provider ID is already used : " + id, this, null); } } source.parameter("date").setValue(new Date()); try { final ParameterValue pv = source.parameter("create_dataset"); if(pv != null){ final Object objBool = pv.getValue(); if(objBool instanceof Boolean){ final Boolean bool = (Boolean) objBool; DataProviders.getInstance().createProvider(id, (DataProviderFactory) service, source, null,bool); }else { DataProviders.getInstance().createProvider(id, (DataProviderFactory) service, source, null); } }else { DataProviders.getInstance().createProvider(id, (DataProviderFactory) service, source, null); } } catch (ConfigurationException ex) { throw new ProcessException("Failed to create provider : " + id+" "+ex.getMessage(), this, ex); } } //StyleProvider case if (service instanceof StyleProviderFactory) { final Collection<StyleProvider> styleProviders = StyleProviders.getInstance().getProviders(); for (final Provider sp : styleProviders) { if (id.equals(sp.getId())) { throw new ProcessException("Provider ID is already used : " + id, this, null); } } try { StyleProviders.getInstance().createProvider(id, (StyleProviderFactory) service, source); } catch (ConfigurationException ex) { throw new ProcessException("Failed to create provider : " + id+" "+ex.getMessage(), this, ex); } } } else { throw new ProcessException("Provider type not found:" + providerType, this, null); } } }