Seam SVN: r13194 - in examples/trunk/booking-simplified/src/main: webapp/WEB-INF and 1 other directories.
by seam-commits@lists.jboss.org
Author: lincolnthree
Date: 2010-06-16 17:06:00 -0400 (Wed, 16 Jun 2010)
New Revision: 13194
Modified:
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java
examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml
examples/trunk/booking-simplified/src/main/webapp/WEB-INF/pretty-config.xml
Log:
Stateless logout and removed CID from permalinks via pretty-link to get around Weld bug
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java 2010-06-16 20:00:40 UTC (rev 13193)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java 2010-06-16 21:06:00 UTC (rev 13194)
@@ -57,7 +57,7 @@
public void validate(final FacesContext context, final UIComponent comp, final Object components) throws ValidatorException
{
- if ((currentUser.getPassword() != null) && currentUser.getPassword().equals(oldPassword))
+ if ((currentUser.getPassword() != null) && !currentUser.getPassword().equals(oldPassword))
{
throw new ValidatorException(new FacesMessage("Your original password was incorrect."));
}
Modified: examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml 2010-06-16 20:00:40 UTC (rev 13193)
+++ examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml 2010-06-16 21:06:00 UTC (rev 13194)
@@ -3,6 +3,7 @@
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:pretty="http://ocpsoft.com/prettyfaces"
xmlns:f="http://java.sun.com/jsf/core"><f:view>
<ui:insert name="metadata"/>
<h:head>
@@ -20,18 +21,18 @@
<div id="status">
<h:outputText value="(#{currentUser.name})" rendered="#{identity.loggedIn}" styleClass="user"/>
#{' '}
- <h:link id="home" outcome="/home.xhtml" value="Home"/>
+ <pretty:link mappingId="home">Home</pretty:link>
#{' | '}
<h:link id="search" outcome="/search.xhtml" value="Find a Hotel"/>
<h:panelGroup rendered="#{not identity.loggedIn}">
#{' | '}
- <h:link id="login" outcome="home" value="Login"/>
+ <pretty:link mappingId="home">Login</pretty:link>
</h:panelGroup>
<h:panelGroup rendered="#{identity.loggedIn}">
#{' | '}
- <h:link id="settings" outcome="/password.xhtml" value="Account"/>
+ <pretty:link mappingId="account">Account</pretty:link>
#{' | '}
- <h:commandLink id="logout" action="#{identity.logout}" value="Logout"/>
+ <pretty:link mappingId="logout">Logout</pretty:link>
</h:panelGroup>
</div>
</h:form>
Modified: examples/trunk/booking-simplified/src/main/webapp/WEB-INF/pretty-config.xml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/WEB-INF/pretty-config.xml 2010-06-16 20:00:40 UTC (rev 13193)
+++ examples/trunk/booking-simplified/src/main/webapp/WEB-INF/pretty-config.xml 2010-06-16 21:06:00 UTC (rev 13194)
@@ -4,11 +4,17 @@
xsi:schemaLocation="http://ocpsoft.com/prettyfaces/2.0.4
http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-2.0.4.xsd">
- <url-mapping>
+ <url-mapping id="home">
<pattern value="/"></pattern>
<view-id>/home.seam</view-id>
</url-mapping>
+ <url-mapping id="logout">
+ <pattern value="/logout"></pattern>
+ <view-id>/home.seam</view-id>
+ <action>#{identity.logout}</action>
+ </url-mapping>
+
<url-mapping>
<pattern value="/search"></pattern>
<view-id>/search.seam</view-id>
@@ -29,13 +35,13 @@
<view-id>/confirm.seam</view-id>
</url-mapping>
- <url-mapping>
+ <url-mapping id="register">
<pattern value="/register"></pattern>
<view-id>/register.seam</view-id>
</url-mapping>
- <url-mapping>
- <pattern value="/settings"></pattern>
+ <url-mapping id="account">
+ <pattern value="/account"></pattern>
<view-id>/password.seam</view-id>
</url-mapping>
14 years, 3 months
Seam SVN: r13193 - in examples/trunk/booking-simplified/src/main: java/org/jboss/seam/examples/booking/account and 3 other directories.
by seam-commits@lists.jboss.org
Author: lincolnthree
Date: 2010-06-16 16:00:40 -0400 (Wed, 16 Jun 2010)
New Revision: 13193
Added:
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/faces/
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/faces/component/
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java
Modified:
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordManagerBean.java
examples/trunk/booking-simplified/src/main/webapp/password.xhtml
Log:
XVal for passwords
Added: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java (rev 0)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordConfirmValidator.java 2010-06-16 20:00:40 UTC (rev 13193)
@@ -0,0 +1,71 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.examples.booking.account;
+
+import javax.faces.application.FacesMessage;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.validator.FacesValidator;
+import javax.faces.validator.Validator;
+import javax.faces.validator.ValidatorException;
+import javax.inject.Inject;
+
+import org.jboss.seam.examples.booking.model.User;
+import org.jboss.seam.faces.validation.InputField;
+
+/**
+ * @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
+ *
+ */
+@FacesValidator(value = "passwordConfirmValidator")
+public class PasswordConfirmValidator implements Validator
+{
+ @Inject
+ @Authenticated
+ User currentUser;
+
+ @Inject
+ @InputField
+ private String oldPassword;
+
+ @Inject
+ @InputField
+ private String newPassword;
+
+ @Inject
+ @InputField
+ private String confirmNewPassword;
+
+ public void validate(final FacesContext context, final UIComponent comp, final Object components) throws ValidatorException
+ {
+ if ((currentUser.getPassword() != null) && currentUser.getPassword().equals(oldPassword))
+ {
+ throw new ValidatorException(new FacesMessage("Your original password was incorrect."));
+ }
+
+ if ((newPassword != null) && !newPassword.equals(confirmNewPassword))
+ {
+ throw new ValidatorException(new FacesMessage("New passwords did not match."));
+ }
+ }
+
+}
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordManagerBean.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordManagerBean.java 2010-06-16 19:32:21 UTC (rev 13192)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/PasswordManagerBean.java 2010-06-16 20:00:40 UTC (rev 13193)
@@ -39,19 +39,11 @@
public void changePassword()
{
- if (user.getPassword().equals(confirmPassword))
- {
- em.merge(user);
- messages.info(new BundleKey("messages.properties", "account.passwordChanged")).textDefault("Password successfully updated.");
- changed = true;
- }
- else
- {
- // FIXME reverting isn't going to work here
- // revertUser();
- confirmPassword = null;
- messages.error(new BundleKey("messages.properties", "account.passwordsDoNotMatch")).textDefault("Passwords do not match. Please re-type the new password.");
- }
+ em.merge(user);
+ messages.info(new BundleKey("messages.properties", "account.passwordChanged")).textDefault("Password successfully updated.");
+ changed = true;
+ // messages.error(new BundleKey("messages.properties",
+ // "account.passwordsDoNotMatch")).textDefault("Passwords do not match. Please re-type the new password.");
}
public boolean isChanged()
Added: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java (rev 0)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java 2010-06-16 20:00:40 UTC (rev 13193)
@@ -0,0 +1,548 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.faces.component;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.el.ValueReference;
+import javax.faces.FacesException;
+import javax.faces.application.FacesMessage;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.component.FacesComponent;
+import javax.faces.component.NamingContainer;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
+import javax.faces.component.UIMessage;
+import javax.faces.component.UINamingContainer;
+import javax.faces.component.UIViewRoot;
+import javax.faces.component.html.HtmlOutputLabel;
+import javax.faces.context.FacesContext;
+import javax.faces.validator.BeanValidator;
+import javax.validation.Validation;
+import javax.validation.ValidationException;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+import javax.validation.metadata.PropertyDescriptor;
+
+/**
+ * <strong>UIInputContainer</strong> is a supplemental component for a JSF 2.0
+ * composite component encapsulating one or more input components
+ * (<strong>EditableValueHolder</strong>), their corresponding message
+ * components (<strong>UIMessage</strong>) and a label
+ * (<strong>HtmlOutputLabel</strong>). This component takes care of wiring the
+ * label to the first input and the messages to each input in sequence. It also
+ * assigns two implicit attribute values, "required" and "invalid" to indicate
+ * that a required input field is present and whether there are any validation
+ * errors, respectively. To determine if a input field is required, both the
+ * required attribute is consulted and whether the property has Bean Validation
+ * constraints. Finally, if the "label" attribute is not provided on the
+ * composite component, the label value will be derived from the id of the
+ * composite component, for convenience.
+ *
+ * <p>
+ * Composite component definition example (minus layout):
+ * </p>
+ *
+ * <pre>
+ * <cc:interface componentType="org.jboss.seam.faces.InputContainer"/>
+ * <cc:implementation>
+ * <h:outputLabel id="label" value="#{cc.attrs.label}:" styleClass="#{cc.attrs.invalid ? 'invalid' : ''}">
+ * <h:ouputText styleClass="required" rendered="#{cc.attrs.required}" value="*"/>
+ * </h:outputLabel>
+ * <cc:insertChildren/>
+ * <h:message id="message" errorClass="invalid message" rendered="#{cc.attrs.invalid}"/>
+ * </cc:implementation>
+ * </pre>
+ *
+ * <p>
+ * Composite component usage example:
+ * </p>
+ *
+ * <pre>
+ * <example:inputContainer id="name">
+ * <h:inputText id="input" value="#{person.name}"/>
+ * </example:inputContainer>
+ * </pre>
+ *
+ * <p>
+ * Possible enhancements:
+ * </p>
+ * <ul>
+ * <li>append styleClass "invalid" to label, inputs and messages when invalid</li>
+ * </ul>
+ *
+ * <p>
+ * NOTE: Firefox does not properly associate a label with the target input if
+ * the input id contains a colon (:), the default separator character in JSF.
+ * JSF 2 allows developers to set the value via an initialization parameter
+ * (context-param in web.xml) keyed to javax.faces.SEPARATOR_CHAR. We recommend
+ * that you override this setting to make the separator an underscore (_).
+ * </p>
+ *
+ * @author Dan Allen
+ */
+(a)FacesComponent(UIInputContainer.COMPONENT_TYPE)
+public class UIInputContainer extends UIComponentBase implements NamingContainer
+{
+ /**
+ * The standard component type for this component.
+ */
+ public static final String COMPONENT_TYPE = "org.jboss.seam.faces.InputContainer";
+
+ protected static final String HTML_ID_ATTR_NAME = "id";
+ protected static final String HTML_CLASS_ATTR_NAME = "class";
+ protected static final String HTML_STYLE_ATTR_NAME = "style";
+
+ private boolean beanValidationPresent = false;
+
+ public UIInputContainer()
+ {
+ beanValidationPresent = isClassPresent("javax.validation.Validator");
+ }
+
+ @Override
+ public String getFamily()
+ {
+ return UINamingContainer.COMPONENT_FAMILY;
+ }
+
+ /**
+ * The name of the auto-generated composite component attribute that holds a
+ * boolean indicating whether the the template contains an invalid input.
+ */
+ public String getInvalidAttributeName()
+ {
+ return "invalid";
+ }
+
+ /**
+ * The name of the auto-generated composite component attribute that holds a
+ * boolean indicating whether the template contains a required input.
+ */
+ public String getRequiredAttributeName()
+ {
+ return "required";
+ }
+
+ /**
+ * The name of the composite component attribute that holds the string label
+ * for this set of inputs. If the label attribute is not provided, one will
+ * be generated from the id of the composite component or, if the id is
+ * defaulted, the name of the property bound to the first input.
+ */
+ public String getLabelAttributeName()
+ {
+ return "label";
+ }
+
+ /**
+ * The name of the auto-generated composite component attribute that holds
+ * the elements in this input container. The elements include the label, a
+ * list of inputs and a cooresponding list of messages.
+ */
+ public String getElementsAttributeName()
+ {
+ return "elements";
+ }
+
+ /**
+ * The name of the composite component attribute that holds a boolean
+ * indicating whether the component template should be enclosed in an HTML
+ * element, so that it be referenced from JavaScript.
+ */
+ public String getEncloseAttributeName()
+ {
+ return "enclose";
+ }
+
+ public String getContainerElementName()
+ {
+ return "div";
+ }
+
+ public String getDefaultLabelId()
+ {
+ return "label";
+ }
+
+ public String getDefaultInputId()
+ {
+ return "input";
+ }
+
+ public String getDefaultMessageId()
+ {
+ return "message";
+ }
+
+ @Override
+ public void encodeBegin(final FacesContext context) throws IOException
+ {
+ if (!isRendered())
+ {
+ return;
+ }
+
+ super.encodeBegin(context);
+
+ InputContainerElements elements = scan(getFacet(UIComponent.COMPOSITE_FACET_NAME), null, context);
+ // assignIds(elements, context);
+ wire(elements, context);
+
+ getAttributes().put(getElementsAttributeName(), elements);
+
+ if (elements.hasValidationError())
+ {
+ getAttributes().put(getInvalidAttributeName(), true);
+ }
+
+ // set the required attribute, but only if the user didn't already assign
+ // it
+ if (!getAttributes().containsKey(getRequiredAttributeName()) && elements.hasRequiredInput())
+ {
+ getAttributes().put(getRequiredAttributeName(), true);
+ }
+
+ if (!getAttributes().containsKey(getLabelAttributeName()))
+ {
+ getAttributes().put(getLabelAttributeName(), generateLabel(elements, context));
+ }
+
+ if (Boolean.TRUE.equals(getAttributes().get(getEncloseAttributeName())))
+ {
+ startContainerElement(context);
+ }
+ }
+
+ @Override
+ public void encodeEnd(final FacesContext context) throws IOException
+ {
+ if (!isRendered())
+ {
+ return;
+ }
+
+ super.encodeEnd(context);
+
+ if (Boolean.TRUE.equals(getAttributes().get(getEncloseAttributeName())))
+ {
+ endContainerElement(context);
+ }
+ }
+
+ protected void startContainerElement(final FacesContext context) throws IOException
+ {
+ context.getResponseWriter().startElement(getContainerElementName(), this);
+ String style = (getAttributes().get("style") != null ? getAttributes().get("style").toString().trim() : null);
+ if (style.length() > 0)
+ {
+ context.getResponseWriter().writeAttribute(HTML_STYLE_ATTR_NAME, style, HTML_STYLE_ATTR_NAME);
+ }
+ String styleClass = (getAttributes().get("styleClass") != null ? getAttributes().get("styleClass").toString().trim() : null);
+ if (styleClass.length() > 0)
+ {
+ context.getResponseWriter().writeAttribute(HTML_CLASS_ATTR_NAME, styleClass, HTML_CLASS_ATTR_NAME);
+ }
+ context.getResponseWriter().writeAttribute(HTML_ID_ATTR_NAME, getClientId(context), HTML_ID_ATTR_NAME);
+ }
+
+ protected void endContainerElement(final FacesContext context) throws IOException
+ {
+ context.getResponseWriter().endElement(getContainerElementName());
+ }
+
+ protected String generateLabel(final InputContainerElements elements, final FacesContext context)
+ {
+ String name = getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX) ? elements.getPropertyName(context) : getId();
+ return name.substring(0, 1).toUpperCase() + name.substring(1);
+ }
+
+ /**
+ * Walk the component tree branch built by the composite component and locate
+ * the input container elements.
+ *
+ * @return a composite object of the input container elements
+ */
+ protected InputContainerElements scan(final UIComponent component, InputContainerElements elements, final FacesContext context)
+ {
+ if (elements == null)
+ {
+ elements = new InputContainerElements();
+ }
+
+ // NOTE we need to walk the tree ignoring rendered attribute because it's
+ // condition
+ // could be based on what we discover
+ if ((elements.getLabel() == null) && (component instanceof HtmlOutputLabel))
+ {
+ elements.setLabel((HtmlOutputLabel) component);
+ }
+ else if (component instanceof EditableValueHolder)
+ {
+ elements.registerInput((EditableValueHolder) component, getDefaultValidator(context), context);
+ }
+ else if (component instanceof UIMessage)
+ {
+ elements.registerMessage((UIMessage) component);
+ }
+ // may need to walk smarter to ensure "element of least suprise"
+ for (UIComponent child : component.getChildren())
+ {
+ scan(child, elements, context);
+ }
+
+ return elements;
+ }
+
+ // assigning ids seems to break form submissions, but I don't know why
+ public void assignIds(final InputContainerElements elements, final FacesContext context)
+ {
+ boolean refreshIds = false;
+ if (getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
+ {
+ setId(elements.getPropertyName(context));
+ refreshIds = true;
+ }
+ UIComponent label = elements.getLabel();
+ if (label != null)
+ {
+ if (label.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
+ {
+ label.setId(getDefaultLabelId());
+ }
+ else if (refreshIds)
+ {
+ label.setId(label.getId());
+ }
+ }
+ for (int i = 0, len = elements.getInputs().size(); i < len; i++)
+ {
+ UIComponent input = (UIComponent) elements.getInputs().get(i);
+ if (input.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
+ {
+ input.setId(getDefaultInputId() + (i == 0 ? "" : (i + 1)));
+ }
+ else if (refreshIds)
+ {
+ input.setId(input.getId());
+ }
+ }
+ for (int i = 0, len = elements.getMessages().size(); i < len; i++)
+ {
+ UIComponent msg = elements.getMessages().get(i);
+ if (msg.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
+ {
+ msg.setId(getDefaultMessageId() + (i == 0 ? "" : (i + 1)));
+ }
+ else if (refreshIds)
+ {
+ msg.setId(msg.getId());
+ }
+ }
+ }
+
+ /**
+ * Wire the label and messages to the input(s)
+ */
+ protected void wire(final InputContainerElements elements, final FacesContext context)
+ {
+ elements.wire(context);
+ }
+
+ /**
+ * Get the default Bean Validation Validator to read the contraints for a
+ * property.
+ */
+ private Validator getDefaultValidator(final FacesContext context) throws FacesException
+ {
+ if (!beanValidationPresent)
+ {
+ return null;
+ }
+
+ ValidatorFactory validatorFactory;
+ Object cachedObject = context.getExternalContext().getApplicationMap().get(BeanValidator.VALIDATOR_FACTORY_KEY);
+ if (cachedObject instanceof ValidatorFactory)
+ {
+ validatorFactory = (ValidatorFactory) cachedObject;
+ }
+ else
+ {
+ try
+ {
+ validatorFactory = Validation.buildDefaultValidatorFactory();
+ }
+ catch (ValidationException e)
+ {
+ throw new FacesException("Could not build a default Bean Validator factory", e);
+ }
+ context.getExternalContext().getApplicationMap().put(BeanValidator.VALIDATOR_FACTORY_KEY, validatorFactory);
+ }
+ return validatorFactory.getValidator();
+ }
+
+ private boolean isClassPresent(final String fqcn)
+ {
+ try
+ {
+ if (Thread.currentThread().getContextClassLoader() != null)
+ {
+ return Thread.currentThread().getContextClassLoader().loadClass(fqcn) != null;
+ }
+ else
+ {
+ return Class.forName(fqcn) != null;
+ }
+ }
+ catch (ClassNotFoundException e)
+ {
+ return false;
+ }
+ catch (NoClassDefFoundError e)
+ {
+ return false;
+ }
+ }
+
+ public static class InputContainerElements
+ {
+ private String propertyName;
+ private HtmlOutputLabel label;
+ private final List<EditableValueHolder> inputs = new ArrayList<EditableValueHolder>();
+ private final List<UIMessage> messages = new ArrayList<UIMessage>();
+ private boolean validationError = false;
+ private boolean requiredInput = false;
+
+ public HtmlOutputLabel getLabel()
+ {
+ return label;
+ }
+
+ public void setLabel(final HtmlOutputLabel label)
+ {
+ this.label = label;
+ }
+
+ public List<EditableValueHolder> getInputs()
+ {
+ return inputs;
+ }
+
+ public void registerInput(final EditableValueHolder input, final Validator validator, final FacesContext context)
+ {
+ inputs.add(input);
+ if (input.isRequired() || isRequiredByConstraint(input, validator, context))
+ {
+ requiredInput = true;
+ }
+ if (!input.isValid())
+ {
+ validationError = true;
+ }
+ // optimization to avoid loop if already flagged
+ else if (!validationError)
+ {
+ Iterator<FacesMessage> it = context.getMessages(((UIComponent) input).getClientId(context));
+ while (it.hasNext())
+ {
+ if (it.next().getSeverity().compareTo(FacesMessage.SEVERITY_WARN) >= 0)
+ {
+ validationError = true;
+ break;
+ }
+ }
+ }
+ }
+
+ public List<UIMessage> getMessages()
+ {
+ return messages;
+ }
+
+ public void registerMessage(final UIMessage message)
+ {
+ messages.add(message);
+ }
+
+ public boolean hasValidationError()
+ {
+ return validationError;
+ }
+
+ public boolean hasRequiredInput()
+ {
+ return requiredInput;
+ }
+
+ private boolean isRequiredByConstraint(final EditableValueHolder input, final Validator validator, final FacesContext context)
+ {
+ if (validator == null)
+ {
+ return false;
+ }
+
+ // NOTE believe it or not, getValueReference on ValueExpression is
+ // broken, so we have to do it ourselves
+ ValueReference vref = new ValueExpressionAnalyzer(((UIComponent) input).getValueExpression("value")).getValueReference(context.getELContext());
+ PropertyDescriptor d = validator.getConstraintsForClass(vref.getBase().getClass()).getConstraintsForProperty((String) vref.getProperty());
+ return (d != null) && d.hasConstraints();
+ }
+
+ public String getPropertyName(final FacesContext context)
+ {
+ if (propertyName != null)
+ {
+ return propertyName;
+ }
+
+ if (inputs.size() == 0)
+ {
+ return null;
+ }
+
+ propertyName = (String) new ValueExpressionAnalyzer(((UIComponent) inputs.get(0)).getValueExpression("value")).getValueReference(context.getELContext()).getProperty();
+ return propertyName;
+ }
+
+ public void wire(final FacesContext context)
+ {
+ int numInputs = inputs.size();
+ if (numInputs > 0)
+ {
+ if (label != null)
+ {
+ label.setFor(((UIComponent) inputs.get(0)).getClientId(context));
+ }
+ for (int i = 0, len = messages.size(); i < len; i++)
+ {
+ if (i < numInputs)
+ {
+ messages.get(i).setFor(((UIComponent) inputs.get(i)).getClientId(context));
+ }
+ }
+ }
+ }
+ }
+}
Modified: examples/trunk/booking-simplified/src/main/webapp/password.xhtml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/password.xhtml 2010-06-16 19:32:21 UTC (rev 13192)
+++ examples/trunk/booking-simplified/src/main/webapp/password.xhtml 2010-06-16 20:00:40 UTC (rev 13193)
@@ -4,6 +4,7 @@
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:s="http://jboss.org/seam/faces"
xmlns:p="http://http://java.sun.com/jsf/composite/components/property"
template="/WEB-INF/layout/template.xhtml">
@@ -23,13 +24,16 @@
<fieldset>
- <p:input id="password">
- <h:inputSecret id="input" value="#{currentUser.password}" redisplay="true"/>
+ <p:input id="old">
+ <h:inputSecret id="password" value="#{currentUser.password}" />
</p:input>
+
+ <p:input id="new">
+ <h:inputSecret id="password" value="#{currentUser.password}" redisplay="true"/>
+ </p:input>
- <p:input id="confirmPassword">
- <h:inputSecret id="input" value="#{passwordManager.confirmPassword}" redisplay="true"
- binding="#{registrationFormControls.confirmPassword}"/>
+ <p:input id="confirm">
+ <h:inputSecret id="password" value="#{currentUser.password}" redisplay="true" />
</p:input>
<div class="buttonBox">
@@ -40,6 +44,8 @@
</fieldset>
+ <s:validateForm validatorId="passwordConfirmValidator"
+ fields="oldPassword=old:password newPassword=new:password confirmNewPassword=confirm:password"/>
</h:form>
</div>
14 years, 3 months
Seam SVN: r13192 - examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 15:32:21 -0400 (Wed, 16 Jun 2010)
New Revision: 13192
Modified:
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingAgentBean.java
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java
Log:
optimizations
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingAgentBean.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingAgentBean.java 2010-06-16 19:23:00 UTC (rev 13191)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingAgentBean.java 2010-06-16 19:32:21 UTC (rev 13192)
@@ -86,8 +86,7 @@
@Begin
public void selectHotel(final Long id)
{
- // NOTE get a fresh reference that's managed by the conversational
- // persistence context
+ // NOTE get a fresh reference that's managed by the extended persistence context
hotelSelection = em.find(Hotel.class, id);
if (hotelSelection != null)
{
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java 2010-06-16 19:23:00 UTC (rev 13191)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java 2010-06-16 19:32:21 UTC (rev 13192)
@@ -80,24 +80,17 @@
@Named("bookings")
public List<Booking> getBookingsForCurrentUser()
{
- if (identity.isLoggedIn() && bookingsForUser == null)
+ if (bookingsForUser == null && identity.isLoggedIn())
{
- String username = currentUserInstance.get().getUsername();
- CriteriaBuilder builder = em.getCriteriaBuilder();
- CriteriaQuery<Booking> cquery = builder.createQuery(Booking.class);
- Root<Booking> booking = cquery.from(Booking.class);
- booking.fetch(Booking_.hotel, JoinType.INNER);
- cquery.select(booking)
- .where(builder.equal(booking.get(Booking_.user).get(User_.username), username))
- .orderBy(builder.asc(booking.get(Booking_.checkinDate)));
-
- bookingsForUser = em.createQuery(cquery).getResultList();
+ fetchBookingsForCurrentUser();
}
return bookingsForUser;
}
- public void afterBookingConfirmed(@Observes(during = TransactionPhase.AFTER_SUCCESS) @Confirmed final BookingEvent bookingEvent)
+ public void afterBookingConfirmed(@Observes(during = TransactionPhase.AFTER_SUCCESS)
+ @Confirmed final BookingEvent bookingEvent)
{
+ // optimization, save the db call
if (bookingsForUser != null)
{
bookingsForUser.add(bookingEvent.getBooking());
@@ -121,4 +114,18 @@
bookingsForUser.remove(selectedBooking);
}
+ private void fetchBookingsForCurrentUser()
+ {
+ String username = currentUserInstance.get().getUsername();
+ CriteriaBuilder builder = em.getCriteriaBuilder();
+ CriteriaQuery<Booking> cquery = builder.createQuery(Booking.class);
+ Root<Booking> booking = cquery.from(Booking.class);
+ booking.fetch(Booking_.hotel, JoinType.INNER);
+ cquery.select(booking)
+ .where(builder.equal(booking.get(Booking_.user).get(User_.username), username))
+ .orderBy(builder.asc(booking.get(Booking_.checkinDate)));
+
+ bookingsForUser = em.createQuery(cquery).getResultList();
+ }
+
}
14 years, 3 months
Seam SVN: r13191 - modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/component.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 15:23:00 -0400 (Wed, 16 Jun 2010)
New Revision: 13191
Modified:
modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java
Log:
null check for Bean Validation code (seems to be a bug in Bean Validation)
merge
Modified: modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java
===================================================================
--- modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java 2010-06-16 18:59:28 UTC (rev 13190)
+++ modules/faces/trunk/api/src/main/java/org/jboss/seam/faces/component/UIInputContainer.java 2010-06-16 19:23:00 UTC (rev 13191)
@@ -44,6 +44,7 @@
import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
+import javax.validation.metadata.PropertyDescriptor;
/**
* <strong>UIInputContainer</strong> is a supplemental component for a JSF 2.0
@@ -92,6 +93,13 @@
* <li>append styleClass "invalid" to label, inputs and messages when invalid</li>
* </ul>
*
+ * <p>
+ * NOTE: Firefox does not properly associate a label with the target input if the input id contains
+ * a colon (:), the default separator character in JSF. JSF 2 allows developers to set the value via
+ * an initialization parameter (context-param in web.xml) keyed to javax.faces.SEPARATOR_CHAR. We
+ * recommend that you override this setting to make the separator an underscore (_).
+ * </p>
+ *
* @author Dan Allen
*/
@FacesComponent(UIInputContainer.COMPONENT_TYPE)
@@ -120,8 +128,9 @@
}
/**
- * The name of the auto-generated composite component attribute that holds a
- * boolean indicating whether the the template contains an invalid input.
+ * The name of the auto-generated composite component attribute
+ * that holds a boolean indicating whether the the template contains
+ * an invalid input.
*/
public String getInvalidAttributeName()
{
@@ -129,8 +138,9 @@
}
/**
- * The name of the auto-generated composite component attribute that holds a
- * boolean indicating whether the template contains a required input.
+ * The name of the auto-generated composite component attribute
+ * that holds a boolean indicating whether the template contains
+ * a required input.
*/
public String getRequiredAttributeName()
{
@@ -138,9 +148,10 @@
}
/**
- * The name of the composite component attribute that holds the string label
- * for this set of inputs. If the label attribute is not provided, one will
- * be generated from the id of the composite component or, if the id is
+ * The name of the composite component attribute that
+ * holds the string label for this set of inputs. If the
+ * label attribute is not provided, one will be generated
+ * from the id of the composite component or, if the id is
* defaulted, the name of the property bound to the first input.
*/
public String getLabelAttributeName()
@@ -149,9 +160,10 @@
}
/**
- * The name of the auto-generated composite component attribute that holds
- * the elements in this input container. The elements include the label, a
- * list of inputs and a cooresponding list of messages.
+ * The name of the auto-generated composite component attribute
+ * that holds the elements in this input container. The
+ * elements include the label, a list of inputs and a cooresponding
+ * list of messages.
*/
public String getElementsAttributeName()
{
@@ -160,8 +172,8 @@
/**
* The name of the composite component attribute that holds a boolean
- * indicating whether the component template should be enclosed in an HTML
- * element, so that it be referenced from JavaScript.
+ * indicating whether the component template should be enclosed in
+ * an HTML element, so that it be referenced from JavaScript.
*/
public String getEncloseAttributeName()
{
@@ -209,8 +221,7 @@
getAttributes().put(getInvalidAttributeName(), true);
}
- // set the required attribute, but only if the user didn't already assign
- // it
+ // set the required attribute, but only if the user didn't already assign it
if (!getAttributes().containsKey(getRequiredAttributeName()) && elements.hasRequiredInput())
{
getAttributes().put(getRequiredAttributeName(), true);
@@ -283,10 +294,9 @@
elements = new InputContainerElements();
}
- // NOTE we need to walk the tree ignoring rendered attribute because it's
- // condition
+ // NOTE we need to walk the tree ignoring rendered attribute because it's condition
// could be based on what we discover
- if ((elements.getLabel() == null) && (component instanceof HtmlOutputLabel))
+ if (elements.getLabel() == null && component instanceof HtmlOutputLabel)
{
elements.setLabel((HtmlOutputLabel) component);
}
@@ -308,7 +318,7 @@
}
// assigning ids seems to break form submissions, but I don't know why
- public void assignIds(final InputContainerElements elements, final FacesContext context)
+ public void assignIds(final InputContainerElements elements, FacesContext context)
{
boolean refreshIds = false;
if (getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
@@ -357,14 +367,13 @@
/**
* Wire the label and messages to the input(s)
*/
- protected void wire(final InputContainerElements elements, final FacesContext context)
+ protected void wire(final InputContainerElements elements, FacesContext context)
{
elements.wire(context);
}
/**
- * Get the default Bean Validation Validator to read the contraints for a
- * property.
+ * Get the default Bean Validation Validator to read the contraints for a property.
*/
private Validator getDefaultValidator(final FacesContext context) throws FacesException
{
@@ -494,10 +503,12 @@
return false;
}
- // NOTE believe it or not, getValueReference on ValueExpression is
- // broken, so we have to do it ourselves
- ValueReference vref = new ValueExpressionAnalyzer(((UIComponent) input).getValueExpression("value")).getValueReference(context.getELContext());
- return validator.getConstraintsForClass(vref.getBase().getClass()).getConstraintsForProperty((String) vref.getProperty()).hasConstraints();
+ // NOTE believe it or not, getValueReference on ValueExpression is broken, so we have to do it ourselves
+ ValueReference vref = new ValueExpressionAnalyzer(((UIComponent) input).getValueExpression("value"))
+ .getValueReference(context.getELContext());
+ PropertyDescriptor d = validator.getConstraintsForClass(vref.getBase().getClass())
+ .getConstraintsForProperty((String) vref.getProperty());
+ return d != null && d.hasConstraints();
}
public String getPropertyName(final FacesContext context)
@@ -512,7 +523,8 @@
return null;
}
- propertyName = (String) new ValueExpressionAnalyzer(((UIComponent) inputs.get(0)).getValueExpression("value")).getValueReference(context.getELContext()).getProperty();
+ propertyName = (String) new ValueExpressionAnalyzer(((UIComponent) inputs.get(0)).getValueExpression("value"))
+ .getValueReference(context.getELContext()).getProperty();
return propertyName;
}
14 years, 3 months
Seam SVN: r13190 - examples/trunk/booking-simplified.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 14:59:28 -0400 (Wed, 16 Jun 2010)
New Revision: 13190
Modified:
examples/trunk/booking-simplified/readme.txt
Log:
notes
Modified: examples/trunk/booking-simplified/readme.txt
===================================================================
--- examples/trunk/booking-simplified/readme.txt 2010-06-16 18:38:58 UTC (rev 13189)
+++ examples/trunk/booking-simplified/readme.txt 2010-06-16 18:59:28 UTC (rev 13190)
@@ -1,3 +1,17 @@
+You will need to start JavaDB to make the application run
+
+$GLASSFISH_HOME/bin/asadmin start-database
+
+However, there should be an option with the GlassFish server plugin in both
+NetBeans and Eclipse to automatically start it when GlassFish starts. Unlike
+JBoss AS, the default data source is a client/server instance.
+
+Eclipse:
+Window > Preferences > GlassFish Preferences > Start the JavaDB database process when starting GlassFish Server
+
+NetBeans:
+Services (View) > Services (Node) > GlassFish (Entry) > Properties (Context menu item) > Start Registered Derby Server
+
Installing Hibernate 3.5 (JPA 2) on GlassFish 3
-----------------------------------------------
wget http://dlc.sun.com.edgesuite.net/glassfish/v3.0.1/promoted/glassfish-3.0....
@@ -6,3 +20,15 @@
./bin/updatetool (may have to run it twice if it's not already installed)
GlassFish Server Open Source Edition > Available Add-ons > Hibernate JPA
Install
+
+GlassFish settings
+------------------
+Disable preserving sessions across server restarts
+
+Viewing data in JavaDB
+----------------------
+Create a database connection to the following database
+
+URL: jdbc:derby://localhost:1527/sun-appserv-samples
+Username: APP
+Password: APP
14 years, 3 months
Seam SVN: r13189 - in examples/trunk/booking-simplified/src/main/webapp: css and 1 other directory.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 14:38:58 -0400 (Wed, 16 Jun 2010)
New Revision: 13189
Modified:
examples/trunk/booking-simplified/src/main/webapp/css/screen.css
examples/trunk/booking-simplified/src/main/webapp/search.xhtml
Log:
fix spinner
Modified: examples/trunk/booking-simplified/src/main/webapp/css/screen.css
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/css/screen.css 2010-06-16 18:07:35 UTC (rev 13188)
+++ examples/trunk/booking-simplified/src/main/webapp/css/screen.css 2010-06-16 18:38:58 UTC (rev 13189)
@@ -248,6 +248,10 @@
border-left: 0px;
border-bottom: 0px;
}
+#activity {
+ float: right;
+ margin: 10px 5px 0 0;
+}
/* Header
----------------------------------------------- */
#title {
Modified: examples/trunk/booking-simplified/src/main/webapp/search.xhtml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/search.xhtml 2010-06-16 18:07:35 UTC (rev 13188)
+++ examples/trunk/booking-simplified/src/main/webapp/search.xhtml 2010-06-16 18:38:58 UTC (rev 13189)
@@ -11,13 +11,13 @@
<script type="text/javascript">
function controlSpinner(behavior)
{
- if (behavior.name == 'begin')
+ if (behavior.status == 'begin')
{
- document.getElementById('activity').style.display = 'inline';
+ document.getElementById('spinner').style.display = 'inline';
}
- else if (behavior.name == 'complete')
+ else if (behavior.status == 'complete')
{
- document.getElementById('activity').style.display = 'none';
+ document.getElementById('spinner').style.display = 'none';
}
}
</script>
@@ -39,16 +39,16 @@
<f:ajax event="keyup" listener="#{hotelSearch.find}" render=":searchResults" onevent="controlSpinner"/>
</h:inputText>
#{' '}
- <span id="activity" style="display: none;"><h:graphicImage id="spinner" value="/img/spinner.gif"/></span>
- <br/>
- <h:outputLabel id="lblPageSize" for="pageSize" value="Maximum results:"/>
+ <h:outputLabel id="lblPageSize" for="pageSize" value="View:"/>
#{' '}
<h:selectOneMenu id="pageSize" value="#{searchCriteria.pageSize}">
<f:ajax listener="#{hotelSearch.find}" render=":searchResults" onevent="controlSpinner"/>
- <f:selectItem itemLabel="5" itemValue="5"/>
- <f:selectItem itemLabel="10" itemValue="10"/>
- <f:selectItem itemLabel="20" itemValue="20"/>
+ <f:selectItem itemLabel="5 hotels per page" itemValue="5"/>
+ <f:selectItem itemLabel="10 hotels per page" itemValue="10"/>
+ <f:selectItem itemLabel="20 hotels per page" itemValue="20"/>
</h:selectOneMenu>
+ #{' '}
+ <span id="activity"><h:graphicImage id="spinner" value="/img/spinner.gif" style="display: none;"/></span>
</fieldset>
</h:form>
</div>
14 years, 3 months
Seam SVN: r13188 - examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 14:07:35 -0400 (Wed, 16 Jun 2010)
New Revision: 13188
Modified:
examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml
Log:
add info about current conversation
Modified: examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml 2010-06-16 18:07:16 UTC (rev 13187)
+++ examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml 2010-06-16 18:07:35 UTC (rev 13188)
@@ -45,10 +45,9 @@
</div>
</div>
<div id="footer">
- Created with Seam 3.0, Web Beans, EJB 3.0 and JSF 2.0
- <br/>
- #{javax.context.conversation}
+ Created with Seam 3.0, Web Beans, EJB 3.0 and JSF 2.0<br/>
+ Current conversation: #{conversation.transient ? 'transient' : 'long-running, id: '.concat(conversation.id)}
</div>
</div>
</h:body>
-</f:view></html>
+</f:view></html>
\ No newline at end of file
14 years, 3 months
Seam SVN: r13187 - in examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking: booking and 1 other directory.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 14:07:16 -0400 (Wed, 16 Jun 2010)
New Revision: 13187
Modified:
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/AccountHolderBean.java
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java
Log:
use Instance to get current User
remove logger
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/AccountHolderBean.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/AccountHolderBean.java 2010-06-16 17:21:08 UTC (rev 13186)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/account/AccountHolderBean.java 2010-06-16 18:07:16 UTC (rev 13187)
@@ -4,7 +4,6 @@
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.Typed;
import javax.inject.Inject;
import javax.inject.Named;
@@ -18,9 +17,6 @@
@SessionScoped
public class AccountHolderBean implements AccountHolder
{
- @Inject
- private Logger log;
-
private User currentUser;
@Produces
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java 2010-06-16 17:21:08 UTC (rev 13186)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/booking/BookingHistoryBean.java 2010-06-16 18:07:16 UTC (rev 13187)
@@ -29,6 +29,7 @@
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.event.TransactionPhase;
+import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.inject.Named;
@@ -38,11 +39,11 @@
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Root;
-import org.jboss.seam.examples.booking.account.AccountHolder;
import org.jboss.seam.examples.booking.account.Authenticated;
import org.jboss.seam.examples.booking.model.Booking;
import org.jboss.seam.examples.booking.model.Booking_;
+import org.jboss.seam.examples.booking.model.User;
import org.jboss.seam.examples.booking.model.User_;
import org.jboss.seam.examples.booking.security.Identity;
import org.jboss.seam.international.status.Messages;
@@ -69,8 +70,8 @@
@Inject
private Identity identity;
- @Inject
- private AccountHolder accountProducer;
+ @Inject @Authenticated
+ private Instance<User> currentUserInstance;
private List<Booking> bookingsForUser = null;
@@ -81,7 +82,7 @@
{
if (identity.isLoggedIn() && bookingsForUser == null)
{
- String username = accountProducer.getCurrentAccount().getUsername();
+ String username = currentUserInstance.get().getUsername();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Booking> cquery = builder.createQuery(Booking.class);
Root<Booking> booking = cquery.from(Booking.class);
@@ -105,7 +106,7 @@
public void cancelBooking(final Booking selectedBooking)
{
- log.info("Canceling booking {0} for {1}", selectedBooking.getId(), accountProducer.getCurrentAccount().getName());
+ log.info("Canceling booking {0} for {1}", selectedBooking.getId(), currentUserInstance.get().getName());
Booking booking = em.find(Booking.class, selectedBooking.getId());
if (booking != null)
{
14 years, 3 months
Seam SVN: r13186 - in examples/trunk/booking-simplified/src/main/webapp: WEB-INF/layout and 1 other directory.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 13:21:08 -0400 (Wed, 16 Jun 2010)
New Revision: 13186
Modified:
examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml
examples/trunk/booking-simplified/src/main/webapp/hotel.xhtml
Log:
navigation
Modified: examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml 2010-06-16 16:53:35 UTC (rev 13185)
+++ examples/trunk/booking-simplified/src/main/webapp/WEB-INF/layout/template.xhtml 2010-06-16 17:21:08 UTC (rev 13186)
@@ -20,12 +20,16 @@
<div id="status">
<h:outputText value="(#{currentUser.name})" rendered="#{identity.loggedIn}" styleClass="user"/>
#{' '}
- <h:link id="about" outcome="/home.xhtml" value="About"/>
+ <h:link id="home" outcome="/home.xhtml" value="Home"/>
#{' | '}
- <h:link id="search" outcome="/search.xhtml" value="Search"/>
+ <h:link id="search" outcome="/search.xhtml" value="Find a Hotel"/>
+ <h:panelGroup rendered="#{not identity.loggedIn}">
+ #{' | '}
+ <h:link id="login" outcome="home" value="Login"/>
+ </h:panelGroup>
<h:panelGroup rendered="#{identity.loggedIn}">
#{' | '}
- <h:link id="settings" outcome="/password.xhtml" value="Settings"/>
+ <h:link id="settings" outcome="/password.xhtml" value="Account"/>
#{' | '}
<h:commandLink id="logout" action="#{identity.logout}" value="Logout"/>
</h:panelGroup>
Modified: examples/trunk/booking-simplified/src/main/webapp/hotel.xhtml
===================================================================
--- examples/trunk/booking-simplified/src/main/webapp/hotel.xhtml 2010-06-16 16:53:35 UTC (rev 13185)
+++ examples/trunk/booking-simplified/src/main/webapp/hotel.xhtml 2010-06-16 17:21:08 UTC (rev 13186)
@@ -22,6 +22,9 @@
<ui:include src="/WEB-INF/fragments/hotel.xhtml"/>
<div class="buttonBox">
+ <h:panelGroup rendered="#{not identity.loggedIn}">
+ <p style="text-align: center;">You must login to book a hotel.</p>
+ </h:panelGroup>
<h:form id="actions">
<h:commandButton id="bookHotel" action="#{bookingAgent.bookHotel}" value="Book Hotel" rendered="#{identity.loggedIn}"/>
#{' '}
14 years, 3 months
Seam SVN: r13185 - examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/bootstrap.
by seam-commits@lists.jboss.org
Author: dan.j.allen
Date: 2010-06-16 12:53:35 -0400 (Wed, 16 Jun 2010)
New Revision: 13185
Modified:
examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/bootstrap/ApplicationSetupBean.java
Log:
proper logging
Modified: examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/bootstrap/ApplicationSetupBean.java
===================================================================
--- examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/bootstrap/ApplicationSetupBean.java 2010-06-16 16:49:35 UTC (rev 13184)
+++ examples/trunk/booking-simplified/src/main/java/org/jboss/seam/examples/booking/bootstrap/ApplicationSetupBean.java 2010-06-16 16:53:35 UTC (rev 13185)
@@ -7,6 +7,7 @@
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Alternative;
import javax.faces.event.PostConstructApplicationEvent;
+import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.validation.ConstraintViolation;
@@ -14,6 +15,7 @@
import org.jboss.seam.examples.booking.model.Hotel;
import org.jboss.seam.examples.booking.model.User;
+import org.slf4j.Logger;
/**
* @author <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a>
@@ -25,6 +27,8 @@
@PersistenceContext
private EntityManager em;
+ @Inject Logger log;
+
private final List<User> users = new ArrayList<User>();
private final List<Hotel> hotels = new ArrayList<Hotel>();
@@ -65,25 +69,35 @@
public void init(@Observes final PostConstructApplicationEvent event)
{
try {
+ persist(users);
+ persist(hotels);
+ }
+ catch (Exception e)
+ {
+ log.error("Encountered error seeding the database", e);
+ }
+ }
- for (User u : users)
- {
- if (em.find(User.class, u.getUsername()) == null)
- {
- em.persist(u);
- }
- }
+ private void persist(List entities)
+ {
+ for (Object e : entities)
+ {
+ persist(e);
+ }
+ }
- for (Hotel h : hotels)
- {
- em.persist(h);
- }
+ private void persist(Object entity)
+ {
+ try
+ {
+ em.persist(entity);
}
catch (ConstraintViolationException e)
{
for (ConstraintViolation v : e.getConstraintViolations())
{
- System.out.println(v.getPropertyPath() + ": " + v.getMessage());
+ log.error("Cannot persist entity because it has validation errors " +
+ v.getRootBean() + ": " + v.getPropertyPath() + " " + v.getMessage());
}
}
}
14 years, 3 months