001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.wicket.settings; 018 019import java.util.ArrayList; 020import java.util.List; 021 022import org.apache.wicket.Application; 023import org.apache.wicket.Component; 024import org.apache.wicket.IComponentAwareEventSink; 025import org.apache.wicket.IDetachListener; 026import org.apache.wicket.IEventDispatcher; 027import org.apache.wicket.event.IEvent; 028import org.apache.wicket.event.IEventSink; 029import org.apache.wicket.serialize.ISerializer; 030import org.apache.wicket.serialize.java.JavaSerializer; 031import org.apache.wicket.util.lang.Args; 032import org.apache.wicket.util.string.Strings; 033 034/** 035 * Framework settings for retrieving and configuring framework settings. 036 * 037 * @author Jonathan Locke 038 * @author Chris Turner 039 * @author Eelco Hillenius 040 * @author Juergen Donnerstag 041 * @author Johan Compagner 042 * @author Igor Vaynberg (ivaynberg) 043 * @author Martijn Dashorst 044 * @author James Carman 045 */ 046public class FrameworkSettings implements IEventDispatcher 047{ 048 /** 049 * Does the standard delivery of events. Events can be disabled at application level by setting a <code>null</code> 050 * {@link IEventDispatcher} via {@link #setDefaultEventDispatcher(IEventDispatcher)} and setting no additional 051 * {@link IEventDispatcher}s (via {@link #add(IEventDispatcher)}). 052 */ 053 private static class DefaultEventDispatcher implements IEventDispatcher 054 { 055 @Override 056 public void dispatchEvent(Object sink, IEvent<?> event, Component component) 057 { 058 // direct delivery 059 if (component != null && sink instanceof IComponentAwareEventSink) 060 { 061 ((IComponentAwareEventSink)sink).onEvent(component, event); 062 } 063 else if (sink instanceof IEventSink) 064 { 065 ((IEventSink)sink).onEvent(event); 066 } 067 } 068 } 069 private IDetachListener detachListener; 070 071 private IEventDispatcher defaultEventDispatcher = new DefaultEventDispatcher(); 072 private List<IEventDispatcher> eventDispatchers = null; 073 074 /** 075 * The {@link ISerializer} that will be used to convert the pages to/from byte arrays 076 */ 077 private ISerializer serializer; 078 079 /** 080 * Construct. 081 * 082 * @param application 083 */ 084 public FrameworkSettings(final Application application) 085 { 086 serializer = new JavaSerializer(application.getApplicationKey()); 087 } 088 089 /** 090 * Gets the Wicket version. The Wicket version is in the same format as the version element in 091 * the pom.xml file (project descriptor). The version is generated by maven in the build/release 092 * cycle and put in the /META-INF/MANIFEST.MF file located in the root folder of the Wicket jar. 093 * <p> 094 * The version usually follows one of the following formats: 095 * <ul> 096 * <li>major.minor[.bug] for stable versions. 1.1, 1.2, 1.2.1 are examples</li> 097 * <li>major.minor-state for development versions. 1.2-beta2, 1.3-SNAPSHOT are examples</li> 098 * </ul> 099 *</p> 100 * 101 * @return the Wicket version 102 */ 103 public String getVersion() 104 { 105 String implVersion = null; 106 Package pkg = getClass().getPackage(); 107 if (pkg != null) 108 { 109 implVersion = pkg.getImplementationVersion(); 110 } 111 return Strings.isEmpty(implVersion) ? "n/a" : implVersion; 112 } 113 114 /** 115 * @return detach listener or <code>null</code> if none 116 */ 117 public IDetachListener getDetachListener() 118 { 119 return detachListener; 120 } 121 122 /** 123 * Sets detach listener 124 * 125 * @param detachListener 126 * listener or <code>null</code> to remove 127 * @return {@code this} object for chaining 128 */ 129 public FrameworkSettings setDetachListener(IDetachListener detachListener) 130 { 131 this.detachListener = detachListener; 132 return this; 133 } 134 135 /** 136 * Registers a new event dispatcher 137 * 138 * @param dispatcher {@link IEventDispatcher} 139 * @return {@code this} object for chaining 140 */ 141 public FrameworkSettings add(IEventDispatcher dispatcher) 142 { 143 Args.notNull(dispatcher, "dispatcher"); 144 if (eventDispatchers == null) 145 { 146 eventDispatchers = new ArrayList<>(); 147 } 148 if (!eventDispatchers.contains(dispatcher)) 149 { 150 eventDispatchers.add(dispatcher); 151 } 152 return this; 153 } 154 155 /** 156 * @return Returns <code>true</code> if there is at least one event dispatcher 157 */ 158 public final boolean hasAnyEventDispatchers() 159 { 160 if (defaultEventDispatcher != null) 161 { 162 return true; 163 } 164 return eventDispatchers != null && !eventDispatchers.isEmpty(); 165 } 166 167 /** 168 * Dispatches event to registered dispatchers 169 * 170 * @see IEventDispatcher#dispatchEvent(Object, IEvent, Component) 171 * 172 */ 173 @Override 174 public void dispatchEvent(Object sink, IEvent<?> event, Component component) 175 { 176 if (defaultEventDispatcher != null) 177 { 178 defaultEventDispatcher.dispatchEvent(sink, event, component); 179 } 180 181 // additional dispatchers delivery 182 if (eventDispatchers == null) 183 { 184 return; 185 } 186 for (IEventDispatcher dispatcher : eventDispatchers) 187 { 188 dispatcher.dispatchEvent(sink, event, component); 189 } 190 } 191 192 /** 193 * Allows to set the default events dispatcher 194 * 195 * @param defaultEventDispatcher 196 * IEventDispatcher 197 * @return {@code this} object for chaining 198 */ 199 public FrameworkSettings setDefaultEventDispatcher(IEventDispatcher defaultEventDispatcher) 200 { 201 this.defaultEventDispatcher = defaultEventDispatcher; 202 return this; 203 } 204 205 /** 206 * Sets the {@link ISerializer} that will be used to convert objects to/from byte arrays 207 * 208 * @param serializer 209 * the {@link ISerializer} to use 210 * @return {@code this} object for chaining 211 */ 212 public FrameworkSettings setSerializer(ISerializer serializer) 213 { 214 this.serializer = Args.notNull(serializer, "serializer"); 215 return this; 216 } 217 218 /** 219 * @return the {@link ISerializer} that will be used to convert objects to/from byte arrays 220 */ 221 public ISerializer getSerializer() 222 { 223 return serializer; 224 } 225}