this print for content only—size & color not accurate spine = 0.894" 472 page count EMPOWERING PRODUCTIVITY FOR THE JAVA ™ DEVELOPER Ajay Vohra US $39.99 Shelve in Java ™ Programming User level: Intermediate–Advanced Vohra, Vohra XML Development with Java ™ Technology THE EXPERT’S VOICE ® IN JAVA ™ TECHNOLOGY Ajay Vohra and Deepak Vohra Pro XML Development with Java ™ Technology CYAN MAGENTA YELLOW BLACK PANTONE 123 CV ISBN 1-59059-706-0 9 781590 597064 53999 6 89253 59706 4 Companion eBook Available All the essential techniques you need to know to develop powerful XML applications using Java ™ technology! Supports Java ™ versions up to 6! Supports Java ™ versions up to 6! Deepak Vohra www.apress.com SOURCE CODE ONLINE Companion eBook See last page for details on $10 eBook version forums.apress.com FOR PROFESSIONALS BY PROFESSIONALS ™ Join online discussions: THE APRESS ROADMAP Pro XML Development with Java ™ Technology Beginning XSLT, 2nd edition Java ™ 6 Platform Revealed Beginning Java ™ Objects, Second Edition Beginning XML with DOM Scripting and Ajax Foundations of Ajax Pro XML Development with Java ™ Technology Dear Reader, To say that XML and Java™ technologies are pervasive is to state the obvious, as you might verify from your own experience. Working with these technologies over the years, we found excellent books focused on specific XML technologies, such as XSLT, XPath and XML Schema. We also found very well written sources that covered Java APIs related to various XML technologies and discussed spe- cific topics in depth, such as Web Services. Unfortunately, developing enterprise applications requires applied knowledge spanning many of these topics, so we often found ourselves flipping through more books than we would have liked to whilst working in a busy, professional setting. We also struggled with the fact that many of the XML-centric books were too abstract and did not provide practical examples to illustrate theoretical concepts, and many of the Java-centric books on XML technologies did not explain the underlying XML concepts. We wrote this book to help us and all the other professional Java developers out there who face the same problems. Our main objective was to consolidate the theory and practice of XML and Java technologies in a single, up-to-date source, that is firmly grounded in underlying XML concepts, which can be consulted time and again to rapidly speed up enterprise application development! We have strived to cover all the essential XML topics, including XML Schema based schemas, addressing of XML documents through XPath, transformation of XML documents using XSLT stylesheets, storage and retrieval of XML content in native XML and relational databases, web applications based on AJAX, and SOAP/HTTP and WSDL based Web Services. These XML topics are covered in the applied context of up-to-date Java technologies, including JAXP, JAXB, XMLBeans, and JAX-WS. We are confident that you will find this book useful in building contemporary, service-oriented enterprise applications. Ajay Vohra and Deepak Vohra Pro Pro XML Development with Java TM Technology ■■■ Ajay Vohra and Deepak Vohra Vohra_706-0FRONT.fm Page i Tuesday, August 15, 2006 9:01 AM Pro XML Development with Java TM Technology Copyright © 2006 by Ajay Vohra and Deepak Vohra All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN-13 (pbk): 978-1-59059-706-4 ISBN-10 (pbk): 1-59059-706-0 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. Apress, Inc. is not affiliated with Sun Microsystems, Inc., and this book was written without endorsement from Sun Microsystems, Inc. Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Chris Mills Technical Reviewer: Bharath Gowda Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick, Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser, Keir Thomas, Matt Wade Project Manager: Elizabeth Seymour Copy Edit Manager: Nicole LeClerc Copy Editor: Kim Wimpsett Assistant Production Director: Kari Brooks-Copony Senior Production Editor: Laura Cheu Compositor: Susan Glinert Stevens Proofreader: Kim Burton Indexer: Carol Burbo Artist: Susan Glinert Stevens Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail orders-ny@springer-sbm.com, or visit http://www.springeronline.com. For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail info@apress.com, or visit http://www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.apress.com in the Source Code section. Vohra_706-0FRONT.fm Page ii Tuesday, August 15, 2006 9:01 AM Dedicated to our parents Vohra_706-0FRONT.fm Page iii Tuesday, August 15, 2006 9:01 AM Vohra_706-0FRONT.fm Page iv Tuesday, August 15, 2006 9:01 AM v Contents at a Glance About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xv About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii PART 1 ■ ■ ■ Parsing, Validating, and Addressing ■CHAPTER 1 Introducing XML and Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ■CHAPTER 2 Parsing XML Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 ■CHAPTER 3 Introducing Schema Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 ■CHAPTER 4 Addressing with XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 ■CHAPTER 5 Transforming with XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 PART 2 ■ ■ ■ Object Bindings ■CHAPTER 6 Object Binding with JAXB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 ■CHAPTER 7 Binding with XMLBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 PART 3 ■ ■ ■ XML and Databases ■CHAPTER 8 Storing XML in Native XML Databases: Xindice . . . . . . . . . . . . . . . 215 ■CHAPTER 9 Storing XML in Relational Databases . . . . . . . . . . . . . . . . . . . . . . . . . 249 PART 4 ■ ■ ■ DOM Level 3.0 ■CHAPTER 10 Loading and Saving with the DOM Level 3 API . . . . . . . . . . . . . . . . 267 PART 5 ■ ■ ■ Utilities ■CHAPTER 11 Converting XML to Spreadsheet, and Vice Versa . . . . . . . . . . . . . . 289 ■CHAPTER 12 Converting XML to PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 Vohra_706-0FRONT.fm Page v Tuesday, August 15, 2006 9:01 AM vi PART 6 ■ ■ ■ Web Applications and Services ■CHAPTER 13 Building Web Applications with Ajax . . . . . . . . . . . . . . . . . . . . . . . . . 329 ■CHAPTER 14 Building XML-Based Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . 353 ■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 Vohra_706-0FRONT.fm Page vi Tuesday, August 15, 2006 9:01 AM vii Contents About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xv About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii PART 1 ■ ■ ■ Parsing, Validating, and Addressing ■CHAPTER 1 Introducing XML and Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Scope of This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Overview of This Book’s Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 XML 1.0 Primer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 XML Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Processing Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 DOCTYPE Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Entities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Complete Example XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Namespaces in XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 XML Schema 1.0 Primer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Schema Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Built-in Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Element Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Complex Type Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Complex Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Simple Type Declarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Schema Example Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Vohra_706-0FRONT.fm Page vii Tuesday, August 15, 2006 9:01 AM viii ■CONTENTS Introducing the Eclipse IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Creating a Java Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Setting the Build Path. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Creating a Java Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Creating a Java Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Running a Java Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Importing a Java Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 ■CHAPTER 2 Parsing XML Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Objectives of Parsing XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Overview of Parsing Approaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 DOM Approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Push Approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Pull Approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Comparing the Parsing Approaches . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Setting Up an Eclipse Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Example XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 J2SE, Packages, and Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Parsing with the DOM Level 3 API . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Parsing with SAX 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 JAXP Pluggability for SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 SAX Features. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 SAX Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 SAX Handlers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 SAX Parsing Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 SAX API Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Parsing with StAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Cursor API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Iterator API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 ■CHAPTER 3 Introducing Schema Validation . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Schema Validation APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Configuring JAXP Parsers for Schema Validation . . . . . . . . . . . . . . . 66 Setting Up the Eclipse Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Vohra_706-0FRONT.fm Page viii Tuesday, August 15, 2006 9:01 AM ■CONTENTS ix JAXP 1.3 DOM Parser API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Create a DOM Parser Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Configure a Factory for Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Create a DOM Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Configure a Parser for Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Validate Using the Parser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Complete DOM API Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 JAXP 1.3 SAX Parser API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Create a SAX Parser Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Configure the Factory for Validation . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Create a SAX Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Configure the Parser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Validate Using the Parser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Complete SAX API Validator Example . . . . . . . . . . . . . . . . . . . . . . . . . 78 JAXP 1.3 Validation API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Create a Validator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Set an Error Handler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Validate the XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Complete JAXP 1.3 Validator Example. . . . . . . . . . . . . . . . . . . . . . . . 81 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 ■CHAPTER 4 Addressing with XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Understanding XPath Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 XPath Expression Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Location Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Applying XPath Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Comparing the XPath API to the DOM API . . . . . . . . . . . . . . . . . . . . . 94 Setting Up the Eclipse Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 JAXP 1.3 XPath API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Explicitly Compiling an XPath Expression . . . . . . . . . . . . . . . . . . . . . 97 Evaluating a Compiled XPath Expression. . . . . . . . . . . . . . . . . . . . . . 97 Evaluating an XPath Expression Directly . . . . . . . . . . . . . . . . . . . . . . 99 Evaluating Namespace Nodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 JAXP 1.3 XPath Example Application . . . . . . . . . . . . . . . . . . . . . . . . 102 JDOM XPath API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 JDOM XPath Example Application. . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Vohra_706-0FRONT.fm Page ix Tuesday, August 15, 2006 9:01 AM [...]... book: • XML 1.0 (http://www.w3.org/TR/REC -xml/ ) describes precise rules for crafting a well-formed XML document and describes partial rules for processing well-formed2 documents Java API for XML Processing (JAXP) 1.3 in J2SE 5.0 is its corresponding Java API In addition, Streaming API for XML 1.0 (StAX) in J2SE 6.0 is relevant for processing XML documents • XML Schema 1.0 (http://www.w3.org/TR/xmlschema-1/)... document can begin with an XML declaration An XML declaration can be omitted, but if it appears, it should be the first thing within a document You define an XML declaration as follows: < ?xml version='1.0' ?> The version attribute specifies the XML version, and it is a required attribute The XML declaration may include additional attributes: encoding and standalone An example XML declaration with the encoding... You can specify a nondefault XML Namespace URI using the xmlns:prefix attribute, where prefix is a unique prefix associated with this XML Namespace An element or an attribute is designated to be part of an XML Namespace either by explicitly prefixing its name with an XML Namespace prefix or by implicitly nesting it within an element that has been associated with a default XML Namespace It is important... 186 Setting Up the Eclipse Project 187 Compiling an XML Schema 189 Customizing XMLBeans Bindings 196 Marshaling an XML Document 197 Unmarshaling an XML Document 200 Traversing an XML Document with the XmlCursor API 203... discussed in this book: • The XMLBeans 2.0 API, which is used for XML binding to JavaBeans This is an alternative to JAXB 2.0 and has some pros and cons compared to JAXB 2.0 • The XML: DB5 group of APIs, which can be used to access and update XML documents stored in a native XML database • The Java Database Connectivity (JDBC) 4.0 API, which is useful for storing XML content within a relational database... An example schema document with its root element is as follows: Built-in Datatypes The XML Schema language has 44 built-in simple types that are specified in XML Schema Part 2: Datatypes (http://www.w3.org/TR/xmlschema-2/) These datatypes of course belong to the XML Schema namespace, so we will use them with the xsd: prefix, as... Well-formed XML documents are defined as part of the XML 1.0 specification at http://www.w3.org/TR/2004/ REC -xml- 20040204/#sec-well-formed 3 http://java.sun.com/javaee/ 3 Vohra_706-0C01.fm Page 4 Wednesday, June 28, 2006 6:27 AM 4 CHAPTER 1 ■ INTRODUCING XML AND JAVA • XSL Transformations (XSLT) 1.0 (http://www.w3.org/TR/xslt) describes a language for transforming an XML document into other XML or non -XML. .. Processing Instructions Processing instructions in an XML document specify directions for applications that are expected to process the document The semantics associated with these instructions are application specific The syntax of a processing instruction is as follows: In a processing instruction, target specifies the target application that is expected to process the instruction,... INTRODUCING XML AND JAVA implicit, internal, parsed entities In fact, you can make these implicit entities explicit, as shown in the following example: ]> The XML declaration and the entity declarations form the prolog of an XML document Complete Example XML Document Listing 1-1 shows the complete example XML document Listing 1-1 Complete Example XML. .. some arbitrary text a CDATA!]]> Namespaces in XML An XML Namespace associates an element or attribute name with a specified URI and thus allows for multiple elements (or attributes) within an XML document to have the same name yet have different semantics associated with those names because . Java ™ Objects, Second Edition Beginning XML with DOM Scripting and Ajax Foundations of Ajax Pro XML Development with Java ™ Technology Dear Reader, To say that XML and Java™ technologies are pervasive. $10 eBook version forums.apress.com FOR PROFESSIONALS BY PROFESSIONALS ™ Join online discussions: THE APRESS ROADMAP Pro XML Development with Java ™ Technology Beginning XSLT, 2nd edition Java ™ . Vohra Pro Pro XML Development with Java TM Technology ■■■ Ajay Vohra and Deepak Vohra Vohra_706-0FRONT.fm Page i Tuesday, August 15, 2006 9:01 AM Pro XML Development with Java TM Technology Copyright