001    /*
002     * The MIT License
003     * Copyright (c) 2012 Microsoft Corporation
004     *
005     * Permission is hereby granted, free of charge, to any person obtaining a copy
006     * of this software and associated documentation files (the "Software"), to deal
007     * in the Software without restriction, including without limitation the rights
008     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
009     * copies of the Software, and to permit persons to whom the Software is
010     * furnished to do so, subject to the following conditions:
011     *
012     * The above copyright notice and this permission notice shall be included in
013     * all copies or substantial portions of the Software.
014     *
015     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
016     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
017     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
019     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
020     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
021     * THE SOFTWARE.
022     */
023    
024    package microsoft.exchange.webservices.data.property.definition;
025    
026    import microsoft.exchange.webservices.data.core.EwsUtilities;
027    import microsoft.exchange.webservices.data.core.service.ServiceObject;
028    import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
029    import microsoft.exchange.webservices.data.core.enumeration.property.PropertyDefinitionFlags;
030    import microsoft.exchange.webservices.data.property.complex.ComplexProperty;
031    import microsoft.exchange.webservices.data.property.complex.ICreateComplexPropertyDelegate;
032    import microsoft.exchange.webservices.data.property.complex.IOwnedProperty;
033    
034    import java.util.EnumSet;
035    
036    /**
037     * Represents base complex property type.
038     *
039     * @param <TComplexProperty> The type of the complex property.
040     */
041    public class ComplexPropertyDefinition<TComplexProperty extends ComplexProperty>
042        extends ComplexPropertyDefinitionBase {
043    
044      private Class<TComplexProperty> instance;
045      /**
046       * The property creation delegate.
047       */
048      private ICreateComplexPropertyDelegate<TComplexProperty> propertyCreationDelegate;
049    
050      /**
051       * Initializes a new instance.
052       *
053       * @param xmlElementName           Name of the XML element.
054       * @param flags                    The flags.
055       * @param version                  The version.
056       * @param propertyCreationDelegate Delegate used to create instances of ComplexProperty.
057       */
058      public ComplexPropertyDefinition(
059          Class<TComplexProperty> cls,
060          String xmlElementName,
061          EnumSet<PropertyDefinitionFlags> flags,
062          ExchangeVersion version,
063          ICreateComplexPropertyDelegate<TComplexProperty>
064              propertyCreationDelegate) {
065        super(xmlElementName, flags, version);
066        this.instance = cls;
067        EwsUtilities.ewsAssert(propertyCreationDelegate != null, "ComplexPropertyDefinition ctor",
068                               "CreateComplexPropertyDelegate cannot be null");
069    
070        this.propertyCreationDelegate = propertyCreationDelegate;
071      }
072    
073      /**
074       * Initializes a new instance.
075       *
076       * @param xmlElementName           Name of the XML element.
077       * @param uri                      The URI.
078       * @param version                  The version.
079       * @param propertyCreationDelegate Delegate used to create instances of ComplexProperty.
080       */
081      public ComplexPropertyDefinition(
082          Class<TComplexProperty> cls,
083          String xmlElementName,
084          String uri,
085          ExchangeVersion version,
086          ICreateComplexPropertyDelegate<TComplexProperty>
087              propertyCreationDelegate) {
088        super(xmlElementName, uri, version);
089        this.instance = cls;
090        this.propertyCreationDelegate = propertyCreationDelegate;
091      }
092    
093      public ComplexPropertyDefinition(String xmlElementName, String uri, ExchangeVersion version,
094          ICreateComplexPropertyDelegate<TComplexProperty> propertyCreationDelegate) {
095        super(xmlElementName, uri, version);
096        this.propertyCreationDelegate = propertyCreationDelegate;
097      }
098    
099      /**
100       * Instantiates a new complex property definition.
101       *
102       * @param xmlElementName           the xml element name
103       * @param uri                      the uri
104       * @param flags                    the flags
105       * @param version                  the version
106       * @param propertyCreationDelegate the property creation delegate
107       */
108      public ComplexPropertyDefinition(Class<TComplexProperty> cls, String xmlElementName, String uri,
109          EnumSet<PropertyDefinitionFlags> flags, ExchangeVersion version,
110          ICreateComplexPropertyDelegate<TComplexProperty> propertyCreationDelegate) {
111        super(xmlElementName, uri, flags, version);
112        this.instance = cls;
113        this.propertyCreationDelegate = propertyCreationDelegate;
114      }
115    
116    
117      /**
118       * Instantiates a new complex property definition.
119       *
120       * @param xmlElementName           the xml element name
121       * @param attachments              the attachments
122       * @param flags                    the flags
123       * @param version                  the version
124       * @param propertyCreationDelegate the property creation delegate
125       */
126      public ComplexPropertyDefinition(
127          String attachments,
128          String xmlElementName,
129          ExchangeVersion version,
130          EnumSet<PropertyDefinitionFlags> flags,
131          ICreateComplexPropertyDelegate<TComplexProperty> propertyCreationDelegate) {
132        // TODO Auto-generated constructor stub
133        super(xmlElementName, attachments, flags, version);
134        this.propertyCreationDelegate = propertyCreationDelegate;
135      }
136    
137      /**
138       * Creates the property instance.
139       *
140       * @param owner The owner.
141       * @return ComplexProperty instance.
142       */
143      @Override public ComplexProperty createPropertyInstance(ServiceObject owner) {
144        TComplexProperty complexProperty = this.propertyCreationDelegate
145            .createComplexProperty();
146        if (complexProperty instanceof IOwnedProperty) {
147          IOwnedProperty ownedProperty = (IOwnedProperty) complexProperty;
148          ownedProperty.setOwner(owner);
149        }
150        return complexProperty;
151      }
152    
153      /**
154       * Gets the property type.
155       */
156      @Override
157      public Class<TComplexProperty> getType() {
158                    /*ParameterizedType parameterizedType =
159                    (ParameterizedType) getClass().getGenericSuperclass();
160                 return (Class) parameterizedType.getActualTypeArguments()[0];
161    
162                     instance = ((Class)((ParameterizedType)this.getClass(). 
163                                   getGenericSuperclass()).getActualTypeArguments()[0]).
164                                   newInstance(); */
165                    /*return ((Class)((ParameterizedType)this.getClass().
166                                   getGenericSuperclass()).getActualTypeArguments()[0]).
167                                   newInstance();*/
168        //return ComplexProperty.class;
169        return this.instance;
170      }
171    }