use of com.axelor.db.mapper.Property in project axelor-open-suite by axelor.
the class DataBackupCreateService method getCsvInputForDateorDateTime.
protected void getCsvInputForDateorDateTime(MetaModel metaModel, CSVInput csvInput) {
try {
Mapper metaModelMapper = Mapper.of(Class.forName(metaModel.getFullName()));
Property[] properties = metaModelMapper.getProperties();
for (Property property : properties) {
String propertyType = property.getType().toString();
if ((propertyType.equals("DATE") || propertyType.equals("DATETIME")) && !property.getName().equals("createdOn") && !property.getName().equals("updatedOn")) {
getDateOrDateTimeHeader(property, csvInput);
}
}
} catch (ClassNotFoundException e) {
TraceBackService.trace(e);
}
}
use of com.axelor.db.mapper.Property in project axelor-open-suite by axelor.
the class DataBackupCreateService method writeCSVData.
protected CSVInput writeCSVData(MetaModel metaModel, CSVWriter csvWriter, DataBackup dataBackup, long totalRecord, List<String> subClasses, String dirPath) {
CSVInput csvInput = new CSVInput();
boolean headerFlag = true;
List<String> dataArr;
List<String> headerArr = new ArrayList<>();
List<Model> dataList;
try {
Mapper metaModelMapper = Mapper.of(Class.forName(metaModel.getFullName()));
Property[] pro = metaModelMapper.getProperties();
Integer fetchLimit = dataBackup.getFetchLimit();
boolean isRelativeDate = dataBackup.getIsRelativeDate();
boolean updateImportId = dataBackup.getUpdateImportId();
csvInput.setFileName(metaModel.getName() + ".csv");
csvInput.setTypeName(metaModel.getFullName());
csvInput.setBindings(new ArrayList<>());
for (int i = 0; i < totalRecord; i = i + fetchLimit) {
dataList = getMetaModelDataList(metaModel, i, fetchLimit, subClasses);
if (dataList != null && !dataList.isEmpty()) {
for (Object dataObject : dataList) {
dataArr = new ArrayList<>();
for (Property property : pro) {
if (isPropertyExportable(property)) {
if (headerFlag) {
String headerStr = getMetaModelHeader(property, csvInput, isRelativeDate);
headerArr.add(headerStr);
}
dataArr.add(getMetaModelData(metaModel.getName(), metaModelMapper, property, dataObject, dirPath, isRelativeDate, updateImportId));
}
}
if (headerFlag) {
if (byteArrFieldFlag) {
csvInput.setCallable("com.axelor.apps.base.service.app.DataBackupRestoreService:importObjectWithByteArray");
byteArrFieldFlag = false;
}
csvWriter.writeNext(headerArr.toArray(new String[headerArr.size()]), true);
headerFlag = false;
}
csvWriter.writeNext(dataArr.toArray(new String[dataArr.size()]), true);
}
}
}
if (AutoImportModelMap.containsKey(csvInput.getTypeName())) {
csvInput.setSearch(AutoImportModelMap.get(csvInput.getTypeName()).toString());
} else if (Class.forName(metaModel.getFullName()).getSuperclass() == App.class) {
csvInput.setSearch("self.code = :code");
} else {
csvInput.setSearch("self.importId = :importId");
}
} catch (ClassNotFoundException e) {
}
return csvInput;
}
use of com.axelor.db.mapper.Property in project axelor-open-suite by axelor.
the class DataBackupCreateService method getQuery.
protected Query<Model> getQuery(MetaModel metaModel, List<String> subClasses) throws ClassNotFoundException {
StringBuilder whereStr = new StringBuilder();
if (subClasses != null && !subClasses.isEmpty()) {
for (String subClassName : subClasses) {
whereStr.append(whereStr.length() > 0 ? " AND " : "");
whereStr.append("id NOT IN (select id from ").append(subClassName).append(")");
}
}
@SuppressWarnings("unchecked") Class<Model> klass = (Class<Model>) Class.forName(metaModel.getFullName());
JpaRepository<Model> model = null;
Query<Model> query = null;
try {
model = JpaRepository.of(klass);
} catch (Exception e) {
TraceBackService.trace(e, DataBackupService.class.getName());
}
if (model != null) {
query = JpaRepository.of(klass).all();
if (StringUtils.notEmpty(whereStr.toString())) {
query.filter(whereStr.toString());
}
try {
Connection connection = DBHelper.getConnection();
DatabaseMetaData dbmd = connection.getMetaData();
List<Property> properties = model.fields();
for (Property property : properties) {
if (property.isRequired()) {
ResultSet res = dbmd.getColumns(null, null, metaModel.getTableName().toLowerCase(), property.getName().replaceAll("([^_A-Z])([A-Z])", "$1_$2").toLowerCase());
while (res.next()) {
if (res.getInt("NULLABLE") == 1) {
String strErr = "Required field issue in table: ";
sb.append(strErr).append("Model: " + metaModel.getName() + ", Field: " + property.getName() + "-----------------------------------------\n");
query = null;
}
}
}
}
connection.close();
} catch (SQLException | NamingException e) {
e.printStackTrace();
}
}
return query;
}
use of com.axelor.db.mapper.Property in project axelor-open-suite by axelor.
the class AppServiceImpl method refreshApp.
@Override
public void refreshApp() throws IOException {
File dataDir = Files.createTempDirectory(null).toFile();
File imgDir = new File(dataDir, "img");
imgDir.mkdir();
CSVConfig csvConfig = new CSVConfig();
csvConfig.setInputs(new ArrayList<>());
List<MetaModel> metaModels = metaModelRepo.all().filter("self.name != 'App' and self.name like 'App%' and self.packageName = ?1", App.class.getPackage().getName()).fetch();
final List<String> appFieldTargetList = Stream.of(JPA.fields(App.class)).filter(p -> p.getType() == PropertyType.ONE_TO_ONE).filter(p -> p.getName().startsWith("app")).map(Property::getTarget).map(Class::getName).collect(Collectors.toList());
log.debug("Total app models: {}", metaModels.size());
for (MetaModel metaModel : metaModels) {
if (!appFieldTargetList.contains(metaModel.getFullName())) {
log.debug("Not a App class : {}", metaModel.getName());
continue;
}
Class<?> klass;
try {
klass = Class.forName(metaModel.getFullName());
} catch (ClassNotFoundException e) {
continue;
}
Object obj = null;
Query query = JPA.em().createQuery("SELECT id FROM " + metaModel.getName());
try {
obj = query.setMaxResults(1).getSingleResult();
} catch (Exception ex) {
}
if (obj != null) {
continue;
}
log.debug("App without app record: {}", metaModel.getName());
String csvName = "base_" + inflector.camelize(klass.getSimpleName(), true) + ".csv";
String pngName = inflector.dasherize(klass.getSimpleName()) + ".png";
CSVInput input = new CSVInput();
input.setFileName(csvName);
input.setTypeName(App.class.getName());
input.setCallable("com.axelor.csv.script.ImportApp:importApp");
input.setSearch("self.code =:code");
input.setSeparator(';');
csvConfig.getInputs().add(input);
CSVInput appInput = new CSVInput();
appInput.setFileName(csvName);
appInput.setTypeName(klass.getName());
appInput.setSearch("self.app.code =:code");
appInput.setSeparator(';');
CSVBind appBind = new CSVBind();
appBind.setColumn("code");
appBind.setField("app");
appBind.setSearch("self.code = :code");
appInput.getBindings().add(appBind);
csvConfig.getInputs().add(appInput);
InputStream stream = klass.getResourceAsStream("/data-init/input/" + csvName);
copyStream(stream, new File(dataDir, csvName));
stream = klass.getResourceAsStream("/data-init/input/img/" + pngName);
copyStream(stream, new File(imgDir, pngName));
}
if (!csvConfig.getInputs().isEmpty()) {
CSVImporter importer = new CSVImporter(csvConfig, dataDir.getAbsolutePath());
importer.run();
}
}
use of com.axelor.db.mapper.Property in project axelor-open-suite by axelor.
the class WkfModelServiceImpl method getMetaModelRecordFilter.
@SuppressWarnings("unchecked")
private Object[] getMetaModelRecordFilter(WkfTaskConfig config, String modelName, User user) {
MetaModel metaModel = metaModelRepo.findByName(modelName);
String model = metaModel.getFullName();
String filter = "self.processInstanceId IN (:processInstanceIds)";
Class<Model> klass = null;
try {
klass = (Class<Model>) Class.forName(model);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (user != null) {
String path = config.getUserPath();
Property property = Mapper.of(klass).getProperty(path.split("\\.")[0]);
if (property == null) {
filter += " AND self.attrs." + path + ".id = '" + user.getId() + "'";
} else {
filter += " AND self." + path + ".id = " + user.getId();
}
}
return new Object[] { klass, filter };
}
Aggregations