001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.record; 016 017 import java.util.ArrayList; 018 import java.util.Collection; 019 import java.util.Collections; 020 021 import org.apache.hivemind.util.Defense; 022 import org.apache.tapestry.engine.ServiceEncoding; 023 import org.apache.tapestry.web.WebRequest; 024 import org.apache.tapestry.web.WebSession; 025 026 /** 027 * The most basic {@link org.apache.tapestry.record.PropertyPersistenceStrategy}, which stores 028 * properties in the HttpSession as attributes. 029 * 030 * @author Howard M. Lewis Ship 031 * @since 4.0 032 */ 033 public class SessionPropertyPersistenceStrategy implements PropertyPersistenceStrategy 034 { 035 public static final String STRATEGY_ID = "session"; 036 037 // Really, the name of the servlet; used as a prefix on all HttpSessionAttribute keys 038 // to keep things straight if multiple Tapestry apps are deployed 039 // in the same WAR. 040 041 private String _applicationId; 042 043 private WebRequest _request; 044 045 public void store(String pageName, String idPath, String propertyName, Object newValue) 046 { 047 Defense.notNull(pageName, "pageName"); 048 Defense.notNull(propertyName, "propertyName"); 049 050 WebSession session = _request.getSession(true); 051 052 String attributeName = RecordUtils.buildChangeKey( 053 STRATEGY_ID, 054 _applicationId, 055 pageName, 056 idPath, 057 propertyName); 058 059 session.setAttribute(attributeName, newValue); 060 } 061 062 public Collection getStoredChanges(String pageName) 063 { 064 Defense.notNull(pageName, "pageName"); 065 066 WebSession session = _request.getSession(false); 067 068 if (session == null) 069 return Collections.EMPTY_LIST; 070 071 final Collection result = new ArrayList(); 072 073 WebSessionAttributeCallback callback = new WebSessionAttributeCallback() 074 { 075 public void handleAttribute(WebSession session, String name) 076 { 077 PropertyChange change = RecordUtils.buildChange(name, session.getAttribute(name)); 078 079 result.add(change); 080 } 081 }; 082 083 RecordUtils.iterateOverMatchingAttributes( 084 STRATEGY_ID, 085 _applicationId, 086 pageName, 087 session, 088 callback); 089 090 return result; 091 } 092 093 public void discardStoredChanges(String pageName) 094 { 095 WebSession session = _request.getSession(false); 096 097 if (session == null) 098 return; 099 100 WebSessionAttributeCallback callback = new WebSessionAttributeCallback() 101 { 102 public void handleAttribute(WebSession session, String name) 103 { 104 session.setAttribute(name, null); 105 } 106 }; 107 108 RecordUtils.iterateOverMatchingAttributes( 109 STRATEGY_ID, 110 _applicationId, 111 pageName, 112 session, 113 callback); 114 } 115 116 /** 117 * Does nothing; session persistence does not make use of query parameters. 118 */ 119 120 public void addParametersForPersistentProperties(ServiceEncoding encoding, boolean post) 121 { 122 } 123 124 public void setApplicationId(String applicationName) 125 { 126 _applicationId = applicationName; 127 } 128 129 public void setRequest(WebRequest request) 130 { 131 _request = request; 132 } 133 }