View Javadoc

1   package sf.net.kayestry.components.address;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   
6   import org.apache.commons.lang.StringUtils;
7   import org.apache.tapestry.IMarkupWriter;
8   import org.apache.tapestry.IRequestCycle;
9   import org.apache.tapestry.form.IFormComponent;
10  import org.apache.tapestry.form.IPropertySelectionModel;
11  import org.apache.tapestry.request.RequestContext;
12  import org.apache.tapestry.valid.IValidationDelegate;
13  import org.json.JSONObject;
14  
15  import sf.net.kayestry.KayaBaseComponent;
16  import sf.net.kayestry.ValueListSelectionList;
17  
18  import ar.com.jiji.kaya.dao.ValueListItem;
19  import ar.com.jiji.kaya.facade.DireccionFacade;
20  import ar.com.jiji.kaya.model.Direccion;
21  import ar.com.jiji.kaya.model.Localidad;
22  import ar.com.jiji.kaya.model.Pais;
23  import ar.com.jiji.kaya.model.Provincia;
24  
25  //TODO: hacer que funcionen varios comopnentes en la misma pagina (cambiar los id de los combos por los nombres de los select y usar los simbolos del script  http://jakarta.apache.org/tapestry/3.0.4/doc/ComponentReference/Script.html)
26  public abstract class DireccionComponent extends KayaBaseComponent {
27  
28  	protected abstract void setDireccionId(Long id);
29  
30  	protected abstract Long getPaisId();
31  
32  	protected abstract void setPaisId(Long paisId);
33  
34  	protected abstract Long getProvinciaId();
35  
36  	protected abstract void setProvinciaId(Long provinciaId);
37  
38  	protected abstract Long getLocalidadId();
39  
40  	protected abstract void setLocalidadId(Long id);
41  
42  	protected abstract void setAddress(Direccion dir);
43  
44  	protected abstract Direccion getAddress();
45  
46  	protected abstract String getCalle();
47  
48  	protected abstract void setCalle(String calle);
49  
50  	protected abstract String getExtras();
51  
52  	protected abstract void setExtras(String data);
53  
54  	protected abstract Integer getNumero();
55  
56  	protected abstract void setNumero(Integer numero);
57  
58  	protected abstract void setCp(String cp);
59  
60  	protected abstract String getCp();
61  
62  	// TODO Pasar los select a kayestry:combo
63  	public IPropertySelectionModel getPaises() {
64  
65  		List<Pais> paises = new ArrayList<Pais>();
66  		// paises.add(new Pais(-1, "Ninguno"));
67  		paises.addAll(getAllPaises());
68  		if (paises.size() > 0 && getPaisId() == null)
69  			setPaisId(paises.get(0).getId());
70  		return new ValueListSelectionList<Pais>(paises);
71  	}
72  
73  	public IPropertySelectionModel getProvincias() {
74  		List<Provincia> provs = getProvincias(getPaisId());
75  		if (provs.size() > 0 && getProvinciaId() == null)
76  			setProvinciaId(provs.get(0).getId());
77  		return new ValueListSelectionList<Provincia>(provs);
78  	}
79  
80  	public IPropertySelectionModel getLocalidades() {
81  		List<Localidad> localidades = getLocalidades(getProvinciaId());
82  		return new ValueListSelectionList<Localidad>(localidades);
83  	}
84  
85  	private List<Pais> getAllPaises() {
86  		DireccionFacade facade = getDireccionFacade();
87  		return facade.getPaises();
88  	}
89  
90  	public abstract DireccionFacade getDireccionFacade();
91  
92  	private List getEmpty() {
93  		return new ArrayList();
94  	}
95  
96  	/**
97  	 * Devuelve la lista de provincias. Se llama con xtile.
98  	 * 
99  	 * @param cycle
100 	 */
101 	public void getProvincias(IRequestCycle cycle) {
102 		Object[] params = cycle.getServiceParameters();
103 		if (params.length == 0)
104 			return;
105 
106 		String[] ret = new String[1];
107 		try {
108 			ret = jsonizeList(getProvincias(new Long(params[0].toString())));
109 		} catch (NumberFormatException e) {
110 			// TODO: tirar error
111 		}
112 
113 		cycle.setServiceParameters(ret);
114 	}
115 
116 	/**
117 	 * Devuelve la lista de provincias. Se llama con xtile.
118 	 * 
119 	 * @param cycle
120 	 */
121 	public void getLocalidades(IRequestCycle cycle) {
122 		Object[] params = cycle.getServiceParameters();
123 		if (params.length == 0)
124 			return;
125 
126 		String[] ret = new String[1];
127 		try {
128 			ret = jsonizeList(getLocalidades(new Long(params[0].toString())));
129 		} catch (NumberFormatException e) {
130 			// TODO: tirar error
131 		}
132 
133 		cycle.setServiceParameters(ret);
134 	}
135 
136 	@SuppressWarnings("unchecked")
137 	private List<Localidad> getLocalidades(Long provinciaId) {
138 		List<Localidad> localidades;
139 		if (provinciaId == null)
140 			localidades = getEmpty();
141 		else
142 			localidades = getDireccionFacade().getLocalidades(provinciaId);
143 		return localidades;
144 	}
145 
146 	private String[] jsonizeList(List<? extends ValueListItem> list) {
147 		List<String> array = new ArrayList<String>();
148 		for (ValueListItem value : list) {
149 			JSONObject item = new JSONObject();
150 			item.put("id", value.getId());
151 			item.put("descripcion", value.getLabel());
152 			array.add(item.toString());
153 		}
154 		return array.toArray(new String[0]);
155 	}
156 
157 	@SuppressWarnings("unchecked")
158 	protected List<Provincia> getProvincias(Long paisId) {
159 		List<Provincia> provincias;
160 		if (paisId == null)
161 			provincias = getEmpty();
162 		else
163 			provincias = getDireccionFacade().getProvincias(paisId);
164 		return provincias;
165 	}
166 
167 	@Override
168 	protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
169 		RequestContext context = cycle.getRequestContext();
170 		Direccion d = getAddress();
171 		if (cycle.isRewinding()) {
172 			if (d == null)
173 				d = new Direccion();
174 			String aux;
175 			aux = context.getParameter("direccionId");
176 			if (StringUtils.isNotEmpty(aux) && !aux.equals("X"))
177 				d.setId(Long.parseLong(aux.substring(1)));
178 			d.setCalle(context.getParameter("calle"));
179 			if (StringUtils.isNumeric(context.getParameter("numero")))
180 				d.setNumero(Integer.parseInt(context.getParameter("numero")));
181 			d.setExtras(context.getParameter("extras"));
182 			setProvinciaId(getId(context, "provincia"));
183 			d.setLocalidad(getLocalidad(context));
184 
185 			setAddress(d);
186 		}
187 
188 		if (d != null) {
189 			setDireccionId(d.getId());
190 			setCalle(d.getCalle());
191 			setNumero(d.getNumero());
192 			setExtras(d.getExtras());
193 			Localidad loc = d.getLocalidad();
194 			String cp = getCp();
195 			if (loc != null) {
196 				if (StringUtils.isNotEmpty(loc.getCodigoPostal()))
197 					cp = loc.getCodigoPostal();
198 			}
199 			setLocalidadId((loc == null ? getId(context, "localidad") : loc
200 					.getId()));
201 			setCp(cp);
202 			Provincia prov = d.getProvincia();
203 			setProvinciaId((prov == null ? getId(context, "provincia") : prov
204 					.getId()));
205 			Pais p = d.getPais();
206 			setPaisId((p == null ? getId(context, "pais") : p.getId()));
207 		}
208 
209 		super.renderComponent(writer, cycle);
210 	}
211 
212 	private Long getId(RequestContext context, String parameterName) {
213 		String aux = context.getParameter(parameterName);
214 		Long rvId = null;
215 		if (StringUtils.isNotEmpty(aux) && !aux.equals("X")) {
216 			rvId = Long.parseLong(aux);
217 		}
218 		return rvId;
219 	}
220 
221 	private Localidad getLocalidad(RequestContext context) {
222 		Localidad loc = null;
223 		Long provId = getId(context, "provincia");
224 		if (provId == null) {
225 			getDelegate().setFormComponent(
226 					(IFormComponent) getComponent("provincia"));
227 			getDelegate().record("Debe seleccionar una provincia de la lista",
228 					null);
229 		}
230 		Long locId;
231 		locId = getId(context, "localidad");
232 		if (provId != null && locId != null) {
233 
234 			loc = getDireccionFacade().getLocalidad(locId);
235 			if (loc == null) {
236 				getDelegate().setFormComponent(
237 						(IFormComponent) getComponent("localidad"));
238 				getDelegate().record("La localidad es invalida. ", null);
239 			}
240 		} else {
241 			getDelegate().setFormComponent(
242 					(IFormComponent) getComponent("localidad"));
243 			getDelegate().record("Debe seleccionar una localidad.", null);
244 		}
245 		return loc;
246 	}
247 
248 	protected abstract IValidationDelegate getDelegate();
249 }