001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/portal/PortalUtils.java $
002: /*---------------- FILE HEADER ------------------------------------------
003:
004: This file is part of deegree.
005: Copyright (C) 2001-2008 by:
006: EXSE, Department of Geography, University of Bonn
007: http://www.giub.uni-bonn.de/deegree/
008: lat/lon GmbH
009: http://www.lat-lon.de
010:
011: This library is free software; you can redistribute it and/or
012: modify it under the terms of the GNU Lesser General Public
013: License as published by the Free Software Foundation; either
014: version 2.1 of the License, or (at your option) any later version.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: Contact:
026:
027: Andreas Poth
028: lat/lon GmbH
029: Aennchenstr. 19
030: 53115 Bonn
031: Germany
032: E-Mail: poth@lat-lon.de
033:
034: Klaus Greve
035: Department of Geography
036: University of Bonn
037: Meckenheimer Allee 166
038: 53115 Bonn
039: Germany
040: E-Mail: greve@giub.uni-bonn.de
041:
042:
043: ---------------------------------------------------------------------------*/
044: package org.deegree.portal;
045:
046: import java.net.URL;
047: import java.net.URLEncoder;
048: import java.util.ArrayList;
049: import java.util.Iterator;
050: import java.util.List;
051:
052: import org.deegree.framework.util.CharsetUtils;
053: import org.deegree.model.spatialschema.Point;
054: import org.deegree.ogcwebservices.OWSUtils;
055: import org.deegree.ogcwebservices.wms.operation.GetMap;
056: import org.deegree.portal.context.Format;
057: import org.deegree.portal.context.GeneralExtension;
058: import org.deegree.portal.context.Layer;
059: import org.deegree.portal.context.LayerExtension;
060: import org.deegree.portal.context.LayerList;
061: import org.deegree.portal.context.Node;
062: import org.deegree.portal.context.ViewContext;
063:
064: /**
065: *
066: *
067: *
068: * @version $Revision: 10497 $
069: * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
070: * @author last edited by: $Author: otonnhofer $
071: *
072: * @version 1.0. $Revision: 10497 $, $Date: 2008-03-06 08:17:39 -0800 (Thu, 06 Mar 2008) $
073: *
074: * @since 2.0
075: */
076: public class PortalUtils {
077:
078: /**
079: * returns a comma seperated list of layers marked as sensible for feature info requestes
080: *
081: * @param vc
082: * @return a comma seperated list of layers marked as sensible for feature info requestes
083: */
084: public static List<String> getFeatureInfoLayers(ViewContext vc) {
085: List<String> list = new ArrayList<String>();
086: LayerList layerList = vc.getLayerList();
087: Layer[] layers = layerList.getLayers();
088: for (int i = 0; i < layers.length; i++) {
089: if (layers[i].getExtension() != null
090: && layers[i].getExtension().isSelectedForQuery()) {
091: list.add(layers[i].getName());
092: }
093: }
094: return list;
095: }
096:
097: /**
098: * returns a comma seperated list of visible layers
099: *
100: * @param vc
101: * @return a comma seperated list of visible layers
102: */
103: public static List getVisibleLayers(ViewContext vc) {
104: List<String[]> list = new ArrayList<String[]>();
105: LayerList layerList = vc.getLayerList();
106: Layer[] layers = layerList.getLayers();
107: for (int i = 0; i < layers.length; i++) {
108: if (!layers[i].isHidden()) {
109: String[] s = new String[2];
110: s[0] = layers[i].getName();
111: s[1] = layers[i].getServer().getOnlineResource()
112: .toExternalForm();
113: list.add(s);
114: }
115: }
116: return list;
117: }
118:
119: /**
120: * returns true if at least one layer of the passed server is visible
121: *
122: * @param vc
123: * @param serverTitle
124: * @return <code>true</code> if at least one layer of the passed server is visible
125: */
126: public static boolean hasServerVisibleLayers(ViewContext vc,
127: String serverTitle) {
128: LayerList layerList = vc.getLayerList();
129: Layer[] layers = layerList.getLayers();
130: for (int i = 0; i < layers.length; i++) {
131: if (layers[i].getServer().getTitle().equals(serverTitle)
132: && !layers[i].isHidden()) {
133: return true;
134: }
135: }
136: return false;
137: }
138:
139: /**
140: * returns true if at least one layer within the node is visible
141: *
142: * @param vc
143: * @param nodeID
144: * @return <code>true</code> if at least one layer of the passed server is visible
145: */
146: public static boolean hasNodeVisibleLayers(ViewContext vc,
147: int nodeID) {
148: Layer[] layers = vc.getLayerList().getLayersByNodeId(nodeID);
149: for (Layer layer : layers) {
150: if (!layer.isHidden()) {
151: return true;
152: }
153: }
154: Node[] nodes = vc.getGeneral().getExtension()
155: .getLayerTreeRoot().getNode(nodeID).getNodes();
156: for (Node node : nodes) {
157: if (hasNodeVisibleLayers(vc, node.getId())) {
158: return true;
159: }
160: }
161: return false;
162: }
163:
164: /**
165: * set visibility for a node and all child nodes/layers
166: * @param vc
167: * @param nodeID
168: * @param hidden
169: */
170: public static void setVisibility(ViewContext vc, int nodeID,
171: boolean hidden) {
172: Layer[] layers = vc.getLayerList().getLayersByNodeId(nodeID);
173: for (Layer layer : layers) {
174: layer.setHidden(hidden);
175: }
176: Node[] nodes = vc.getGeneral().getExtension()
177: .getLayerTreeRoot().getNode(nodeID).getNodes();
178: for (Node node : nodes) {
179: setVisibility(vc, node.getId(), hidden);
180: }
181: }
182:
183: /**
184: * creates the GetMap basic requests required by the JSP page assigned to the MapViewPortlet.
185: *
186: * @param vc
187: * @param user
188: * @param password
189: * @param sessionID
190: * @return list of GetMap requests
191: */
192: public static String[] createBaseRequests(ViewContext vc,
193: String user, String password, String sessionID) {
194:
195: Layer[] layers = vc.getLayerList().getLayers();
196: List<String> list = new ArrayList<String>(layers.length);
197: int i = layers.length - 1;
198: try {
199: while (i >= 0) {
200: GeneralExtension gExt = vc.getGeneral().getExtension();
201: Point[] bbox = vc.getGeneral().getBoundingBox();
202: StringBuffer sb = new StringBuffer(1000);
203: URL url = OWSUtils.getHTTPGetOperationURL(layers[i]
204: .getServer().getCapabilities(), GetMap.class);
205: if (url != null) {
206: String href = url.toExternalForm();
207:
208: sb.append(OWSUtils.validateHTTPGetBaseURL(href));
209: sb.append("SRS=").append(
210: bbox[0].getCoordinateSystem().getName());
211: if ("1.0.0".equals(layers[i].getServer()
212: .getVersion())) {
213: sb.append("&REQUEST=map");
214: sb.append("&exceptions=INIMAGE");
215: sb.append("&WMTVER=").append(
216: layers[i].getServer().getVersion());
217: } else {
218: sb.append("&REQUEST=GetMap");
219: sb
220: .append("&exceptions=application/vnd.ogc.se_inimage");
221: sb.append("&VERSION=").append(
222: layers[i].getServer().getVersion());
223: }
224: sb.append("&transparent=").append(true);
225: if (gExt == null) {
226: sb.append("&BGCOLOR=0xFFFFFF");
227: } else {
228: sb.append("&BGCOLOR=")
229: .append(gExt.getBgColor());
230: }
231:
232: Format format = layers[i].getFormatList()
233: .getCurrentFormat();
234: sb.append("&FORMAT=").append(format.getName());
235: StringBuffer styles = new StringBuffer(1000);
236: styles.append("&STYLES=");
237: StringBuffer lyrs = new StringBuffer(1000);
238: lyrs.append("&LAYERS=");
239: String title = layers[i].getServer().getTitle();
240: int authentication = -1;
241: while (i >= 0
242: && title.equals(layers[i].getServer()
243: .getTitle())) {
244: if (!layers[i].isHidden()) {
245: if (authentication < 0) {
246: // just evaluate if not has already been loaded
247: authentication = layers[i]
248: .getExtension()
249: .getAuthentication();
250: }
251: lyrs.append(layers[i].getName())
252: .append(',');
253: String style = layers[i].getStyleList()
254: .getCurrentStyle().getName();
255: if (style.equalsIgnoreCase("DEFAULT")) {
256: style = "";
257: }
258: styles.append(style).append(',');
259: }
260: LayerExtension le = layers[i].getExtension();
261: Iterator<String> iterator = le
262: .getVendorspecificParameterNames();
263: while (iterator.hasNext()) {
264: sb.append('&');
265: String name = iterator.next();
266: String value = le
267: .getVendorspecificParameter(name);
268: sb.append(name).append('=').append(value);
269: }
270: i--;
271: }
272: if (authentication == LayerExtension.USERPASSWORD) {
273: if (user != null) {
274: sb
275: .append("&user=")
276: .append(
277: URLEncoder
278: .encode(
279: user,
280: CharsetUtils
281: .getSystemCharset()));
282: }
283: if (password != null) {
284: sb.append("&password=");
285: sb.append(URLEncoder.encode(password,
286: CharsetUtils.getSystemCharset()));
287: }
288: } else if (authentication == LayerExtension.SESSIONID) {
289: if (sessionID != null) {
290: sb.append("&sessionID=");
291: sb.append(URLEncoder.encode(sessionID,
292: CharsetUtils.getSystemCharset()));
293: }
294: }
295: String s1 = lyrs.substring(0, lyrs.length() - 1);
296: String s2 = styles
297: .substring(0, styles.length() - 1);
298: sb.append(s1).append(s2);
299:
300: if (s1.length() > 7) {
301: // ensure that a request will just be created if
302: // at least one layer of a group is visible
303: list.add(sb.toString());
304: }
305: } else {
306: System.out
307: .println("no service available for layer: "
308: + layers[i--].getName());
309: }
310:
311: }
312: } catch (Exception shouldneverhappen) {
313: shouldneverhappen.printStackTrace();
314: }
315:
316: return list.toArray(new String[list.size()]);
317:
318: }
319:
320: /**
321: * creates the GetMap basic requests required by the JSP page assigned to the MapViewPortlet.
322: *
323: * @param vc
324: * @return
325: */
326: public static String[] createBaseRequests(ViewContext vc) {
327:
328: return createBaseRequests(vc, null, null, null);
329:
330: }
331:
332: }
|