Overview
As part of the the migration process for the NetBeans Coherence Module I have decided to migrate my Java/XML implementation from JAXB to a XAM/XDM based model because it will be a more appropriate fit for the advanced XML editor functionality and will remove some of the synchronisation issues seen in my initial release of the NetBeans Coherence Plug-in . As part of this development process I decided that it would be good to put together a simple tutorial that will allow others to repeat the process and cement the development strategy within my own mind.At present their is currently no automated method of generating XAM/XDM Java Interfaces / Implementation classes similar to that provided by JAXB (maybe a future project if I get time) so I will be documenting my approach to the development process. The NetBeans Coherence module provides editors for the three core Coherence XML files "POF Config", Cache Config" and "Coherence Operational" and for this tutorial I will be working with the pof-config XML file. With Coherence 3.7 the Coherence team has provided XSD definitions of the XML files and hence I will be working with these as the source for my implementation.
A future Blog entry will explain how I link the XAM/XDM Model describe here to the existing Advanced POF Editors within the Coherence Netbeans Module.
Identifying the Required Objects
As I mentioned at present their are no automated tools for this hence we will need to review the XSD to identify which elements within it we need to implement. Below we can see the new Coherence 3.7 POF XSD and from this I have identified we will need to create the following Java Interfaces and their corresponding implementations.- pof-config - PofConfig & PofConfigImpl
- user-type-list -UserTypeList & UserTypeListImpl
- user-type - UserType & UserTypeImpl
- include - Include & IncludeImpl
- type-id - TypeId & TypeIdImpl
- class-name - ClassName & ClassNameImpl
- serializer-type - SerializerType & SerializerTypeImpl
- serializer - Serializer & SerializerImpl
- default-serializer -
DefaultSerializer & DefaultSerializerImpl
- init-params - InitParams & InitParamsImpl
- init-param - InitParam & InitParamImpl
- param-type - ParamType & ParamTypeImpl
- param-value - ParamValue & ParamValueImpl
- allow-interfaces - AllowInterfaces & AllowInterfacesImpl
- allow-subclasses -
AllowSubclasses & AllowSubclassesImpl
- UserTypeListElement
In addition I created a number of Interfaces and Impl Classes that matched the "Simple Types".
- xsd:string - PofConfigTextComponent & PofConfigTextComponentImpl
- xsd:boolean - PofConfigBooleanComponent & PofConfigBooleanComponentImpl
- xsd:nonNegativeInteger - PofConfigNonNegativeIntegerComponent & PofConfigNonNegativeIntegerComponen
coherence-pof-config.xsd
1 <?xml version="1.0"?> 2 3 4 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 5 targetNamespace="http://xmlns.oracle.com/coherence/coherence-pof-config" 6 xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config" 7 elementFormDefault="qualified" attributeFormDefault="unqualified" 8 version="1.0"> 9 10 <xsd:annotation> 11 <xsd:documentation> 12 Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 13 14 Oracle is a registered trademarks of Oracle Corporation and/or its 15 affiliates. 16 17 This software is the confidential and proprietary information of 18 Oracle Corporation. You shall not disclose such confidential and 19 proprietary information and shall use it only in accordance with the 20 terms of the license agreement you entered into with Oracle. 21 22 This notice may not be removed or altered. 23 </xsd:documentation> 24 </xsd:annotation> 25 26 <xsd:annotation> 27 <xsd:documentation> 28 This is the XML schema for the Coherence pof configuration file 29 (coherence-pof-config.xml). 30 </xsd:documentation> 31 </xsd:annotation> 32 33 <xsd:element name="pof-config"> 34 <xsd:annotation> 35 <xsd:documentation> 36 The pof-config element is the root element of the pof-config 37 descriptor. 38 39 Used in: n/a 40 </xsd:documentation> 41 </xsd:annotation> 42 <xsd:complexType> 43 <xsd:sequence> 44 <xsd:element ref="user-type-list" /> 45 <xsd:element ref="allow-interfaces" minOccurs="0" /> 46 <xsd:element ref="allow-subclasses" minOccurs="0" /> 47 <xsd:element ref="default-serializer" minOccurs="0" /> 48 </xsd:sequence> 49 </xsd:complexType> 50 </xsd:element> 51 52 <xsd:element name="user-type-list"> 53 <xsd:annotation> 54 <xsd:documentation> 55 The user-type-list element contains zero or more user-type elements. 56 Each POF user type that will be used must be listed in the 57 user-type-list. 58 59 The user-type-list element may also contain zero or more include 60 elements. Each include element is used to add user-type elements 61 defined in another pof-config file. 62 63 Used in: pof-config 64 </xsd:documentation> 65 </xsd:annotation> 66 <xsd:complexType> 67 <xsd:choice minOccurs="0" maxOccurs="unbounded"> 68 <xsd:element ref="user-type" /> 69 <xsd:element ref="include" /> 70 </xsd:choice> 71 </xsd:complexType> 72 </xsd:element> 73 74 <xsd:element name="user-type"> 75 <xsd:annotation> 76 <xsd:documentation> 77 The user-type element contains the declaration of a POF user type. A 78 POF user type is a uniquely identifiable, portable, versionable 79 object class that can be communicated among systems regardless of 80 language, OS, hardware and location. 81 82 Within the user-type element, the type-id element is optional, but its use 83 is strongly suggested in order to support schema versioning and 84 evolution. 85 86 Within the user-type element, the class-name element is required, and 87 specifies the fully qualified name of the Java class or interface 88 that all values of the user type are type-assignable to. 89 90 If the serializer element is omitted, then the user type is assumed to 91 implement the PortableObject interface, and the 92 PortableObjectSerializer implementation is used as the PofSerializer. 93 94 Used in: user-type-list 95 </xsd:documentation> 96 </xsd:annotation> 97 <xsd:complexType> 98 <xsd:sequence> 99 <xsd:element ref="type-id" minOccurs="0" /> 100 <xsd:element ref="class-name" /> 101 <xsd:element ref="serializer" minOccurs="0" /> 102 </xsd:sequence> 103 </xsd:complexType> 104 </xsd:element> 105 106 <xsd:element name="include" type="xsd:string"> 107 <xsd:annotation> 108 <xsd:documentation> 109 The include element specifies the location of a pof-config file to load 110 user-type elements from. 111 112 The value is a locator string (either a valid path or URL) that 113 identifies 114 the location of the target pof-config file. 115 116 Used in: user-type-list 117 </xsd:documentation> 118 </xsd:annotation> 119 </xsd:element> 120 121 <xsd:element name="type-id" type="xsd:nonNegativeInteger"> 122 <xsd:annotation> 123 <xsd:documentation> 124 The type-id element specifies an integer value (n >= 0) that uniquely 125 identifies the user type. 126 127 If none of the user-type elements contains a type-id element, then the 128 type IDs for the user types will be based on the order in which they 129 appear in the user-type-list, with the first user type being assigned 130 the type ID 0, the second user type being assigned the type ID 1, and so on. 131 132 However, it is strongly recommended that user types IDs always be specified, 133 in order to support schema versioning and evolution. 134 135 Used in: user-type 136 </xsd:documentation> 137 </xsd:annotation> 138 </xsd:element> 139 140 <xsd:element name="class-name" type="xsd:string"> 141 <xsd:annotation> 142 <xsd:documentation> 143 The class-name element specifies the name of a Java class or interface. 144 145 Within the user-type element, the class-name element is required, 146 and specifies the fully qualified name of the Java class or interface 147 that all values of the user type are type-assignable to. 148 149 Within the serializer element, the class-name element is required. 150 151 Used in: user-type, serializer 152 </xsd:documentation> 153 </xsd:annotation> 154 </xsd:element> 155 156 <xsd:complexType name="serializer-type"> 157 <xsd:sequence> 158 <xsd:element ref="class-name" /> 159 <xsd:element ref="init-params" minOccurs="0" /> 160 </xsd:sequence> 161 </xsd:complexType> 162 163 <xsd:element name="serializer" type="serializer-type"> 164 <xsd:annotation> 165 <xsd:documentation> 166 The serializer element specifies what PofSerializer to use to serialize 167 and deserialize a specific user type. 168 169 A PofSerializer is used to serialize and deserialize user type values 170 to and from a POF stream. Within the serializer element, the class-name 171 element is required, and zero or more constructor parameters can be 172 defined within an init-params element. 173 174 If the serializer element is omitted, then the user type is assumed to 175 implement the PortableObject interface, and the 176 PortableObjectSerializer 177 implementation is used as the PofSerializer. 178 179 If the init-params element is omitted from the serializer element, 180 then the 181 following four constructors are attempted on the specific PofSerializer 182 implementation, and in this order: 183 184 - (int nTypeId, Class clz, ClassLoader loader) 185 - (int nTypeId, Class clz) 186 - (int nTypeId) 187 - () 188 189 Used in: user-type 190 </xsd:documentation> 191 </xsd:annotation> 192 </xsd:element> 193 194 <xsd:element name="default-serializer" type="serializer-type"> 195 <xsd:annotation> 196 <xsd:documentation> 197 The default serializer element specifies what PofSerializer to use to 198 serialize and deserialize all user types defined in this config. If 199 a serializer is specified for a user type, then that serializer will 200 be used for that user type instead of the default serializer. 201 202 If the default serializer element is omitted, the serializer defined 203 for the specific user type will be used. If the serializer for the 204 user type is also omitted, then the user type is assumed to implement 205 the PortableObject interface, and the PortableObjectSerializer 206 implementation is used as the PofSerializer. 207 208 If the init-params element is omitted from the default serializer 209 element, then the following four constructors are attempted on the 210 specific PofSerializer implementation, and in this order: 211 212 - (int nTypeId, Class clz, ClassLoader loader) 213 - (int nTypeId, Class clz) 214 - (int nTypeId) 215 - () 216 217 Used in: pof-config 218 </xsd:documentation> 219 </xsd:annotation> 220 </xsd:element> 221 222 <xsd:element name="init-params"> 223 <xsd:annotation> 224 <xsd:documentation> 225 The init-params element contains zero or more arguments (each as an 226 init-param) that correspond to the parameters of a constructor of 227 the class that is being configured. 228 229 Used in: serializer 230 </xsd:documentation> 231 </xsd:annotation> 232 <xsd:complexType> 233 <xsd:sequence> 234 <xsd:element ref="init-param" minOccurs="0" maxOccurs="unbounded" /> 235 </xsd:sequence> 236 </xsd:complexType> 237 </xsd:element> 238 239 <xsd:element name="init-param"> 240 <xsd:annotation> 241 <xsd:documentation> 242 The init-param element provides a type for a configuration parameter 243 and a corresponding value to pass as an argument. 244 245 Used in: init-params 246 </xsd:documentation> 247 </xsd:annotation> 248 <xsd:complexType> 249 <xsd:sequence> 250 <xsd:element ref="param-type" /> 251 <xsd:element ref="param-value" /> 252 </xsd:sequence> 253 </xsd:complexType> 254 </xsd:element> 255 256 <xsd:element name="param-type"> 257 <xsd:annotation> 258 <xsd:documentation> 259 The param-type element specifies the Java type of initialization 260 parameter. 261 262 Supported types are: 263 - string - indicates that the value is a java.lang.String 264 - boolean - indicates that the value is a java.lang.Boolean 265 - int - indicates that the value is a java.lang.Integer 266 - long - indicates that the value is a java.lang.Long 267 - double - indicates that the value is a java.lang.Double 268 - decimal - indicates that the value is a 269 java.math.BigDecimal 270 - file - indicates that the value is a 271 java.io.File 272 - date - indicates that the value is a java.sql.Date 273 - time - indicates that the value is a java.sql.Time 274 - datetime -indicates that the value is a 275 java.sql.Timestamp 276 - xml - indicates that the value is the entire init-param 277 XmlElement 278 279 The value is converted to the specified type, and the target 280 constructor or method must have a parameter of that type in 281 order for the instantiation to succeed. 282 283 Used in: init-param 284 </xsd:documentation> 285 </xsd:annotation> 286 <xsd:simpleType> 287 <xsd:restriction base="xsd:normalizedString"> 288 <xsd:enumeration value="string" /> 289 <xsd:enumeration value="java.lang.String" /> 290 <xsd:enumeration value="int" /> 291 <xsd:enumeration value="java.lang.Integer" /> 292 <xsd:enumeration value="long" /> 293 <xsd:enumeration value="java.lang.Long" /> 294 <xsd:enumeration value="boolean" /> 295 <xsd:enumeration value="java.lang.Boolean" /> 296 <xsd:enumeration value="double" /> 297 <xsd:enumeration value="java.lang.Double" /> 298 <xsd:enumeration value="float" /> 299 <xsd:enumeration value="java.lang.Float" /> 300 <xsd:enumeration value="decimal" /> 301 <xsd:enumeration value="java.math.BigDecimal" /> 302 <xsd:enumeration value="file" /> 303 <xsd:enumeration value="java.io.File" /> 304 <xsd:enumeration value="date" /> 305 <xsd:enumeration value="java.sql.Date" /> 306 <xsd:enumeration value="time" /> 307 <xsd:enumeration value="java.sql.Time" /> 308 <xsd:enumeration value="datetime" /> 309 <xsd:enumeration value="java.sql.Timestamp" /> 310 <xsd:enumeration value="xml" /> 311 <xsd:enumeration value="com.tangosol.run.xml.XmlElement" /> 312 </xsd:restriction> 313 </xsd:simpleType> 314 </xsd:element> 315 316 <xsd:element name="param-value" type="xsd:string"> 317 <xsd:annotation> 318 <xsd:documentation> 319 The param-value element specifies a value of the initialization 320 parameter. 321 322 The value is in a format specific to the type of the parameter. 323 324 There are four reserved values that can be specified. Each of these 325 values 326 is replaced at runtime with a specific runtime value before the 327 constructor 328 is invoked: 329 - "{type-id}" - replaced with the Type ID of the User Type; 330 - "{class-name}" - replaced with the name of the class for the User 331 Type; 332 - "{class}" - replaced with the Class for the User Type; 333 - 334 "{class-loader}" - replaced with the ConfigurablePofContext's 335 ContextClassLoader. 336 337 Used in: init-param 338 </xsd:documentation> 339 </xsd:annotation> 340 </xsd:element> 341 342 <xsd:element name="allow-interfaces" type="xsd:boolean"> 343 <xsd:annotation> 344 <xsd:documentation> 345 The allow-interfaces element indicates whether the user-type class-name 346 can specify Java interface types in addition to Java class types. 347 348 Valid values are "true" or "false". Default value is false. 349 350 Used in: pof-config 351 </xsd:documentation> 352 </xsd:annotation> 353 </xsd:element> 354 355 <xsd:element name="allow-subclasses" type="xsd:boolean"> 356 <xsd:annotation> 357 <xsd:documentation> 358 The allow-subclasses element indicates whether the user-type class-name 359 can specify a Java class type that is abstract, and whether sub-classes 360 of any specified user-type class-name will be permitted at runtime and 361 automatically mapped to the specified super-class for purposes of 362 obtaining a serializer. 363 364 Valid values are "true" or "false". Default value is false. 365 366 Used in: pof-config 367 </xsd:documentation> 368 </xsd:annotation> 369 </xsd:element> 370 371 </xsd:schema> 372 373
Implementation Examples
Because the implementation of the Elements and Complex types is fairly generic I will not document all the Interfaces and Classes I have produced but rather document some example Interfaces and Classes. The common methods and functionality implemented will be further explained in the XAM/XDM implementation section.PofConfigTextComponent & PofConfigTextComponentImpl
This Interface and class define the methods that will be used by all Simple Elements that are of xsd:string type. The interface defines a simple getValue and setValue method that return and set a simple string value. It can be seen that the Abstract class, associated with the interface, assumes that any inherited classes implement the getTagName() methods to return the name of this tag. This is required because setValue implements the underlying protected setText method that requires the name of the implementing element.PofConfigTextComponent
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 /** 45 * 46 * @author Andrew Hopkinson (Oracle A-Team) 47 */ 48 public interface PofConfigTextComponent extends PofConfigComponent { 49 public String getValue(); 50 public void setValue(String value); 51 } 52 53
PofConfigTextComponentImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import org.netbeans.modules.coherence.xml.pof.PofConfigTextComponent; 45 import org.w3c.dom.Element; 46 47 /** 48 * 49 * @author Andrew Hopkinson (Oracle A-Team) 50 */ 51 public abstract class PofConfigTextComponentImpl extends PofConfigComponentImpl implements PofConfigTextComponent { 52 53 public PofConfigTextComponentImpl(PofConfigModelImpl model, Element e) { 54 super(model, e); 55 } 56 57 @Override 58 public String getValue() { 59 return getText(); 60 } 61 62 @Override 63 public void setValue(String value) { 64 setText(getTagName(), value); 65 } 66 67 } 68 69
IncludeImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import org.netbeans.modules.coherence.xml.pof.Include; 45 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 46 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 47 import org.w3c.dom.Element; 48 49 /** 50 * 51 * @author Andrew Hopkinson (Oracle A-Team) 52 */ 53 public class IncludeImpl extends PofConfigTextComponentImpl implements Include { 54 55 public IncludeImpl(PofConfigModelImpl model, Element e) { 56 super(model, e); 57 } 58 59 public IncludeImpl(PofConfigModelImpl model) { 60 super(model, createNewElement(XML_TAG_NAME, model)); 61 } 62 63 @Override 64 public String getTagName() { 65 return Include.XML_TAG_NAME; 66 } 67 68 @Override 69 public void accept(PofConfigVisitor visitor) { 70 visitor.visit(this); 71 } 72 73 @Override 74 public Class<? extends PofConfigComponent> getComponentType() { 75 return Include.class; 76 } 77 78 } 79 80
UserTypeList & UserTypeListImpl
The UserTypeList Interface and Class show how to implement a Complex Element / Type that contains an un-sequenced repeating group and it can be seen that we have 4 key methods that add, remove and retrieve the Sub Elements of the <user-type-list> element. The Impl class shows that these simply wrap the underlying org.netbeans.modules.xml.xam.AbstractComponent insertAtIndex, appendChild and removeChild specifically indicating that the element concerned is a Sub Element of the <user-type-list> tag. Hence the user does not need to be aware of the tag type or name.To improve read access I have also implement two additional methods, one for each sub-element, getIncludes() and getUserTypes() which simply return just the elements of the appropriate type.
UserTypeList
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 import java.util.List; 45 46 /** 47 * 48 * @author Andrew Hopkinson (Oracle A-Team) 49 */ 50 public interface UserTypeList extends PofConfigComponent { 51 52 static String XML_TAG_NAME = "user-type-list"; 53 54 public List<Include> getIncludes(); 55 56 public List<UserType> getUserTypes(); 57 58 List<UserTypeListElement> getElements(); 59 60 void addElement(UserTypeListElement element) throws ValueNotPermittedException; 61 62 void addElement(int index, UserTypeListElement element) throws ValueNotPermittedException; 63 64 void removeElement(UserTypeListElement element); 65 } 66 67
UserTypeListImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import java.util.List; 45 import org.netbeans.modules.coherence.xml.pof.Include; 46 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 47 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 48 import org.netbeans.modules.coherence.xml.pof.UserType; 49 import org.netbeans.modules.coherence.xml.pof.UserTypeList; 50 import org.netbeans.modules.coherence.xml.pof.UserTypeListElement; 51 import org.netbeans.modules.coherence.xml.pof.ValueNotPermittedException; 52 import org.w3c.dom.Element; 53 54 /** 55 * 56 * @author Andrew Hopkinson (Oracle A-Team) 57 */ 58 public class UserTypeListImpl extends PofConfigComponentImpl implements UserTypeList { 59 60 public UserTypeListImpl(PofConfigModelImpl model, Element e) { 61 super(model, e); 62 } 63 64 public UserTypeListImpl(PofConfigModelImpl model) { 65 super(model, createNewElement(XML_TAG_NAME, model)); 66 } 67 68 @Override 69 public String getTagName() { 70 return UserTypeList.XML_TAG_NAME; 71 } 72 73 @Override 74 public void accept(PofConfigVisitor visitor) { 75 visitor.visit(this); 76 } 77 78 @Override 79 public Class<? extends PofConfigComponent> getComponentType() { 80 return UserTypeList.class; 81 } 82 83 @Override 84 public List<Include> getIncludes() { 85 return getChildren(Include.class); 86 } 87 88 @Override 89 public List<UserType> getUserTypes() { 90 return getChildren(UserType.class); 91 } 92 93 @Override 94 public List<UserTypeListElement> getElements() { 95 return getChildren(UserTypeListElement.class); 96 } 97 98 @Override 99 public void addElement(UserTypeListElement element) throws ValueNotPermittedException { 100 appendChild(UserTypeListElement.USERTYPELIST_ELEMENT, element); 101 } 102 103 @Override 104 public void addElement(int index, UserTypeListElement element) throws ValueNotPermittedException { 105 insertAtIndex(UserTypeListElement.USERTYPELIST_ELEMENT, element, index); 106 } 107 108 @Override 109 public void removeElement(UserTypeListElement element) { 110 removeChild( UserTypeListElement.USERTYPELIST_ELEMENT, element ); 111 } 112 113 } 114 115
PofConfig & PofConfigImpl
This Interface and associated class are a representation of the top level <pof-config> tag which cotains a <xsd:sequence> now as mentioned the sequence defines the order in which elements can appear within the xml and as such we can simply write a getter and setter for each of the Sub Elements. The implemented getter methods will call the underlying getChildren method specifying the appropriate Interface class then return the first element, because their can only be one, or null if it does not exist.It can be seen within the implementation class that the set methods for each of the Sub Elements use the underlying addBefore or addAfter methods to specify where in the sequence they should be added.
PofConfig
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 import java.util.List; 45 46 /** 47 * 48 * @author Andrew Hopkinson (Oracle A-Team) 49 */ 50 public interface PofConfig extends PofConfigComponent { 51 52 public static String XML_TAG_NAME = "pof-config"; 53 54 public UserTypeList getUserTypeList(); 55 56 public void setUserTypeList(UserTypeList element); 57 58 public AllowInterfaces getAllowInterfaces(); 59 60 public void setAllowInterfaces(AllowInterfaces element); 61 62 public AllowSubclasses getAllowSubclasses(); 63 64 public void setAllowSubclasses(AllowSubclasses element); 65 66 public DefaultSerializer getDefaultSerializer(); 67 68 public void setDefaultSerializer(DefaultSerializer element); 69 70 } 71 72
PofConfigImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import java.util.ArrayList; 45 import java.util.Collection; 46 import java.util.List; 47 import org.netbeans.modules.coherence.xml.pof.AllowInterfaces; 48 import org.netbeans.modules.coherence.xml.pof.AllowSubclasses; 49 import org.netbeans.modules.coherence.xml.pof.DefaultSerializer; 50 import org.netbeans.modules.coherence.xml.pof.PofConfig; 51 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 52 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 53 import org.netbeans.modules.coherence.xml.pof.UserTypeList; 54 import org.w3c.dom.Element; 55 56 /** 57 * 58 * @author Andrew Hopkinson (Oracle A-Team) 59 */ 60 public class PofConfigImpl extends PofConfigComponentImpl implements PofConfig { 61 62 PofConfigImpl(PofConfigModelImpl model, Element e) { 63 super(model, e); 64 } 65 66 PofConfigImpl(PofConfigModelImpl model) { 67 this(model, createNewElement(XML_TAG_NAME, model)); 68 } 69 70 @Override 71 public String getTagName() { 72 return PofConfig.XML_TAG_NAME; 73 } 74 75 @Override 76 public void accept(PofConfigVisitor visitor) { 77 visitor.visit(this); 78 } 79 80 @Override 81 public Class<? extends PofConfigComponent> getComponentType() { 82 return PofConfig.class; 83 } 84 85 @Override 86 public UserTypeList getUserTypeList() { 87 List<UserTypeList> elements = getChildren(UserTypeList.class); 88 if (elements != null && elements.size() > 0) { 89 return elements.get(0); 90 } 91 return null; 92 } 93 94 @Override 95 public void setUserTypeList(UserTypeList element) { 96 UserTypeList child = getUserTypeList(); 97 if (child != null) { 98 removeChild(UserTypeList.XML_TAG_NAME, child); 99 } 100 if (element != null) { 101 Collection typeList = new ArrayList(); 102 typeList.add(AllowInterfacesImpl.class); 103 typeList.add(AllowSubclassesImpl.class); 104 typeList.add(DefaultSerializerImpl.class); 105 addBefore(UserTypeList.XML_TAG_NAME, element, typeList); 106 } 107 } 108 109 @Override 110 public AllowInterfaces getAllowInterfaces() { 111 List<AllowInterfaces> elements = getChildren(AllowInterfaces.class); 112 if (elements != null && elements.size() > 0) { 113 return elements.get(0); 114 } 115 return null; 116 } 117 118 @Override 119 public void setAllowInterfaces(AllowInterfaces element) { 120 AllowInterfaces child = getAllowInterfaces(); 121 if (child != null) { 122 removeChild(AllowInterfaces.XML_TAG_NAME, child); 123 } 124 if (element != null) { 125 Collection typeList = new ArrayList(); 126 typeList.add(UserTypeListImpl.class); 127 addAfter(AllowInterfaces.XML_TAG_NAME, element, typeList); 128 } 129 } 130 131 @Override 132 public AllowSubclasses getAllowSubclasses() { 133 List<AllowSubclasses> elements = getChildren(AllowSubclasses.class); 134 if (elements != null && elements.size() > 0) { 135 return elements.get(0); 136 } 137 return null; 138 } 139 140 @Override 141 public void setAllowSubclasses(AllowSubclasses element) { 142 AllowSubclasses child = getAllowSubclasses(); 143 if (child != null) { 144 removeChild(AllowSubclasses.XML_TAG_NAME, child); 145 } 146 if (element != null) { 147 Collection typeList = new ArrayList(); 148 typeList.add(UserTypeListImpl.class); 149 typeList.add(AllowInterfacesImpl.class); 150 addAfter(AllowSubclasses.XML_TAG_NAME, element, typeList); 151 } 152 } 153 154 @Override 155 public DefaultSerializer getDefaultSerializer() { 156 List<DefaultSerializer> elements = getChildren(DefaultSerializer.class); 157 if (elements != null && elements.size() > 0) { 158 return elements.get(0); 159 } 160 return null; 161 } 162 163 @Override 164 public void setDefaultSerializer(DefaultSerializer element) { 165 DefaultSerializer child = getDefaultSerializer(); 166 if (child != null) { 167 removeChild(DefaultSerializer.XML_TAG_NAME, child); 168 } 169 if (element != null) { 170 Collection typeList = new ArrayList(); 171 typeList.add(UserTypeListImpl.class); 172 typeList.add(AllowInterfacesImpl.class); 173 typeList.add(AllowSubclassesImpl.class); 174 addAfter(DefaultSerializer.XML_TAG_NAME, element, typeList); 175 } 176 } 177 } 178 179
XAM/XDM Implementation Requirements
To implement the XAM/XDM Object Model their are a number of classes that must be created, in addition to those required for the Elements, and these control the parsing, creation, sychronisation and removal of the Object Model and its elements. Essentially these Interfaces and Classes would be common across every XAM/XDM implementation although their actual implementation would be different as can be seen from the code.I will discuss each of these and explain what functionality they provide. I will use a simple naming convention that takes the name of the top level element, pof-config (PofConfig), and prepends it to the various required Interfaces and Classes.
PofConfigComponentFactory & PofConfigComponentFactoryImpl
These constitute the Factory classes that will be used to create all the available Elements within the coherence-pof-config.xsd. It can be seen that no parameters are passed to any of the methods and as such they create simple empty default instances of the appropriate element. At present the Impl does not force the existence of any Mandatory Sub-Elements this is simply left to the user of the code to implement.In addition to the create methods the Impl provides an implementation of a getVisitor method that will create / retrieve an instance of the Visitor Implementation (see later).
PofConfigComponentFactory
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 import org.w3c.dom.Element; 45 46 /** 47 * 48 * @author Andrew Hopkinson (Oracle A-Team) 49 */ 50 public interface PofConfigComponentFactory { 51 52 public PofConfigComponent createComponent( Element element, PofConfigComponent context); 53 54 public PofConfig createPofConfig(); 55 public UserTypeList createUserTypeList(); 56 public UserType createUserType(); 57 public Include createInclude(); 58 public TypeId createTypeId(); 59 public ClassName createClassName(); 60 public SerializerType createSerializerType(); 61 public Serializer createSerializer(); 62 public DefaultSerializer createDefaultSerializer(); 63 public InitParams createInitParams(); 64 public InitParam createInitParam(); 65 public ParamType createParamType(); 66 public ParamValue createParamValue(); 67 public AllowInterfaces createAllowInterfaces(); 68 public AllowSubclasses createAllowSubclasses(); 69 } 70 71
PofConfigComponentFactoryImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import org.netbeans.modules.coherence.xml.pof.AllowInterfaces; 45 import org.netbeans.modules.coherence.xml.pof.AllowSubclasses; 46 import org.netbeans.modules.coherence.xml.pof.ClassName; 47 import org.netbeans.modules.coherence.xml.pof.DefaultSerializer; 48 import org.netbeans.modules.coherence.xml.pof.Include; 49 import org.netbeans.modules.coherence.xml.pof.InitParam; 50 import org.netbeans.modules.coherence.xml.pof.InitParams; 51 import org.netbeans.modules.coherence.xml.pof.ParamType; 52 import org.netbeans.modules.coherence.xml.pof.ParamValue; 53 import org.netbeans.modules.coherence.xml.pof.PofConfig; 54 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 55 import org.netbeans.modules.coherence.xml.pof.PofConfigComponentFactory; 56 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 57 import org.netbeans.modules.coherence.xml.pof.Serializer; 58 import org.netbeans.modules.coherence.xml.pof.SerializerType; 59 import org.netbeans.modules.coherence.xml.pof.TypeId; 60 import org.netbeans.modules.coherence.xml.pof.UserType; 61 import org.netbeans.modules.coherence.xml.pof.UserTypeList; 62 import org.w3c.dom.Element; 63 64 /** 65 * 66 * @author Andrew Hopkinson (Oracle A-Team) 67 */ 68 public class PofConfigComponentFactoryImpl implements PofConfigComponentFactory { 69 70 private PofConfigModelImpl myModel; 71 private ThreadLocal<PofConfigVisitorImpl> myBuilder; 72 73 PofConfigComponentFactoryImpl(PofConfigModelImpl model) { 74 myModel = model; 75 myBuilder = new ThreadLocal<PofConfigVisitorImpl>(); 76 } 77 78 @Override 79 public PofConfigComponent createComponent(Element element, PofConfigComponent context) { 80 PofConfigVisitorImpl visitor = getVisitor(); 81 return visitor.create(context, element); 82 } 83 84 @Override 85 public PofConfig createPofConfig() { 86 return new PofConfigImpl(getModel()); 87 } 88 89 @Override 90 public UserTypeList createUserTypeList() { 91 return new UserTypeListImpl(getModel()); 92 } 93 94 @Override 95 public UserType createUserType() { 96 return new UserTypeImpl(getModel()); 97 } 98 99 @Override 100 public Include createInclude() { 101 return new IncludeImpl(getModel()); 102 } 103 104 @Override 105 public TypeId createTypeId() { 106 return new TypeIdImpl(getModel()); 107 } 108 109 @Override 110 public ClassName createClassName() { 111 return new ClassNameImpl(getModel()); 112 } 113 114 @Override 115 public SerializerType createSerializerType() { 116 return new SerializerTypeImpl(getModel()); 117 } 118 119 @Override 120 public Serializer createSerializer() { 121 return new SerializerImpl(getModel()); 122 } 123 124 @Override 125 public DefaultSerializer createDefaultSerializer() { 126 return new DefaultSerializerImpl(getModel()); 127 } 128 129 @Override 130 public InitParams createInitParams() { 131 return new InitParamsImpl(getModel()); 132 } 133 134 @Override 135 public InitParam createInitParam() { 136 return new InitParamImpl(getModel()); 137 } 138 139 @Override 140 public ParamType createParamType() { 141 return new ParamTypeImpl(getModel()); 142 } 143 144 @Override 145 public ParamValue createParamValue() { 146 return new ParamValueImpl(getModel()); 147 } 148 149 @Override 150 public AllowInterfaces createAllowInterfaces() { 151 return new AllowInterfacesImpl(getModel()); 152 } 153 154 @Override 155 public AllowSubclasses createAllowSubclasses() { 156 return new AllowSubclassesImpl(getModel()); 157 } 158 159 public PofConfigVisitorImpl getVisitor() { 160 PofConfigVisitorImpl visitor = myBuilder.get(); 161 if (visitor == null) { 162 visitor = new PofConfigVisitorImpl(getModel()); 163 myBuilder.set(visitor); 164 } 165 visitor.init(); 166 167 return visitor; 168 } 169 170 public PofConfigModelImpl getModel() { 171 return myModel; 172 } 173 174 } 175 176
PofConfigModel, PofConfigModelImpl & PofConfigModelFactory
The PofConfigModel extends the standard "org.netbeans.modules.xml.xam.dom.AbstractDocumentModel" for the <PofConfigComponent> class and provides implementations for the required Methods. This provides the Core Model representation of the XSD based around the Classes we have built. The Factory class provides the methods for creating the PofConfigModel based on the ModelSource identified as the a NetBeans FileObject. Once the Model representation has been created the Impl class will all the user the retrieve and create components (Elements) and also access the component updater which will keep the model in sync.PofConfigModel
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 import org.netbeans.modules.xml.xam.dom.DocumentModel; 45 46 /** 47 * 48 * @author Andrew Hopkinson (Oracle A-Team) 49 */ 50 public interface PofConfigModel extends DocumentModel<PofConfigComponent> { 51 52 public PofConfig getPofConfig(); 53 54 public PofConfigComponentFactory getFactory(); 55 } 56 57
PofConfigModelImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import org.netbeans.modules.coherence.xml.pof.PofConfig; 45 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 46 import org.netbeans.modules.coherence.xml.pof.PofConfigComponentFactory; 47 import org.netbeans.modules.coherence.xml.pof.PofConfigModel; 48 import org.netbeans.modules.xml.xam.ComponentUpdater; 49 import org.netbeans.modules.xml.xam.ModelSource; 50 import org.netbeans.modules.xml.xam.dom.AbstractDocumentModel; 51 import org.w3c.dom.Element; 52 53 /** 54 * 55 * @author Andrew Hopkinson (Oracle A-Team) 56 */ 57 public class PofConfigModelImpl extends AbstractDocumentModel<PofConfigComponent> implements PofConfigModel { 58 59 private PofConfigImpl myRoot; 60 private PofConfigComponentFactoryImpl myFactory; 61 private SyncUpdateVisitor mySyncUpdateVisitor; 62 63 public PofConfigModelImpl(ModelSource source) { 64 super(source); 65 myFactory = new PofConfigComponentFactoryImpl(this); 66 } 67 68 @Override 69 public PofConfigComponent createRootComponent(Element element) { 70 PofConfigImpl poc = (PofConfigImpl)getFactory().createComponent(element, null); 71 72 if (poc != null) myRoot = poc; 73 else return null; 74 75 return getPofConfig(); 76 } 77 78 @Override 79 protected ComponentUpdater<PofConfigComponent> getComponentUpdater() { 80 if (mySyncUpdateVisitor == null) mySyncUpdateVisitor = new SyncUpdateVisitor(); 81 return mySyncUpdateVisitor; 82 } 83 84 @Override 85 public PofConfigComponent getRootComponent() { 86 return myRoot; 87 } 88 89 @Override 90 public PofConfigComponent createComponent(PofConfigComponent parent, Element element) { 91 return getFactory().createComponent(element, parent); 92 } 93 94 @Override 95 public PofConfig getPofConfig() { 96 return (PofConfig)getRootComponent(); 97 } 98 99 @Override 100 public PofConfigComponentFactory getFactory() { 101 return myFactory; 102 } 103 } 104 105
PofConfigModelFactory
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 import org.netbeans.modules.coherence.xml.pof.impl.PofConfigModelImpl; 45 import org.netbeans.modules.xml.xam.AbstractModelFactory; 46 import org.netbeans.modules.xml.xam.ModelSource; 47 48 /** 49 * 50 * @author Andrew Hopkinson (Oracle A-Team) 51 */ 52 public class PofConfigModelFactory extends AbstractModelFactory<PofConfigModel> { 53 54 private final static PofConfigModelFactory instance = new PofConfigModelFactory(); 55 56 public static PofConfigModelFactory getInstance() { 57 return instance; 58 } 59 60 @Override 61 public PofConfigModel createModel(ModelSource ms) { 62 return new PofConfigModelImpl(ms); 63 } 64 65 @Override 66 public synchronized PofConfigModel getModel(ModelSource source) { 67 return (PofConfigModel) super.getModel(source); 68 } 69 } 70 71
PofConfigVisitor & PofConfigVisitorImpl
The XAM / XDM Model structure implements the Visitor Pattern for all XML Processing and as such the PofConfigVisitor and its associated Impl are implementations of the required Interface and Class. As such it can be seen that a visit method is defined for each of the XSD Element Interface definitions.PofConfigVisitor
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 /** 45 * 46 * @author Andrew Hopkinson (Oracle A-Team) 47 */ 48 public interface PofConfigVisitor { 49 50 // PofConfig Top Level 51 void visit(PofConfig pofConfig); 52 53 void visit(AllowInterfaces allowInterfaces); 54 void visit(AllowSubclasses allowSubclasses); 55 void visit(ClassName className); 56 void visit(DefaultSerializer defaultSerializer); 57 void visit(Include include); 58 void visit(InitParam initParam); 59 void visit(InitParams initParams); 60 void visit(ParamType paramType); 61 void visit(ParamValue paramValue); 62 void visit(Serializer serializer); 63 void visit(SerializerType serializerType); 64 void visit(TypeId typeId); 65 void visit(UserType userType); 66 void visit(UserTypeList userTypeList); 67 } 68 69
PofConfigVisitorImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import javax.xml.namespace.QName; 45 import org.netbeans.modules.coherence.xml.pof.AllowInterfaces; 46 import org.netbeans.modules.coherence.xml.pof.AllowSubclasses; 47 import org.netbeans.modules.coherence.xml.pof.ClassName; 48 import org.netbeans.modules.coherence.xml.pof.DefaultSerializer; 49 import org.netbeans.modules.coherence.xml.pof.Include; 50 import org.netbeans.modules.coherence.xml.pof.InitParam; 51 import org.netbeans.modules.coherence.xml.pof.InitParams; 52 import org.netbeans.modules.coherence.xml.pof.ParamType; 53 import org.netbeans.modules.coherence.xml.pof.ParamValue; 54 import org.netbeans.modules.coherence.xml.pof.PofConfig; 55 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 56 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 57 import org.netbeans.modules.coherence.xml.pof.Serializer; 58 import org.netbeans.modules.coherence.xml.pof.SerializerType; 59 import org.netbeans.modules.coherence.xml.pof.TypeId; 60 import org.netbeans.modules.coherence.xml.pof.UserType; 61 import org.netbeans.modules.coherence.xml.pof.UserTypeList; 62 import org.netbeans.modules.xml.xam.dom.AbstractDocumentComponent; 63 import org.w3c.dom.Element; 64 65 /** 66 * 67 * @author Andrew Hopkinson (Oracle A-Team) 68 */ 69 public class PofConfigVisitorImpl implements PofConfigVisitor { 70 71 private PofConfigComponent myResult; 72 private Element myElement; 73 private PofConfigModelImpl myModel; 74 75 private PofConfigModelImpl getModel() { 76 return myModel; 77 } 78 79 private Element getElement() { 80 return myElement; 81 } 82 83 private String getLocalName() { 84 return getElement().getLocalName(); 85 } 86 87 public void setResult(PofConfigComponent myResult) { 88 this.myResult = myResult; 89 } 90 91 private boolean isOk(PofConfigElements elements) { 92 return elements.getName().equals(getLocalName()); 93 } 94 95 public PofConfigVisitorImpl(PofConfigModelImpl model) { 96 myModel = model; 97 } 98 99 public void init() { 100 myResult = null; 101 myElement = null; 102 } 103 104 PofConfigComponent create(PofConfigComponent context, Element element) { 105 QName qName = AbstractDocumentComponent.getQName(element); 106 if (!PofConfigComponent.NAMESPACE.equals(qName.getNamespaceURI())) { 107 return null; 108 } 109 if (context == null) { 110 return new PofConfigImpl(getModel(), element); 111 } else { 112 myElement = element; 113 context.accept(this); 114 } 115 return myResult; 116 } 117 118 @Override 119 public void visit(PofConfig pofConfig) { 120 if (isOk(PofConfigElements.ALLOWINTERFACES)) setResult(new AllowInterfacesImpl(getModel(), getElement())); 121 else if (isOk(PofConfigElements.ALLOWSUBCLASSES)) setResult(new AllowSubclassesImpl(getModel(), getElement())); 122 else if (isOk(PofConfigElements.USERTYPELIST)) setResult(new UserTypeListImpl(getModel(), getElement())); 123 else if (isOk(PofConfigElements.DEFAULTSERIALIZER)) setResult(new DefaultSerializerImpl(getModel(), getElement())); 124 } 125 126 @Override 127 public void visit(AllowInterfaces allowInterfaces) { 128 } 129 130 @Override 131 public void visit(AllowSubclasses allowSubclasses) { 132 } 133 134 @Override 135 public void visit(ClassName className) { 136 } 137 138 @Override 139 public void visit(DefaultSerializer defaultSerializer) { 140 visit((SerializerType)defaultSerializer); 141 } 142 143 @Override 144 public void visit(Include include) { 145 } 146 147 @Override 148 public void visit(InitParam initParam) { 149 if (isOk(PofConfigElements.PARAMTYPE)) setResult(new ParamTypeImpl(getModel(), getElement())); 150 else if (isOk(PofConfigElements.PARAMVALUE)) setResult(new ParamValueImpl(getModel(), getElement())); 151 } 152 153 @Override 154 public void visit(InitParams initParams) { 155 if (isOk(PofConfigElements.INITPARAM)) setResult(new InitParamImpl(getModel(), getElement())); 156 } 157 158 @Override 159 public void visit(ParamType paramType) { 160 } 161 162 @Override 163 public void visit(ParamValue paramValue) { 164 } 165 166 @Override 167 public void visit(Serializer serializer) { 168 visit((SerializerType)serializer); 169 } 170 171 @Override 172 public void visit(SerializerType serializerType) { 173 if (isOk(PofConfigElements.CLASSNAME)) setResult(new ClassNameImpl(getModel(), getElement())); 174 else if (isOk(PofConfigElements.INITPARAMS)) setResult(new InitParamsImpl(getModel(), getElement())); 175 } 176 177 @Override 178 public void visit(TypeId typeId) { 179 } 180 181 @Override 182 public void visit(UserType userType) { 183 if (isOk(PofConfigElements.TYPEID)) setResult(new TypeIdImpl(getModel(), getElement())); 184 else if (isOk(PofConfigElements.CLASSNAME)) setResult(new ClassNameImpl(getModel(), getElement())); 185 else if (isOk(PofConfigElements.SERIALIZER)) setResult(new SerializerImpl(getModel(), getElement())); 186 } 187 188 @Override 189 public void visit(UserTypeList userTypeList) { 190 if (isOk(PofConfigElements.USERTYPE)) setResult(new UserTypeImpl(getModel(), getElement())); 191 else if (isOk(PofConfigElements.INCLUDE)) setResult(new IncludeImpl(getModel(), getElement())); 192 } 193 194 } 195 196
SyncUpdateVisitor
Used to Synchronise DocumentObject and Model. It can be seen from the code that this Visitor also contains a set of visit methods, one for each Emelement, and that each of them execute roughly the same functionality. Firstly they test the the Parent is the correct Element / Component and then check to see if we are Adding or Deleting. If Adding the we set the appropriate component to the value passed whilst if deleting we simply pass null which will be taken by the implementing class to mean delete. The exception to this are the UserType and Include which are sub elements of the UserTypeList which has a repeating Choice element and as such we created the additional UserTypeListElement Interface. Therefore the UserType and Include visit methods call a common visitUserTypeListElement.SyncUpdateVisitor
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import org.netbeans.modules.coherence.xml.pof.AllowInterfaces; 45 import org.netbeans.modules.coherence.xml.pof.AllowSubclasses; 46 import org.netbeans.modules.coherence.xml.pof.ClassName; 47 import org.netbeans.modules.coherence.xml.pof.DefaultSerializer; 48 import org.netbeans.modules.coherence.xml.pof.Include; 49 import org.netbeans.modules.coherence.xml.pof.InitParam; 50 import org.netbeans.modules.coherence.xml.pof.InitParams; 51 import org.netbeans.modules.coherence.xml.pof.ParamType; 52 import org.netbeans.modules.coherence.xml.pof.ParamValue; 53 import org.netbeans.modules.coherence.xml.pof.PofConfig; 54 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 55 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 56 import org.netbeans.modules.coherence.xml.pof.Serializer; 57 import org.netbeans.modules.coherence.xml.pof.SerializerType; 58 import org.netbeans.modules.coherence.xml.pof.TypeId; 59 import org.netbeans.modules.coherence.xml.pof.UserType; 60 import org.netbeans.modules.coherence.xml.pof.UserTypeList; 61 import org.netbeans.modules.coherence.xml.pof.UserTypeListElement; 62 import org.netbeans.modules.xml.xam.ComponentUpdater; 63 import org.netbeans.modules.xml.xam.ComponentUpdater.Operation; 64 65 /** 66 * 67 * @author Andrew Hopkinson (Oracle A-Team) 68 */ 69 public class SyncUpdateVisitor implements ComponentUpdater<PofConfigComponent>, PofConfigVisitor { 70 71 private PofConfigComponent myParent; 72 private int myIndex; 73 private Operation myOperation; 74 75 public Operation getOperation() { 76 return myOperation; 77 } 78 79 public int getIndex() { 80 return myIndex; 81 } 82 83 public PofConfigComponent getParent() { 84 return myParent; 85 } 86 87 private boolean isAdd() { 88 return getOperation() == Operation.ADD; 89 } 90 91 private boolean isRemove() { 92 return getOperation() == Operation.REMOVE; 93 } 94 95 @Override 96 public void update(PofConfigComponent target, PofConfigComponent child, Operation operation) { 97 update(target, child, -1, operation); 98 } 99 100 @Override 101 public void update(PofConfigComponent target, PofConfigComponent child, int index, Operation operation) { 102 if (target != null && child != null 103 && (operation == null || operation == Operation.ADD || operation == Operation.REMOVE)) { 104 myIndex = index; 105 myOperation = operation; 106 myParent = target; 107 child.accept(this); 108 } 109 } 110 111 @Override 112 public void visit(PofConfig pofConfig) { 113 throw new UnsupportedOperationException("Not supported yet."); 114 } 115 116 @Override 117 public void visit(AllowInterfaces element) { 118 if (getParent() instanceof PofConfig) { 119 PofConfig parent = (PofConfig) getParent(); 120 if (isAdd()) { 121 parent.setAllowInterfaces(element); 122 } else if (isRemove()) { 123 parent.setAllowInterfaces(null); 124 } 125 } 126 } 127 128 @Override 129 public void visit(AllowSubclasses element) { 130 if (getParent() instanceof PofConfig) { 131 PofConfig parent = (PofConfig) getParent(); 132 if (isAdd()) { 133 parent.setAllowSubclasses(element); 134 } else if (isRemove()) { 135 parent.setAllowSubclasses(null); 136 } 137 } 138 } 139 140 @Override 141 public void visit(ClassName element) { 142 if (getParent() instanceof SerializerType) { 143 SerializerType parent = (SerializerType) getParent(); 144 if (isAdd()) { 145 parent.setClassName(element); 146 } else if (isRemove()) { 147 parent.setClassName(null); 148 } 149 } else if (getParent() instanceof UserType) { 150 UserType parent = (UserType) getParent(); 151 if (isAdd()) { 152 parent.setClassName(element); 153 } else if (isRemove()) { 154 parent.setClassName(null); 155 } 156 } 157 158 } 159 160 @Override 161 public void visit(DefaultSerializer element) { 162 if (getParent() instanceof PofConfig) { 163 PofConfig parent = (PofConfig) getParent(); 164 if (isAdd()) { 165 parent.setDefaultSerializer(element); 166 } else if (isRemove()) { 167 parent.setDefaultSerializer(null); 168 } 169 } 170 } 171 172 @Override 173 public void visit(Include include) { 174 visitUserTypeListElement(include); 175 } 176 177 @Override 178 public void visit(InitParam element) { 179 if (getParent() instanceof InitParams) { 180 InitParams parent = (InitParams) getParent(); 181 if (isAdd()) { 182 parent.addInitParam(getIndex(), element); 183 } else if (isRemove()) { 184 parent.removeInitParam(element); 185 } 186 } 187 } 188 189 @Override 190 public void visit(InitParams element) { 191 if (getParent() instanceof SerializerType) { 192 SerializerType parent = (SerializerType) getParent(); 193 if (isAdd()) { 194 parent.setInitParams(element); 195 } else if (isRemove()) { 196 parent.setInitParams(null); 197 } 198 } 199 } 200 201 @Override 202 public void visit(ParamType element) { 203 if (getParent() instanceof InitParam) { 204 InitParam parent = (InitParam) getParent(); 205 if (isAdd()) { 206 parent.setParamType(element); 207 } else if (isRemove()) { 208 parent.setParamType(null); 209 } 210 } 211 } 212 213 @Override 214 public void visit(ParamValue element) { 215 if (getParent() instanceof InitParam) { 216 InitParam parent = (InitParam) getParent(); 217 if (isAdd()) { 218 parent.setParamValue(element); 219 } else if (isRemove()) { 220 parent.setParamValue(null); 221 } 222 } 223 } 224 225 @Override 226 public void visit(Serializer element) { 227 if (getParent() instanceof UserType) { 228 UserType parent = (UserType) getParent(); 229 if (isAdd()) { 230 parent.setSerializer(element); 231 } else if (isRemove()) { 232 parent.setSerializer(null); 233 } 234 } 235 } 236 237 @Override 238 public void visit(SerializerType serializerType) { 239 throw new UnsupportedOperationException("Not supported yet."); 240 } 241 242 @Override 243 public void visit(TypeId element) { 244 if (getParent() instanceof UserType) { 245 UserType parent = (UserType) getParent(); 246 if (isAdd()) { 247 parent.setTypeId(element); 248 } else if (isRemove()) { 249 parent.setTypeId(null); 250 } 251 } 252 } 253 254 @Override 255 public void visit(UserType userType) { 256 visitUserTypeListElement(userType); 257 } 258 259 @Override 260 public void visit(UserTypeList element) { 261 if (getParent() instanceof PofConfig) { 262 PofConfig parent = (PofConfig) getParent(); 263 if (isAdd()) { 264 parent.setUserTypeList(element); 265 } else if (isRemove()) { 266 parent.setUserTypeList(null); 267 } 268 } 269 } 270 271 private void visitUserTypeListElement(UserTypeListElement element) { 272 try { 273 if (getParent() instanceof UserTypeList) { 274 UserTypeList parent = (UserTypeList) getParent(); 275 if (isAdd()) { 276 parent.addElement(getIndex(), element); 277 } else if (isRemove()) { 278 parent.removeElement(element); 279 } 280 } 281 } catch (Exception e) { 282 } 283 } 284 } 285 286
PofConfigComponent & PofConfigComponentImpl
This Interface and its associated Abstract Class Implementation
are the common underlying PofConfig Component. They contain a
number of key methods and constants that allow all inheriting
components to access the Namespace, for the XML, and Model. In
addition they mandate that all inheriting classes implement a
getTagName that will be used by the common
PofConfigTextComponent etc to set the value of the Element.PofConfigComponent
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof; 43 44 import org.netbeans.modules.xml.xam.dom.DocumentComponent; 45 46 /** 47 * 48 * @author Andrew Hopkinson (Oracle A-Team) 49 */ 50 public interface PofConfigComponent extends DocumentComponent<PofConfigComponent> { 51 52 public String NAMESPACE = "http://xmlns.oracle.com/coherence/coherence-pof-config"; 53 54 public String getTagName(); 55 56 public PofConfigModel getModel(); 57 58 public Class<? extends PofConfigComponent> getComponentType(); 59 60 public void accept(PofConfigVisitor visitor); 61 } 62 63
PofConfigComponentImpl
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2011 Oracle and/or its affiliates. All rights reserved. 5 * 6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates. 7 * Other names may be trademarks of their respective owners. 8 * 9 * The contents of this file are subject to the terms of either the GNU 10 * General Public License Version 2 only ("GPL") or the Common 11 * Development and Distribution License("CDDL") (collectively, the 12 * "License"). You may not use this file except in compliance with the 13 * License. You can obtain a copy of the License at 14 * http://www.netbeans.org/cddl-gplv2.html 15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the 16 * specific language governing permissions and limitations under the 17 * License. When distributing the software, include this License Header 18 * Notice in each file and include the License file at 19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this 20 * particular file as subject to the "Classpath" exception as provided 21 * by Oracle in the GPL Version 2 section of the License file that 22 * accompanied this code. If applicable, add the following below the 23 * License Header, with the fields enclosed by brackets [] replaced by 24 * your own identifying information: 25 * "Portions Copyrighted [year] [name of copyright owner]" 26 * 27 * If you wish your version of this file to be governed by only the CDDL 28 * or only the GPL Version 2, indicate your decision by adding 29 * "[Contributor] elects to include this software in this distribution 30 * under the [CDDL or GPL Version 2] license." If you do not indicate a 31 * single choice of license, a recipient has the option to distribute 32 * your version of this file under either the CDDL, the GPL Version 2 or 33 * to extend the choice of license to its licensees as provided above. 34 * However, if you add GPL Version 2 code and therefore, elected the GPL 35 * Version 2 license, then the option applies only if the new code is 36 * made subject to such option by the copyright holder. 37 * 38 * Contributor(s): 39 * 40 * Portions Copyrighted 2011 Sun Microsystems, Inc. 41 */ 42 package org.netbeans.modules.coherence.xml.pof.impl; 43 44 import java.util.List; 45 import org.netbeans.modules.coherence.xml.pof.PofConfigComponent; 46 import org.netbeans.modules.coherence.xml.pof.PofConfigModel; 47 import org.netbeans.modules.coherence.xml.pof.PofConfigVisitor; 48 import org.netbeans.modules.xml.xam.dom.AbstractDocumentComponent; 49 import org.netbeans.modules.xml.xam.dom.Attribute; 50 import org.w3c.dom.Element; 51 import org.w3c.dom.Node; 52 import org.w3c.dom.NodeList; 53 54 /** 55 * 56 * @author Andrew Hopkinson (Oracle A-Team) 57 */ 58 public abstract class PofConfigComponentImpl extends AbstractDocumentComponent<PofConfigComponent> implements PofConfigComponent { 59 60 public PofConfigComponentImpl(PofConfigModelImpl model, Element e) { 61 super(model, e); 62 } 63 64 @Override 65 protected void populateChildren(List<PofConfigComponent> children) { 66 NodeList nl = getPeer().getChildNodes(); 67 if (nl != null) { 68 for (int i = 0; i < nl.getLength(); i++) { 69 Node n = nl.item(i); 70 if (n instanceof Element) { 71 PofConfigComponent comp = (PofConfigComponent) getModel().getFactory().createComponent((Element) n, this); 72 if (comp != null) { 73 children.add(comp); 74 } 75 } 76 } 77 } 78 } 79 80 @Override 81 protected Object getAttributeValueOf(Attribute atrbt, String string) { 82 return null; 83 } 84 85 @Override 86 public PofConfigModelImpl getModel() { 87 return (PofConfigModelImpl)super.getModel(); 88 } 89 90 protected static Element createNewElement(String name, PofConfigModelImpl model){ 91 return model.getDocument().createElementNS( NAMESPACE, name ); 92 } 93 94 } 95 96
No comments:
Post a Comment