8 Replies Latest reply on Mar 25, 2009 11:02 AM by jaikiran

    directly injecting a bean in a property

    bryan.kearney

      Following the docs here:

      http://www.jboss.org/file-access/default/members/jbossmc/freezone/docs/2.0.x/userGuide/ch11s03.html

      I attempted to replace this xml:

       <bean name="Muppet" class="org.apache.qpid.agent.Muppet" />
      
       <bean name="Kermit" class="org.apache.qpid.agent.ManagedObject">
       <property name="name">Muppet</property>
       <property name="managed">
       <inject bean="Muppet" />
       </property>
       <property name="adapter">
       <inject bean="POJOAdapter" />
       </property>
       </bean>
      


      with this:

       <bean name="Kermit" class="org.apache.qpid.agent.ManagedObject">
       <property name="name">Muppet</property>
       <property name="managed">
       <bean name="Muppet" class="org.apache.qpid.agent.Muppet" />
       </property>
       <property name="adapter">
       <inject bean="POJOAdapter" />
       </property>
       </bean>
      


      But I get the following excption:

      Caused by: org.xml.sax.SAXException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'bean'. One of '{"urn:jboss:bean-deployer:2.0":value, "urn:jboss:bean-deployer:2.0":inject, "urn:jboss:bean-deployer:2.0":value-factory, "urn:jboss:bean-deployer:2.0":collection, "urn:jboss:bean-deployer:2.0":list, "urn:jboss:bean-deployer:2.0":set, "urn:jboss:bean-deployer:2.0":array, "urn:jboss:bean-deployer:2.0":map, "urn:jboss:bean-deployer:2.0":null, "urn:jboss:bean-deployer:2.0":this, WC[##other:"urn:jboss:bean-deployer:2.0"], "urn:jboss:bean-deployer:2.0":annotation}' is expected.
      


      I scanned JIRA but did not see a bug. Is the documentation correct?

      -- bk



        • 1. Re: directly injecting a bean in a property
          jaikiran

          Works fine for me:

          <?xml version="1.0" encoding="UTF-8"?>
          <deployment xmlns="urn:jboss:bean-deployer:2.0">
          
           <bean name="test" class="org.myapp.test.TestBean">
           <property name="name">
           <bean name="somestring" class="java.lang.String"/>
           </property>
           </bean>
          </deployment>
          

          public class TestBean
          {
          
           private String name;
          
           public String getName()
           {
           return name;
           }
          
           public void setName(String name)
           {
           System.out.println("Setting name in testbean" + name);
           this.name = name;
          
           }
          
          
          }
          


          • 2. Re: directly injecting a bean in a property
            bryan.kearney

            I am using Jboss 5.0 on Fedora 10, with the sun JDK. What stack are you running on?

            -- bk

            • 3. Re: directly injecting a bean in a property
              jaikiran

              5.0.1 GA, Sun Java. Can you post your exact xml file and also the console logs?

              • 4. Re: directly injecting a bean in a property
                bryan.kearney

                Sure. Here is the xml

                <?xml version="1.0" encoding="UTF-8"?>
                <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
                 xmlns="urn:jboss:bean-deployer:2.0">
                
                 <bean name="QPIDConnection" class="org.apache.qpid.client.AMQConnection">
                 <constructor>
                 <parameter>amqp://guest:guest@/?brokerlist='tcp://localhost'
                 </parameter>
                 </constructor>
                 </bean>
                
                 <bean name="POJOAdapter" class="org.apache.qpid.agent.POJOAdapter" />
                 <bean name="Muppet" class="org.apache.qpid.agent.Muppet" />
                
                 <bean name="Kermit" class="org.apache.qpid.agent.ManagedObject">
                 <property name="name">Muppet</property>
                 <property name="managed">
                 <!-- <inject bean="Muppet" />-->
                 <bean name="Muppet" class="org.apache.qpid.agent.Muppet" />
                 </property>
                 <property name="adapter">
                 <inject bean="POJOAdapter" />
                 </property>
                 </bean>
                
                 <bean name="QMFAgent" class="org.apache.qpid.agent.Agent">
                 <property name="label">agent</property>
                 <property name="sessionTransacted">false</property>
                 <property name="connection">
                 <inject bean="QPIDConnection" />
                 </property>
                 <property name="managedObjects">
                 <list elementClass="org.apache.qpid.agent.ManagedObject">
                 <inject bean="Kermit" />
                 </list>
                 </property>
                 </bean>
                
                </deployment>
                


                Here is the stack trace:

                06:58:48,157 ERROR [AbstractKernelController] Error installing to Parse: name=vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/ state=Not Installed mode=Manual requiredState=Parse
                org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/
                 at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException(DeploymentException.java:49)
                 at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:337)
                 at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:297)
                 at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:269)
                 at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.deploy(AbstractParsingDeployerWithOutput.java:230)
                 at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
                 at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
                 at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
                 at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
                 at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
                 at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
                 at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
                 at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
                 at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
                 at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
                 at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
                 at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
                 at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:698)
                 at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
                 at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
                 at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
                 at org.jboss.Main.boot(Main.java:209)
                 at org.jboss.Main$1.run(Main.java:547)
                 at java.lang.Thread.run(Thread.java:619)
                Caused by: org.jboss.xb.binding.JBossXBException: Failed to parse source: cvc-complex-type.2.4.a: Invalid content was found starting with element 'bean'. One of '{"urn:jboss:bean-deployer:2.0":value, "urn:jboss:bean-deployer:2.0":inject, "urn:jboss:bean-deployer:2.0":value-factory, "urn:jboss:bean-deployer:2.0":collection, "urn:jboss:bean-deployer:2.0":list, "urn:jboss:bean-deployer:2.0":set, "urn:jboss:bean-deployer:2.0":array, "urn:jboss:bean-deployer:2.0":map, "urn:jboss:bean-deployer:2.0":null, "urn:jboss:bean-deployer:2.0":this, WC[##other:"urn:jboss:bean-deployer:2.0"], "urn:jboss:bean-deployer:2.0":annotation}' is expected. @ vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/META-INF/jboss-beans.xml[20,72]
                 at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:203)
                 at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)
                 at org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper.parse(JBossXBDeployerHelper.java:199)
                 at org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper.parse(JBossXBDeployerHelper.java:170)
                 at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:132)
                 at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:118)
                 at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parseAndInit(AbstractVFSParsingDeployer.java:256)
                 at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parse(AbstractVFSParsingDeployer.java:239)
                 at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:330)
                 ... 22 more
                Caused by: org.xml.sax.SAXException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'bean'. One of '{"urn:jboss:bean-deployer:2.0":value, "urn:jboss:bean-deployer:2.0":inject, "urn:jboss:bean-deployer:2.0":value-factory, "urn:jboss:bean-deployer:2.0":collection, "urn:jboss:bean-deployer:2.0":list, "urn:jboss:bean-deployer:2.0":set, "urn:jboss:bean-deployer:2.0":array, "urn:jboss:bean-deployer:2.0":map, "urn:jboss:bean-deployer:2.0":null, "urn:jboss:bean-deployer:2.0":this, WC[##other:"urn:jboss:bean-deployer:2.0"], "urn:jboss:bean-deployer:2.0":annotation}' is expected. @ vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/META-INF/jboss-beans.xml[20,72]
                 at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$MetaDataErrorHandler.error(SaxJBossXBParser.java:426)
                 at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
                 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
                 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
                 at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
                 at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
                 at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
                 at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
                 at org.apache.xerces.impl.xs.XMLSchemaValidator.emptyElement(Unknown Source)
                 at org.apache.xerces.xinclude.XIncludeHandler.emptyElement(Unknown Source)
                 at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
                 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
                 at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
                 at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
                 at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
                 at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
                 at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
                 at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
                 at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:199)
                 ... 30 more
                
                




                • 5. Re: directly injecting a bean in a property
                  bryan.kearney

                  I noticed I did not comments out the first Muppet bean. Even if I do that:

                  <?xml version="1.0" encoding="UTF-8"?>
                  <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
                   xmlns="urn:jboss:bean-deployer:2.0">
                  
                   <bean name="QPIDConnection" class="org.apache.qpid.client.AMQConnection">
                   <constructor>
                   <parameter>amqp://guest:guest@/?brokerlist='tcp://localhost'
                   </parameter>
                   </constructor>
                   </bean>
                  
                   <bean name="POJOAdapter" class="org.apache.qpid.agent.POJOAdapter" />
                   <!-- <bean name="Muppet" class="org.apache.qpid.agent.Muppet" />-->
                  
                   <bean name="Kermit" class="org.apache.qpid.agent.ManagedObject">
                   <property name="name">Muppet</property>
                   <property name="managed">
                   <!-- <inject bean="Muppet" />-->
                   <bean name="Muppet" class="org.apache.qpid.agent.Muppet" />
                   </property>
                   <property name="adapter">
                   <inject bean="POJOAdapter" />
                   </property>
                   </bean>
                  
                   <bean name="QMFAgent" class="org.apache.qpid.agent.Agent">
                   <property name="label">agent</property>
                   <property name="sessionTransacted">false</property>
                   <property name="connection">
                   <inject bean="QPIDConnection" />
                   </property>
                   <property name="managedObjects">
                   <list elementClass="org.apache.qpid.agent.ManagedObject">
                   <inject bean="Kermit" />
                   </list>
                   </property>
                   </bean>
                  
                  </deployment>
                  



                  I get a stack trace:

                  07:00:52,312 ERROR [AbstractKernelController] Error installing to Parse: name=vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/ state=Not Installed mode=Manual requiredState=Parse
                  org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/
                   at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException(DeploymentException.java:49)
                   at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:337)
                   at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:297)
                   at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:269)
                   at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.deploy(AbstractParsingDeployerWithOutput.java:230)
                   at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
                   at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
                   at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
                   at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
                   at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
                   at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
                   at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
                   at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
                   at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
                   at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
                   at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
                   at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
                   at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:698)
                   at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:290)
                   at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:221)
                   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
                   at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
                   at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
                   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
                   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
                   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
                   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
                   at java.lang.Thread.run(Thread.java:619)
                  Caused by: org.jboss.xb.binding.JBossXBException: Failed to parse source: cvc-complex-type.2.4.a: Invalid content was found starting with element 'bean'. One of '{"urn:jboss:bean-deployer:2.0":value, "urn:jboss:bean-deployer:2.0":inject, "urn:jboss:bean-deployer:2.0":value-factory, "urn:jboss:bean-deployer:2.0":collection, "urn:jboss:bean-deployer:2.0":list, "urn:jboss:bean-deployer:2.0":set, "urn:jboss:bean-deployer:2.0":array, "urn:jboss:bean-deployer:2.0":map, "urn:jboss:bean-deployer:2.0":null, "urn:jboss:bean-deployer:2.0":this, WC[##other:"urn:jboss:bean-deployer:2.0"], "urn:jboss:bean-deployer:2.0":annotation}' is expected. @ vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/META-INF/jboss-beans.xml[20,72]
                   at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:203)
                   at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)
                   at org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper.parse(JBossXBDeployerHelper.java:199)
                   at org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper.parse(JBossXBDeployerHelper.java:170)
                   at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:132)
                   at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:118)
                   at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parseAndInit(AbstractVFSParsingDeployer.java:256)
                   at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parse(AbstractVFSParsingDeployer.java:239)
                   at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:330)
                   ... 27 more
                  Caused by: org.xml.sax.SAXException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'bean'. One of '{"urn:jboss:bean-deployer:2.0":value, "urn:jboss:bean-deployer:2.0":inject, "urn:jboss:bean-deployer:2.0":value-factory, "urn:jboss:bean-deployer:2.0":collection, "urn:jboss:bean-deployer:2.0":list, "urn:jboss:bean-deployer:2.0":set, "urn:jboss:bean-deployer:2.0":array, "urn:jboss:bean-deployer:2.0":map, "urn:jboss:bean-deployer:2.0":null, "urn:jboss:bean-deployer:2.0":this, WC[##other:"urn:jboss:bean-deployer:2.0"], "urn:jboss:bean-deployer:2.0":annotation}' is expected. @ vfszip:/home/bkearney/jboss5/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/META-INF/jboss-beans.xml[20,72]
                   at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$MetaDataErrorHandler.error(SaxJBossXBParser.java:426)
                   at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
                   at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
                   at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
                   at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
                   at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
                   at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
                   at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
                   at org.apache.xerces.impl.xs.XMLSchemaValidator.emptyElement(Unknown Source)
                   at org.apache.xerces.xinclude.XIncludeHandler.emptyElement(Unknown Source)
                   at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
                   at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
                   at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
                   at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
                   at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
                   at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
                   at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
                   at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
                   at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:199)
                   ... 35 more
                  
                  
                  



                  • 6. Re: directly injecting a bean in a property
                    jaikiran

                    The only difference i see is that you use:

                    <deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                     xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd"
                     xmlns="urn:jboss:bean-deployer:2.0">
                    


                    Change it to:

                    <deployment xmlns="urn:jboss:bean-deployer:2.0">


                    And see if it works.


                    • 7. Re: directly injecting a bean in a property
                      bryan.kearney

                      Yeah.. that worked.. thanks. However, aren't the two lines the same?

                      • 8. Re: directly injecting a bean in a property
                        jaikiran

                         

                        "bryan.kearney" wrote:
                        However, aren't the two lines the same?


                        I am bad at understanding xml schema declarations. To answer your question, i'll have to first understand the difference myself :)