001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/OWSUtils.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 53177 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. 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 package org.deegree.ogcwebservices; 044 045 import java.net.URL; 046 import java.util.List; 047 048 import org.deegree.datatypes.QualifiedName; 049 import org.deegree.ogcwebservices.getcapabilities.GetCapabilities; 050 import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities; 051 import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities; 052 import org.deegree.ogcwebservices.wfs.capabilities.WFSOperationsMetadata; 053 import org.deegree.ogcwebservices.wfs.operation.GetFeature; 054 import org.deegree.ogcwebservices.wfs.operation.GetFeatureWithLock; 055 import org.deegree.ogcwebservices.wfs.operation.Lock; 056 import org.deegree.ogcwebservices.wfs.operation.transaction.Transaction; 057 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilities; 058 import org.deegree.ogcwebservices.wms.operation.GetFeatureInfo; 059 import org.deegree.ogcwebservices.wms.operation.GetLegendGraphic; 060 import org.deegree.ogcwebservices.wms.operation.GetMap; 061 import org.deegree.owscommon_new.DCP; 062 import org.deegree.owscommon_new.HTTP; 063 import org.deegree.owscommon_new.Operation; 064 import org.deegree.owscommon_new.OperationsMetadata; 065 066 /** 067 * 068 * 069 * 070 * @version $Revision: 9345 $ 071 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 072 * @author last edited by: $Author: apoth $ 073 * 074 * @version 1.0. $Revision: 9345 $, $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $ 075 * 076 * @since 2.0 077 */ 078 public class OWSUtils { 079 080 /** 081 * according to OGC WMS 1.3 Testsuite a URL to a service operation via HTTPGet must end with '?' 082 * or '&' 083 * 084 * @param href 085 * @return the parameter, changed to fulfill the spec 086 */ 087 public static String validateHTTPGetBaseURL( String href ) { 088 if ( !href.endsWith( "/" ) ) { 089 if ( href.indexOf( '?' ) < 0 ) { 090 href = href + '?'; 091 } else if ( !href.endsWith( "&" ) && !href.endsWith( "?" ) ) { 092 href = href + '&'; 093 } 094 } 095 return href; 096 } 097 098 /** 099 * the method return the first HTTPGet URL for a Operation within the pass capabilities 100 * document. If No URL can be found (e.g. the service does not support the operation via HTTP 101 * Get) <code>null</code> will be returned 102 * 103 * @param capabilities 104 * @param clss 105 * @return see above 106 */ 107 public synchronized static URL getHTTPGetOperationURL( OGCCapabilities capabilities, Class clss ) { 108 URL url = null; 109 if ( capabilities instanceof WMSCapabilities ) { 110 url = getHTTPGetOperationURL( (WMSCapabilities) capabilities, clss ); 111 } else if ( capabilities instanceof WFSCapabilities ) { 112 url = getHTTPGetOperationURL( (WFSCapabilities) capabilities, clss ); 113 } else { 114 // TODO 115 // support more service types 116 // possibly use generic base capabilities to extract it 117 } 118 return url; 119 120 } 121 122 /** 123 * @see #getHTTPGetOperationURL(OGCCapabilities, Class) 124 * @param capabilities 125 * @param clss 126 * @return the first operation URL 127 */ 128 private synchronized static URL getHTTPGetOperationURL( WMSCapabilities capabilities, Class clss ) { 129 130 OperationsMetadata om = capabilities.getOperationMetadata(); 131 List<DCP> dcps = null; 132 if ( clss.equals( GetMap.class ) ) { 133 Operation op = om.getOperation( new QualifiedName( "GetMap" ) ); 134 if ( op == null ) { 135 op = om.getOperation( new QualifiedName( "map" ) ); 136 } 137 dcps = op.getDCP(); 138 } else if ( clss.equals( GetCapabilities.class ) ) { 139 Operation op = om.getOperation( new QualifiedName( "GetCapabilities" ) ); 140 if ( op == null ) { 141 op = om.getOperation( new QualifiedName( "capabilities" ) ); 142 } 143 dcps = op.getDCP(); 144 } else if ( clss.equals( GetFeatureInfo.class ) ) { 145 Operation op = om.getOperation( new QualifiedName( "GetFeatureInfo" ) ); 146 if ( op == null ) { 147 op = om.getOperation( new QualifiedName( "FeatureInfo" ) ); 148 } 149 dcps = op.getDCP(); 150 } else if ( clss.equals( GetLegendGraphic.class ) ) { 151 Operation op = om.getOperation( new QualifiedName( "GetLegendGraphic" ) ); 152 dcps = op.getDCP(); 153 } 154 155 // search for the first HTTP Get link 156 if ( dcps == null ) { 157 return null; 158 } 159 for ( DCP dcp : dcps ) { 160 if ( dcp instanceof HTTP ) { 161 HTTP http = (HTTP) dcp; 162 List<URL> urls = http.getGetOnlineResources(); 163 if ( urls.size() > 0 ) { 164 return urls.get( 0 ); 165 } 166 } 167 } 168 169 return null; 170 171 } 172 173 /** 174 * @see #getHTTPGetOperationURL(OGCCapabilities, Class) 175 * @param capabilities 176 * @param clss 177 * @return the first operation URL 178 */ 179 private synchronized static URL getHTTPGetOperationURL( WFSCapabilities capabilities, Class clss ) { 180 181 URL url = null; 182 WFSOperationsMetadata om = (WFSOperationsMetadata) capabilities.getOperationsMetadata(); 183 if ( clss.equals( GetCapabilities.class ) ) { 184 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getGetCapabilitiesOperation().getDCPs()[0].getProtocol(); 185 url = http.getGetOnlineResources()[0]; 186 } else if ( clss.equals( GetFeature.class ) ) { 187 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getGetFeature().getDCPs()[0].getProtocol(); 188 url = http.getGetOnlineResources()[0]; 189 } else if ( clss.equals( GetFeatureWithLock.class ) ) { 190 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getGetFeatureWithLock().getDCPs()[0].getProtocol(); 191 url = http.getGetOnlineResources()[0]; 192 } else if ( clss.equals( Lock.class ) ) { 193 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getLockFeature().getDCPs()[0].getProtocol(); 194 url = http.getGetOnlineResources()[0]; 195 } else if ( clss.equals( Transaction.class ) ) { 196 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getTransaction().getDCPs()[0].getProtocol(); 197 url = http.getGetOnlineResources()[0]; 198 } 199 return url; 200 } 201 202 /** 203 * the method return the first HTTPPost URL for a Operation within the pass capabilities 204 * document. If No URL can be found (e.g. the service does not support the operation via HTTP 205 * Get) <code>null</code> will be returned 206 * 207 * @param capabilities 208 * @param clss 209 * @return the first HTTPPost URL for a Operation within the pass capabilities document. If No 210 * URL can be found (e.g. the service does not support the operation via HTTP Get) 211 * <code>null</code> will be returned 212 */ 213 public synchronized static URL getHTTPPostOperationURL( OGCCapabilities capabilities, Class clss ) { 214 URL url = null; 215 if ( capabilities instanceof WFSCapabilities ) { 216 url = getHTTPPostOperationURL( (WFSCapabilities) capabilities, clss ); 217 } else { 218 // TODO 219 // support more service types 220 // possibly use generic base capabilities to extract it 221 } 222 return url; 223 } 224 225 /** 226 * @see #getHTTPPostOperationURL(OGCCapabilities, Class) 227 * @param capabilities 228 * @param clss 229 * @return the first operation URL 230 */ 231 private synchronized static URL getHTTPPostOperationURL( WFSCapabilities capabilities, Class clss ) { 232 233 URL url = null; 234 WFSOperationsMetadata om = (WFSOperationsMetadata) capabilities.getOperationsMetadata(); 235 if ( clss.equals( GetCapabilities.class ) ) { 236 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getGetCapabilitiesOperation().getDCPs()[0].getProtocol(); 237 url = http.getPostOnlineResources()[0]; 238 } else if ( clss.equals( GetFeature.class ) ) { 239 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getGetFeature().getDCPs()[0].getProtocol(); 240 url = http.getPostOnlineResources()[0]; 241 } else if ( clss.equals( GetFeatureWithLock.class ) ) { 242 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getGetFeatureWithLock().getDCPs()[0].getProtocol(); 243 url = http.getPostOnlineResources()[0]; 244 } else if ( clss.equals( Lock.class ) ) { 245 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getLockFeature().getDCPs()[0].getProtocol(); 246 url = http.getPostOnlineResources()[0]; 247 } else if ( clss.equals( Transaction.class ) ) { 248 org.deegree.ogcwebservices.getcapabilities.HTTP http = (org.deegree.ogcwebservices.getcapabilities.HTTP) om.getTransaction().getDCPs()[0].getProtocol(); 249 url = http.getPostOnlineResources()[0]; 250 } 251 return url; 252 } 253 254 }