Author: pete.muir(a)jboss.org
Date: 2008-10-07 10:00:17 -0400 (Tue, 07 Oct 2008)
New Revision: 9217
Added:
trunk/src/wicket/org/jboss/seam/wicket/SeamComponentInstantiationListener.java
trunk/src/wicket/org/jboss/seam/wicket/annotations/
trunk/src/wicket/org/jboss/seam/wicket/annotations/NoConversationPage.java
Modified:
trunk/doc/Seam_Reference_Guide/en-US/Wicket.xml
trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Book.java
trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Confirm.java
trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Hotel.java
trunk/src/wicket/org/jboss/seam/wicket/SeamWebApplication.java
trunk/src/wicket/org/jboss/seam/wicket/WicketComponent.java
Log:
JBSEAM-3516
Modified: trunk/doc/Seam_Reference_Guide/en-US/Wicket.xml
===================================================================
--- trunk/doc/Seam_Reference_Guide/en-US/Wicket.xml 2008-10-07 12:11:07 UTC (rev 9216)
+++ trunk/doc/Seam_Reference_Guide/en-US/Wicket.xml 2008-10-07 14:00:17 UTC (rev 9217)
@@ -122,9 +122,6 @@
Seam will automatically apply the restriction to any nested
classes.
</para>
- <para>
- TODO - Implement this (See JBSEAM-3192)
- </para>
</tip>
<para>
@@ -156,6 +153,16 @@
};]]></programlisting>
<para>
+ You may have pages in your application which can only be accessed
+ when the user has a long-running conversation active. To enforce
+ this you can use the <code>@NoConversationPage</code> annotation:
+ </para>
+
+ <programlisting><![CDATA[@Restrict
+(a)NoConversationPage(Main.class)
+public class Hotel extends WebPage {]]></programlisting>
+
+ <para>
If you want to further decouple your application classes, you can
use Seam events. Of course, you can raise an event using
<code>Events.instance().raiseEvent("foo")</code>.
Alternatively, you
Modified: trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Book.java
===================================================================
--- trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Book.java 2008-10-07
12:11:07 UTC (rev 9216)
+++ trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Book.java 2008-10-07
14:00:17 UTC (rev 9217)
@@ -19,8 +19,10 @@
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.example.wicket.action.Booking;
import org.jboss.seam.example.wicket.action.HotelBooking;
+import org.jboss.seam.wicket.annotations.NoConversationPage;
@Restrict
+(a)NoConversationPage(Main.class)
public class Book extends WebPage
{
@@ -42,7 +44,6 @@
add(body);
body.add(new HotelViewPanel("hotelView", booking.getHotel()));
body.add(new HotelBookingForm("booking"));
-
}
public class HotelBookingForm extends Form
Modified: trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Confirm.java
===================================================================
--- trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Confirm.java 2008-10-07
12:11:07 UTC (rev 9216)
+++ trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Confirm.java 2008-10-07
14:00:17 UTC (rev 9217)
@@ -15,8 +15,10 @@
import org.jboss.seam.core.Conversation;
import org.jboss.seam.example.wicket.action.Booking;
import org.jboss.seam.example.wicket.action.HotelBooking;
+import org.jboss.seam.wicket.annotations.NoConversationPage;
@Restrict
+(a)NoConversationPage(Main.class)
public class Confirm extends WebPage
{
@@ -67,11 +69,4 @@
add(body);
}
- @Override
- protected void onBeforeRender()
- {
- super.onBeforeRender();
- System.out.println("cid " + Conversation.instance().getId());
- }
-
}
Modified: trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Hotel.java
===================================================================
--- trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Hotel.java 2008-10-07
12:11:07 UTC (rev 9216)
+++ trunk/examples/wicket/src/web/org/jboss/seam/example/wicket/Hotel.java 2008-10-07
14:00:17 UTC (rev 9217)
@@ -8,8 +8,10 @@
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.example.wicket.action.HotelBooking;
+import org.jboss.seam.wicket.annotations.NoConversationPage;
@Restrict
+(a)NoConversationPage(Main.class)
public class Hotel extends WebPage
{
Added: trunk/src/wicket/org/jboss/seam/wicket/SeamComponentInstantiationListener.java
===================================================================
--- trunk/src/wicket/org/jboss/seam/wicket/SeamComponentInstantiationListener.java
(rev 0)
+++
trunk/src/wicket/org/jboss/seam/wicket/SeamComponentInstantiationListener.java 2008-10-07
14:00:17 UTC (rev 9217)
@@ -0,0 +1,38 @@
+package org.jboss.seam.wicket;
+
+import org.apache.wicket.AbortException;
+import org.apache.wicket.Component;
+import org.apache.wicket.Page;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.application.IComponentInstantiationListener;
+import org.jboss.seam.core.Manager;
+import org.jboss.seam.international.StatusMessage;
+import org.jboss.seam.international.StatusMessages;
+
+public class SeamComponentInstantiationListener implements
IComponentInstantiationListener
+{
+
+ public void onInstantiation(Component component)
+ {
+ if (!Manager.instance().isLongRunningConversation())
+ {
+ WicketComponent<?> wicketComponent =
WicketComponent.getInstance(component.getClass());
+ if (wicketComponent != null)
+ {
+ Class<? extends Page> noConversationPage =
wicketComponent.getNoConversationPage();
+ if (noConversationPage != null)
+ {
+ final RequestCycle cycle = RequestCycle.get();
+ StatusMessages.instance().addFromResourceBundleOrDefault(
+ StatusMessage.Severity.WARN,
+ "org.jboss.seam.NoConversation",
+ "The conversation ended or timed"
+ );
+ cycle.redirectTo(component.getPageFactory().newPage(noConversationPage));
+ throw new AbortException();
+ }
+ }
+ }
+ }
+
+}
Property changes on:
trunk/src/wicket/org/jboss/seam/wicket/SeamComponentInstantiationListener.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/src/wicket/org/jboss/seam/wicket/SeamWebApplication.java
===================================================================
--- trunk/src/wicket/org/jboss/seam/wicket/SeamWebApplication.java 2008-10-07 12:11:07 UTC
(rev 9216)
+++ trunk/src/wicket/org/jboss/seam/wicket/SeamWebApplication.java 2008-10-07 14:00:17 UTC
(rev 9217)
@@ -111,6 +111,7 @@
super.init();
inititializeSeamSecurity();
initializeSeamStatusMessages();
+ addComponentInstantiationListener(new SeamComponentInstantiationListener());
}
/**
Modified: trunk/src/wicket/org/jboss/seam/wicket/WicketComponent.java
===================================================================
--- trunk/src/wicket/org/jboss/seam/wicket/WicketComponent.java 2008-10-07 12:11:07 UTC
(rev 9216)
+++ trunk/src/wicket/org/jboss/seam/wicket/WicketComponent.java 2008-10-07 14:00:17 UTC
(rev 9217)
@@ -14,6 +14,7 @@
import java.util.List;
import java.util.Set;
+import org.apache.wicket.Page;
import org.apache.wicket.util.string.Strings;
import org.jboss.seam.Component;
import org.jboss.seam.Namespace;
@@ -37,6 +38,7 @@
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.security.Identity;
+import org.jboss.seam.wicket.annotations.NoConversationPage;
import org.jboss.seam.wicket.ioc.BijectedAttribute;
import org.jboss.seam.wicket.ioc.BijectedField;
import org.jboss.seam.wicket.ioc.BijectedMethod;
@@ -98,6 +100,8 @@
boolean anyMethodHasRaiseEvent = false;
+ private Class<? extends Page> noConversationPage;
+
public Class<?> getType()
{
return type;
@@ -150,18 +154,9 @@
{
this.type = type;
this.enclosingType = type.getEnclosingClass();
- if (enclosingType != null)
+ if (this.enclosingType != null)
{
- Class<?> c = enclosingType.getEnclosingClass();
- int i = 0;
- while (c != null)
- {
- c = c.getEnclosingClass();
- i++;
- }
- this.enclosingInstanceVariableName = "this$" + i;
log.info("Class: " + type + ", enclosed by " +
enclosingType);
- log.trace("[" + type + "] enclosing instance variable: " +
enclosingInstanceVariableName);
}
else
{
@@ -170,8 +165,6 @@
scan();
- scanRestrictions();
-
initInterceptors();
Contexts.getApplicationContext().set(getName(), this);
@@ -180,6 +173,7 @@
private void scan()
{
Class clazz = type;
+ scanClassEnclosureHierachy();
for (Method method : clazz.getDeclaredMethods())
{
add(method);
@@ -194,10 +188,10 @@
}
}
- private void scanRestrictions()
+ private void scanClassEnclosureHierachy()
{
Class cls = type;
-
+ int i = 0;
while (cls != null)
{
for (Annotation annotation : cls.getAnnotations())
@@ -214,11 +208,23 @@
if (restrictions == null) restrictions = new HashSet<String>();
restrictions.add("#{identity.hasRole('" +
annotation.annotationType().getSimpleName().toLowerCase() +
"')}");
- }
+ }
+
+ if (annotation instanceof NoConversationPage)
+ {
+ NoConversationPage noConversationPage = (NoConversationPage) annotation;
+ this.noConversationPage = noConversationPage.value();
+ }
}
cls = cls.getEnclosingClass();
+ i++;
}
+
+ if (i > 1)
+ {
+ this.enclosingInstanceVariableName = "this$" + (i - 2);
+ }
}
public void checkRestrictions()
@@ -504,4 +510,9 @@
conversationManagementMembers.contains(member);
}
+ public Class<? extends Page> getNoConversationPage()
+ {
+ return noConversationPage;
+ }
+
}
Added: trunk/src/wicket/org/jboss/seam/wicket/annotations/NoConversationPage.java
===================================================================
--- trunk/src/wicket/org/jboss/seam/wicket/annotations/NoConversationPage.java
(rev 0)
+++ trunk/src/wicket/org/jboss/seam/wicket/annotations/NoConversationPage.java 2008-10-07
14:00:17 UTC (rev 9217)
@@ -0,0 +1,20 @@
+package org.jboss.seam.wicket.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import org.apache.wicket.Page;
+
+@Target(TYPE)
+@Retention(RUNTIME)
+@Documented
+public @interface NoConversationPage
+{
+
+ Class<? extends Page> value();
+
+}
Property changes on:
trunk/src/wicket/org/jboss/seam/wicket/annotations/NoConversationPage.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain