    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/portal/standard/security/control/AddServiceListener.java $
    002    /*----------------------------------------------------------------------------
    003     This file is part of deegree, http://deegree.org/
    004     Copyright (C) 2001-2009 by:
    005       Department of Geography, University of Bonn
    006     and
    007       lat/lon GmbH
    008
    009     This library is free software; you can redistribute it and/or modify it under
    010     the terms of the GNU Lesser General Public License as published by the Free
    011     Software Foundation; either version 2.1 of the License, or (at your option)
    012     any later version.
    013     This library is distributed in the hope that it will be useful, but WITHOUT
    014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
    016     details.
    017     You should have received a copy of the GNU Lesser General Public License
    018     along with this library; if not, write to the Free Software Foundation, Inc.,
    019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    020
    021     Contact information:
    022
    023     lat/lon GmbH
    024     Aennchenstr. 19, 53177 Bonn
    025     Germany
    026     http://lat-lon.de/
    027
    028     Department of Geography, University of Bonn
    029     Prof. Dr. Klaus Greve
    030     Postfach 1147, 53001 Bonn
    031     Germany
    032     http://www.geographie.uni-bonn.de/deegree/
    033
    034     e-mail: info@deegree.org
    035    ----------------------------------------------------------------------------*/
    036    package org.deegree.portal.standard.security.control;
    037
    038    import static org.deegree.framework.log.LoggerFactory.getLogger;
    039    import static org.deegree.framework.util.StringTools.stackTraceToString;
    040    import static org.deegree.i18n.Messages.get;
    041    import static org.deegree.ogcwebservices.wms.capabilities.WMSCapabilitiesDocumentFactory.getWMSCapabilitiesDocument;
    042    import static org.deegree.portal.standard.security.control.ClientHelper.TYPE_FEATURETYPE;
    043    import static org.deegree.portal.standard.security.control.ClientHelper.TYPE_LAYER;
    044    import static org.deegree.portal.standard.security.control.SecurityHelper.acquireTransaction;
    045    import static org.deegree.portal.standard.security.control.SecurityHelper.checkForAdminRole;
    046    import static org.deegree.security.drm.SecurityAccessManager.getInstance;
    047
    048    import java.io.IOException;
    049    import java.net.URL;
    050    import java.util.LinkedList;
    051    import java.util.List;
    052
    053    import javax.servlet.ServletRequest;
    054
    055    import org.deegree.enterprise.control.AbstractListener;
    056    import org.deegree.enterprise.control.FormEvent;
    057    import org.deegree.enterprise.control.RPCParameter;
    058    import org.deegree.enterprise.control.RPCWebEvent;
    059    import org.deegree.framework.log.ILogger;
    060    import org.deegree.framework.util.StringPair;
    061    import org.deegree.framework.xml.XMLParsingException;
    062    import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
    063    import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
    064    import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities;
    065    import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilitiesDocument_1_1_0;
    066    import org.deegree.ogcwebservices.wfs.capabilities.WFSFeatureType;
    067    import org.deegree.ogcwebservices.wms.capabilities.Layer;
    068    import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilities;
    069    import org.deegree.security.GeneralSecurityException;
    070    import org.deegree.security.drm.SecurityAccessManager;
    071    import org.deegree.security.drm.SecurityTransaction;
    072    import org.deegree.security.drm.model.Service;
    073    import org.xml.sax.SAXException;
    074
    075    /**
    076     * <code>AddServiceListener</code>
    077     *
    078     * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
    079     * @author last edited by: $Author: mschneider $
    080     *
    081     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
    082     */
    083    public class AddServiceListener extends AbstractListener {
    084
    085        private static final ILogger LOG = getLogger( AddServiceListener.class );
    086
    087        private static void addAllLayers( SecurityTransaction transaction, String prefix, Layer layer,
    088                                          List<StringPair> objects )
    089                                throws GeneralSecurityException {
    090            if ( layer.getName() != null ) {
    091                objects.add( new StringPair( layer.getName(), layer.getTitle() ) );
    092                transaction.registerSecuredObject( TYPE_LAYER, prefix + layer.getName(), layer.getTitle() );
    093            }
    094            for ( Layer l : layer.getLayer() ) {
    095                addAllLayers( transaction, prefix, l, objects );
    096            }
    097        }
    098
    099        @Override
    100        public void actionPerformed( FormEvent event ) {
    101            RPCParameter[] params = ( (RPCWebEvent) event ).getRPCMethodCall().getParameters();
    102
    103            ServletRequest request = getRequest();
    104
    105            SecurityTransaction transaction = null;
    106            SecurityAccessManager manager = null;
    107
    108            try {
    109                // perform access check
    110                manager = getInstance();
    111                transaction = acquireTransaction( this );
    112                checkForAdminRole( transaction );
    113
    114                boolean isWMS = params[1].getValue().toString().equalsIgnoreCase( "wms" );
    115                boolean isWFS = params[1].getValue().toString().equalsIgnoreCase( "wfs" );
    116                if ( !isWMS && !isWFS ) {
    117                    // error message? client is faulty
    118                    LOG.logError( "Unknown/unsupported service type to register: " + params[1].getValue() );
    119                }
    120
    121                String address = params[0].getValue().toString();
    122
    123                if ( address.indexOf( "?" ) != -1 ) {
    124                    address = address.substring( 0, address.indexOf( "?" ) );
    125                }
    126
    127                try {
    128                    if ( transaction.getServiceByAddress( address ) != null ) {
    129                        request.setAttribute( "SOURCE", getClass().getSimpleName() );
    130                        request.setAttribute( "MESSAGE", get( "IGEO_STD_SEC_SERVICE_EXISTS", address ) );
    131                        setNextPage( "error.jsp" );
    132                        manager.abortTransaction( transaction );
    133                        return;
    134                    }
    135                } catch ( GeneralSecurityException e ) {
    136                    // so the lookup failed
    137                }
    138
    139                String getCapa = address + "?request=GetCapabilities&";
    140
    141                if ( isWMS ) {
    142                    OGCCapabilities capa = getWMSCapabilitiesDocument( new URL( getCapa + "service=WMS&version=1.1.1" ) ).parseCapabilities();
    143                    if ( capa instanceof WMSCapabilities ) {
    144                        WMSCapabilities cap = (WMSCapabilities) capa;
    145                        LinkedList<StringPair> objects = new LinkedList<StringPair>();
    146
    147                        addAllLayers( transaction, "[" + address + "]:", cap.getLayer(), objects );
    148
    149                        transaction.registerService( address, cap.getServiceIdentification().getTitle(), objects, "WMS" );
    150                    }
    151                }
    152
    153                if ( isWFS ) {
    154                    WFSCapabilitiesDocument_1_1_0 doc = new WFSCapabilitiesDocument_1_1_0();
    155                    doc.load( new URL( getCapa + "service=WFS&version=1.1.0" ) );
    156                    WFSCapabilities capa = (WFSCapabilities) doc.parseCapabilities();
    157                    LinkedList<StringPair> objects = new LinkedList<StringPair>();
    158                    for ( WFSFeatureType ft : capa.getFeatureTypeList().getFeatureTypes() ) {
    159                        objects.add( new StringPair( ft.getName().getFormattedString(), ft.getTitle() ) );
    160                        transaction.registerSecuredObject( TYPE_FEATURETYPE, "[" + address + "]:"
    161                                                                             + ft.getName().getFormattedString(),
    162                                                           ft.getTitle() );
    163                    }
    164
    165                    transaction.registerService( address, capa.getServiceIdentification().getTitle(), objects, "WFS" );
    166                }
    167
    168                manager.commitTransaction( transaction );
    169
    170                LinkedList<Service> services = transaction.getAllServices();
    171                request.setAttribute( "SERVICES", services );
    172
    173            } catch ( GeneralSecurityException e ) {
    174                getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    175                getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_FAIL_INIT_SERVICES_EDITOR", e.getMessage() ) );
    176                setNextPage( "error.jsp" );
    177                LOG.logError( e.getMessage(), e );
    178                try {
    179                    if ( manager != null ) {
    180                        manager.abortTransaction( transaction );
    181                    }
    182                } catch ( GeneralSecurityException e1 ) {
    183                    LOG.logError( "Unknown error", e1 );
    184                }
    185            } catch ( SAXException e ) {
    186                getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    187                getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_ERROR_ADD_SERVICE", e.getMessage() ) );
    188                setNextPage( "error.jsp" );
    189                try {
    190                    if ( manager != null ) {
    191                        manager.abortTransaction( transaction );
    192                    }
    193                } catch ( GeneralSecurityException e1 ) {
    194                    LOG.logError( "Unknown error", e1 );
    195                }
    196            } catch ( IOException e ) {
    197                getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    198                getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_ERROR_ADD_SERVICE", e.getMessage() ) );
    199                setNextPage( "error.jsp" );
    200                try {
    201                    if ( manager != null ) {
    202                        manager.abortTransaction( transaction );
    203                    }
    204                } catch ( GeneralSecurityException e1 ) {
    205                    LOG.logError( "Unknown error", e1 );
    206                }
    207            } catch ( XMLParsingException e ) {
    208                getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    209                getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_ERROR_ADD_SERVICE2" ) );
    210                setNextPage( "error.jsp" );
    211                try {
    212                    if ( manager != null ) {
    213                        manager.abortTransaction( transaction );
    214                    }
    215                } catch ( GeneralSecurityException e1 ) {
    216                    LOG.logError( "Unknown error", e1 );
    217                }
    218            } catch ( InvalidCapabilitiesException e ) {
    219                getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    220                getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_ERROR_ADD_SERVICE2" ) );
    221                setNextPage( "error.jsp" );
    222                try {
    223                    if ( manager != null ) {
    224                        manager.abortTransaction( transaction );
    225                    }
    226                } catch ( GeneralSecurityException e1 ) {
    227                    LOG.logError( "Unknown error", e1 );
    228                }
    229            } catch ( Exception e ) {
    230                LOG.logError( get( "IGEO_STD_SEC_ERROR_UNKNOWN", stackTraceToString( e ) ) );
    231                try {
    232                    if ( manager != null ) {
    233                        manager.abortTransaction( transaction );
    234                    }
    235                } catch ( GeneralSecurityException e1 ) {
    236                    LOG.logError( "Unknown error", e1 );
    237                    getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    238                    getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_ERROR_ADD_SERVICE", e1.getMessage() ) );
    239                    setNextPage( "error.jsp" );
    240                    return;
    241
    242                }
    243                getRequest().setAttribute( "SOURCE", this.getClass().getName() );
    244                getRequest().setAttribute( "MESSAGE", get( "IGEO_STD_SEC_ERROR_ADD_SERVICE", e.getMessage() ) );
    245                setNextPage( "error.jsp" );
    246            }
    247        }
    248
    249    }