001 // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org)
002 // The Molly framework is freely distributable under the terms of an
003 // MIT-style license. For details, see the molly pages web site at:
004 // http://www.mollypages.org/. Use, modify, have fun !
005
006 package fc.web.forms;
007
008 import javax.servlet.*;
009 import javax.servlet.http.*;
010 import java.io.*;
011 import java.util.*;
012 import java.sql.*;
013
014 import fc.jdbc.*;
015 import fc.io.*;
016 import fc.util.*;
017
018 /**
019 A test dependency implementation.
020 */
021 public class TestDependency implements Dependency
022 {
023 static List usa_states = Arrays.asList( new Select.Option[] {
024 new Select.Option("pa"),
025 new Select.Option("ny", true)
026 });
027
028 static List int_states = Arrays.asList( new Select.Option[] {
029 new Select.Option("int#1"),
030 new Select.Option("int#2"),
031 new Select.Option("int#3")
032 });
033
034 static String selectCountryFirst = "--select a country first--";
035
036 static List select_country_msg = Arrays.asList( new Select.Option[] {
037 new Select.Option(selectCountryFirst)
038 });
039
040 Select country;
041 DependentSelect states;
042 Log log;
043 String last_name;
044
045 public TestDependency(Select country, DependentSelect state)
046 {
047 this.country = country;
048 this.states = state;
049 states.addDependency(this);
050 log = states.log;
051 last_name = country.name + "_last_value_id";
052 }
053
054 public Object getInitialValues(Field f)
055 {
056 DependentSelect.Data data = new DependentSelect.Data(); //initially empty
057 data.addOption(new Select.Option(selectCountryFirst));
058 return data;
059 }
060
061 public void updateValues(FormData fd, HttpServletRequest req)
062 throws DependencyException
063 {
064 String country_val = country.getStringValue(fd);
065
066 log.bug("country_val:", country_val);
067
068 if (needsUpdate(country_val, fd)) {
069 log.bug("needsupdate=true");
070 fd.setDependencyUpdated();
071 }
072
073 Hidden prev_country = fd.getDynamicField(last_name);
074 String prev_val = (prev_country != null) ?
075 prev_country.getValue(fd).intern() : "";
076
077 DependentSelect.Data data = (DependentSelect.Data)
078 fd.getData(states.getName());
079
080 if (country_val == null || country_val.equalsIgnoreCase("--- select ---")){
081 states.setValue(data, select_country_msg);
082 }
083 else if (country_val.equalsIgnoreCase("usa")) {
084 states.setValue(data, usa_states);
085 if (prev_val != "usa")
086 data.clearSubmittedData();
087 }
088 else if (country_val.equalsIgnoreCase("uk")) {
089 states.setValue(data, int_states);
090 if (prev_val != "uk")
091 data.clearSubmittedData();
092 }
093 else
094 throw new DependencyException("Bad country value (" + country_val + "), cannot calculate state dependency from this country");
095
096 }
097
098 boolean needsUpdate(String country_val, FormData fd)
099 {
100 if (country_val == null)
101 return false;
102
103 Hidden prev_country = fd.getDynamicField(last_name);
104 log.bug("prev_country: ", prev_country);
105
106 if (prev_country == null)
107 return true;
108
109 String prev_val = prev_country.getValue(fd); //can be null
110
111 log.bug("country_val: ", country_val, "; prev_value:", prev_val);
112
113 return ! country_val.equals(prev_val);
114 }
115
116 public void setDependencyDataFromSubmit(FormData fd, HttpServletRequest req)
117 {
118 String[] hidden_values = req.getParameterValues(last_name);
119
120 log.bug("hidden_values=", Arrays.toString(hidden_values));
121
122 if (hidden_values != null) {
123 Hidden h = new Hidden(last_name, hidden_values);
124 fd.addDynamicField(h);
125 }
126 }
127
128 public void renderDependencyData(FormData fd, Writer out)
129 throws SQLException, IOException
130 {
131 log.bug("start..");
132 if (fd != null) {
133 String country_val = country.getStringValue(fd);
134 if (country_val != null) {
135 Hidden h = new Hidden(last_name, country_val);
136 h.render(out);
137 }
138 }
139 }
140
141 public boolean isSubmitDataValid(FormData fd)
142 {
143 return true;
144 }
145
146 public String toString() {
147 return "country-->state dependency";
148 }
149
150 } //~class DependencyOnSelect