001 /*---------------------------------------------------------------------------- 002 This file is part of deegree, http://deegree.org/ 003 Copyright (C) 2001-2009 by: 004 Department of Geography, University of Bonn 005 and 006 lat/lon GmbH 007 008 This library is free software; you can redistribute it and/or modify it under 009 the terms of the GNU Lesser General Public License as published by the Free 010 Software Foundation; either version 2.1 of the License, or (at your option) 011 any later version. 012 This library is distributed in the hope that it will be useful, but WITHOUT 013 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 014 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 015 details. 016 You should have received a copy of the GNU Lesser General Public License 017 along with this library; if not, write to the Free Software Foundation, Inc., 018 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 019 020 Contact information: 021 022 lat/lon GmbH 023 Aennchenstr. 19, 53177 Bonn 024 Germany 025 http://lat-lon.de/ 026 027 Department of Geography, University of Bonn 028 Prof. Dr. Klaus Greve 029 Postfach 1147, 53001 Bonn 030 Germany 031 http://www.geographie.uni-bonn.de/deegree/ 032 033 e-mail: info@deegree.org 034 ----------------------------------------------------------------------------*/ 035 036 package org.deegree.portal.portlet.modules.map.actions.portlets; 037 038 import java.io.File; 039 import java.io.FileOutputStream; 040 import java.io.IOException; 041 import java.io.OutputStreamWriter; 042 import java.io.UnsupportedEncodingException; 043 import java.net.MalformedURLException; 044 import java.net.URLDecoder; 045 import java.util.ArrayList; 046 import java.util.List; 047 048 import javax.servlet.ServletContext; 049 import javax.servlet.http.HttpServletRequest; 050 import javax.servlet.http.HttpSession; 051 import javax.xml.parsers.ParserConfigurationException; 052 053 import org.apache.jetspeed.portal.Portlet; 054 import org.deegree.enterprise.WebUtils; 055 import org.deegree.framework.log.ILogger; 056 import org.deegree.framework.log.LoggerFactory; 057 import org.deegree.framework.util.ConvenienceFileFilter; 058 import org.deegree.framework.util.StringTools; 059 import org.deegree.framework.xml.NamespaceContext; 060 import org.deegree.framework.xml.XMLFragment; 061 import org.deegree.framework.xml.XMLParsingException; 062 import org.deegree.framework.xml.XMLTools; 063 import org.deegree.i18n.Messages; 064 import org.deegree.model.crs.UnknownCRSException; 065 import org.deegree.ogcbase.CommonNamespaces; 066 import org.deegree.portal.PortalException; 067 import org.deegree.portal.context.ContextException; 068 import org.deegree.portal.context.General; 069 import org.deegree.portal.context.ViewContext; 070 import org.deegree.portal.context.WMCMetadataSurrogate; 071 import org.deegree.portal.context.WebMapContextFactory; 072 import org.deegree.portal.context.XMLFactory; 073 import org.deegree.portal.portlet.modules.actions.AbstractPortletPerform; 074 import org.deegree.portal.portlet.modules.actions.IGeoPortalPortletPerform; 075 import org.deegree.security.drm.model.User; 076 import org.w3c.dom.Element; 077 import org.xml.sax.SAXException; 078 079 /** 080 * Perform class for saving WMCs 081 * 082 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 083 * @author last edited by: $Author: taddei $ 084 * 085 * @version $Revision: 1.9 $, $Date: 2007/01/04 11:18:33 $ 086 */ 087 088 public class WMCManagementPortletPerfom extends IGeoPortalPortletPerform { 089 090 private static final ILogger LOG = LoggerFactory.getLogger( WMCManagementPortletPerfom.class ); 091 092 public static final String TITLE = "TITLE"; 093 094 public static final String DESCRIPTION = "DESCRIPTION"; 095 096 public static final String KEYWORDS = "KEYWORDS"; 097 098 public static final String FILENAME = "FILENAME"; 099 100 private static NamespaceContext nsContext = CommonNamespaces.getNamespaceContext(); 101 102 private static final List<WMCMetadataSurrogate> sharedContextList = new ArrayList<WMCMetadataSurrogate>( 50 ); 103 104 /** 105 * constructor 106 * 107 * @param request 108 * @param portlet 109 * @param sc 110 */ 111 WMCManagementPortletPerfom( HttpServletRequest request, Portlet portlet, ServletContext sc ) { 112 super( request, portlet, sc ); 113 } 114 115 /** 116 * Saves the current context as a user context to a file in 117 * "WEB-INF/wmc/$USER_DIR/$mapPortletID$_CURRENTWMC.xml". 118 * 119 * @param userName 120 * @throws Exception 121 */ 122 void doSavecontext( String userName ) 123 throws Exception { 124 125 saveContext( userName, getMapPortletID() + "_" + AbstractPortletPerform.CURRENT_WMC ); 126 127 } 128 129 /** 130 * Saves the current context as a user context to a file named by the user 131 * 132 * @param userName 133 * @throws Exception 134 */ 135 void doSavenamedcontext( String userName ) 136 throws Exception { 137 138 saveContext( userName, parameter.get( "CONTEXTNAME" ) ); 139 140 } 141 142 /** 143 * 144 * @param userName 145 * @param cntxtName 146 * @throws PortalException 147 * @throws ParserConfigurationException 148 * @throws IOException 149 */ 150 private void saveContext( String userName, String cntxtName ) 151 throws PortalException, ParserConfigurationException, IOException { 152 LOG.logDebug( "Preparing context save." ); 153 ViewContext vc = getCurrentViewContext( getInitParam( INIT_MAPPORTLETID ) ); 154 if ( vc == null ) { 155 String msg = Messages.getMessage( "IGEO_PORTLET_NO_VC_AVAILABLE", getInitParam( INIT_MAPPORTLETID ) ); 156 LOG.logDebug( msg ); 157 throw new PortalException( msg ); 158 } 159 160 File dir = new File( sc.getRealPath( "WEB-INF/wmc/" + userName ) ); 161 LOG.logDebug( "Found directory '" + dir.getAbsolutePath() + "' for user '" + userName + "'." ); 162 163 HttpSession ses = request.getSession( false ); 164 165 LOG.logDebug( "Session is '" + ses + "'." ); 166 167 // create user director if not exists 168 System.out.println( dir ); 169 if ( !dir.exists() ) { 170 System.out.println( 555 ); 171 dir.mkdir(); 172 } 173 174 if ( ses != null ) { 175 storeContext( dir, cntxtName, vc ); 176 } 177 } 178 179 /** 180 * Saves the current context as a shared context to a file in "WEB-INF/wmc/shared". 181 * 182 * @param userName 183 * @throws Exception 184 */ 185 void doSaveshared( String userName ) 186 throws Exception { 187 188 ViewContext vc = getCurrentViewContext( getInitParam( INIT_MAPPORTLETID ) ); 189 if ( vc == null ) { 190 String msg = Messages.getMessage( "IGEO_PORTLET_NO_VC_AVAILABLE", getInitParam( INIT_MAPPORTLETID ) ); 191 throw new PortalException( msg ); 192 } 193 194 updateVC( userName, vc ); 195 String filename = "wmc_" + String.valueOf( System.currentTimeMillis() ); 196 197 File dir = new File( sc.getRealPath( "WEB-INF/wmc/shared/" ) ); 198 199 HttpSession ses = request.getSession( false ); 200 if ( ses != null && dir.exists() ) { 201 storeContext( dir, filename, vc ); 202 } 203 204 sharedContextList.add( WMCMetadataSurrogate.createFromWMC( filename + ".xml", vc ) ); 205 } 206 207 /** 208 * Updates the WMC using the info available inteh request. Currently title, abstract, keywords 209 * and user (author) are update. The first three come from the request parameters TITLE, 210 * ABSTRACT and KEYWORDS, and the user name come from the session. 211 * 212 * @param userName 213 * @param vc 214 * @throws ContextException 215 * @throws PortalException 216 */ 217 private void updateVC( String userName, ViewContext vc ) 218 throws ContextException, PortalException { 219 220 String title = parameter.get( TITLE ); 221 String _abstract = parameter.get( DESCRIPTION ); 222 String keywords = parameter.get( KEYWORDS ); 223 224 General general = vc.getGeneral(); 225 if ( userName != null && userName.length() > 0 ) { 226 general.getContactInformation().setIndividualName( new String[] { userName } ); 227 } 228 String charset = WebUtils.readCharsetFromContentType( request ); 229 try { 230 if ( title != null ) { 231 general.setTitle( URLDecoder.decode( title, charset ) ); 232 } 233 if ( _abstract != null ) { 234 general.setAbstract( URLDecoder.decode( _abstract, charset ) ); 235 } 236 if ( keywords != null ) { 237 keywords = URLDecoder.decode( keywords, charset ); 238 String kwords[] = keywords.split( "," ); 239 general.setKeywords( kwords ); 240 } 241 } catch ( UnsupportedEncodingException e ) { 242 LOG.logError( e.getMessage(), e ); 243 String msg = Messages.getMessage( "IGEO_PORTLET_CONEXTMNG_DECODING", charset ); 244 throw new PortalException( msg, e ); 245 } 246 247 } 248 249 /** 250 * 251 * @param dir 252 * @param name 253 * @param context 254 * @throws ParserConfigurationException 255 * @throws IOException 256 */ 257 private void storeContext( File dir, String name, ViewContext context ) 258 throws ParserConfigurationException, IOException { 259 260 XMLFragment xml = XMLFactory.export( context ); 261 262 File file = new File( dir.getAbsolutePath() + '/' + name + ".xml" ); 263 264 LOG.logDebug( "Saving context to '" + file.getAbsolutePath() + "'." ); 265 266 String charset = WebUtils.readCharsetFromContentType( request ); 267 OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream( file ), charset ); 268 xml.write( osw ); 269 osw.close(); 270 } 271 272 /** 273 * Loads a context from a file pointed to by the request parameter "wmc_filename". The file must 274 * be in the "WEB-INF/wmc/shared/" directory. 275 * 276 * @throws Exception 277 */ 278 void doLoadcontext() 279 throws Exception { 280 281 String wmcFilename = request.getParameter( "wmc_filename" ); 282 File file = new File( sc.getRealPath( "WEB-INF/wmc/shared/" + wmcFilename ) ); 283 loadContext( file ); 284 285 } 286 287 /** 288 * Loads a context from a file pointed to by the request parameter "wmc_filename". The file must 289 * be in the "WEB-INF/wmc/$USER_NAME$/" directory. 290 * 291 * @param userName 292 * name of the user who loads a context 293 * @throws Exception 294 */ 295 void doLoadnamedcontext( String userName ) 296 throws Exception { 297 298 String wmcFilename = request.getParameter( "wmc_filename" ); 299 File file = new File( sc.getRealPath( "WEB-INF/wmc/" + userName + '/' + wmcFilename ) ); 300 loadContext( file ); 301 302 } 303 304 /** 305 * loads a context 306 * 307 * @param file 308 * context file name 309 * @throws IOException 310 * @throws XMLParsingException 311 * @throws ContextException 312 * @throws SAXException 313 * @throws UnknownCRSException 314 * @throws MalformedURLException 315 */ 316 private void loadContext( File file ) 317 throws IOException, XMLParsingException, ContextException, SAXException, 318 UnknownCRSException, MalformedURLException { 319 User u = null; 320 String session = parameter.get( "PARAM_SESSIONID" ); 321 322 String msg = StringTools.concat( 300, "Loading context from '", file.getAbsolutePath(), "' using user '", u, 323 "' and sessionID '", session, "'." ); 324 LOG.logDebug( msg ); 325 326 ViewContext vc = WebMapContextFactory.createViewContext( file.toURI().toURL(), u, session ); 327 328 setCurrentMapContext( vc, getInitParam( INIT_MAPPORTLETID ) ); 329 } 330 331 /** 332 * 333 * @return shared context list 334 */ 335 public static List<WMCMetadataSurrogate> getSharedContextList() { 336 return sharedContextList; 337 } 338 339 @Override 340 public void buildNormalContext() 341 throws PortalException { 342 super.buildNormalContext(); 343 344 // TODO 345 // remove this from buildNormalContext() 346 if ( sharedContextList.size() == 0 ) { 347 String s = sc.getRealPath( "WEB-INF/wmc/shared/" ); 348 File directory = new File( s ); 349 350 ConvenienceFileFilter cff = new ConvenienceFileFilter( false, "XML" ); 351 File[] wmcFiles = directory.listFiles( cff ); 352 353 for ( int i = 0; i < wmcFiles.length; i++ ) { 354 try { 355 XMLFragment xml = new XMLFragment( wmcFiles[i].toURI().toURL() ); 356 Element root = xml.getRootElement(); 357 String xpath = "cntxt:General/cntxt:ContactInformation/cntxt:ContactPersonPrimary/cntxt:ContactPerson[0]"; 358 String author = XMLTools.getNodeAsString( root, xpath, nsContext, "-" ); 359 xpath = "cntxt:General/cntxt:Title"; 360 String title = XMLTools.getNodeAsString( root, xpath, nsContext, "-" ); 361 String abstract_ = XMLTools.getNodeAsString( root, "cntxt:General/cntxt:Abstract", nsContext, "-" ); 362 xpath = "cntxt:General/cntxt:KeywordList/cntxt:Keyword"; 363 String[] keywords = XMLTools.getNodesAsStrings( root, xpath, nsContext ); 364 365 WMCMetadataSurrogate wmcs = new WMCMetadataSurrogate( wmcFiles[i].getName(), author, title, 366 abstract_, keywords ); 367 sharedContextList.add( wmcs ); 368 } catch ( Exception e ) { 369 e.printStackTrace(); 370 } 371 } 372 } 373 } 374 375 }