/*
* 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.admin;
import java.util.List;
import javax.inject.Inject;
import javax.xml.namespace.QName;
import org.constellation.business.ISensorBusiness;
import org.constellation.configuration.TargetNotFoundException;
import org.constellation.database.api.jooq.tables.pojos.CstlUser;
import org.constellation.database.api.jooq.tables.pojos.Data;
import org.constellation.database.api.jooq.tables.pojos.Sensor;
import org.constellation.database.api.repository.DataRepository;
import org.constellation.database.api.repository.SensorRepository;
import org.constellation.database.api.repository.UserRepository;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.base.Optional;
import java.util.Date;
@Component
@Primary
public class SensorBusiness implements ISensorBusiness {
@Inject
private UserRepository userRepository;
@Inject
private SensorRepository sensorRepository;
@Inject
private org.constellation.security.SecurityManager securityManager;
@Inject
private DataRepository dataRepository;
@Override
public Sensor getSensor(final String id) {
return sensorRepository.findByIdentifier(id);
}
@Override
public List<Sensor> getAll() {
return sensorRepository.findAll();
}
@Override
public List<Data> getLinkedData(final Sensor sensor){
return sensorRepository.getLinkedDatas(sensor);
}
@Override
public List<Sensor> getChildren(final Sensor sensor) {
return sensorRepository.getChildren(sensor);
}
@Override
@Transactional
public void delete(final String identifier) {
sensorRepository.delete(identifier);
}
@Override
@Transactional
public void linkDataToSensor(QName dataName, String providerId, String sensorIdentifier) {
final Data data = dataRepository.findDataFromProvider(dataName.getNamespaceURI(), dataName.getLocalPart(), providerId);
final Sensor sensor = sensorRepository.findByIdentifier(sensorIdentifier);
sensorRepository.linkDataToSensor(data.getId(),sensor.getId());
}
/**
* Proceed to remove the link between data and sensor.
*
* @param dataName given data name to find the data instance.
* @param providerId given provider identifier for data.
* @param sensorIdentifier given sensor identifier that will be unlinked.
*/
@Override
@Transactional
public void unlinkDataToSensor(final QName dataName,
final String providerId,
final String sensorIdentifier) throws TargetNotFoundException {
final Data data = dataRepository.findDataFromProvider(
dataName.getNamespaceURI(),
dataName.getLocalPart(),
providerId);
final Sensor sensor = sensorRepository.findByIdentifier(sensorIdentifier);
if(data == null){
throw new TargetNotFoundException("Cannot unlink data to sensor," +
" because target data is not found for" +
" name : "+dataName.getLocalPart()+" and provider : "+providerId);
}
if(sensor == null){
throw new TargetNotFoundException("Cannot unlink data to sensor," +
" because target sensor is not found for" +
" sensorIdentifier : "+sensorIdentifier);
}
sensorRepository.unlinkDataToSensor(data.getId(),sensor.getId());
}
public Sensor create(final String identifier, final String type, final String parent) {
return create(identifier,type,parent,null);
}
@Override
@Transactional
public Sensor create(final String identifier, final String type, final String parent, final String metadata) {
return create(identifier, type, parent, metadata, null);
}
@Override
@Transactional
public Sensor create(final String identifier, final String type, final String parent, final String metadata, final Long date) {
Optional<CstlUser> user = userRepository.findOne(securityManager.getCurrentUserLogin());
Sensor sensor = new Sensor();
sensor.setIdentifier(identifier);
sensor.setType(type);
if(user.isPresent()) {
sensor.setOwner(user.get().getId());
}
sensor.setParent(parent);
sensor.setMetadata(metadata);
sensor.setDate(date);
return sensorRepository.create(sensor);
}
@Override
@Transactional
public void update(Sensor sensor) {
sensorRepository.update(sensor);
}
}