/**
* Copyright © 2015 Pablo Grela Palleiro (pablogp_9@hotmail.com)
*
* 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.cuacfm.members.model.programservice;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.cuacfm.members.model.account.Account;
import org.cuacfm.members.model.accountservice.AccountService;
import org.cuacfm.members.model.program.Program;
import org.cuacfm.members.model.program.ProgramCategory;
import org.cuacfm.members.model.program.ProgramLanguage;
import org.cuacfm.members.model.program.ProgramThematic;
import org.cuacfm.members.model.program.ProgramType;
import org.cuacfm.members.model.util.DateUtils;
import org.cuacfm.members.model.util.FileUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* The Class JsonToProgram.
*/
@Service("jsonToProgram")
public class JsonToProgram {
private static final Logger logger = LoggerFactory.getLogger(JsonToProgram.class);
private static final int MAX_AREA = 500;
private static final int MAX_CHARACTERS = 50;
private static final int MAX_DNI = 10;
private static final int MAX_NUMBER = 20;
@Value("${formPrograms}")
private String formPrograms;
@Autowired
private ProgramService programService;
@Autowired
private AccountService accountService;
/**
* Parser.
*
* @param pathJsonToAccount the path json to account
* @throws Exception the exception
*/
@SuppressWarnings("unchecked")
public void parser(String pathJsonToAccount) throws Exception {
logger.info("parser");
JSONParser parser = new JSONParser();
Object obj = parser.parse(new InputStreamReader(new FileInputStream(pathJsonToAccount), StandardCharsets.UTF_8));
JSONObject jsonObject = (JSONObject) obj;
JSONArray solutions = (JSONArray) jsonObject.get(formPrograms);
Iterator<JSONObject> iterator = solutions.iterator();
while (iterator.hasNext()) {
JSONObject jsonObjectRow = iterator.next();
String dateString = FileUtils.split((String) jsonObjectRow.get("dateCreate"), MAX_CHARACTERS);
String[] dateConvert = dateString.split("GMT");
Date dateCreate = DateUtils.format(dateConvert[0].trim(), "E MMM dd yyyy HH:mm:ss", Locale.ENGLISH);
String name = FileUtils.split((String) jsonObjectRow.get("name"), MAX_CHARACTERS);
String description = FileUtils.split((String) jsonObjectRow.get("description"), MAX_AREA);
description = description + "\n" + FileUtils.split((String) jsonObjectRow.get("hour"), MAX_AREA);
Float periodicity = FileUtils.getFloat((String) jsonObjectRow.get("periodicity"));
Integer duration = FileUtils.getInteger((String) jsonObjectRow.get("duration"));
// Conseguir los miembros, mejor sacar la relacion de programName, dentro de accounts.json
// String members = FileUtils.split((String) jsonObjectRow.get("accounts"), MAX_CHARACTERS);
List<Account> accounts = getMembers(name);
String programLanguageName = FileUtils.split((String) jsonObjectRow.get("programLanguage"), MAX_DNI);
ProgramLanguage programLanguage = programService.findProgramLanguageByName(programLanguageName);
String programTypeName = FileUtils.split((String) jsonObjectRow.get("programType"), MAX_NUMBER);
ProgramType programType = programService.findProgramTypeByName(programTypeName);
// Hay mas de un programThematic en el json, pero solo cojo el primero
String programThematicName = FileUtils.split((String) jsonObjectRow.get("programThematic"), MAX_NUMBER);
String[] programThematicName1 = programThematicName.split(",");
ProgramThematic programThematic = programService.findProgramThematicByName(programThematicName1[0].trim());
String programCategoryName = FileUtils.split((String) jsonObjectRow.get("programCategory"), MAX_NUMBER);
ProgramCategory programCategory = programService.findProgramCategoryByName(programCategoryName);
String email = FileUtils.split((String) jsonObjectRow.get("email"), MAX_CHARACTERS).trim();
String twitter = FileUtils.split((String) jsonObjectRow.get("twitter"), MAX_CHARACTERS).trim();
String facebook = FileUtils.split((String) jsonObjectRow.get("facebook"), MAX_CHARACTERS).trim();
String podcast = FileUtils.split((String) jsonObjectRow.get("podcast"), MAX_CHARACTERS).trim();
String web = FileUtils.split((String) jsonObjectRow.get("web"), MAX_CHARACTERS).trim();
Boolean active = FileUtils.getBoolean((String) jsonObjectRow.get("active"));
String accountPayerName = FileUtils.split((String) jsonObjectRow.get("accountPayer"), MAX_CHARACTERS);
Account accountPayer = accountService.findByEmail(accountPayerName);
try {
Program programAux = programService.findByName(name);
//UPDATE
if (programAux != null) {
programAux.setName(FileUtils.changeValue(programAux.getName(), name));
programAux.setDescription(FileUtils.changeValue(programAux.getDescription(), description));
programAux.setPeriodicity((Float) FileUtils.changeValue(periodicity, (float) 0.0));
programAux.setDuration((Integer) FileUtils.changeValue(duration, 60));
programAux.setAccounts(accounts);
programAux.setProgramType((ProgramType) FileUtils.changeValue(programAux.getProgramType(), programType));
programAux.setProgramThematic((ProgramThematic) FileUtils.changeValue(programAux.getProgramThematic(), programThematic));
programAux.setProgramCategory((ProgramCategory) FileUtils.changeValue(programAux.getProgramCategory(), programCategory));
programAux.setProgramLanguage((ProgramLanguage) FileUtils.changeValue(programAux.getProgramLanguage(), programLanguage));
programAux.setEmail(FileUtils.changeValue(programAux.getEmail(), email));
programAux.setTwitter(FileUtils.changeValue(programAux.getTwitter(), twitter));
programAux.setFacebook(FileUtils.changeValue(programAux.getFacebook(), facebook));
programAux.setPodcast(FileUtils.changeValue(programAux.getPodcast(), podcast));
programAux.setWeb(FileUtils.changeValue(programAux.getWeb(), web));
programAux.setDateCreate((Date) FileUtils.changeValue(programAux.getDateCreate(), dateCreate));
programAux.setActive((Boolean) FileUtils.changeValue(programAux.isActive(), active));
programAux.setAccountPayer(accountPayer);
programService.update(programAux);
} else {
// Default values, if property is null
periodicity = (Float) FileUtils.changeValue((float) 1.0, periodicity);
duration = (Integer) FileUtils.changeValue(60, duration);
programCategory = (ProgramCategory) FileUtils.changeValue(programCategory, programService.findProgramCategoryById(1));
programThematic = (ProgramThematic) FileUtils.changeValue(programThematic, programService.findProgramThematicById(1));
programLanguage = (ProgramLanguage) FileUtils.changeValue(programLanguage, programService.findProgramLanguageById(1));
programType = (ProgramType) FileUtils.changeValue(programType, programService.findProgramTypeById(1));
Program program = new Program(name, description, periodicity, duration, accounts, accountPayer, programType, programThematic,
programCategory, programLanguage, email, twitter, facebook, podcast, web);
programService.save(program);
program.setDateCreate((Date) FileUtils.changeValue(program.getDateCreate(), dateCreate));
program.setActive((Boolean) FileUtils.changeValue(true, active));
programService.update(program);
}
} catch (Exception e) {
logger.error("parser, error program: " + name + " - ", e);
}
}
}
/**
* Gets the members.
*
* @param name the name
* @return the members
*/
private List<Account> getMembers(String name) {
List<Account> accounts = new ArrayList<>();
for (Account account : accountService.getAccounts()) {
String[] programs = account.getProgramName().split(",");
for (String program : programs) {
if (name.trim().equalsIgnoreCase(program.trim())) {
accounts.add(account);
}
}
}
return accounts;
}
}