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 }