/*
* Copyright (C) 2010, Emergya (http://www.emergya.es)
*
* @author <a href="mailto:jlrodriguez@emergya.es">Juan Luís Rodríguez</a>
* @author <a href="mailto:marias@emergya.es">María Arias</a>
*
* This file is part of GoFleet
*
* This software is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* As a special exception, if you link this library with other files to
* produce an executable, this library does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* This exception does not however invalidate any other reasons why the
* executable file might be covered by the GNU General Public License.
*/
package es.emergya.ui.gis.popups;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.rmi.RemoteException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.swing.AbstractAction;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SpinnerDateModel;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.freixas.jcalendar.DateEvent;
import org.freixas.jcalendar.DateListener;
import org.freixas.jcalendar.JCalendarCombo;
import org.gofleet.context.GoWired;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.gpx.GpxData;
import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
import org.openstreetmap.josm.data.gpx.WayPoint;
import org.openstreetmap.josm.gui.layer.GpxLayer;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.MyGpxLayer;
import org.openstreetmap.josm.io.GpxImporter;
import org.openstreetmap.josm.io.GpxWriter;
import es.emergya.actions.Authentication;
import es.emergya.bbdd.bean.HistoricoGPS;
import es.emergya.bbdd.bean.Incidencia;
import es.emergya.bbdd.bean.Recurso;
import es.emergya.cliente.constants.LogicConstants;
import es.emergya.ui.base.BasicWindow;
import es.emergya.ui.gis.CustomMapView;
import es.emergya.ui.gis.HistoryMapViewer;
import es.emergya.ui.gis.ICustomMapView;
import es.emergya.webservices.ServiceStub;
import es.emergya.webservices.ServiceStub.GetIncidenciasAbiertasEnPeriodo;
import es.emergya.webservices.ServiceStub.GetPosicionesIncidencias;
import es.emergya.webservices.ServiceStub.GetPosicionesIncidenciasResponse;
import es.emergya.webservices.ServiceStub.GetRecursosEnPeriodo;
import es.emergya.webservices.ServiceStub.GetRecursosEnPeriodoResponse;
import es.emergya.webservices.ServiceStub.GetRutasRecursos;
import es.emergya.webservices.ServiceStub.GetRutasRecursosResponse;
import es.emergya.webservices.ServiceStub.GetUltimasPosiciones;
import es.emergya.webservices.ServiceStub.GetUltimasPosicionesResponse;
import es.emergya.webservices.ServiceStub.IncidenciaWS;
import es.emergya.webservices.ServiceStub.Posicion;
import es.emergya.webservices.WSProvider;
public class ConsultaHistoricos extends JFrame {
private static final Dimension DIMENSION_LABEL = new Dimension(100, 10);
private static final Dimension DIMENSION_JLIST = new Dimension(250, 80);
private static final Dimension DIMENSION_2JLIST = new Dimension(250, 2 * 80);
static final Log log = LogFactory.getLog(ConsultaHistoricos.class);
private static final long serialVersionUID = -6066807198392103411L;
private static ConsultaHistoricos self;
private List<Layer> capas = new ArrayList<Layer>();
protected CustomMapView mapView;
private DateFormat dateFormat;
private JLabel cargando = new JLabel();
private JCheckBox soloUltimas;
private JCalendarCombo calendarfin;
private JSpinner horaini;
private JSpinner horafin;
// private JList zona;
private JList incidencias;
private JList recursos;
private static Set<Object> recursosMostrados = new HashSet<Object>();
private static Set<Object> incidenciasMostradas = new HashSet<Object>();
private JCalendarCombo calendarini;
private JButton limpiar;
private JButton consultar;
private SwingWorker<Layer, Object> consulta = null;
private SwingWorker<String, String> updateRecursos = null;
final private JTextField mensaje = new JTextField("");
private HistoryMapViewer visorHistorico = null;
private final static Locale LOCALE = new Locale("es", "ES");
@GoWired
private BasicWindow basicWindow;
/**
* @return the basicWindow
*/
public BasicWindow getBasicWindow() {
return basicWindow;
}
/**
* @param basicWindow the basicWindow to set
*/
public void setBasicWindow(BasicWindow basicWindow) {
this.basicWindow = basicWindow;
}
public synchronized static void close() {
if (self != null)
self.closing.actionPerformed(null);
self = null;
}
private void clearRecursos() {
synchronized (recursosMostrados) {
recursosMostrados.clear();
}
}
private void addRecurso(Object r) {
synchronized (recursosMostrados) {
if (!recursosMostrados.contains(r)) {
recursosMostrados.add(r);
}
}
}
public static List<Object> getCurrentRecursos() {
synchronized (recursosMostrados) {
LinkedList<Object> res = new LinkedList<Object>();
res.addAll(recursosMostrados);
return res;
}
}
private void clearIncidencias() {
synchronized (incidenciasMostradas) {
incidenciasMostradas.clear();
}
}
private void addIncidencia(Object r) {
synchronized (incidenciasMostradas) {
if (!incidenciasMostradas.contains(r)) {
incidenciasMostradas.add(r);
}
}
}
public static List<Object> getCurrentIncidencias() {
synchronized (incidenciasMostradas) {
LinkedList<Object> res = new LinkedList<Object>();
res.addAll(incidenciasMostradas);
return res;
}
}
public static List<Layer> getCapas() {
if (self == null) {
return new LinkedList<Layer>();
}
return self.capas;
}
private final ListSelectionListener listSelectionListener = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent arg0) {
if (recursos.getSelectedIndex() != -1
|| incidencias.getSelectedIndex() != -1) {
consultar.setEnabled(true);
} else {
consultar.setEnabled(false);
}
}
};
private final ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateRecursos();
}
};
private final ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
updateRecursos();
}
};
private ActionListener closing = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
self.setVisible(false);
try {
if (consulta != null) {
consulta.cancel(true);
}
} catch (Throwable t) {
}
getLimpiar().doClick();
HistoryMapViewer.refreshHistoryPanel();
self = null;
}
};
public synchronized static void showConsultaHistoricos(CustomMapView mapView) {
if (self == null) {
self = new ConsultaHistoricos(mapView);
}
self.setVisible(true);
self.setExtendedState(JFrame.NORMAL);
}
public synchronized static void showConsultaHistoricos(
CustomMapView mapView, HistoryMapViewer mapviewer) {
if (self == null) {
self = new ConsultaHistoricos(mapView, mapviewer);
}
self.setVisible(true);
self.setExtendedState(JFrame.NORMAL);
}
private ConsultaHistoricos(CustomMapView mapView, HistoryMapViewer mapViewer) {
this(mapView);
this.visorHistorico = mapViewer;
}
private ConsultaHistoricos(CustomMapView mapView) {
super("Consulta de Posiciones GPS");
setResizable(false);
setAlwaysOnTop(true);
this.mapView = mapView;
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setIconImage(getBasicWindow().getIconImage());
dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
// explicitly set timezone of input if needed
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone("Zulu"));
JPanel dialogo = new JPanel(new BorderLayout());
dialogo.setBackground(Color.WHITE);
dialogo.setBorder(new EmptyBorder(10, 10, 10, 10));
dialogo.add(getCabecera(), BorderLayout.NORTH);
dialogo.add(getCentral(), BorderLayout.CENTER);
dialogo.add(getBotones(), BorderLayout.SOUTH);
add(dialogo);
setPreferredSize(new Dimension(430, 440));
pack();
setLocationRelativeTo(mapView);
getLimpiar().doClick();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
closing.actionPerformed(null);
}
});
}
private JPanel getCabecera() {
JPanel cabecera = new JPanel(new FlowLayout(FlowLayout.LEFT));
cabecera.setOpaque(false);
JLabel titulo = new JLabel("Consulta de Posiciones GPS en el Histórico");
titulo.setFont(LogicConstants.deriveBoldFont(12.0f));
titulo.setIcon(LogicConstants
.getIcon("tittleventana_icon_consultahistorico"));
cabecera.add(titulo);
return cabecera;
}
private JPanel getCentral() {
JPanel central = new JPanel(new FlowLayout());
central.setOpaque(false);
JPanel intervalo = getIntervalo();
intervalo.setOpaque(false);
intervalo.setPreferredSize(new Dimension(400, 100));
central.add(intervalo);
// JPanel consulta = getConsulta();
// consulta.setOpaque(false);
// consulta.setPreferredSize(new Dimension(400, 120));
// central.add(consulta);
JPanel elementos = getElementos();
elementos.setOpaque(false);
elementos.setPreferredSize(new Dimension(400, 210));
central.add(elementos);
JPanel ventanaMensaje = getVentanaMensaje();
ventanaMensaje.setOpaque(false);
ventanaMensaje.setPreferredSize(new Dimension(400, 30));
central.add(ventanaMensaje);
return central;
}
private JPanel getElementos() {
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING));
panel.setOpaque(false);
panel.setBorder(new TitledBorder("Elementos a Consultar"));
JLabel jLabel = new JLabel("Recursos", SwingConstants.RIGHT);
jLabel.setPreferredSize(ConsultaHistoricos.DIMENSION_LABEL);
panel.add(jLabel);
recursos = new JList(new DefaultListModel());
recursos.getInputMap().put(
KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK),
"selectAll");
recursos.getActionMap().put("selectAll", new AbstractAction() {
private static final long serialVersionUID = -5515338515763292526L;
@Override
public void actionPerformed(ActionEvent e) {
recursos.setSelectionInterval(0,
recursos.getModel().getSize() - 1);
}
});
recursos.addListSelectionListener(listSelectionListener);
final JScrollPane jScrollPaneR = new JScrollPane(recursos,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPaneR.getViewport().setPreferredSize(DIMENSION_JLIST);
panel.add(jScrollPaneR);
jLabel = new JLabel("Incidencias", SwingConstants.RIGHT);
jLabel.setPreferredSize(ConsultaHistoricos.DIMENSION_LABEL);
panel.add(jLabel);
incidencias = new JList(new DefaultListModel());
incidencias.getInputMap().put(
KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK),
"selectAll");
incidencias.getActionMap().put("selectAll", new AbstractAction() {
private static final long serialVersionUID = -5515338515763292526L;
@Override
public void actionPerformed(ActionEvent e) {
incidencias.setSelectionInterval(0, incidencias.getModel()
.getSize() - 1);
}
});
incidencias.addListSelectionListener(listSelectionListener);
final JScrollPane jScrollPaneI = new JScrollPane(incidencias,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPaneI.getViewport().setPreferredSize(DIMENSION_JLIST);
panel.setPreferredSize(DIMENSION_2JLIST);
panel.add(jScrollPaneI);
return panel;
}
// private JPanel getConsulta() {
// JPanel panel = new JPanel(new FlowLayout());
// panel.setOpaque(false);
// panel.setBorder(new TitledBorder("Zona de Consulta"));
// JLabel jLabel = new JLabel("Zona", SwingConstants.RIGHT);
// jLabel.setPreferredSize(ConsultaHistoricos.DIMENSION_LABEL);
// panel.add(jLabel);
// zona = new JList(new DefaultListModel());
// for (Zona z : ZonaConsultas.getAllZonas()) {
// ((DefaultListModel) zona.getModel()).addElement(z);
// }
// zona.addListSelectionListener(listSelectionListener);
// zona.addListSelectionListener(new ListSelectionListener() {
//
// @Override
// public void valueChanged(ListSelectionEvent e) {
// updateRecursos();
//
// }
// });
// zona.getInputMap().put(
// KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK),
// "selectAll");
// zona.getActionMap().put("selectAll", new AbstractAction() {
//
// private static final long serialVersionUID = -5515338515763292526L;
//
// @Override
// public void actionPerformed(ActionEvent e) {
// zona.setSelectionInterval(0, zona.getModel().getSize() - 1);
// }
// });
//
// final JScrollPane jScrollPane = new JScrollPane(zona,
// JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
// JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// jScrollPane.getViewport().setPreferredSize(DIMENSION_JLIST);
// panel.add(jScrollPane);
// panel.setPreferredSize(DIMENSION_JLIST);
// return panel;
// }
private JPanel getIntervalo() {
JPanel intervalo = new JPanel(new GridBagLayout());
intervalo.setOpaque(false);
intervalo.setBorder(new TitledBorder("Intervalo Temporal de Consulta"));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
intervalo.add(new JLabel("Fecha/Hora Inicial"), gbc);
gbc.gridx++;
calendarini = new JCalendarCombo();
calendarini.addActionListener(actionListener);
calendarini.addDateListener(dateListener);
intervalo.add(calendarini, gbc);
gbc.gridx++;
final Calendar instance = Calendar.getInstance();
instance.set(Calendar.HOUR, 0);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
horaini = initializeSpinner(instance);
intervalo.add(horaini, gbc);
gbc.gridx = 0;
gbc.gridy++;
intervalo.add(new JLabel("Fecha/Hora Final"), gbc);
gbc.gridx++;
calendarfin = new JCalendarCombo();
calendarfin.addActionListener(actionListener);
calendarfin.addDateListener(dateListener);
intervalo.add(calendarfin, gbc);
gbc.gridx++;
horafin = initializeSpinner(instance);
intervalo.add(horafin, gbc);
gbc.gridx = 0;
gbc.gridy++;
gbc.anchor = GridBagConstraints.EAST;
soloUltimas = new JCheckBox();
soloUltimas.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateRecursos();
}
});
soloUltimas.setOpaque(false);
soloUltimas.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
boolean enabled = !soloUltimas.isSelected();
calendarini.setEnabled(enabled);
calendarfin.setEnabled(enabled);
horaini.setEnabled(enabled);
horafin.setEnabled(enabled);
}
});
intervalo.add(soloUltimas, gbc);
gbc.gridx++;
gbc.anchor = GridBagConstraints.WEST;
intervalo.add(new JLabel("Consultar Sólo Las Últimas Posiciones"), gbc);
return intervalo;
}
private JSpinner initializeSpinner(final Calendar instance) {
JSpinner res = new JSpinner(new SpinnerDateModel());
JSpinner.DateEditor startEditor = new JSpinner.DateEditor(res,
"HH:mm:ss");
res.setEditor(startEditor);
res.setValue(instance.getTime());
res.addChangeListener(changeListener);
return res;
}
private JPanel getVentanaMensaje() {
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(Color.WHITE);
mensaje.setOpaque(false);
mensaje.setBorder(null);
mensaje.setForeground(Color.RED);
mensaje.setEditable(false);
panel.add(mensaje, BorderLayout.CENTER);
return panel;
}
private JPanel getBotones() {
JPanel boton = new JPanel(new FlowLayout());
boton.setOpaque(false);
consultar = getConsultar();
boton.add(consultar);
limpiar = getLimpiar();
boton.add(limpiar);
cargando = new JLabel(LogicConstants.getIcon("48x48_transparente"));
boton.add(cargando);
boton.add(new JLabel(LogicConstants.getIcon("48x48_transparente")));
JButton cancelar = getCancelar();
boton.add(cancelar);
return boton;
}
private JButton getCancelar() {
JButton jButton = new JButton(LogicConstants.getIcon("button_cancel"));
jButton.addActionListener(closing);
jButton.setText("Cancelar");
return jButton;
}
private JButton getLimpiar() {
JButton jButton = new JButton(LogicConstants.getIcon("button_limpiar"));
jButton.setText("Limpiar");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
clearRecursos();
clearIncidencias();
cleanLayers();
if (visorHistorico != null) {
visorHistorico.updateControls();
}
return null;
}
@Override
protected void done() {
HistoryMapViewer.enableSaveGpx(false);
HistoryMapViewer.getResultadoHistoricos().setSelected(
false);
recursos.setSelectedIndex(-1);
incidencias.setSelectedIndex(-1);
// zona.setSelectedIndex(-1);
final Calendar instance = Calendar.getInstance();
calendarini.setDate(instance.getTime());
calendarfin.setDate(instance.getTime());
horafin.setValue(instance.getTime());
instance.set(Calendar.HOUR_OF_DAY, 0);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
horaini.setValue(instance.getTime());
soloUltimas.setSelected(false);
calendarini.setEnabled(true);
calendarfin.setEnabled(true);
horaini.setEnabled(true);
horafin.setEnabled(true);
consultar.setEnabled(false);
limpiar.setEnabled(false);
setError("");
}
};
sw.execute();
}
});
return jButton;
}
private JButton getConsultar() {
final JButton jButton = new JButton(
LogicConstants.getIcon("historico_button_realizarconsulta"));
jButton.setText("Consultar");
jButton.setEnabled(false);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cargando.setIcon(LogicConstants.getIcon("anim_calculando"));
cargando.repaint();
limpiar.setEnabled(false);
jButton.setEnabled(false);
consulta = new SwingWorker<Layer, Object>() {
@Override
protected Layer doInBackground() throws Exception {
publish(new Object[0]);
List<String> idRecursos = new ArrayList<String>();
List<Long> idZonas = new ArrayList<Long>();
for (Object o : recursos.getSelectedValues()) {
if (o instanceof Recurso) {
idRecursos.add(((Recurso) o).getIdentificador());
} else {
idRecursos.add(o.toString());
}
}
// for (Object o : zona.getSelectedValues()) {
// if (o instanceof Zona) {
// idZonas.add(((Zona) o).getId());
// }
// }
List<String> idIncidencias = new ArrayList<String>();
for (Object o : incidencias.getSelectedValues()) {
if (o instanceof Incidencia) {
idIncidencias.add(((Incidencia) o).getId()
.toString());
} else {
idIncidencias.add(o.toString());
}
}
if (soloUltimas.isSelected()) {
if (idRecursos.size() > 0) {
getUltimasPosiciones(Authentication.getUsuario()
.getNombreUsuario(), idRecursos,
idZonas);
}
if (idIncidencias.size() > 0) {
getPosicionesIncidencias(Authentication
.getUsuario().getNombreUsuario(),
idIncidencias, idZonas);
}
} else {
if (idRecursos.size() > 0) {
getRutas(Authentication.getUsuario()
.getNombreUsuario(), idRecursos,
getFechaIni(), getFechaFin());
}
if (idIncidencias.size() > 0) {
getPosicionesIncidencias(Authentication
.getUsuario().getNombreUsuario(),
idIncidencias, idZonas);
}
}
return null;
}
@Override
protected void process(List<Object> chunks) {
super.process(chunks);
cleanLayers();
cargando.setIcon(LogicConstants
.getIcon("anim_calculando"));
cargando.repaint();
}
@Override
protected void done() {
HistoryMapViewer.getResultadoHistoricos().setSelected(
true);
cargando.setIcon(LogicConstants
.getIcon("48x48_transparente"));
cargando.repaint();
}
};
consulta.execute();
}
});
return jButton;
}
private File getUltimasPosiciones(String nombreUsuario,
List<String> idRecursos, List<Long> idZonas) {
Posicion[] posiciones = new Posicion[0];
clearIncidencias();
clearRecursos();
try {
ServiceStub client = WSProvider.getServiceClient();
GetUltimasPosiciones param = new GetUltimasPosiciones();
param.setIdRecursos(idRecursos.toArray(new String[0]));
param.setNombreUsuario(nombreUsuario);
long[] zonas = new long[idZonas.size()];
for (int i = 0; i < idZonas.size(); i++) {
zonas[i] = idZonas.get(i);
}
param.setZonas(zonas);
GetUltimasPosicionesResponse res = client
.getUltimasPosiciones(param);
posiciones = res.get_return();
} catch (RemoteException e) {
log.error("Error al conectar al servicio web", e);
setError("Error al conectar al servicio web");
}
File file = writeTo(posiciones, false, true);
cargarGpx(file, "ultimas_posiciones");
for (Posicion p : posiciones) {
Recurso r = new Recurso();
r.setId(null);
r.setNombre(p.getIdentificador());
HistoricoGPS gps = new HistoricoGPS();
gps.setPosX(p.getX());
gps.setPosY(p.getY());
gps.setRecurso(r.toString());
r.setHistoricoGps(gps);
addRecurso(r);
}
if (this.visorHistorico != null) {
visorHistorico.updateControls();
}
return file;
}
private GpxLayer cargarGpx(File file, String name) {
GpxImporter importer = new GpxImporter();
GpxLayer layer = null;
try {
if (!importer.acceptFile(file)) {
new IOException("Gpx inaccesible.");
}
importer.importData(file);
layer = new MyGpxLayer(importer.getLastData(),
file.getAbsolutePath(), true, this.mapView);
layer.name = name;
addCapa(layer);
} catch (Throwable t) {
log.error("Error al cargar la capa", t);
setError("Error al cargar la capa");
}
return layer;
}
private void addCapa(final Layer layer) {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
layer.visible = true;
if (!Main.pref.putColor("layer " + layer.name,
Color.decode(LogicConstants.getNextColor()))) {
log.error("Error al asignar el color");
}
return null;
}
@Override
protected void done() {
super.done();
mapView.addLayer(layer, false);
capas.add(layer);
limpiar.setEnabled(true);
HistoryMapViewer.enableSaveGpx(true);
}
};
sw.execute();
}
private synchronized void cleanLayers() {
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
return null;
}
@Override
protected void done() {
for (Layer layer : capas) {
mapView.removeLayer(layer);
}
capas.clear();
mapView.repaint();
LogicConstants.resetColor();
}
};
sw.execute();
}
/**
* Escribe las posiciones en formato gpx y devuelve el descriptor del
* fichero. Devuelve null si hubo algun error.
*
* @param posiciones
* @return
*/
private File writeTo(Posicion[] posiciones, boolean linea, boolean showTime) {
File file = null;
try {
file = File.createTempFile("Historico", ".gpx");
GpxData data = new GpxData();
ImmutableGpxTrack track = new ImmutableGpxTrack(
new LinkedList<Collection<WayPoint>>(),
new LinkedHashMap<String, Object>());
LinkedList<WayPoint> linkedList = new LinkedList<WayPoint>();
if (posiciones != null) {
for (Posicion pos : posiciones) {
WayPoint way = buildWay(pos, linea, showTime);
linkedList.add(way);
}
} else {
setError("No se encontraron posiciones");
}
if (linea) {
track.trackSegs.add(linkedList);
data.tracks.add(track);
}
data.waypoints = linkedList;
OutputStream out = new FileOutputStream(file);
GpxWriter writer = new GpxWriter(out);
writer.write(data);
out.close();
} catch (UnsupportedEncodingException e) {
log.error("Error al escribir el gpx en el fichero temporal.", e);
setError("Error al escribir el gpx en el fichero temporal.");
} catch (IOException e) {
log.error("No pude crear un fichero temporal", e);
setError("No pude crear un fichero temporal");
}
return file;
}
private WayPoint buildWay(Posicion pos, boolean linea, boolean showTime) {
WayPoint way = new WayPoint(new LatLon(pos.getY(), pos.getX()));
way.attr.put("time",
dateFormat.format(pos.getMarcaTemporal().getTime()));
String name = pos.getIdentificador();
if (showTime) {
name += " "
+ DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.MEDIUM, LOCALE).format(
pos.getMarcaTemporal().getTime());
}
way.attr.put("name", name);
way.setGarminCommentTime("time");
way.drawLine = linea;
return way;
}
private File getPosicionesIncidencias(String nombreUsuario,
List<String> idIncidencias, List<Long> idZonas) {
Posicion[] posiciones = new Posicion[0];
clearRecursos();
clearIncidencias();
try {
ServiceStub client = WSProvider.getServiceClient();
GetPosicionesIncidencias param = new GetPosicionesIncidencias();
param.setIdIncidencias(idIncidencias.toArray(new String[0]));
param.setNombreUsuario(nombreUsuario);
GetPosicionesIncidenciasResponse res = client
.getPosicionesIncidencias(param);
posiciones = res.get_return();
for (Posicion p : posiciones) {
addIncidencia(p.getIdentificador());
}
} catch (RemoteException e) {
log.error("Error al conectar al servicio web", e);
setError("Error al conectar al servicio web");
}
if (this.visorHistorico != null) {
visorHistorico.updateControls();
}
File file = writeTo(posiciones, false, false);
cargarGpx(file, "incidencias");
return file;
}
private void getRutas(String nombreUsuario, List<String> idRecurso,
Calendar ini, Calendar fin) {
clearRecursos();
clearIncidencias();
try {
ServiceStub client = WSProvider.getServiceClient();
GetRutasRecursos param = new GetRutasRecursos();
param.setNombreUsuario(nombreUsuario);
param.setFechaInicio(ini);
param.setFechaFin(fin);
param.setListaRecursos(idRecurso.toArray(new String[0]));
GetRutasRecursosResponse res = client.getRutasRecursos(param);
String[] gpx = res.get_return();
int i = 0;
if (gpx != null) {
for (String s : gpx) {
if (s == null) {
log.error("El recurso " + idRecurso.get(i++)
+ " ha devuelto un camino nulo.");
} else {
try {
final File file = File.createTempFile("historico",
"gpx");
FileWriter fstream = new FileWriter(file);
BufferedWriter out = new BufferedWriter(fstream);
out.write(s);
out.close();
if (i < idRecurso.size()) {
addRecurso(cargarGpx(file, idRecurso.get(i++)));
} else {
cargarGpx(file,
(new Long(System.currentTimeMillis()))
.toString());
log.error("Nos hemos quedado sin nombres de recursos. "
+ "Esto tiene que ser porque se han devuelto mas gpx de "
+ "los que hemos pedido. La capa se mostrara, pero hay que "
+ "revisar la peticion al servicio web.");
}
} catch (Throwable t) {
log.error("Error al cargar gpx", t);
}
}
}
}
} catch (RemoteException e) {
log.error("Error al conectar al servicio web", e);
setError("Error al conectar al servicio web");
}
if (this.visorHistorico != null) {
visorHistorico.updateControls();
}
}
protected String[] getRecursosEnPeriodo(String nombreUsuario, Calendar ini,
Calendar fin, long[] zonas) {
try {
ServiceStub client = WSProvider.getServiceClient();
GetRecursosEnPeriodo param = new GetRecursosEnPeriodo();
param.setFechaInicio(ini);
param.setFechaFinal(fin);
param.setZonas(zonas);
param.setNombreUsuario(nombreUsuario);
GetRecursosEnPeriodoResponse res = client
.getRecursosEnPeriodo(param);
String[] rec = res.get_return();
if (rec != null) {
log.trace("Nos ha devuelto " + rec.length + " recursos.");
return rec;
}
} catch (RemoteException e) {
log.error("Error al conectar al servicio web", e);
setError("Error al conectar al servicio web");
}
return new String[] {};
}
protected Incidencia[] getIncidenciasEnPeriodo(String nombreUsuario,
Calendar ini, Calendar fin, long[] zonas) {
List<Incidencia> res = new ArrayList<Incidencia>();
try {
ServiceStub client = WSProvider.getServiceClient();
GetIncidenciasAbiertasEnPeriodo param = new GetIncidenciasAbiertasEnPeriodo();
param.setFechaInicio(ini);
param.setFechaFinal(fin);
param.setNombreUsuario(nombreUsuario);
param.setZonas(zonas);
IncidenciaWS[] rec = client.getIncidenciasAbiertasEnPeriodo(param)
.get_return();
if (rec != null) {
for (IncidenciaWS in : rec) {
try {
Incidencia i = new Incidencia();
BeanUtils.copyProperties(i, in);
res.add(i);
} catch (Throwable e) {
log.error("Error al transformar de WS a objeto", e);
}
}
}
} catch (RemoteException e) {
log.error("Error al conectar al servicio web", e);
setError("Error al conectar al servicio web");
}
return res.toArray(new Incidencia[0]);
}
private synchronized void updateRecursos() {
if (updateRecursos != null) {
updateRecursos.cancel(true);
}
updateRecursos = new SwingWorker<String, String>() {
private String[] recursosEnPeriodos = new String[0];
private Incidencia[] incidenciasEnPeriodos = new Incidencia[0];
@Override
protected String doInBackground() throws Exception {
cargando.setIcon(LogicConstants.getIcon("anim_calculando"));
Calendar ini = null;
Calendar fin = null;
if (!soloUltimas.isSelected()) {
ini = getFechaIni();
fin = getFechaFin();
}
if (ini != null && fin != null && ini.after(fin)) {
return null;
}
List<Long> idZonas = new ArrayList<Long>();
// for (Object o : zona.getSelectedValues()) {
// if (o instanceof Zona) {
// idZonas.add(((Zona) o).getId());
// }
// }
long[] zonas = new long[idZonas.size()];
for (int i = 0; i < zonas.length; i++) {
zonas[i] = idZonas.get(i);
}
recursosEnPeriodos = getRecursosEnPeriodo(Authentication
.getUsuario().getNombreUsuario(), ini, fin, zonas);
incidenciasEnPeriodos = getIncidenciasEnPeriodo(Authentication
.getUsuario().getNombreUsuario(), ini, fin, zonas);
return null;
}
@Override
protected void done() {
synchronized (recursos) {
log.trace("Cargamos los recursos");
((DefaultListModel) recursos.getModel())
.removeAllElements();
for (String recurso : recursosEnPeriodos) {
log.trace("Mostramos en la ventana de consulta "
+ recurso);
((DefaultListModel) recursos.getModel())
.addElement(recurso);
}
}
synchronized (incidencias) {
((DefaultListModel) incidencias.getModel())
.removeAllElements();
for (Incidencia i : incidenciasEnPeriodos) {
log.trace("Mostramos en la ventana de consulta " + i);
((DefaultListModel) incidencias.getModel())
.addElement(i);
}
}
limpiar.setEnabled(true);
recursos.repaint();
incidencias.repaint();
cargando.setIcon(LogicConstants.getIcon("48x48_transparente"));
cargando.repaint();
updateRecursos = null;
}
};
updateRecursos.execute();
}
private Calendar getFechaFin() {
Calendar tmp2 = Calendar.getInstance();
Calendar fin = calendarfin.getCalendar();
tmp2.setTime((Date) horafin.getValue());
fin.set(Calendar.HOUR_OF_DAY, tmp2.get(Calendar.HOUR_OF_DAY));
fin.set(Calendar.MINUTE, tmp2.get(Calendar.MINUTE));
fin.set(Calendar.SECOND, tmp2.get(Calendar.SECOND));
return fin;
}
private Calendar getFechaIni() {
Calendar tmp = Calendar.getInstance();
Calendar ini = calendarini.getCalendar();
tmp.setTime((Date) horaini.getValue());
ini.set(Calendar.HOUR_OF_DAY, tmp.get(Calendar.HOUR_OF_DAY));
ini.set(Calendar.MINUTE, tmp.get(Calendar.MINUTE));
ini.set(Calendar.SECOND, tmp.get(Calendar.SECOND));
return ini;
}
private Thread limpiarError = null;
private final DateListener dateListener = new DateListener() {
@Override
public void dateChanged(DateEvent arg0) {
updateRecursos();
}
};
public synchronized void setError(final String e) {
if (limpiarError != null && limpiarError.isAlive()) {
limpiarError.interrupt();
}
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
return null;
}
@Override
protected void done() {
mensaje.setText(e);
mensaje.repaint();
cargando.setIcon(LogicConstants.getIcon("48x48_transparente"));
}
};
sw.execute();
limpiarError = new Thread() {
@Override
public void run() {
try {
Thread.sleep(1000 * LogicConstants.getInt(
"TIMEOUT_ERROR_WEBSERVICE", 15));
SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
mensaje.setText("");
return null;
}
};
sw.execute();
} catch (InterruptedException e) {
}
}
};
limpiarError.start();
}
}