ingo@1400: package de.intevation.flys.client.server;
ingo@1400:
ingo@1400: import java.io.BufferedReader;
ingo@1400: import java.io.InputStream;
ingo@1400: import java.io.InputStreamReader;
ingo@1400: import java.io.IOException;
ingo@1400: import java.io.StringWriter;
ingo@1400: import java.net.URL;
ingo@1400: import java.net.URLConnection;
ingo@1400: import java.util.List;
ingo@1400:
ingo@1400: import org.apache.log4j.Logger;
ingo@1400:
ingo@1400: import com.google.gwt.user.server.rpc.RemoteServiceServlet;
ingo@1400:
ingo@1400:
ingo@1400: import de.intevation.flys.client.shared.exceptions.ServerException;
ingo@1400: import de.intevation.flys.client.shared.model.AttributedTheme;
ingo@1400: import de.intevation.flys.client.shared.model.Theme;
ingo@1400:
ingo@1400: import de.intevation.flys.client.client.services.GFIService;
ingo@1400:
ingo@1400:
ingo@1400: /**
ingo@1400: * @author Ingo Weinzierl
ingo@1400: */
ingo@1400: public class GFIServiceImpl
ingo@1400: extends RemoteServiceServlet
ingo@1400: implements GFIService
ingo@1400: {
ingo@1400: public static final String ERR_NO_VALID_GFI_URL =
ingo@1400: "error_no_valid_gfi_url";
ingo@1400:
ingo@1400: public static final String ERR_GFI_REQUEST_FAILED =
ingo@1400: "error_gfi_req_failed";
ingo@1400:
ingo@1400: public static final String ERR_PARSING_RESPONSE_FAILED =
ingo@1400: "error_gfi_parsing_failed";
ingo@1400:
ingo@1400:
ingo@1400: private static final Logger logger =
ingo@1400: Logger.getLogger(GFIServiceImpl.class);
ingo@1400:
ingo@1400:
ingo@1400: /**
ingo@1400: * @param themes
ingo@1400: * @param format
ingo@1400: * @param bbox
ingo@1400: * @param height
ingo@1400: * @param width
ingo@1400: * @param x
ingo@1400: * @param y
ingo@1400: *
ingo@1400: * @return
ingo@1400: */
ingo@1400: public String query(
ingo@1400: List themes,
ingo@1400: String format,
ingo@1400: String bbox,
ingo@1400: String projection,
ingo@1400: int height,
ingo@1400: int width,
ingo@1400: int x,
ingo@1400: int y
ingo@1400: ) throws ServerException
ingo@1400: {
ingo@1400: logger.info("GFIServiceImpl.query");
ingo@1400:
ingo@1400: String path = createGetFeautureInfoURL(
ingo@1400: themes, format, bbox, projection, height, width, x, y);
ingo@1400: logger.debug("URL=" + path);
ingo@1400:
ingo@1400: try {
ingo@1400: URL url = new URL(path);
ingo@1400:
ingo@1400: URLConnection conn = url.openConnection();
ingo@1400: conn.connect();
ingo@1400:
ingo@1400: InputStream is = conn.getInputStream();
ingo@1400:
ingo@1400: return getResponseText(is);
ingo@1400:
ingo@1400: }
ingo@1400: catch (IOException ioe) {
ingo@1400: logger.warn(ioe, ioe);
ingo@1400: }
ingo@1400:
ingo@1400: throw new ServerException(ERR_GFI_REQUEST_FAILED);
ingo@1400: }
ingo@1400:
ingo@1400:
ingo@1400: protected String getResponseText(InputStream is)
ingo@1400: throws ServerException {
ingo@1400: BufferedReader reader = null;
ingo@1400: StringWriter writer = new StringWriter();
ingo@1400:
ingo@1400: try {
ingo@1400: reader = new BufferedReader(new InputStreamReader(is));
ingo@1400:
ingo@1400: String line = null;
ingo@1400:
ingo@1400: if (reader.ready()) {
ingo@1400: while ((line = reader.readLine()) != null) {
ingo@1400: String test = line.trim();
ingo@1400: if (test.startsWith("<") && !test.startsWith("")
ingo@1400: && test.indexOf("_feature") > 0)
ingo@1400: {
ingo@1400: writer.append("");
ingo@1400: }
ingo@1400: writer.append(line);
ingo@1400:
ingo@1400: if (test.startsWith("") && test.indexOf("_feature") > 0) {
ingo@1400: writer.append("");
ingo@1400: }
ingo@1400: }
ingo@1400: }
ingo@1400: }
ingo@1400: catch (IOException ioe) {
ingo@1400: logger.warn(ioe, ioe);
ingo@1400: throw new ServerException(ERR_PARSING_RESPONSE_FAILED);
ingo@1400: }
ingo@1400: finally {
ingo@1400: if (reader != null) {
ingo@1400: try {
ingo@1400: reader.close();
ingo@1400: }
ingo@1400: catch (IOException ioe) {
ingo@1400: // do nothing here
ingo@1400: }
ingo@1400: }
ingo@1400: }
ingo@1400:
ingo@1400: return writer.toString();
ingo@1400: }
ingo@1400:
ingo@1400:
ingo@1400: /**
ingo@1400: * @param map
ingo@1400: * @param themes
ingo@1400: * @param format
ingo@1400: * @param x
ingo@1400: * @param y
ingo@1400: *
ingo@1400: * @return
ingo@1400: */
ingo@1400: protected String createGetFeautureInfoURL(
ingo@1400: List themes,
ingo@1400: String infoFormat,
ingo@1400: String bbox,
ingo@1400: String projection,
ingo@1400: int height,
ingo@1400: int width,
ingo@1400: int x,
ingo@1400: int y
ingo@1400: ) throws ServerException
ingo@1400: {
ingo@1400: String url = getUrl(themes);
ingo@1400:
ingo@1400: if (url == null || url.length() == 0) {
ingo@1400: throw new ServerException(ERR_NO_VALID_GFI_URL);
ingo@1400: }
ingo@1400:
ingo@1400: String layers = createLayersString(themes);
ingo@1400:
ingo@1400: StringBuilder sb = new StringBuilder();
ingo@1400: sb.append(url);
ingo@1400:
ingo@1400: if (url.indexOf("?") < 0) {
ingo@1400: sb.append("?SERVICE=WMS");
ingo@1400: }
ingo@1400: else {
ingo@1400: sb.append("&SERVICE=WMS");
ingo@1400: }
ingo@1400:
ingo@1400: sb.append("&VERSION=1.1.1");
ingo@1400: sb.append("&REQUEST=GetFeatureInfo");
ingo@1400: sb.append("&LAYERS=" + layers);
ingo@1400: sb.append("&QUERY_LAYERS=" + layers);
ingo@1400: sb.append("&BBOX=" + bbox);
ingo@1400: sb.append("&HEIGHT=" + height);
ingo@1400: sb.append("&WIDTH=" + width);
ingo@1400: sb.append("&FORMAT=image/png");
ingo@1400: sb.append("&INFO_FORMAT=" + infoFormat);
ingo@1400: sb.append("&SRS=" + projection);
ingo@1400: sb.append("&X=" + String.valueOf(x));
ingo@1400: sb.append("&Y=" + String.valueOf(y));
ingo@1400:
ingo@1400: return sb.toString();
ingo@1400: }
ingo@1400:
ingo@1400:
ingo@1400: protected String getUrl(List themes) {
ingo@1400: for (Theme t: themes) {
ingo@1400: AttributedTheme attr = (AttributedTheme) t;
ingo@1400:
ingo@1400: if (attr.getAttrAsBoolean("queryable")) {
ingo@1400: return attr.getAttr("url");
ingo@1400: }
ingo@1400: }
ingo@1400:
ingo@1400: return null;
ingo@1400: }
ingo@1400:
ingo@1400:
ingo@1400: protected String createLayersString(List themes) {
ingo@1400: StringBuilder sb = new StringBuilder();
ingo@1400: boolean first = true;
ingo@1400:
ingo@1400: for (Theme theme: themes) {
ingo@1400: if (!first) {
ingo@1400: sb.append(",");
ingo@1400: }
ingo@1400:
ingo@1400: AttributedTheme layer = (AttributedTheme) theme;
ingo@1400: if (layer.getAttrAsBoolean("queryable")) {
ingo@1400: sb.append(layer.getAttr("layers"));
ingo@1400: first = false;
ingo@1400: }
ingo@1400: }
ingo@1400:
ingo@1400: return sb.toString();
ingo@1400: }
ingo@1400: }
ingo@1400: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :