ok, allora passo a spiegarvi cosa devofare concretamente:
Ho una classe astratta, ItemFactory che implementa in modo generico l'accesso a un database e il caching dei dati letti
Poi vengono create classi derivate come ad esempio ArticoliFactory e FattureFactory che sfruttando le funzionalita offerte da ItemFactory e modificandone la configurazione recuperano i dati dal database.
A questo punto ArticoliFactory e' una sorta di DataSurce e per istanziarlo e' sufficiente
ArticoliFactory a = new ArticoliFactory();
il problema e' che questa classe viene usata da piu parti del codice e ognuna in questo modo si creerebbe una sua istanza e quindi si potrebbero avere gli stessi dati duplicati.
la cosa migliore sarebbe che ogni volta che serve si potesse chiamare :
ArticoliFactory a = ArticoliFactory.createInstance();
dove solo la prima volta viene creata concretamente un istanza (e memorizzata) e tutte le successive viene restituita sempre la stessa istanza (che a questo punto potrebbe essere gia popolata e pronta a restituire i dati senza causare altre richieste al database)
Per il momento ho risolto implementando createInstance() in ogni singola classe concreta, ma mi sembra strano che una funzionalita del genere non si possa implementare a livello della classe astratta.
Spero di essere stato piu chiaro questa volta e di aver fatto capire qual'e' il mio scopo.
metto anche il codice:
JDCItemsFactory.java
codice:
package it.lelmarir.inventario4.data;
import it.lelmarir.db.JDCConnection;
import it.lelmarir.db.JDCConnectionDriver;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import com.google.gwt.dev.protobuf.GeneratedMessage.ExtendableBuilder;
import com.vaadin.data.util.ItemsFactory;
import com.vaadin.data.util.SqlConstraint;
import com.vaadin.data.util.SqlConstraintBlock;
public abstract class JDCItemsFactory[B] implements ItemsFactory[B], Serializable{
private String queryFields = "a.*,c.testo AS nomeCategoria";
private String queryTable = "articolo a LEFT JOIN codcategoria c ON a.id_categoria = c.id";
private String querySort = "";
SqlConstraintBlock constraints = new SqlConstraintBlock();
public JDCItemsFactory(String queryFields, String queryTable) {
this.queryFields = queryFields;
this.queryTable = queryTable;
}
@Override
public void addContainerFilter(Object propertyId, String filterString, boolean ignoreCase, boolean onlyMatchPrefix) {
constraints.addConstraint((new SqlConstraint(propertyId.toString())).like(((onlyMatchPrefix)?"%":"")+filterString));
//TODO: ignoreCase
}
@Override
public List[B] getItems(int startIndex, int count) {
List[B] list = new LinkedList[B]();
JDCConnection connection = JDCConnectionDriver.getConnection();
String query = "";
try {
Statement stm = connection.createStatement();
String cond = constraints.getSqlConstraint();
query = "SELECT "+queryFields+" FROM "+queryTable+" "+ ((cond!="")?" WHERE "+cond:"") + ((querySort!="")?"ORDER BY "+querySort:"") +" LIMIT "+startIndex+","+count;
ResultSet result = stm.executeQuery(query);
while(result.next() == true)
{
list.add(resultSetToBean(result));
}
} catch (SQLException e) {
System.err.println(this.getClass().getName() + ":" + query);
e.printStackTrace();
}
return list;
}
protected abstract B resultSetToBean(ResultSet resultSet);
@Override
public abstract Class[B] getType();
@Override
public void removeAllContainerFilters() {
constraints.removeAllConstraints();
}
@Override
public void removeContainerFilters(Object propertyId) {
constraints.removeConstraint(propertyId.toString());
}
@Override
public int size() {
try {
JDCConnection connection = JDCConnectionDriver.getConnection();
Statement stm = connection.createStatement();
String cond = constraints.getSqlConstraint();
String query = "SELECT count(*) AS count FROM "+queryTable+ ((cond!="")?" WHERE "+cond:"");
ResultSet result = stm.executeQuery(query);
if(result.next() == true)
{
return result.getInt("count");
}
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
public void sort(Object[] propertyId, boolean[] ascending) {
querySort = "";
if(propertyId.length == 0)
return;
querySort += propertyId[0].toString() + " " + ((ascending[0])?"DESC":"");
for(int i = 1; i < propertyId.length; i++)
{
querySort += ", ";
querySort += propertyId[i].toString() + " " + ((ascending[i])?"DESC":"");
}
}
}
ArticoloItemFactory.java
codice:
package it.lelmarir.inventario4.data;
import it.lelmarir.db.JDCConnection;
import it.lelmarir.db.JDCConnectionDriver;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
import com.vaadin.data.util.ItemsFactory;
import com.vaadin.data.util.SqlConstraint;
import com.vaadin.data.util.SqlConstraintBlock;
public class ArticoloItemFactory extends JDCItemsFactory<Articolo> implements
Serializable {
private static ArticoloItemFactory instance = null;
public static ArticoloItemFactory createInstance(){
if(instance == null)
instance = new ArticoloItemFactory();
return instance;
}
public ArticoloItemFactory() {
super("a.*,c.testo AS nomeCategoria",
"articolo a LEFT JOIN codcategoria c ON a.id_categoria = c.id");
}
@Override
protected Articolo resultSetToBean(ResultSet resultSet) {
try {
return new Articolo(resultSet.getString("id"),
resultSet.getString("nome"),
resultSet.getString("descrizione"),
resultSet.getString("posizione"),
resultSet.getDouble("prezzo"),
resultSet.getDouble("coefficientePrezzo"),
resultSet.getDouble("prezzoFinito"),
resultSet.getInt("id_categoria"),
resultSet.getString("nomeCategoria"));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public Class<Articolo> getType() {
return Articolo.class;
}
}
Se a qualcuno interessa pubblico anche le altre classi necessarie a far funzionare il tutto