001//
002// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-2 
003// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
004// Any modifications to this file will be lost upon recompilation of the source schema. 
005// Generated on: 2016.11.01 at 03:16:38 AM CET 
006//
007
008
009package org.jomc.model;
010
011import java.util.ArrayList;
012import java.util.Iterator;
013import java.util.List;
014import javax.annotation.Generated;
015import javax.xml.bind.annotation.XmlAccessType;
016import javax.xml.bind.annotation.XmlAccessorType;
017import javax.xml.bind.annotation.XmlElement;
018import javax.xml.bind.annotation.XmlType;
019
020
021/**
022 * List of implementations.
023 * 
024 * <p>Java class for Implementations complex type.
025 * 
026 * <p>The following schema fragment specifies the expected content contained within this class.
027 * 
028 * <pre>
029 * &lt;complexType name="Implementations">
030 *   &lt;complexContent>
031 *     &lt;extension base="{http://jomc.org/model}ModelObject">
032 *       &lt;sequence>
033 *         &lt;element ref="{http://jomc.org/model}implementation" maxOccurs="unbounded" minOccurs="0"/>
034 *         &lt;element name="reference" type="{http://jomc.org/model}ImplementationReference" maxOccurs="unbounded" minOccurs="0"/>
035 *       &lt;/sequence>
036 *     &lt;/extension>
037 *   &lt;/complexContent>
038 * &lt;/complexType>
039 * </pre>
040 * 
041 * 
042 */
043@XmlAccessorType(XmlAccessType.FIELD)
044@XmlType(name = "Implementations", namespace = "http://jomc.org/model", propOrder = {
045    "implementation",
046    "reference"
047})
048@Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
049public class Implementations
050    extends ModelObject
051    implements Cloneable
052{
053
054    @XmlElement(namespace = "http://jomc.org/model")
055    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
056    protected List<Implementation> implementation;
057    @XmlElement(namespace = "http://jomc.org/model")
058    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
059    protected List<ImplementationReference> reference;
060
061    /**
062     * Creates a new {@code Implementations} instance.
063     * 
064     */
065    public Implementations() {
066        // CC-XJC Version 2.0.1 Build 2012-03-02T12:09:12+0000
067        super();
068    }
069
070    /**
071     * Creates a new {@code Implementations} instance by deeply copying a given {@code Implementations} instance.
072     * 
073     * 
074     * @param o
075     *     The instance to copy.
076     * @throws NullPointerException
077     *     if {@code o} is {@code null}.
078     */
079    public Implementations(final Implementations o) {
080        // CC-XJC Version 2.0.1 Build 2012-03-02T12:09:12+0000
081        super(o);
082        if (o == null) {
083            throw new NullPointerException("Cannot create a copy of 'Implementations' from 'null'.");
084        }
085        // 'Implementation' collection.
086        if (o.implementation!= null) {
087            copyImplementation(o.getImplementation(), this.getImplementation());
088        }
089        // 'Reference' collection.
090        if (o.reference!= null) {
091            copyReference(o.getReference(), this.getReference());
092        }
093    }
094
095    /**
096     * Gets the value of the implementation property.
097     * 
098     * <p>
099     * This accessor method returns a reference to the live list,
100     * not a snapshot. Therefore any modification you make to the
101     * returned list will be present inside the JAXB object.
102     * This is why there is not a <CODE>set</CODE> method for the implementation property.
103     * 
104     * <p>
105     * For example, to add a new item, do as follows:
106     * <pre>
107     *    getImplementation().add(newItem);
108     * </pre>
109     * 
110     * 
111     * <p>
112     * Objects of the following type(s) are allowed in the list
113     * {@link Implementation }
114     * 
115     * 
116     */
117    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
118    public List<Implementation> getImplementation() {
119        if (implementation == null) {
120            implementation = new ArrayList<Implementation>();
121        }
122        return this.implementation;
123    }
124
125    /**
126     * Gets the value of the reference property.
127     * 
128     * <p>
129     * This accessor method returns a reference to the live list,
130     * not a snapshot. Therefore any modification you make to the
131     * returned list will be present inside the JAXB object.
132     * This is why there is not a <CODE>set</CODE> method for the reference property.
133     * 
134     * <p>
135     * For example, to add a new item, do as follows:
136     * <pre>
137     *    getReference().add(newItem);
138     * </pre>
139     * 
140     * 
141     * <p>
142     * Objects of the following type(s) are allowed in the list
143     * {@link ImplementationReference }
144     * 
145     * 
146     */
147    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
148    public List<ImplementationReference> getReference() {
149        if (reference == null) {
150            reference = new ArrayList<ImplementationReference>();
151        }
152        return this.reference;
153    }
154
155    /**
156     * Copies all values of property {@code Implementation} deeply.
157     * 
158     * @param source
159     *     The source to copy from.
160     * @param target
161     *     The target to copy {@code source} to.
162     * @throws NullPointerException
163     *     if {@code target} is {@code null}.
164     */
165    @SuppressWarnings("unchecked")
166    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
167    private static void copyImplementation(final List<Implementation> source, final List<Implementation> target) {
168        // CC-XJC Version 2.0.1 Build 2012-03-02T12:09:12+0000
169        if ((source!= null)&&(!source.isEmpty())) {
170            for (final Iterator<?> it = source.iterator(); it.hasNext(); ) {
171                final Object next = it.next();
172                if (next instanceof Implementation) {
173                    // CClassInfo: org.jomc.model.Implementation
174                    target.add(((Implementation) next).clone());
175                    continue;
176                }
177                // Please report this at https://apps.sourceforge.net/mantisbt/ccxjc/
178                throw new AssertionError((("Unexpected instance '"+ next)+"' for property 'Implementation' of class 'org.jomc.model.Implementations'."));
179            }
180        }
181    }
182
183    /**
184     * Copies all values of property {@code Reference} deeply.
185     * 
186     * @param source
187     *     The source to copy from.
188     * @param target
189     *     The target to copy {@code source} to.
190     * @throws NullPointerException
191     *     if {@code target} is {@code null}.
192     */
193    @SuppressWarnings("unchecked")
194    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
195    private static void copyReference(final List<ImplementationReference> source, final List<ImplementationReference> target) {
196        // CC-XJC Version 2.0.1 Build 2012-03-02T12:09:12+0000
197        if ((source!= null)&&(!source.isEmpty())) {
198            for (final Iterator<?> it = source.iterator(); it.hasNext(); ) {
199                final Object next = it.next();
200                if (next instanceof ImplementationReference) {
201                    // CClassInfo: org.jomc.model.ImplementationReference
202                    target.add(((ImplementationReference) next).clone());
203                    continue;
204                }
205                // Please report this at https://apps.sourceforge.net/mantisbt/ccxjc/
206                throw new AssertionError((("Unexpected instance '"+ next)+"' for property 'Reference' of class 'org.jomc.model.Implementations'."));
207            }
208        }
209    }
210
211    /**
212     * Creates and returns a deep copy of this object.
213     * 
214     * 
215     * @return
216     *     A deep copy of this object.
217     */
218    @Override
219    @Generated(value = "com.sun.tools.xjc.Driver", date = "2016-11-01T03:16:37+01:00", comments = "JAXB RI vhudson-jaxb-ri-2.1-2")
220    public Implementations clone() {
221        {
222            // CC-XJC Version 2.0.1 Build 2012-03-02T12:09:12+0000
223            final Implementations clone = ((Implementations) super.clone());
224            // 'Implementation' collection.
225            if (this.implementation!= null) {
226                clone.implementation = null;
227                copyImplementation(this.getImplementation(), clone.getImplementation());
228            }
229            // 'Reference' collection.
230            if (this.reference!= null) {
231                clone.reference = null;
232                copyReference(this.getReference(), clone.getReference());
233            }
234            return clone;
235        }
236    }
237    
238    /**
239     * Gets an implementation for a given identifier from the list of implementations.
240     *
241     * @param implementation The identifier of the implementation to return.
242     *
243     * @return The first matching implementation or {@code null}, if no such implementation is found.
244     *
245     * @throws NullPointerException if {@code implementation} is {@code null}.
246     *
247     * @see #getImplementation()
248     * @see Implementation#getIdentifier()
249     */
250    public Implementation getImplementation( final String implementation )
251    {
252        if ( implementation == null )
253        {
254            throw new NullPointerException( "implementation" );
255        }
256
257        for ( int i = 0, s0 = this.getImplementation().size(); i < s0; i++ )
258        {
259            final Implementation current = this.getImplementation().get( i );
260
261            if ( implementation.equals( current.getIdentifier() ) )
262            {
263                return current;
264            }
265        }
266
267        return null;
268    }
269
270    /**
271     * Gets an implementation for a given class from the list of implementations.
272     *
273     * @param implementation The class of the implementation to return.
274     *
275     * @return The first matching implementation declaring {@code implementation} or {@code null}, if no such
276     * implementation is found.
277     *
278     * @throws NullPointerException if {@code implementation} is {@code null}.
279     * @throws ModelObjectException if compiling the name of a referenced type to a {@code JavaTypeName} fails.
280     *
281     * @see #getImplementation()
282     * @see Implementation#isClassDeclaration()
283     * @see Implementation#getClazz()
284     */
285    public Implementation getImplementation( final Class<?> implementation ) throws ModelObjectException
286    {
287        if ( implementation == null )
288        {
289            throw new NullPointerException( "implementation" );
290        }
291
292        for ( int i = 0, s0 = this.getImplementation().size(); i < s0; i++ )
293        {
294            final Implementation current = this.getImplementation().get( i );
295
296            if ( current.isClassDeclaration() && current.getClazz() != null )
297            {
298                if ( implementation.getName().equals( current.getJavaTypeName().getClassName() ) )
299                {
300                    return current;
301                }
302            }
303        }
304
305        return null;
306    }
307
308    /**
309     * Gets an implementation for a given name from the list of implementations.
310     *
311     * @param name The name of the implementation to return.
312     *
313     * @return The first matching implementation or {@code null}, if no such implementation is found.
314     *
315     * @throws NullPointerException if {@code name} is {@code null}.
316     *
317     * @see #getImplementation()
318     * @see Implementation#getName()
319     */
320    public Implementation getImplementationByName( final String name )
321    {
322        if ( name == null )
323        {
324            throw new NullPointerException( "name" );
325        }
326
327        for ( int i = 0, s0 = this.getImplementation().size(); i < s0; i++ )
328        {
329            final Implementation current = this.getImplementation().get( i );
330
331            if ( name.equals( current.getName() ) )
332            {
333                return current;
334            }
335        }
336
337        return null;
338    }
339
340    /**
341     * Gets an implementation reference for a given identifier from the list of references.
342     *
343     * @param implementation The identifier of the reference to return.
344     *
345     * @return The first matching implementation reference or {@code null}, if no such reference is found.
346     *
347     * @throws NullPointerException if {@code implementation} is {@code null}.
348     *
349     * @see #getReference()
350     * @see ImplementationReference#getIdentifier()
351     */
352    public ImplementationReference getReference( final String implementation )
353    {
354        if ( implementation == null )
355        {
356            throw new NullPointerException( "implementation" );
357        }
358
359        for ( int i = 0, s0 = this.getReference().size(); i < s0; i++ )
360        {
361            final ImplementationReference r = this.getReference().get( i );
362
363            if ( implementation.equals( r.getIdentifier() ) )
364            {
365                return r;
366            }
367        }
368
369        return null;
370    }
371      
372}