138 lines
5.1 KiB
Java
138 lines
5.1 KiB
Java
package org.gcube.application.perform.service.engine;
|
|
|
|
import java.sql.Connection;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.util.UUID;
|
|
|
|
import org.gcube.application.perform.service.LocalConfiguration;
|
|
import org.gcube.application.perform.service.engine.model.BeanNotFound;
|
|
import org.gcube.application.perform.service.engine.model.DBField;
|
|
import org.gcube.application.perform.service.engine.model.DBQueryDescriptor;
|
|
import org.gcube.application.perform.service.engine.model.DBType;
|
|
import org.gcube.application.perform.service.engine.model.ISQueryDescriptor;
|
|
import org.gcube.application.perform.service.engine.model.anagraphic.Batch;
|
|
import org.gcube.application.perform.service.engine.model.anagraphic.Farm;
|
|
|
|
import lombok.Synchronized;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@Slf4j
|
|
public class MappingManagerImpl implements MappingManager {
|
|
|
|
|
|
private static final String INSERT_BATCH="INSERT INTO batches (id,uuid,farmid,type,name) VALUES (SELECT (max(id)+1 from batches),?,?,?,?) ON CONFLICT DO NOTHING";
|
|
private static final String GET_BATCH_BY_ID="Select * from batches where id = ?";
|
|
private static final String GET_BATCH_BY_DESCRIPTIVE_KEY="Select * from batches where farmid=? AND type=? AND name= ?";
|
|
|
|
|
|
private static final String GET_FARM_BY_ID=String.format("SELECT f.farmid as $1%s, f.uuid as %2$s, c.companyid as %3$s, c.uuid as %4$s, a.associationid as %5$s, a.uuid as %6$s FROM "
|
|
+ "farms as f INNER JOIN companies as c ON f.companyid=c.companyid INNER JOIN associations as a ON c.associationid=a.associationid WHERE f.farmid = ?",
|
|
DBField.Farm.FARM_ID,DBField.Farm.UUID,DBField.Farm.COMPANY_ID,DBField.Farm.COMPANY_UUID,DBField.Farm.ASSOCIATION_ID,DBField.Farm.ASSOCIATION_UUID);
|
|
|
|
|
|
private static ISQueryDescriptor isQueryDescriptor=null;
|
|
|
|
|
|
public MappingManagerImpl() {
|
|
|
|
}
|
|
|
|
@Synchronized
|
|
private ISQueryDescriptor getISQueryDescriptor() {
|
|
if(isQueryDescriptor==null) {
|
|
isQueryDescriptor=
|
|
new ISQueryDescriptor(DBType.Anagraphic,
|
|
LocalConfiguration.getProperty(LocalConfiguration.MAPPING_DB_ENDPOINT_NAME), null,
|
|
LocalConfiguration.getProperty(LocalConfiguration.MAPPING_DB_ENDPOINT_CATEGORY));
|
|
}
|
|
return isQueryDescriptor;
|
|
}
|
|
|
|
|
|
@Override
|
|
public Batch getBatch(DBQueryDescriptor desc) throws BeanNotFound,SQLException{
|
|
DataBaseManager db=DataBaseManager.get(getISQueryDescriptor());
|
|
|
|
String type=desc.getCondition().get(DBField.Batch.fields.get(DBField.Batch.BATCH_TYPE));
|
|
String name=desc.getCondition().get(DBField.Batch.fields.get(DBField.Batch.BATCH_NAME));
|
|
Long farmid=Long.parseLong(desc.getCondition().get(DBField.Batch.fields.get(DBField.Batch.FARM_ID)));
|
|
|
|
Connection conn=db.getConnection();
|
|
PreparedStatement psSearch=conn.prepareStatement(GET_BATCH_BY_DESCRIPTIVE_KEY);
|
|
psSearch.setLong(1, farmid);
|
|
psSearch.setString(2, type);
|
|
psSearch.setString(3, name);
|
|
ResultSet rs=psSearch.executeQuery();
|
|
|
|
if(rs.next())
|
|
return rowToBatch(rs);
|
|
|
|
// ID NOT FOUND, TRY TO REGISTER IT
|
|
|
|
log.trace("Registering new Batch [name {} , type {}, farmid {} ] ",name,type,farmid);
|
|
PreparedStatement psInsert=conn.prepareStatement(INSERT_BATCH);
|
|
psInsert.setString(1, UUID.randomUUID().toString());
|
|
psInsert.setLong(2,farmid);
|
|
psInsert.setString(3, type);
|
|
psInsert.setString(4, name);
|
|
|
|
boolean inserted=psInsert.executeUpdate()==1;
|
|
if(inserted) {
|
|
conn.commit();
|
|
log.trace("Committed Batch.");
|
|
}
|
|
rs=psSearch.executeQuery();
|
|
|
|
if(rs.next())
|
|
return rowToBatch(rs);
|
|
else throw new BeanNotFound(String.format("Unable to find Bean [farmid=%1$d, type=%2$s,name=%3$s]",farmid,type,name));
|
|
|
|
}
|
|
|
|
@Override
|
|
public Farm getFarm(DBQueryDescriptor desc) throws BeanNotFound,SQLException{
|
|
DataBaseManager db=DataBaseManager.get(getISQueryDescriptor());
|
|
|
|
|
|
Connection conn=db.getConnection();
|
|
PreparedStatement psGet=null;
|
|
DBField IDField=DBField.Farm.fields.get(DBField.Farm.FARM_ID);
|
|
if(desc.getCondition().containsKey(IDField)) {
|
|
// get By ID
|
|
psGet=conn.prepareStatement(GET_FARM_BY_ID);
|
|
psGet.setLong(1,Long.parseLong(desc.getCondition().get(IDField)));
|
|
}
|
|
|
|
ResultSet rs=psGet.executeQuery();
|
|
if(!rs.next())
|
|
throw new BeanNotFound("Farm not found. Condition was "+desc);
|
|
|
|
return rowToFarm(rs);
|
|
}
|
|
|
|
|
|
|
|
private static Batch rowToBatch(ResultSet rs) throws SQLException {
|
|
Batch toReturn=new Batch();
|
|
toReturn.setFarmId(rs.getLong(DBField.Batch.FARM_ID));
|
|
toReturn.setId(rs.getLong(DBField.Batch.BATCH_ID));
|
|
toReturn.setName(rs.getString(DBField.Batch.BATCH_NAME));
|
|
toReturn.setType(rs.getString(DBField.Batch.BATCH_TYPE));
|
|
return toReturn;
|
|
}
|
|
|
|
|
|
private static Farm rowToFarm(ResultSet rs) throws SQLException {
|
|
Farm toReturn=new Farm();
|
|
toReturn.setAssociationId(rs.getLong(DBField.Farm.ASSOCIATION_ID));
|
|
toReturn.setAssociationUUID(rs.getString(DBField.Farm.ASSOCIATION_UUID));
|
|
toReturn.setCompanyId(rs.getLong(DBField.Farm.COMPANY_ID));
|
|
toReturn.setCompanyUUID(rs.getString(DBField.Farm.COMPANY_UUID));
|
|
toReturn.setId(rs.getLong(DBField.Farm.FARM_ID));
|
|
toReturn.setUUID(rs.getString(DBField.Farm.UUID));
|
|
return toReturn;
|
|
}
|
|
}
|