package rules; import static org.codelutin.i18n.I18n.n_; import static org.codelutin.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.ResultName; import scripts.SiMatrix; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.codelutin.math.matrix.*; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.util.Doc; // pour pouvoir afficher une aide contextuelle (BUG#1605) /** * Cantonnement.java * * Created: 30 novembre 2006 * * @author anonymous * @version $Revision: 1.2 $ * * Last update: $Date: 2007-01-24 18:25:34 $ * by : $Author: bpoussin $ */ public class CantonnementPreSimu extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(CantonnementPreSimu.class); @Doc(value="do the doc of param zone") public Zone param_zone = null; @Doc(value="do the doc of param gear") public Gear param_gear = null; @Doc(value="do the doc of param enginSelective") public boolean param_enginSelective = true; @Doc(value="do the doc of param beginMonth") public Month param_beginMonth = Month.JANUARY; @Doc(value="do the doc of param endMonth") public Month param_endMonth = Month.DECEMBER; protected Map tableNonActivite = new HashMap(); protected boolean affectNonActivite = false; public String [] necessaryResult = { // put here all necessary result for this rule // example: // ResultName.MATRIX_BIOMASS, // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, ResultName.MATRIX_NO_ACTIVITY, }; public String[] getNecessaryResult() { return this.necessaryResult; } /** * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ public String getDescription() throws Exception { return _("Cantonnement: can be used to Cantonnement with gear if you put gear in parameter"); } private void reportNonActivite(SimulationContext context, List listestrategies, List metiers, Metier metier, List chomageMonth) { for(Strategy strategy : listestrategies) { SetOfVessels SetOfBateau = strategy.getSetOfVessels(); EffortDescription effort = SetOfBateau.getPossibleMetiers(metier); if (effort != null){ for (Month month : chomageMonth) { StrategyMonthInfo InfoMois = strategy.getStrategyMonthInfo(month); //this.p.tableNonActivite=Regle_action_lib.reportNonActivite(this.p.tableNonActivite, listestrategies.get(i), metier, mois, InfoMois.getProportionMetier(metier)); log.info("debut reportNonActivite"); // on regarde si on a d�j� une entr�e pour le mois courant MatrixND matNonActiviteMois=tableNonActivite.get(month); if (matNonActiviteMois == null){ matNonActiviteMois = MatrixFactory.getInstance().create( ResultName.MATRIX_NO_ACTIVITY, new List[]{listestrategies, metiers}, new String[]{n_("Strategies"), n_("Metiers")}); tableNonActivite.put(month, matNonActiviteMois); } matNonActiviteMois.setValue(strategy, metier, InfoMois.getProportionMetier(metier)); log.info("fin reportNonActivite"); InfoMois.setProportionMetier(metier, 0); MetierMonitor metierMon = context.getMetierMonitor(); metierMon.isLimited(metier, month); metierMon.addforbiddenMetier(metier, month); } } } } /** * Appel� au d�marrage de la simulation, cette m�thode permet d'initialiser * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(SimulationContext context) throws Exception { SiMatrix siMatrix = SiMatrix.getSiMatrix(context); // MetierDAO metierDao = IsisFishDAOHelper.getMetierDAO(context.getDB()); ZoneDAO zoneDao = IsisFishDAOHelper.getZoneDAO(context.getDB()); MetierSeasonInfoDAO metierSeasonInfoDao = IsisFishDAOHelper.getMetierSeasonInfoDAO(context.getDB()); // List metiers = metierDao.findAll(); List SaisonFermee = Month.getMonths(param_beginMonth, param_endMonth); List maillefermee = param_zone.getCell(); FisheryRegion region = RegionStorage.getFisheryRegion(context.getDB()); List listestrategies= region.getStrategy(); List metiers = region.getMetier(); // var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); for (Metier metier : metiers) { log.info("metier examin� " + metier.getName()); if (param_gear != null && !metier.getGear().equals(param_gear)){ log.info("l engin du m�tier n est pas concern�"); } else { log.info("l engin du m�tier est bien concern�"); List saisons = metier.getMetierSeasonInfo(); for (MetierSeasonInfo saisonmetier: saisons){ int inter = siMatrix.nbCellInter(saisonmetier.getZone(), param_zone); if (inter != 0){ List MailleMetier = siMatrix.getCells(saisonmetier.getZone()); // les mailles qui reste dans la zone metier List newCellMetier = new ArrayList(MailleMetier); newCellMetier.removeAll(maillefermee); List saison=saisonmetier.getMonths(); if (saison.containsAll(SaisonFermee)){ log.info("il y a bien intersection entre la zone m�tier et le cantonnement pour la saison "+saison.toString()); // calcule de la zone restante: boolean ToutFerme=false; boolean DebInclus=saison.contains(param_beginMonth); boolean FinInclus=saison.contains(param_endMonth); //creation du nouveau secteur de metier Zone secteurResult = zoneDao.create(); secteurResult.setName("MetaCantonnement-" + metier.getName() + "-" + saison.toString()); secteurResult.setComment("Secteur cr�� durant la simulation."); // on ajoute les mailles restants de la zone metier dans la zone resultante secteurResult.addAllCell(newCellMetier); // test pour savoir si toute la zone de pratique du metier // (reunion de toutes les zones metiers de metier a date) // est totalement incluse dans la zone Cantonnement if (newCellMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement ToutFerme=false; } else { log.info("Toute la zone metier est ferme"); ToutFerme=true; } // 1er cas: la saison m�tier est identique (ou totalement incluse dans la saison ferm�e, dans ce cas l�, on change juste // le secteur if (SaisonFermee.containsAll(saison)){ log.info("toute la saison metier est incluse dans la saison de fermeture"); //si tout est ferm�, on met le metier au ch�mage if (ToutFerme==true) { log.info ("toute la zone est ferm�e, le metier passe donc � ch�mage pour cette saison"); reportNonActivite(context, listestrategies, metiers, metier, saison); } else { log.info("tout n'est pas ferm�e, le secteur de p�che devient " + secteurResult); for (Month month : SaisonFermee){ metier.getMetierSeasonInfo(month).clearZone(); metier.getMetierSeasonInfo(month).addZone(secteurResult); } } // 2�me cas de figure: moisDeb est inclus mais pas moisFin (ou alors c'est le dernier mois) if (DebInclus && ((!FinInclus) || param_endMonth.equals(saison.get(saison.size()-1)))) { log.info ("il y a intersection de la saison de fermeture avec la saison m�tier de " + param_beginMonth + " � " + saison.get(saison.size()-1)); //si tout est ferm� on met les proportions � 0 pour les mois fermes if(ToutFerme==true){ log.info ("toute la zone m�tier est ferm�e"); List chomageMonth = new ArrayList(SaisonFermee); chomageMonth.retainAll(saison); log.info ("de "+chomageMonth.get(0)+" a "+ chomageMonth.get(chomageMonth.size()-1)+ ", le metier est donc mis au chomage"); reportNonActivite(context, listestrategies, metiers, metier, chomageMonth); } else { //on commence par cr�e les nouvelles saisons // var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,saison.getLastMois().getNumMois()); // var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); saisonmetier.setLastMonth(param_beginMonth.previous()); //on cr�e un nouveau infoSaisonMetier MetierSeasonInfo NouvelInfoSaison= metierSeasonInfoDao.create(); NouvelInfoSaison.setMetier(metier); NouvelInfoSaison.setFirstMonth(param_beginMonth); NouvelInfoSaison.setLastMonth(saison.get(saison.size()-1)); NouvelInfoSaison.addZone(secteurResult); NouvelInfoSaison.setComment("saison cr�e pendant la simulation") ; metier.addMetierSeasonInfo(NouvelInfoSaison); log.info ("de "+saison.get(0)+" � "+param_beginMonth.previous()+" le metier peche en "+saisonmetier.getZone()); log.info ("de "+param_beginMonth+" � "+saison.get(saison.size()-1)+" le metier peche en "+secteurResult); } } // 3�me cas de figure: moisFin est inclus mais pas moisDeb (ou alors il est �gal au premier mois) else if (((!DebInclus) || param_beginMonth.equals(saison.get(0))) && FinInclus) { log.info ("il y a intersection de la saison de fermeture avec la saison m�tier de "+param_beginMonth+" � "+saison.get(saison.size()-1)); //si tout est ferm� on met les proportions � 0 pour les mois fermes if (ToutFerme==true){ log.info ("toute la zone est fermee"); List chomageMonth = new ArrayList(SaisonFermee); chomageMonth.retainAll(saison); reportNonActivite(context, listestrategies, metiers, metier, chomageMonth); } else { //on commence par cr�e les nouvelles saisons saisonmetier.setFirstMonth(param_endMonth.next()); //on cr�e un nouveau infoSaisonMetier MetierSeasonInfo NouvelInfoSaison= metierSeasonInfoDao.create(); NouvelInfoSaison.setMetier(metier); NouvelInfoSaison.setFirstMonth(saison.get(0)); NouvelInfoSaison.setLastMonth(param_endMonth); NouvelInfoSaison.addZone(secteurResult); NouvelInfoSaison.setComment("saison cr�e pendant la simulation") ; metier.addMetierSeasonInfo(NouvelInfoSaison); log.info ("de "+saison.get(0)+" � "+param_endMonth+" le metier peche en "+secteurResult); log.info ("de "+param_endMonth.next()+" � "+saison.get(saison.size()-1)+" le metier peche en "+saisonmetier.getZone()); } } // dernier cas de figure: les deux sont inclus et sont diff�rents des bornes else { //si tout est ferm� on met les proportions � 0 pour les mois fermes if (ToutFerme==true){ log.info("toute la zone m�tier est ferm�e"); reportNonActivite(context, listestrategies, metiers, metier, SaisonFermee); } else { //on commence par cr�e les nouvelles saisons // var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); // var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); // var NouvelleSaison3=new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois().getNumMois()); // saisonmetier.setFirstMonth(param_beginMonth.previous()); //on cr�e un nouveau infoSaisonMetier MetierSeasonInfo NouvelInfoSaison = metierSeasonInfoDao.create(); NouvelInfoSaison.setMetier(metier); NouvelInfoSaison.setFirstMonth(param_beginMonth); NouvelInfoSaison.setLastMonth(param_endMonth); NouvelInfoSaison.addZone(secteurResult); NouvelInfoSaison.setComment("saison cr�e pendant la simulation") ; metier.addMetierSeasonInfo(NouvelInfoSaison); //on cr�e un nouveau infoSaisonMetier MetierSeasonInfo NouvelInfoSaison2 = metierSeasonInfoDao.create(); NouvelInfoSaison2.setMetier(metier); NouvelInfoSaison2.setFirstMonth(param_endMonth.next()); NouvelInfoSaison2.setLastMonth(saison.get(saison.size()-1)); NouvelInfoSaison2.setZone(saisonmetier.getZone()); NouvelInfoSaison2.setComment("saison cr�e pendant la simulation") ; metier.addMetierSeasonInfo(NouvelInfoSaison2); log.info ("de "+saison.get(0)+" � "+param_beginMonth.previous()+" le metier peche en "+saisonmetier.getZone()); log.info ("de "+param_beginMonth+" � "+param_endMonth+" le metier peche en "+secteurResult); log.info ("de "+param_endMonth.next()+" � "+saison.get(saison.size()-1)+" le metier peche en "+saisonmetier.getZone()); } } } } } } } /* this.p = new Object(); this.p.paramRegle = this.param; this.p.tableNonActivite=new Packages.java.util.HashMap(); this.p.affectNonActivite=false; var enginselectif=this.param.getValue("EnginSelective");//entrez le nom de l'engin ferm�e ou non si pas de s�lection sur engin var moisDeb=this.param.getValue("moisDeb"); //entrez le mois debut de fermeture var moisFin=this.param.getValue("moisFin");//entrez le mois de fin de fermeture var ZoneFermee=this.param.getValue("zone"); writeln("bla"); if (enginselectif) {var EnginInterdit=this.param.getValue("engin");} else {var EnginInterdit=MetierFactory.findByNom("nonActivite").getEngin();} var RegionSimu=ZoneFermee.getRegion(); var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb); var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin); var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){ var metier=imetier.next(); writeln ("metier examin� "+metier.getNom()); if ((!metier.getEngin().equals(EnginInterdit)) && enginselectif){ writeln("l engin du m�tier n est pas concern�"); } else { writeln("l engin du m�tier est bien concern�"); var ListeSaisons = metier.getInfoSaison(); for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){ var saisonmetier=isaisonmetier.next(); var maillefermee=ZoneFermee.getMaille(); var MailleMetier=saisonmetier.getSecteur().getMaille().copy(); MailleMetier.retainAll(maillefermee); if (MailleMetier.size()!=0){ MailleMetier=saisonmetier.getSecteur().getMaille().copy(); var saison=saisonmetier.getSaison(); if (saison.contains(SaisonFermee)){ writeln("il y a bien intersection entre la zone m�tier et le cantonnement pour la saison "+saison.toString()); // calcule de la zone restante: var ToutFerme=false; var DebInclus=saison.contains(MoisDeb); var FinInclus=saison.contains(MoisFin); MailleMetier.removeAll(maillefermee); writeln("inter maille:"+MailleMetier.size()); // test pour savoir si toute la zone de pratique du metier // (reunion de toutes les zones metiers de metier a date) // est totalement incluse dans la zone Cantonnement if (MailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement ToutFerme=false; //creation du nouveau secteur de metier //on v�rifie si le secteur a pas d�j� �t� modifi� par une autre r�gle afin de ne pas avoir de probl�me d'ID var ListeSecteur=MetaSecteurFactory.findAllByKey("MetaCantonnement-"+metier.getNom()+saison.toString(), RegionSimu); if (ListeSecteur.size()!=0){ var secteurResult = MetaSecteurFactory.create(saisonmetier.getSecteur().getNom()+"Modif", RegionSimu, "Secteur cr�� durant la simulation."); } else{ var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+metier.getNom()+saison.toString(),RegionSimu, "Secteur cr�� durant la simulation."); } writeln("nouveau secteur cree:"+secteurResult); var zonesMetier = saisonmetier.getSecteur().getAllSecteur(); writeln("zonesMetier:"+zonesMetier); writeln("zonesMetier.size:"+zonesMetier.size()); for(var i=0; i