Seam SVN: r8261 - trunk/src/main/org/jboss/seam/mock.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-22 06:48:01 -0400 (Thu, 22 May 2008)
New Revision: 8261
Modified:
trunk/src/main/org/jboss/seam/mock/MockHttpServletResponse.java
Log:
JBSEAM-3021
Modified: trunk/src/main/org/jboss/seam/mock/MockHttpServletResponse.java
===================================================================
--- trunk/src/main/org/jboss/seam/mock/MockHttpServletResponse.java 2008-05-21 21:30:59 UTC (rev 8260)
+++ trunk/src/main/org/jboss/seam/mock/MockHttpServletResponse.java 2008-05-22 10:48:01 UTC (rev 8261)
@@ -55,14 +55,13 @@
public String encodeURL(String arg0)
{
- // TODO Auto-generated method stub
- return null;
+ return arg0;
}
+ @Deprecated
public String encodeUrl(String arg0)
{
- // TODO Auto-generated method stub
- return null;
+ return encodeURL(arg0);
}
public void sendError(int arg0) throws IOException
16 years, 6 months
Seam SVN: r8260 - trunk/examples/icefaces/view.
by seam-commits@lists.jboss.org
Author: jguglielmin
Date: 2008-05-21 17:30:59 -0400 (Wed, 21 May 2008)
New Revision: 8260
Modified:
trunk/examples/icefaces/view/main.xhtml
Log:
fixed main page so that s:link is used to open with proper hotel in another tab (rather than outputLink).
Modified: trunk/examples/icefaces/view/main.xhtml
===================================================================
--- trunk/examples/icefaces/view/main.xhtml 2008-05-21 20:57:06 UTC (rev 8259)
+++ trunk/examples/icefaces/view/main.xhtml 2008-05-21 21:30:59 UTC (rev 8260)
@@ -66,7 +66,7 @@
</h:column>
<h:column>
<f:facet name="header">Action</f:facet>
- <ice:commandLink id="viewHotel" value="View Hotel" action="#{hotelBooking.selectHotel(hot)}"/>
+ <s:link id="viewHotel" value="View Hotel" action="#{hotelBooking.selectHotel(hot)}"/>
</h:column>
</ice:dataTable>
<s:link value="More results" action="#{hotelSearch.nextPage}" rendered="#{hotelSearch.nextPageAvailable}"/>
16 years, 6 months
Seam SVN: r8259 - in branches/Seam_2_0: seam-gen and 1 other directory.
by seam-commits@lists.jboss.org
Author: jbalunas(a)redhat.com
Date: 2008-05-21 16:57:06 -0400 (Wed, 21 May 2008)
New Revision: 8259
Modified:
branches/Seam_2_0/build/common.build.xml
branches/Seam_2_0/seam-gen/build.xml
Log:
JBSEAM-3017 - modified seam-gen library dependencies and locations so that seam-gen does not require a network connection.
Modified: branches/Seam_2_0/build/common.build.xml
===================================================================
--- branches/Seam_2_0/build/common.build.xml 2008-05-21 18:02:12 UTC (rev 8258)
+++ branches/Seam_2_0/build/common.build.xml 2008-05-21 20:57:06 UTC (rev 8259)
@@ -118,6 +118,7 @@
<copyDependencies id="pdf" pom="${pdf.pom}" todir="${lib.dir}" scope="runtime" />
<copyDependencies id="remoting" pom="${remoting.pom}" todir="${lib.dir}" scope="runtime" />
<copyDependencies id="ui" pom="${ui.pom}" todir="${lib.dir}" scope="runtime" />
+ <copyDependencies id="gen" pom="${gen.pom}" todir="${lib.dir}" scope="runtime" />
<copyDependencies id="core" pom="${core.pom}" todir="${lib.dir}" scope="compile" />
<copyDependencies id="debug" pom="${debug.pom}" todir="${lib.dir}" scope="compile" />
<copyDependencies id="ioc" pom="${ioc.pom}" todir="${lib.dir}" scope="compile" />
@@ -125,6 +126,7 @@
<copyDependencies id="pdf" pom="${pdf.pom}" todir="${lib.dir}" scope="compile" />
<copyDependencies id="remoting" pom="${remoting.pom}" todir="${lib.dir}" scope="compile" />
<copyDependencies id="ui" pom="${ui.pom}" todir="${lib.dir}" scope="compile" />
+ <copyDependencies id="gen" pom="${gen.pom}" todir="${lib.dir}" scope="compile" />
<property name="copyseamdependenciesdone" value="true" />
</target>
Modified: branches/Seam_2_0/seam-gen/build.xml
===================================================================
--- branches/Seam_2_0/seam-gen/build.xml 2008-05-21 18:02:12 UTC (rev 8258)
+++ branches/Seam_2_0/seam-gen/build.xml 2008-05-21 20:57:06 UTC (rev 8259)
@@ -7,8 +7,8 @@
<!-- Order is important -->
<property file="./build.properties" />
<import file="${seam.dir}/build/common.build.xml" />
-
- <target name="init" depends="initpoms">
+
+ <target name="init">
<path id="seam-gen.path" path="${seam.dir}/lib/jboss-seam-gen.jar" />
<!-- taskdefs -->
@@ -39,8 +39,6 @@
<taskdef name="pathFixer"
classname="org.jboss.seam.tool.FixPathTask"
classpathref="seam-gen.path"/>
-
- <copyDependencies pom="${gen.pom}" id="gen" scope="runtime" todir="${lib.dir}/gen" />
</target>
<target name="init-properties" depends="init">
@@ -1060,9 +1058,13 @@
<target name="init-generate">
<path id="htools.classpath">
- <fileset dir="${lib.dir}/gen">
- <include name="*.jar"/>
- </fileset>
+ <pathelement path="../lib/ant.jar"/>
+ <pathelement path="../lib/hibernate-tools.jar"/>
+ <pathelement path="../lib/freemarker.jar"/>
+ <pathelement path="../lib/jboss-seam.jar"/>
+ <pathelement path="../lib/runtime.jar"/>
+ <pathelement path="../lib/common.jar"/>
+ <pathelement path="../lib/text.jar"/>
<pathelement path="../lib/dom4j.jar" />
<pathelement path="../lib/persistence-api.jar" />
<pathelement path="../lib/hibernate.jar" />
16 years, 6 months
Seam SVN: r8258 - trunk/src/main/org/jboss/seam/jsf.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-21 14:02:12 -0400 (Wed, 21 May 2008)
New Revision: 8258
Modified:
trunk/src/main/org/jboss/seam/jsf/SeamApplication.java
Log:
JBSEAM-3013
Modified: trunk/src/main/org/jboss/seam/jsf/SeamApplication.java
===================================================================
--- trunk/src/main/org/jboss/seam/jsf/SeamApplication.java 2008-05-21 16:08:28 UTC (rev 8257)
+++ trunk/src/main/org/jboss/seam/jsf/SeamApplication.java 2008-05-21 18:02:12 UTC (rev 8258)
@@ -3,6 +3,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
+import java.util.Map;
import java.util.ResourceBundle;
import javax.el.ELContextListener;
@@ -115,15 +116,81 @@
@Override
public Converter createConverter(Class targetClass)
{
+ Converter converter = null;
if ( Contexts.isApplicationContextActive() )
{
- String name = Init.instance().getConvertersByClass().get(targetClass);
- if (name!=null)
+ converter = new ConverterLocator(targetClass).getConverter();
+ }
+ if (converter == null)
+ {
+ converter = application.createConverter(targetClass);
+ }
+ return converter;
+ }
+
+ private class ConverterLocator
+ {
+
+ private Map<Class, String> converters;
+ private Class targetClass;
+ private Converter converter;
+
+ public ConverterLocator(Class targetClass)
+ {
+ converters = Init.instance().getConvertersByClass();
+ this.targetClass = targetClass;
+ }
+
+ public Converter getConverter()
+ {
+ if (converter == null)
{
- return (Converter) Component.getInstance(name);
+ locateConverter(targetClass);
}
+ return converter;
}
- return application.createConverter(targetClass);
+
+ private Converter createConverter(Class clazz)
+ {
+ return (Converter) Component.getInstance(converters.get(clazz));
+ }
+
+ private void locateConverter(Class clazz)
+ {
+ if (converters.containsKey(clazz))
+ {
+ converter = createConverter(clazz);
+ return;
+ }
+
+ for (Class _interface: clazz.getInterfaces())
+ {
+ if (converters.containsKey(_interface))
+ {
+ converter = createConverter(_interface);
+ return;
+ }
+ else
+ {
+ locateConverter(_interface);
+ if (converter != null)
+ {
+ return;
+ }
+ }
+ }
+
+ Class superClass = clazz.getSuperclass();
+ if (converters.containsKey(superClass))
+ {
+ converter = createConverter(superClass);
+ return;
+ }
+ else if (superClass != null)
+ {
+ locateConverter(superClass);
+ }
+ }
}
@Override
16 years, 6 months
Seam SVN: r8257 - trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/ui.
by seam-commits@lists.jboss.org
Author: christian.bauer(a)jboss.com
Date: 2008-05-21 12:08:28 -0400 (Wed, 21 May 2008)
New Revision: 8257
Added:
trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/ui/WikiUrlSessionIdFilter.java
Log:
JBSEAM-3018, disable URL session id rewriting
Added: trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/ui/WikiUrlSessionIdFilter.java
===================================================================
--- trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/ui/WikiUrlSessionIdFilter.java (rev 0)
+++ trunk/examples/wiki/src/main/org/jboss/seam/wiki/core/ui/WikiUrlSessionIdFilter.java 2008-05-21 16:08:28 UTC (rev 8257)
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.seam.wiki.core.ui;
+
+import org.jboss.seam.ScopeType;
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.Startup;
+import org.jboss.seam.annotations.intercept.BypassInterceptors;
+import org.jboss.seam.annotations.web.Filter;
+import org.jboss.seam.web.AbstractFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * Removes jsessionid from encoded URLs, see http://jira.jboss.com/jira/browse/JBSEAM-3018
+ *
+ * More details: http://foreverprecio.us/groovy_tech
+ *
+ * @author Christian Bauer
+ */
+@Startup
+(a)Scope(ScopeType.APPLICATION)
+@Name("wikiUrlSessionIdFilter")
+@BypassInterceptors
+@Filter
+public class WikiUrlSessionIdFilter extends AbstractFilter {
+
+ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
+ throws IOException, ServletException {
+
+ if (!(req instanceof HttpServletRequest)) {
+ chain.doFilter(req, res);
+ return;
+ }
+
+ HttpServletRequest request = (HttpServletRequest) req;
+ HttpServletResponse response = (HttpServletResponse) res;
+
+ // Redirect requests with JSESSIONID in URL to clean version (old links bookmarked/stored by bots)
+ // This is ONLY triggered if the request did not also contain a JSESSIONID cookie! Which should be fine for bots...
+ if (request.isRequestedSessionIdFromURL()) {
+ String url = request.getRequestURL()
+ .append(request.getQueryString() != null ? "?"+request.getQueryString() : "")
+ .toString();
+ // TODO: The url is clean, at least in Tomcat, which strips out the JSESSIONID path parameter automatically (Jetty does not?!)
+ response.setHeader("Location", url);
+ response.sendError(HttpServletResponse.SC_MOVED_PERMANENTLY);
+ return;
+ }
+
+ // Prevent rendering of JSESSIONID in URLs for all outgoing links
+ HttpServletResponseWrapper wrappedResponse =
+ new HttpServletResponseWrapper(response) {
+ @Override
+ public String encodeRedirectUrl(String url) {
+ return url;
+ }
+
+ @Override
+ public String encodeRedirectURL(String url) {
+ return url;
+ }
+
+ @Override
+ public String encodeUrl(String url) {
+ return url;
+ }
+
+ @Override
+ public String encodeURL(String url) {
+ return url;
+ }
+ };
+ chain.doFilter(req, wrappedResponse);
+
+ }
+}
16 years, 6 months
Seam SVN: r8256 - trunk/src/main/org/jboss/seam/navigation.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-21 11:31:38 -0400 (Wed, 21 May 2008)
New Revision: 8256
Modified:
trunk/src/main/org/jboss/seam/navigation/Page.java
trunk/src/main/org/jboss/seam/navigation/Pages.java
Log:
JBSEAM-2352
Modified: trunk/src/main/org/jboss/seam/navigation/Page.java
===================================================================
--- trunk/src/main/org/jboss/seam/navigation/Page.java 2008-05-21 14:03:58 UTC (rev 8255)
+++ trunk/src/main/org/jboss/seam/navigation/Page.java 2008-05-21 15:31:38 UTC (rev 8256)
@@ -14,6 +14,7 @@
import org.jboss.seam.core.Events;
import org.jboss.seam.core.Interpolator;
import org.jboss.seam.core.ResourceLoader;
+import org.jboss.seam.core.Expressions.ValueExpression;
import org.jboss.seam.security.Identity;
import org.jboss.seam.web.Pattern;
@@ -28,7 +29,7 @@
private final String viewId;
private String description;
private Integer timeout;
- private String noConversationViewId;
+ private ValueExpression<String> noConversationViewId;
private String resourceBundleName;
private boolean switchEnabled = true;
private List<Param> parameters = new ArrayList<Param>();
@@ -129,12 +130,12 @@
return timeout;
}
- public void setNoConversationViewId(String noConversationViewId)
+ public void setNoConversationViewId(ValueExpression<String> noConversationViewId)
{
this.noConversationViewId = noConversationViewId;
}
- public String getNoConversationViewId()
+ public ValueExpression<String> getNoConversationViewId()
{
return noConversationViewId;
}
Modified: trunk/src/main/org/jboss/seam/navigation/Pages.java
===================================================================
--- trunk/src/main/org/jboss/seam/navigation/Pages.java 2008-05-21 14:03:58 UTC (rev 8255)
+++ trunk/src/main/org/jboss/seam/navigation/Pages.java 2008-05-21 15:31:38 UTC (rev 8256)
@@ -48,6 +48,7 @@
import org.jboss.seam.core.Expressions.ValueExpression;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.faces.Validation;
+import org.jboss.seam.international.StatusMessage;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.pageflow.Pageflow;
@@ -72,7 +73,7 @@
{
private static final LogProvider log = Logging.getLogProvider(Pages.class);
- private String noConversationViewId;
+ private ValueExpression<String> noConversationViewId;
private String loginViewId;
private Integer httpPort;
@@ -573,7 +574,7 @@
Events.instance().raiseEvent("org.jboss.seam.noConversation");
FacesMessages.instance().addFromResourceBundleOrDefault(
- FacesMessage.SEVERITY_WARN,
+ StatusMessage.Severity.WARN,
"org.jboss.seam.NoConversation",
"The conversation ended, timed out or was processing another request"
);
@@ -880,13 +881,13 @@
for (int i=stack.size()-1; i>=0; i--)
{
Page page = stack.get(i);
- String noConversationViewId = page.getNoConversationViewId();
+ String noConversationViewId = page.getNoConversationViewId().getValue();
if (noConversationViewId!=null)
{
return noConversationViewId;
}
}
- return this.noConversationViewId;
+ return this.noConversationViewId.getValue();
}
/**
@@ -924,7 +925,7 @@
Element root = getDocumentRoot(stream);
if (noConversationViewId==null) //let the setting in components.xml override the pages.xml
{
- noConversationViewId = root.attributeValue("no-conversation-view-id");
+ noConversationViewId = Expressions.instance().createValueExpression(root.attributeValue("no-conversation-view-id"), String.class);
}
if (loginViewId==null) //let the setting in components.xml override the pages.xml
{
@@ -1060,7 +1061,7 @@
page.setTimeout(Integer.parseInt(timeoutString));
}
- page.setNoConversationViewId(element.attributeValue("no-conversation-view-id"));
+ page.setNoConversationViewId(Expressions.instance().createValueExpression(element.attributeValue("no-conversation-view-id"), String.class));
page.setConversationRequired("true".equals(element.attributeValue("conversation-required")));
page.setLoginRequired("true".equals(element.attributeValue("login-required")));
page.setScheme(element.attributeValue("scheme"));
@@ -1479,12 +1480,12 @@
*
* @return a JSF view id
*/
- public String getNoConversationViewId()
+ public ValueExpression<String> getNoConversationViewId()
{
return noConversationViewId;
}
- public void setNoConversationViewId(String noConversationViewId)
+ public void setNoConversationViewId(ValueExpression<String> noConversationViewId)
{
this.noConversationViewId = noConversationViewId;
}
16 years, 6 months
Seam SVN: r8255 - trunk/examples/dvdstore/resources/WEB-INF.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-21 10:03:58 -0400 (Wed, 21 May 2008)
New Revision: 8255
Modified:
trunk/examples/dvdstore/resources/WEB-INF/components.xml
Log:
oops
Modified: trunk/examples/dvdstore/resources/WEB-INF/components.xml
===================================================================
--- trunk/examples/dvdstore/resources/WEB-INF/components.xml 2008-05-21 13:36:05 UTC (rev 8254)
+++ trunk/examples/dvdstore/resources/WEB-INF/components.xml 2008-05-21 14:03:58 UTC (rev 8255)
@@ -19,7 +19,11 @@
<!-- 120 second conversation timeout -->
<core:manager conversation-timeout="120000"/>
- <bpm:jbpm />
+ <bpm:jbpm>
+ <bpm:process-definitions>
+ <value>ordermanagement1.jpdl.xml</value>
+ </bpm:process-definitions>
+ </bpm:jbpm>
<security:identity authenticate-method="#{authenticator.authenticate}"/>
16 years, 6 months
Seam SVN: r8254 - trunk/src/main/org/jboss/seam/persistence.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-21 09:36:05 -0400 (Wed, 21 May 2008)
New Revision: 8254
Modified:
trunk/src/main/org/jboss/seam/persistence/PersistenceProvider.java
Log:
EntityManager can be passed in as null
Modified: trunk/src/main/org/jboss/seam/persistence/PersistenceProvider.java
===================================================================
--- trunk/src/main/org/jboss/seam/persistence/PersistenceProvider.java 2008-05-21 12:49:45 UTC (rev 8253)
+++ trunk/src/main/org/jboss/seam/persistence/PersistenceProvider.java 2008-05-21 13:36:05 UTC (rev 8254)
@@ -176,11 +176,11 @@
private AbstractPersistenceProvider getPersistenceProvider(EntityManager entityManager)
{
// Work around EJBTHREE-912 (don't you just love random NPEs!)
- if (isInstanceOf(entityManager.getClass(), "org.jboss.ejb3.entity.HibernateSession"))
+ if (entityManager != null && isInstanceOf(entityManager.getClass(), "org.jboss.ejb3.entity.HibernateSession"))
{
return HibernatePersistenceProvider.instance();
}
- else if(isInstanceOf(entityManager.getDelegate().getClass(), "org.hibernate.Session"))
+ else if(entityManager != null && isInstanceOf(entityManager.getDelegate().getClass(), "org.hibernate.Session"))
{
return HibernatePersistenceProvider.instance();
}
16 years, 6 months
Seam SVN: r8253 - trunk/src/test/unit/org/jboss/seam/test/unit.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-21 08:49:45 -0400 (Wed, 21 May 2008)
New Revision: 8253
Modified:
trunk/src/test/unit/org/jboss/seam/test/unit/HomeTest.java
Log:
Fix broken test
Modified: trunk/src/test/unit/org/jboss/seam/test/unit/HomeTest.java
===================================================================
--- trunk/src/test/unit/org/jboss/seam/test/unit/HomeTest.java 2008-05-21 12:31:08 UTC (rev 8252)
+++ trunk/src/test/unit/org/jboss/seam/test/unit/HomeTest.java 2008-05-21 12:49:45 UTC (rev 8253)
@@ -6,6 +6,7 @@
import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.framework.HibernateEntityHome;
import org.jboss.seam.framework.Home;
+import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.test.unit.entity.SimpleEntity;
import org.testng.annotations.Test;
@@ -118,10 +119,10 @@
public class SimpleEntityHomeWithMessageStubs extends Home<EntityManager, SimpleEntity> {
- private FacesMessages facesMessages;
+ private StatusMessages statusMessages;
public SimpleEntityHomeWithMessageStubs() {
- facesMessages = new FacesMessages();
+ statusMessages = new FacesMessages();
}
public void triggerCreatedMessage() {
@@ -135,9 +136,9 @@
}
@Override
- protected FacesMessages getFacesMessages()
+ protected StatusMessages getStatusMessages()
{
- return facesMessages;
+ return statusMessages;
}
@Override
16 years, 6 months
Seam SVN: r8252 - trunk/examples/numberguess/resources.
by seam-commits@lists.jboss.org
Author: pete.muir(a)jboss.org
Date: 2008-05-21 08:31:08 -0400 (Wed, 21 May 2008)
New Revision: 8252
Modified:
trunk/examples/numberguess/resources/.gpd.cheat.jpdl.xml
trunk/examples/numberguess/resources/.gpd.pageflow.jpdl.xml
Log:
Update to new gpd format
Modified: trunk/examples/numberguess/resources/.gpd.cheat.jpdl.xml
===================================================================
--- trunk/examples/numberguess/resources/.gpd.cheat.jpdl.xml 2008-05-21 12:18:34 UTC (rev 8251)
+++ trunk/examples/numberguess/resources/.gpd.cheat.jpdl.xml 2008-05-21 12:31:08 UTC (rev 8252)
@@ -1,3 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
-<pageflow-diagram name="" width="752" height="547"/>
+<root-container name="cheat" width="748" height="786">
+ <node name="confirm" x="156" y="24" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="cheat" x="156" y="144" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+</root-container>
Modified: trunk/examples/numberguess/resources/.gpd.pageflow.jpdl.xml
===================================================================
--- trunk/examples/numberguess/resources/.gpd.pageflow.jpdl.xml 2008-05-21 12:18:34 UTC (rev 8251)
+++ trunk/examples/numberguess/resources/.gpd.pageflow.jpdl.xml 2008-05-21 12:31:08 UTC (rev 8252)
@@ -1,3 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
-<pageflow-diagram name="" width="753" height="548"/>
+<root-container name="numberGuess" width="748" height="787">
+ <node name="displayGuess" x="276" y="12" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ <edge>
+ <label x="5" y="-10"/>
+ <bendpoint w1="126" h1="-18" w2="-126" h2="-18"/>
+ </edge>
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="evaluateGuess" x="276" y="288" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="evaluateRemainingGuesses" x="504" y="288" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="giveup" x="528" y="12" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ <bendpoint w1="92" h1="0" w2="128" h2="-348"/>
+ <bendpoint w1="91" h1="347" w2="127" h2="-1"/>
+ </edge>
+ <edge>
+ <label x="5" y="-10"/>
+ <bendpoint w1="-127" h1="32" w2="125" h2="32"/>
+ </edge>
+ </node>
+ <node name="cheat" x="60" y="288" width="132" height="36">
+ <edge>
+ <label x="5" y="-10"/>
+ </edge>
+ </node>
+ <node name="win" x="276" y="360" width="132" height="36"/>
+ <node name="lose" x="492" y="360" width="132" height="36"/>
+</root-container>
16 years, 6 months