java.lang.IllegalStateException: URL is null
at com.codename1.io.ConnectionRequest.validateImpl(ConnectionRequest.java:1216)
at com.codename1.io.NetworkManager.addToQueue(NetworkManager.java:608)
at com.codename1.io.NetworkManager.addToQueue(NetworkManager.java:563)
at com.codename1.io.services.CachedDataService.updateData(CachedDataService.java:77)
at userclasses.StateMachine.onActualite_ActualiteActualiserAction(StateMachine.java:322)
at generated.StateMachineBase.handleComponentAction(StateMachineBase.java:1714)
public static void updateData(CachedData d, ActionListener callback)
{
if(d.isFetching())
{
return;
}
d.setFetching(true);
CachedDataService c = new CachedDataService();
c.setPost(false);
if(callback != null) {
c.addResponseListener(callback);
}
if(d.getModified() != null && d.getModified().length() > 0) {
c.addRequestHeader("If-Modified-Since", d.getModified());
c.addRequestHeader("If-None-Match", d.getEtag());
//you forgot to add : c.setUrl(d.getUrl);
}
NetworkManager.getInstance().addToQueue(c);
}
//the new update method
public static void updateData(ReseauCachedData d, ActionListener callback) {
if(d.isFetching()) {
return;
}
d.setFetching(true);
ReseauCachedDataService c = new ReseauCachedDataService();
c.data = d;
c.setPost(false);
if(callback != null)
{
c.addResponseListener(callback);
}
if(d.getModified() != null && d.getModified().length() > 0)
{
c.addRequestHeader("If-Modified-Since", d.getModified());
c.addRequestHeader("If-None-Match", d.getEtag());
}
c.setUrl(d.getUrl());
NetworkManager.getInstance().addToQueue(c);
}
/**
* thanks to Fabrice Kabongo
*/
public static void updateData(ReseauCachedData d, ActionListener callback) {
if(d.isFetching()) {
return;
}
d.setFetching(true);
ReseauCachedDataService c = new ReseauCachedDataService();
c.setPost(false);
if(callback != null)
{
c.addResponseListener(callback);
}
if(d.getModified() != null && d.getModified().length() > 0)
{
c.addRequestHeader("If-Modified-Since", d.getModified());
c.addRequestHeader("If-None-Match", d.getEtag());//generates a null pointer exception when the server didn't set the ETag
}
c.setUrl(d.getUrl());
NetworkManager.getInstance().addToQueue(c);
}
public static void updateData(ReseauCachedData d, ActionListener callback) {
if(d.isFetching()) {
return;
}
d.setFetching(true);
ReseauCachedDataService c = new ReseauCachedDataService();
c.setPost(false);
if(callback != null)
{
c.addResponseListener(callback);
}
if(d.getModified() != null && d.getModified().length() > 0)
{
c.addRequestHeader("If-Modified-Since", d.getModified());
//start of the correction
if(d.getEtag()!=null)
{
c.addRequestHeader("If-None-Match", d.getEtag());
}
//and of the correction
}
c.setUrl(d.getUrl());
NetworkManager.getInstance().addToQueue(c);
}
if(d.isFetching()) {
return;
}
d.setFetching(true);
public class CachedDataService extends ConnectionRequest
{
private CachedData data = new CachedData();//this one
protected void readResponse(InputStream input) throws IOException
{
byte[] b = Util.readInputStream(input);
data.setData(b);//here
Log.p(String.valueOf(data.getData().length));
fireResponseListener(new NetworkEvent(this, data));//and it sent to the user
}
listeBreves.setUrl("http://localhost/web/breves/?token="+token);
CachedDataService.updateData(listeBreves, new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
DataOutputStream dos = null;
NetworkEvent nvt = (NetworkEvent)evt;
listeBreves = (CachedData)nvt.getMetaData();//here
}
});
protected void handleErrorResponseCode(int code, String message)
{
//miss a data.setFetching(false);
// but even if we do that is not the original CachedData that'll be unlocked
if(code == 304) {
// data unmodified
return;
}
super.handleErrorResponseCode(code, message);
}
public class CachedDataService extends ConnectionRequest {
private CachedData data = new CachedData();
private CachedDataService() {}
/**
* Makes sure the cached data class is properly registered as an externalizable. This must
* be invoked for caching to work
*/
public static void register() {
Util.register("CachedData", CachedData.class);
}
/**
* Checks that the cached data is up to date and if a newer version exits it updates the data in place
*
* @param d the data to check
* @param callback optional callback to be invoked on request completion
*/
public static void updateData(CachedData d, ActionListener callback) {
if(d.isFetching()) {
return;
}
d.setFetching(true);
CachedDataService c = new CachedDataService();
c.data = d;//to ensure that we store a link to the original CachedData
c.setPost(false);
if(callback != null)
{
c.addResponseListener(callback);
}
if(d.getModified() != null && d.getModified().length() > 0)
{
c.addRequestHeader("If-Modified-Since", d.getModified());
if(d.getEtag()!=null)
{//already added
c.addRequestHeader("If-None-Match", d.getEtag());
}
}
c.setUrl(d.getUrl());//already added too
NetworkManager.getInstance().addToQueue(c);
}
/**
* @inheritDoc
*/
@Override
protected void handleErrorResponseCode(int code, String message)
{
data.setFetching(false);//the first correction
if(code == 304) {
// data unmodified
return;
}
super.handleErrorResponseCode(code, message);
}
/**
* @inheritDoc
*/
@Override
protected void readHeaders(Object connection) throws IOException
{
String last = getHeader(connection, "Last-Modified");
String etag = getHeader(connection, "ETag");
if(last != null && last.length() > 0) {
data.setModified(last);
data.setEtag(etag);
}
//i would like to add this here: data.setFetching(false);
//instead of everywere but it will be to soon to unlock the CachedData }
/**
* @inheritDoc
*/
@Override
protected void readResponse(InputStream input) throws IOException
{
byte[] b = Util.readInputStream(input);
data.setData(b);
Log.p(String.valueOf(data.getData().length));
data.setFetching(false);//so we also add here because "data" is no more a new CacheData
fireResponseListener(new NetworkEvent(this, data));
}