Author: fdesbois Date: 2010-01-05 09:55:40 +0000 (Tue, 05 Jan 2010) New Revision: 163 Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactState.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ActivityCalendarImport.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceContactImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceReferentialImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceContactMock.java trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo Log: - Add ImportHelper to simplify CSV headers managment - Improve imports - Add import/export for contacts Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java (rev 0) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java 2010-01-05 09:55:40 UTC (rev 163) @@ -0,0 +1,235 @@ + +package fr.ifremer.suiviobsmer; + +import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang.time.DurationFormatUtils; +import org.slf4j.Logger; + +/** + * ImportHelper + * + * Created: 4 janv. 2010 + * + * @author fdesbois + * @version $Revision$ + * + * Mise a jour: $Date$ + * par : $Author$ + */ +public class ImportHelper { + + /** + * CSV headers for Boat + */ + public static enum BOAT { + /** Boat immatriculation **/ + NAVS_COD(19), + /** Boat name **/ + CARN_NOM(20), + /** Boat length **/ + CARN_LONGUEUR_HT(-1), + /** Boat build year **/ + CARN_ANNEE(-1), + /** Boat district code **/ + QUARTIER_IMMA(21), + /** ShipOwner code **/ + PER_COD(-1), + /** ShipOwner last name **/ + PER_NOM(-1), + /** ShipOwner first name **/ + PER_PRENOM(-1), + /** Boat active **/ + NAVS_ACTIVE(-1); + + int contactHeader; + + BOAT(int index) { + this.contactHeader = index; + } + + public int forContactCsv() { + return contactHeader; + } + } + + /** + * CSV headers for SamplingPlan + */ + public static enum SAMPLING { + /** SampleRow code **/ + PLAN_CODE(5), + /** Program code **/ + PROGRAMME_CODE(6), + /** Program period begin **/ + PROGRAMME_DEBUT(7), + /** Program period end **/ + PROGRAMME_FIN(8), + /** FishingZone other infos **/ + PECHE_AUTRE(12), + /** Profession code DCF5 **/ + METIER_CODE_DCF5(13), + /** Profession mesh size **/ + METIER_MAILLAGE(14), + /** Profession size **/ + METIER_TAILLE(15), + /** Profession other infos **/ + METIER_AUTRE(16), + /** Profession libelle **/ + METIER_LIBELLE(17), + /** Profession species **/ + METIER_ESPECES(18), + /** SampleRow nb observants **/ + PLAN_NB_OBSERV(-1), + /** SampleRow average tide time **/ + PLAN_DUREE_MOY(-1); + + int contactHeader; + + SAMPLING(int index) { + this.contactHeader = index; + } + + public int forContactCsv() { + return contactHeader; + } + } + + /** + * CSV headers for FishingZone + */ + public static enum FISHING_ZONE { + /** FishingZone facade **/ + PECHE_FACADE(9), + /** FishingZone sector **/ + PECHE_ZONE(10), + /** FishingZone district code **/ + PECHE_DIVISION(11); + + int contactHeader; + + FISHING_ZONE(int index) { + this.contactHeader = index; + } + + public int forContactCsv() { + return contactHeader; + } + } + + /** + * CSV headers for Contact + */ + public static enum CONTACT { + /** Contact create date **/ + CONT_CREATION(0), + /** User id **/ + OBSERV_ID(1), + /** User prenom **/ + OBSERV_PRENOM(2), + /** User nom **/ + OBSERV_NOM(3), + /** Company id **/ + //SOCIETE_ID, + /** Company nom **/ + SOCIETE_NOM(4), + /** Contact state **/ + CONT_ETAT(22), + /** Contact tide begin **/ + CONT_DEBUT_MAREE(23), + /** Contact tide end **/ + CONT_FIN_MAREE(24), + /** Contact nb observants **/ + CONT_NB_OBSERV(25), + /** Contact mammals capture **/ + CONT_MAM_CAPT(26), + /** Contact mammals observation **/ + CONT_MAM_OBS(27), + /** Contact comment **/ + CONT_COMMENT(28), + /** Contact data input **/ + CONT_ALLEGRO(29), + /** Contact company validation **/ + CONT_SOCIETE_VALID(30), + /** Contact program validation **/ + CONT_PROGRAM_VALID(31); + + int contactHeader; + + CONTACT(int index) { + this.contactHeader = index; + } + + public int forContactCsv() { + return contactHeader; + } + } + + public static int CONTACT_NB_HEADERS = 31; + + public static String getHeaderForContactCsv(int index) { + for (BOAT boatEnum : BOAT.values()) { + if (boatEnum.forContactCsv() == index) { + return boatEnum.name(); + } + } + for (SAMPLING samplingEnum : SAMPLING.values()) { + if (samplingEnum.forContactCsv() == index) { + return samplingEnum.name(); + } + } + for (FISHING_ZONE zoneEnum : FISHING_ZONE.values()) { + if (zoneEnum.forContactCsv() == index) { + return zoneEnum.name(); + } + } + for (CONTACT contactEnum : CONTACT.values()) { + if (contactEnum.forContactCsv() == index) { + return contactEnum.name(); + } + } + return ""; + } + + public static String formatContactValidation(Boolean validation) { + String valid = ""; + if (validation == null) { + valid = "N"; + } else if (BooleanUtils.isTrue(validation)) { + valid = "A"; + } else { + valid = "R"; + } + return valid; + } +// +// public static Boolean parseContactValidation(String validation) { +// if (validation.equals("A")) { +// return Boolean.TRUE; +// } else if (validation.equals("R")) { +// return Boolean.FALSE; +// } +// return null; +// } + + public static String formatContactMammals(boolean mammals) { + return mammals ? "X" : ""; + } + + public static boolean parseContactMammals(String mammals) { + return mammals.equals("X"); + } + + public static long logTimeAndMemory(Logger log, long tic1, String msg) { + if (log.isInfoEnabled()) { + log.info("RUNNING... Import : " + msg); + Runtime runtime = Runtime.getRuntime(); + long mem = (runtime.totalMemory() - runtime.freeMemory()) / 1048576; + //long memMega = mem / 1024 / 1024; + log.info("Memory : " + mem + " Mo"); + long tic2 = System.currentTimeMillis(); + log.info("Time : " + DurationFormatUtils.formatDurationHMS(tic2 - tic1)); + } + return System.currentTimeMillis(); + } + +} Property changes on: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/ImportHelper.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactState.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactState.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/bean/ContactState.java 2010-01-05 09:55:40 UTC (rev 163) @@ -21,7 +21,8 @@ package fr.ifremer.suiviobsmer.bean; -import fr.ifremer.suiviobsmer.bean.states.*; +import java.util.ArrayList; +import java.util.List; /** * ContactState @@ -89,4 +90,12 @@ return null; } + public static List<String> availableStates() { + List<String> results = new ArrayList<String>(); + for (ContactState state : values()) { + results.add(state.toString()); + } + return results; + } + } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ActivityCalendarImport.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ActivityCalendarImport.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ActivityCalendarImport.java 2010-01-05 09:55:40 UTC (rev 163) @@ -23,6 +23,7 @@ import fr.ifremer.suiviobsmer.*; import com.csvreader.CsvReader; +import fr.ifremer.suiviobsmer.ImportHelper.BOAT; import fr.ifremer.suiviobsmer.entity.ActivityCalendar; import fr.ifremer.suiviobsmer.entity.ActivityCalendarDAO; import fr.ifremer.suiviobsmer.entity.ActivityMonth; @@ -166,7 +167,7 @@ currRow++; //long firstTic = System.currentTimeMillis(); - int boatImmatriculation = Integer.parseInt(reader.get("NAVS_COD").trim()); + int boatImmatriculation = Integer.parseInt(reader.get(BOAT.NAVS_COD.name()).trim()); // long tic1 = System.currentTimeMillis(); Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImpl.java 2010-01-05 09:55:40 UTC (rev 163) @@ -22,6 +22,8 @@ package fr.ifremer.suiviobsmer.impl; import com.csvreader.CsvReader; +import fr.ifremer.suiviobsmer.ImportHelper; +import fr.ifremer.suiviobsmer.ImportHelper.BOAT; import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException.Type; import fr.ifremer.suiviobsmer.SuiviObsmerContext; @@ -42,7 +44,6 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -345,14 +346,14 @@ reader.readHeaders(); long startTime = System.currentTimeMillis(); - long tic1, tic2; + long tic; BoatDAO boatDAO = SuiviObsmerModelDAOHelper.getBoatDAO(transaction); ShipOwnerDAO shipOwnerDAO = SuiviObsmerModelDAOHelper.getShipOwnerDAO(transaction); Map<String, ShipOwner> availableShipOwners = new HashMap<String, ShipOwner>(); - tic1 = System.currentTimeMillis(); + tic = System.currentTimeMillis(); while(reader.readRecord()) { result[0]++; @@ -361,15 +362,15 @@ // } - int immatriculation = Integer.parseInt(reader.get("NAVS_COD").trim()); - String boatName = reader.get("CARN_NOM").trim(); - int boatLength = Integer.parseInt(reader.get("CARN_LONGUEUR_HT").trim()); - int buildYear = Integer.parseInt(reader.get("CARN_ANNEE").trim()); - String districtCode = reader.get("QUARTIER_IMMA").trim(); - String shipOwnerCode = reader.get("PER_COD").trim(); - String shipOwnerLastName = reader.get("PER_NOM").trim(); - String shipOwnerFirstName = reader.get("PER_PRENOM").trim(); - String activeStr = reader.get("NAVS_ACTIVE").trim(); + int immatriculation = Integer.parseInt(reader.get(BOAT.NAVS_COD.name()).trim()); + String boatName = reader.get(BOAT.CARN_NOM.name()).trim(); + int boatLength = Integer.parseInt(reader.get(BOAT.CARN_LONGUEUR_HT.name()).trim()); + int buildYear = Integer.parseInt(reader.get(BOAT.CARN_ANNEE.name()).trim()); + String districtCode = reader.get(BOAT.QUARTIER_IMMA.name()).trim(); + String shipOwnerCode = reader.get(BOAT.PER_COD.name()).trim(); + String shipOwnerLastName = reader.get(BOAT.PER_NOM.name()).trim(); + String shipOwnerFirstName = reader.get(BOAT.PER_PRENOM.name()).trim(); + String activeStr = reader.get(BOAT.NAVS_ACTIVE.name()).trim(); boolean active = !activeStr.equals("I"); @@ -435,16 +436,17 @@ availableShipOwners.clear(); transaction.commitTransaction(); - if (log.isInfoEnabled()) { - log.info("RUNNING... Import navires ligne " + result[0]); - Runtime runtime = Runtime.getRuntime(); - long mem = (runtime.totalMemory() - runtime.freeMemory()) / 1048576; - //long memMega = mem / 1024 / 1024; - log.info("Memory : " + mem + " Mo"); - tic2 = System.currentTimeMillis(); - log.info("Time : " + DurationFormatUtils.formatDurationHMS(tic2 - tic1)); - tic1 = System.currentTimeMillis(); - } + tic = ImportHelper.logTimeAndMemory(log, tic, "navires ligne " + result[0]); +// if (log.isInfoEnabled()) { +// log.info("RUNNING... Import navires ligne " + result[0]); +// Runtime runtime = Runtime.getRuntime(); +// long mem = (runtime.totalMemory() - runtime.freeMemory()) / 1048576; +// //long memMega = mem / 1024 / 1024; +// log.info("Memory : " + mem + " Mo"); +// tic2 = System.currentTimeMillis(); +// log.info("Time : " + DurationFormatUtils.formatDurationHMS(tic2 - tic1)); +// tic1 = System.currentTimeMillis(); +// } } } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceContactImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceContactImpl.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceContactImpl.java 2010-01-05 09:55:40 UTC (rev 163) @@ -21,21 +21,44 @@ package fr.ifremer.suiviobsmer.impl; +import com.csvreader.CsvReader; +import com.csvreader.CsvWriter; +import fr.ifremer.suiviobsmer.ImportHelper; +import fr.ifremer.suiviobsmer.ImportHelper.*; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException.Type; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; +import fr.ifremer.suiviobsmer.bean.ContactState; +import java.io.InputStream; import org.nuiton.topia.framework.TopiaQuery; import fr.ifremer.suiviobsmer.bean.states.ContactStateEnum; import fr.ifremer.suiviobsmer.entity.Boat; +import fr.ifremer.suiviobsmer.entity.BoatDAO; import fr.ifremer.suiviobsmer.entity.Company; +import fr.ifremer.suiviobsmer.entity.CompanyDAO; import fr.ifremer.suiviobsmer.entity.Contact; import fr.ifremer.suiviobsmer.entity.ContactDAO; import fr.ifremer.suiviobsmer.entity.ContactImpl; +import fr.ifremer.suiviobsmer.entity.FishingZone; +import fr.ifremer.suiviobsmer.entity.Profession; +import fr.ifremer.suiviobsmer.entity.Program; import fr.ifremer.suiviobsmer.entity.SampleRow; +import fr.ifremer.suiviobsmer.entity.SampleRowDAO; import fr.ifremer.suiviobsmer.entity.User; +import fr.ifremer.suiviobsmer.entity.UserDAO; import fr.ifremer.suiviobsmer.services.ServiceContact; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.persistence.TopiaEntity; @@ -135,4 +158,242 @@ } } + protected static String DATE_TIME_PATTERN = "dd/MM/yyyy HH:mm:ss"; + protected static String DATE_PATTERN = "dd/MM/yyyy"; + + @Override + public InputStream exportContactCsv(User user, List<Contact> contacts) + throws SuiviObsmerException { + TopiaContext transaction = null; + InputStream result = null; + try { + transaction = rootContext.beginTransaction(); + + // No contacts from arguments, select all existing from database + if (contacts == null) { + ContactDAO dao = SuiviObsmerModelDAOHelper.getContactDAO(transaction); + if (user.getAdmin()) { + contacts = dao.findAll(); + } else { + // Filtered by company for a simple user + contacts = dao.createQuery(). + add("user.company", user.getCompany()). + executeToEntityList(); + } + } + + String alea = SuiviObsmerContext.createRandomString(8); + FileOutputStream output = new FileOutputStream("/tmp/contact-" + alea + ".csv"); + CsvWriter writer = new CsvWriter(output, ',', Charset.forName("UTF-8")); + + // Headers + for (int i = 0; i < ImportHelper.CONTACT_NB_HEADERS; i++) { + String header = ImportHelper.getHeaderForContactCsv(i); + writer.write(header); + } + + DateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_PATTERN, Locale.FRENCH); + DateFormat dateFormat = new SimpleDateFormat(DATE_PATTERN, Locale.FRENCH); + + int curr = 0; + for (Contact contact : contacts) { + curr++; + String[] record = new String[ImportHelper.CONTACT_NB_HEADERS]; + + // Contact part + record[CONTACT.CONT_CREATION.forContactCsv()] = dateTimeFormat.format(contact.getTopiaCreateDate()); + record[CONTACT.CONT_ETAT.forContactCsv()] = contact.getState(); + record[CONTACT.CONT_DEBUT_MAREE.forContactCsv()] = dateFormat.format(contact.getTideBeginDate()); + record[CONTACT.CONT_FIN_MAREE.forContactCsv()] = dateFormat.format(contact.getTideEndDate()); + record[CONTACT.CONT_NB_OBSERV.forContactCsv()] = String.valueOf(contact.getNbObservants()); + record[CONTACT.CONT_MAM_CAPT.forContactCsv()] = + ImportHelper.formatContactMammals(contact.getMammalsCapture()); + record[CONTACT.CONT_MAM_OBS.forContactCsv()] = + ImportHelper.formatContactMammals(contact.getMammalsObservation()); + record[CONTACT.CONT_COMMENT.forContactCsv()] = contact.getComment(); + record[CONTACT.CONT_ALLEGRO.forContactCsv()] = dateFormat.format(contact.getDataInputDate()); + record[CONTACT.CONT_SOCIETE_VALID.forContactCsv()] = + ImportHelper.formatContactValidation(contact.getValidationCompany()); + record[CONTACT.CONT_PROGRAM_VALID.forContactCsv()] = + ImportHelper.formatContactValidation(contact.getValidationProgram()); + + // Observer part + User observer = contact.getUser(); + Company company = observer.getCompany(); + record[CONTACT.OBSERV_ID.forContactCsv()] = observer.getLogin(); + record[CONTACT.OBSERV_PRENOM.forContactCsv()] = observer.getFirstName(); + record[CONTACT.OBSERV_NOM.forContactCsv()] = observer.getLastName(); + record[CONTACT.SOCIETE_NOM.forContactCsv()] = company.getName(); + + // SampleRow part + SampleRow row = contact.getSampleRow(); + Program program = row.getProgram(); + record[SAMPLING.PLAN_CODE.forContactCsv()] = row.getCode(); + record[SAMPLING.PROGRAMME_CODE.forContactCsv()] = program.getName(); + record[SAMPLING.PROGRAMME_DEBUT.forContactCsv()] = dateFormat.format(program.getPeriodBegin()); + record[SAMPLING.PROGRAMME_FIN.forContactCsv()] = dateFormat.format(program.getPeriodEnd()); + record[SAMPLING.PECHE_AUTRE.forContactCsv()] = row.getFishingZonesInfos(); + + // FishingZone part + List<FishingZone> zones = row.getFishingZone(); + String fishingDistrict = ""; + for (FishingZone zone : zones) { + fishingDistrict += zone.getDistrictCode() + " - "; + } + fishingDistrict = fishingDistrict.substring(fishingDistrict.length() - 3); + record[FISHING_ZONE.PECHE_FACADE.forContactCsv()] = zones.get(0).getFacadeName(); + record[FISHING_ZONE.PECHE_ZONE.forContactCsv()] = zones.get(0).getSectorName(); + record[FISHING_ZONE.PECHE_DIVISION.forContactCsv()] = fishingDistrict; + + // Profession part + Profession profession = row.getProfession(); + record[SAMPLING.METIER_CODE_DCF5.forContactCsv()] = profession.getCodeDCF5(); + record[SAMPLING.METIER_MAILLAGE.forContactCsv()] = profession.getMeshSize(); + record[SAMPLING.METIER_TAILLE.forContactCsv()] = profession.getSize(); + record[SAMPLING.METIER_AUTRE.forContactCsv()] = profession.getOther(); + record[SAMPLING.METIER_LIBELLE.forContactCsv()] = profession.getLibelle(); + record[SAMPLING.METIER_ESPECES.forContactCsv()] = profession.getSpecies(); + + // Boat part + Boat boat = contact.getBoat(); + record[BOAT.NAVS_COD.forContactCsv()] = String.valueOf(boat.getImmatriculation()); + record[BOAT.CARN_NOM.forContactCsv()] = boat.getName(); + record[BOAT.QUARTIER_IMMA.forContactCsv()] = boat.getDistrictCode(); + + writer.writeRecord(record); + } + writer.close(); + + result = new FileInputStream(output.getFD()); + + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, + "Impossible d'exporter les contacts", eee); + } + return result; + } + + @Override + public int importContactCsv(InputStream input) throws SuiviObsmerException { + TopiaContext transaction = null; + int result = 0; + try { + transaction = rootContext.beginTransaction(); + + CsvReader reader = new CsvReader(input, Charset.forName("UTF-8")); + reader.readHeaders(); + + ContactDAO dao = SuiviObsmerModelDAOHelper.getContactDAO(transaction); + UserDAO userDAO = SuiviObsmerModelDAOHelper.getUserDAO(transaction); + CompanyDAO companyDAO = SuiviObsmerModelDAOHelper.getCompanyDAO(transaction); + SampleRowDAO rowDAO = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); + BoatDAO boatDAO = SuiviObsmerModelDAOHelper.getBoatDAO(transaction); + + DateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_PATTERN, Locale.FRENCH); + DateFormat dateFormat = new SimpleDateFormat(DATE_PATTERN, Locale.FRENCH); + + int currRow = 0; + long tic; + tic = System.currentTimeMillis(); + while(reader.readRecord()) { + currRow++; + + String userId = reader.get(CONTACT.OBSERV_ID.name()); + String state = reader.get(CONTACT.CONT_ETAT.name()); + + ContactState contactState = ContactState.createContactStateEnum(state); + + if (contactState == null) { + throw new SuiviObsmerBusinessException(Type.IMPORT_ERROR, this.getClass(), + "Erreur ligne " + currRow + " : " + + "Etat du contact invalide '" + state + "', valeurs possibles : " + + ContactState.availableStates()); + } + + User user = userDAO.findByLogin(userId); + if (user != null) { + // FIXME-FD20100104 findContains not optimized in TopiaDAOImpl + Company company = companyDAO.findContainsUser(user); + if (company != null) { + String rowCode = reader.get(SAMPLING.PLAN_CODE.name()); + + SampleRow row = rowDAO.findByCode(rowCode); + + if (row != null) { + int boatImmatriculation = Integer.parseInt(reader.get(BOAT.NAVS_COD.name())); + + Boat boat = boatDAO.findByImmatriculation(boatImmatriculation); + + if (boat != null) { + Date createDate = dateTimeFormat.parse(reader.get(CONTACT.CONT_CREATION.name())); + + Contact contact = dao.createQuery(). + add(TopiaEntity.TOPIA_CREATE_DATE, createDate). + executeToEntity(); + + if (contact == null) { // new contact to import + contact = dao.create( + Contact.USER, user, + Contact.SAMPLE_ROW, row, + Contact.BOAT, boat); + } + Date tideBegin = dateFormat.parse(CONTACT.CONT_DEBUT_MAREE.name()); + Date tideEnd = dateFormat.parse(CONTACT.CONT_FIN_MAREE.name()); + int nbObservants = Integer.parseInt(reader.get(CONTACT.CONT_NB_OBSERV.name())); + boolean mammalsCapture = + ImportHelper.parseContactMammals(reader.get(CONTACT.CONT_MAM_CAPT.name())); + boolean mammalsObsv = + ImportHelper.parseContactMammals(reader.get(CONTACT.CONT_MAM_OBS.name())); + + contact.setState(state); + contact.setTideBeginDate(tideBegin); + contact.setTideEndDate(tideEnd); + contact.setNbObservants(nbObservants); + contact.setMammalsCapture(mammalsCapture); + contact.setMammalsObservation(mammalsObsv); + + result++; + + } else if (log.isWarnEnabled()) { + log.warn("Import contact ligne " + currRow + " : " + + "Navire inexistant avec l'immatriculation : " + boatImmatriculation); + } + } else if (log.isWarnEnabled()) { + log.warn("Import contact ligne " + currRow + " : " + + "Ligne d'échantillon inexistante avec le code : " + rowCode); + } + } else if (log.isErrorEnabled()) { + log.error("Import contact ligne " + currRow + " : " + + "Cette utilisateur n'est lié à aucune société : " + user); + } + } else if (log.isWarnEnabled()) { + log.warn("Import contact ligne " + currRow + " : " + + "Utilisateur inexistant avec l'identifiant : " + userId); + } + + if (result % 1000 == 0) { + transaction.commitTransaction(); + tic = ImportHelper.logTimeAndMemory(log, tic, "contacts ligne " + currRow); +// if (log.isInfoEnabled()) { +// log.info("RUNNING... Import contacts ligne " + currRow); +// Runtime runtime = Runtime.getRuntime(); +// long mem = (runtime.totalMemory() - runtime.freeMemory()) / 1048576; +// //long memMega = mem / 1024 / 1024; +// log.info("Memory : " + mem + " Mo"); +// tic2 = System.currentTimeMillis(); +// log.info("Time : " + DurationFormatUtils.formatDurationHMS(tic2 - tic1)); +// tic1 = System.currentTimeMillis(); +// } + } + } + + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, + "Impossible d'exporter les contacts", eee); + } + return result; + } + } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceReferentialImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceReferentialImpl.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceReferentialImpl.java 2010-01-05 09:55:40 UTC (rev 163) @@ -22,6 +22,7 @@ package fr.ifremer.suiviobsmer.impl; import com.csvreader.CsvReader; +import fr.ifremer.suiviobsmer.ImportHelper.FISHING_ZONE; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; @@ -142,9 +143,9 @@ log.trace(" " + Arrays.asList(reader.getValues())); } - String facadeName = reader.get("PECHE_FACADE").trim(); - String sectorName = reader.get("PECHE_ZONE").trim(); - String districtCode = reader.get("PECHE_DIVISION").trim(); + String facadeName = reader.get(FISHING_ZONE.PECHE_FACADE.name()).trim(); + String sectorName = reader.get(FISHING_ZONE.PECHE_ZONE.name()).trim(); + String districtCode = reader.get(FISHING_ZONE.PECHE_DIVISION.name()).trim(); FishingZone zone = dao.findByProperties( FishingZone.FACADE_NAME, facadeName, Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceSamplingImpl.java 2010-01-05 09:55:40 UTC (rev 163) @@ -22,6 +22,8 @@ package fr.ifremer.suiviobsmer.impl; import com.csvreader.CsvReader; +import fr.ifremer.suiviobsmer.ImportHelper.FISHING_ZONE; +import fr.ifremer.suiviobsmer.ImportHelper.SAMPLING; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; @@ -48,6 +50,7 @@ import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaQuery; import org.nuiton.topia.framework.TopiaQuery.Op; +import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.util.EntityLoador; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -294,12 +297,16 @@ SampleRowDAO dao = SuiviObsmerModelDAOHelper.getSampleRowDAO(transaction); - result = dao.findByTopiaId(sampleRowId); + result = dao.createQuery().add(TopiaEntity.TOPIA_ID, sampleRowId). + addLoad("company", "program", "profession"). + executeToEntity(); - // load data - result.getCompany(); - result.getProgram(); - result.getProfession(); +// result = dao.findByTopiaId(sampleRowId); +// +// // load data +// result.getCompany(); +// result.getProgram(); +// result.getProfession(); transaction.closeContext(); } catch (Exception eee) { @@ -390,7 +397,7 @@ log.trace(" " + Arrays.asList(reader.getValues())); } - String code = reader.get("PLAN_CODE").trim(); + String code = reader.get(SAMPLING.PLAN_CODE.name()).trim(); if (StringUtils.isEmpty(code)) { continue; @@ -399,10 +406,10 @@ // Replace single number after year by a double one : 2010_1 -> 2010_01 code = code.replaceFirst("_(\\d)$", "_0$1"); - String programName = reader.get("PROGRAMME_CODE").trim(); - int[] programBegin = getMonthAndYear(reader.get("PROGRAMME_DEBUT").trim()); - int[] programEnd = getMonthAndYear(reader.get("PROGRAMME_FIN").trim()); - String districts = reader.get("PECHE_DIVISION"); + String programName = reader.get(SAMPLING.PROGRAMME_CODE.name()).trim(); + int[] programBegin = getMonthAndYear(reader.get(SAMPLING.PROGRAMME_DEBUT.name()).trim()); + int[] programEnd = getMonthAndYear(reader.get(SAMPLING.PROGRAMME_FIN.name()).trim()); + String districts = reader.get(FISHING_ZONE.PECHE_DIVISION.name()); row = dao.findByCode(code); // Refuse existing SampleRow @@ -511,12 +518,12 @@ protected Profession importProfession(TopiaContext transaction, CsvReader reader) throws IOException, TopiaException { - String codeDCF5 = reader.get("METIER_CODE_DCF5").trim(); - String maillage = reader.get("METIER_MAILLAGE").trim(); - String taille = reader.get("METIER_TAILLE").trim(); - String autre = reader.get("METIER_AUTRE").trim(); - String libelle = reader.get("METIER_LIBELLE").trim(); - String especes = reader.get("METIER_ESPECES").trim(); + String codeDCF5 = reader.get(SAMPLING.METIER_CODE_DCF5.name()).trim(); + String maillage = reader.get(SAMPLING.METIER_MAILLAGE.name()).trim(); + String taille = reader.get(SAMPLING.METIER_TAILLE.name()).trim(); + String autre = reader.get(SAMPLING.METIER_AUTRE.name()).trim(); + String libelle = reader.get(SAMPLING.METIER_LIBELLE.name()).trim(); + String especes = reader.get(SAMPLING.METIER_ESPECES.name()).trim(); ProfessionDAO dao = SuiviObsmerModelDAOHelper.getProfessionDAO(transaction); Map<String, Object> existParams = new HashMap<String, Object>(); @@ -589,9 +596,9 @@ protected void updateRow(TopiaContext transaction, SampleRow sampleRow, CsvReader reader) throws IOException, TopiaException, ParseException { - String fishingZoneInfos = reader.get("PECHE_AUTRE").trim(); - int nbObservants = Integer.parseInt(reader.get("PLAN_NB_OBSERV").trim()); - String averageStr = reader.get("PLAN_DUREE_MOY").trim(); + String fishingZoneInfos = reader.get(SAMPLING.PECHE_AUTRE.name()).trim(); + int nbObservants = Integer.parseInt(reader.get(SAMPLING.PLAN_NB_OBSERV.name()).trim()); + String averageStr = reader.get(SAMPLING.PLAN_DUREE_MOY.name()).trim(); averageStr = averageStr.replaceAll(",", "."); double averageTideTime = Double.parseDouble(averageStr); Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceContactMock.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceContactMock.java 2010-01-04 11:24:57 UTC (rev 162) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceContactMock.java 2010-01-05 09:55:40 UTC (rev 163) @@ -29,6 +29,8 @@ import fr.ifremer.suiviobsmer.entity.SampleRow; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceContact; +import java.io.InputStream; +import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -259,6 +261,16 @@ throw new UnsupportedOperationException("Not supported yet."); } + @Override + public InputStream exportContactCsv(User user, List<Contact> contacts) throws SuiviObsmerException { + throw new UnsupportedOperationException("Not supported yet."); + } + @Override + public int importContactCsv(InputStream input) throws SuiviObsmerException { + throw new UnsupportedOperationException("Not supported yet."); + } + + } Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ)