Hello, I have a problem while using a simple HttpClient connection from a POJO data source, I have a class:
package pl.m.olap.base;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public abstract class BaseDataSource<T> {
private Iterator<T> iterator;
private Map<String, Object> dataSetParamValues;
public abstract List<T> fetch();
public void open(Object appContext, Map<String, Object> dataSetParamValues) {
this.dataSetParamValues = dataSetParamValues;
iterator = fetch().iterator();
}
public Object next() {
if (iterator != null && iterator.hasNext()) {
return iterator.next();
}
return null;
}
public void close() {
}
}
package pl.m.olap.dataset;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import pl.mikronika.olap.base.BaseDataSource;
import pl.mikronika.olap.base.BaseWebClientBuilder;
import pl.mikronika.olap.dto.MOlapLocation;
import pl.mikronika.olap.logic.LocationService;
import pl.mikronika.olap.response.Response;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class MOlapProvinceDataSet extends BaseDataSource<MOlapLocation> {
@Override
public List<MOlapLocation> fetch() {
HttpClient httpClient = BaseWebClientBuilder.create();
Gson gson = new GsonBuilder().create();
HttpGet getRequest = new HttpGet(
"http://127.0.0.1:8080/oc/api/olap/datasources/dimension/location?type=PROVINCE");
getRequest.addHeader("accept", "application/json");
String responseString = "";
try {
HttpResponse response = httpClient.execute(getRequest);
if (response.getStatusLine().getStatusCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.getStatusLine().getStatusCode());
}
BufferedReader br = new BufferedReader(
new InputStreamReader((response.getEntity().getContent())));
String output;
while ((output = br.readLine()) != null) {
//System.out.println(output);
responseString += output;
}
} catch (IOException e) {
}
Response response = gson.fromJson(responseString, Response.class);
List<MOlapLocation> locations = new ArrayList();
if (!response.data.isEmpty()) {
response.data.stream().forEach((name) -> {
System.out.println("name = " + name);
locations.add(new MOlapLocation((String) name));
});
}
return locations;
}
}
and when adding this DataSet to BIRT and trying to get the data it throws
Quote:org.eclipse.birt.data.engine.odaconsumer.OdaDataException: Cannot execute the statement.
org.eclipse.datatools.connectivity.oda.OdaException ;
java.lang.reflect.InvocationTargetException
at org.eclipse.birt.data.engine.odaconsumer.ExceptionHandler.newException(ExceptionHandler.java:52)
at org.eclipse.birt.data.engine.odaconsumer.ExceptionHandler.throwException(ExceptionHandler.java:108)
at org.eclipse.birt.data.engine.odaconsumer.ExceptionHandler.throwException(ExceptionHandler.java:84)
at org.eclipse.birt.data.engine.odaconsumer.PreparedStatement.execute(PreparedStatement.java:586)
at org.eclipse.birt.data.engine.executor.DataSourceQuery.execute(DataSourceQuery.java:978)
at org.eclipse.birt.data.engine.impl.PreparedOdaDSQuery$OdaDSQueryExecutor.executeOdiQuery(PreparedOdaDSQuery.java:607)
at org.eclipse.birt.data.engine.impl.QueryExecutor.execute(QueryExecutor.java:1251)
at org.eclipse.birt.data.engine.impl.ServiceForQueryResults.executeQuery(ServiceForQueryResults.java:233)
at org.eclipse.birt.data.engine.impl.QueryResults.getResultIterator(QueryResults.java:178)
at org.eclipse.birt.report.engine.api.impl.ExtractionResults.nextResultIterator(ExtractionResults.java:157)
at org.eclipse.birt.report.designer.data.ui.dataset.DataSetPreviewer.preview(DataSetPreviewer.java:69)
at org.eclipse.birt.report.designer.data.ui.dataset.ResultSetPreviewPage$5.run(ResultSetPreviewPage.java:372)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:119)
Caused by: org.eclipse.datatools.connectivity.oda.OdaException ;
java.lang.reflect.InvocationTargetException
at org.eclipse.birt.data.oda.pojo.impl.internal.PojoDataSetFromCustomClass.open(PojoDataSetFromCustomClass.java:194)
at org.eclipse.birt.data.oda.pojo.impl.Query.executeQuery(Query.java:131)
at org.eclipse.datatools.connectivity.oda.consumer.helper.OdaQuery.doExecuteQuery(OdaQuery.java:480)
at org.eclipse.datatools.connectivity.oda.consumer.helper.OdaQuery.executeQuery(OdaQuery.java:444)
at org.eclipse.birt.data.engine.odaconsumer.PreparedStatement.execute(PreparedStatement.java:575)
... 9 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.eclipse.birt.data.oda.pojo.impl.internal.PojoDataSetFromCustomClass.open(PojoDataSetFromCustomClass.java:180)
... 13 more
Caused by: java.lang.NullPointerException
at pl.mikronika.olap.dataset.MOlapProvinceDataSet.fetch(MOlapProvinceDataSet.java:41)
at pl.mikronika.olap.base.BaseDataSource.open(BaseDataSource.java:20)
... 18 more
it is the error line, it works fine if i use it outside the birt designer/viewer, HttpResponse response = httpClient.execute(getRequest);
I have a shaded jar added to Eclipse with this DataSource, which has the HttpClient inside.
Please help