summaryrefslogtreecommitdiffstats
path: root/sdo-java/branches/emf-2.5/lib/src/main/java/org/apache/tuscany/sdo/api/SDOHelper.java
blob: 17d9a08a8785088f511c1f713a3a548d65672a00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
/**
 *
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package org.apache.tuscany.sdo.api;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

import commonj.sdo.helper.XSDHelper;

import commonj.sdo.DataGraph;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.Sequence;
import commonj.sdo.Type;
import commonj.sdo.helper.CopyHelper;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.TypeHelper;

/**
 * This interface provides helper functions which are not included in the SDO specification itself.
 * Use of the functions in this interface is recommended, instead of resorting to low-level 
 * implementation-specific APIs.
 */
public interface SDOHelper
{
	final int UNBOUNDED = -1; //return value from getUpperBound() when maxOccurs="unbounded"
	final int UNSPECIFIED = -2; //return value from getUpperBound() for global property
	
  /**
   * Create a non-extensible HelperContext to provide access to a consistent set of Helpers which make use
   * of a new TypeHelper instance to provide scope for type definitions.
   * @return the new HelperContext
   * @see #createHelperContext(boolean)
   */
  public HelperContext createHelperContext();

  /**
   * Create a non-extensible HelperContext to provide access to a consistent set of Helpers which make use
   * of a new TypeHelper instance to provide scope for type definitions.
   * @param options Map of default XMLOptions
   * @return the new HelperContext
   * @see #createHelperContext(boolean)
   */
  public HelperContext createHelperContext(boolean extensibleNamespaces, Map options);
  
  /**
   * Create a HelperContext to provide access to a consistent set of Helpers which make use of a new
   * TypeHelper instance to provide scope for type definitions.
   * @param extensibleNamespaces true if the contents of a namespaces should be incrementally modifiable over time
   * @return the new HelperContext
   */
  public HelperContext createHelperContext(boolean extensibleNamespaces);
  
  /**
   * create a non-extensible HelperContext with default load/save options
   * @param options default load/save options from XMLOptions
   * @return the new HelperContext
   */
  public HelperContext createHelperContext(Map options);

  /**
   * Creates an instance of a data type from the specified string.
   * @param dataType a Type, for which isDataType() returns true, to instantiate.
   * @param literal the string value of the dataType.
   * @return an instance of the dataType.
   * @see #convertToString(Type, Object)
   */
  public Object createFromString(Type dataType, String literal);

  /**
   * Converts an instance of a data type to a string literal representation.
   * @param dataType the Type, for which isDataType() returns true, of the value to convert.
   * @param value a value of the dataType.
   * @return the string literal representation of the value.
   * @see #createFromString(Type, String)
   */
  public String convertToString(Type dataType, Object value);

  /**
   * Create a DataObject wrapper for an instance of the specified dataType.
   * This method is typically used to create a root object that can be passed to the XMLHelper.save() 
   * method when the root element to be serialized is an XMLSchema simpleType.
   * @param dataType a Type for which isDataType() returns true.
   * @param value the instance value.
   * @return a DataObject wrapper for the specified value.
   */
  public DataObject createDataTypeWrapper(Type dataType, Object value);

  /**
   * Get the SDO built-in type corresponding to the specified XSD type in the XML Schema
   * namespace ("http://www.w3.org/2001/XMLSchema").
   * @param xsdType a type name in the XML Schema namespace.
   * @return the SDO built-in Type corresponding to the specified XSD type.
   */
  public Type getXSDSDOType(String xsdType);

  /**
   * Gets the Sequence corresponding to the specified substitutable Property of the specified DataObject.
   * @param dataObject the data object.
   * @param head a substitution group head property.
   * @return the Sequence corresponding to the specified substitutable Property of the specified DataObject or
   *         null if the specified Property isn't a substitution head.
   */
  public Sequence getSubstitutionValues(DataObject dataObject, Property head);

  /**
   * Get the SDO built-in type corresponding to the specified Java instanceClass.
   * @param javaClass the Java instanceClass of the type.
   * @return the SDO built-in Type corresponding to the specified instanceClass.
   */
  public Type getJavaSDOType(Class javaClass);

  /**
   * Return whether at least one value is required for a valid instance of the specified property.
   * @param the property in question.
   * @return true if the property is required.
   */
  public boolean isRequired(Property property);

  /**
   * Return the upper bound of the specified property or -1 if unbounded.
   * @param the property in question.
   * @return the upper bound.
   */
  public int getUpperBound(Property property);

  /**
   * Return the lower bound of the specified property or 1 by default
   * @param the property in question.
   * @return the lower bound.
   */
  public int getLowerBound(Property property);
  
  /**
   * Return Enumeration facet 
   * @param type
   * @return List of enum facets in a Type
   *///Amita
  public List getEnumerationFacet(Type type);
  
  /**
   * Return Pattern facet 
   * @param type
   * @return List of pattern facets in a Type
   *///Amita
  public List getPatternFacet(Type type);

  /**
   * Returns whether the Property is many-valued given the specified context.
   * @param property The Property in question
   * @param context The context to check whether the specified Property is many-valued
   * @return true if the Property is many-valued given the specified context.
   */
  public boolean isMany(Property property, DataObject context);

  /**
   * Create an empty data graph.
   * @return the new data graph instance.
   */
  public DataGraph createDataGraph();

  /**
   * Set the root object of a data graph.
   * @param dataGraph the data graph in which to set the root object.
   * @param rootObject the root object.
   */
  public void setRootObject(DataGraph dataGraph, DataObject rootObject);

  /**
   * Load a serialized data graph from the specified insputStream.
   * 
   * @param inputStream the inputStream of the data graph.
   * @param options loader control options, or null.
   * @param hc the HelperContext in which to register deserialized Types and to find Types when
   *              creating DataObject instances, or null for default HelperContext.
   * @return the de-serialized data graph.
   * @throws IOException
   */
  public DataGraph loadDataGraph(InputStream inputStream, Map options, HelperContext hc) throws IOException;
  
  /**
   * Serialize the specified data graph to the specified outputStream.
   * @param dataGraph the data graph to save.
   * @param outputStream the outputStream for the data graph.
   * @param options serializer control options, or null.
   * @throws IOException
   */
  public void saveDataGraph(DataGraph dataGraph, OutputStream outputStream, Map options) throws IOException;

  /**
   * Registers the specified {@link Type type}(s) to be serialized along with
   * the {@link DataObject data object}(s) in the graph. For example, the list of types returned from 
   * {@link TypeHelper#define} can be registered with this method, allowing deserialization of
   * instances of a dynamically defined model.
   * @param dataGraph the DataGraph in which to register the specified type(s).
   * @param types a list containing the type(s) to be registered (TBD or null to automatically register all 
   * types used by the objects in the DataGraph).
   */
  public void registerDataGraphTypes(DataGraph dataGraph, List/*Type*/types);
  
  /**
   * Create a new cross scope CopyHelper.
   * @param hc the HelperContext containing the Types to use to create the copy objects.
   * @return the new CopyHelper.
   */
  public CopyHelper createCrossScopeCopyHelper(HelperContext targetScope);

  
  /**
   * Create a new XMLStreamHelper, with visibility to types in the specified HelperContext scope.
   * @param hc the HelperContext to use for locating types.
   * @return the new XMLStreamHelper.
   */
  public XMLStreamHelper createXMLStreamHelper(HelperContext hc);
  
  /**
   * Create a new ObjectInputStream in the specifice HelperContext scope.
   * @param inputStream the inputStream with which to create the ObjectInputStream.
   * @param helperContext the HelperContext scope.
   * @return the new ObjectInputStream.
   */
  public ObjectInputStream createObjectInputStream(InputStream inputStream, HelperContext helperContext) throws IOException;

  /**
   * Create a new ObjectOutputStream in the specifice HelperContext scope.
   * @param outputStream the outputStream with which to create the ObjectOutputStream.
   * @param helperContext the HelperContext scope.
   * @return the new ObjectOutputStream.
   */
  public ObjectOutputStream createObjectOutputStream(OutputStream outputStream, HelperContext helperContext) throws IOException;
  
  /**
   * Gets all of the types associated with a uri.
   * @param hc the HelperContext to use for locating types.
   * @param uri the URI of the Types
   * @return a List containing instances of Type, null if uri is not found.
   */
  public List getTypes(HelperContext hc, String uri);

  /**
   * Gets the open content subset of the specified DataObject's instance properties.
   * @param dataObject the DataObject instance
   * @return a List containing any open content properties of the DataObject
   */
  public List getOpenContentProperties(DataObject dataObject);

  /**
   * Return true if the specified type is a special DocumentRoot Type.
   * @param type the Type in question
   * @return true if type is a DocumentRoot
   */
  public boolean isDocumentRoot(Type type);
  
  /**
   * Return an XPath from the containment root to the specified DataObject.
   * @param dataObject a DataObject
   * @return the XPath from the containment root.
   */
  public String getXPath(DataObject dataObject);
  
  /**
   * Gets a MetaDataBuilder which can be used to programatically create SDO Types and Properties.
   * @return a MetaDataBuilder instance
   */
  public MetaDataBuilder getMetaDataBuilder();
  
  /**
   * An experimental interface,  subject to possible change that permits
   * registration of an event listener with a DataObject instance
   * @param dob DataObject
   * @param listener EventListener
   */
  public void addChangeListener(DataObject dob, EventListener listener);

  /**
   * An experimental interface,  subject to possible change that permits
   * deregistration of an event listener with a DataObject instance
   * @param dob DataObject
   * @param listener EventListener
   */
  public void removeChangeListener(DataObject dob, EventListener listener);

  /**
   * This interface provides methods which can be used to programatically create SDO Types and Properties.
   * It provides a lower level and more efficient API then the DataObject-based one of TypeHelper.define().
   */
 
  public interface MetaDataBuilder
  {

    /**
     * Create a Type in the specified TypeHelper scope.
     * @return the new Type.
     */
    public Type createType(HelperContext hc, String uri, String name, boolean isDataType);

    /**
     * Add a baseType to the specified type.
     */
    public void addBaseType(Type type, Type baseType);

    /**
     * Add an aliasName to the specified type.
     */
    public void addAliasName(Type type, String aliasName);

    /**
     * Set the isOpen value of the specified type.
     */
    public void setOpen(Type type, boolean isOpen);

    /**
     * Set the isSequenced value of the specified type.
     */
    public void setSequenced(Type type, boolean isSequenced);

    /**
     * Set the isAbstract value of the specified type.
     */
    public void setAbstract(Type type, boolean isAbstract);

    /**
     * Set the isAbstract value of the specified type.
     */
    public void setJavaClassName(Type type, String javaClassName);

    /**
     * Create a new property in the specified containingType.
     */
    public Property createProperty(Type containingType, String name, Type propertyType);

    /**
     * Set a SDO property to become an XSD element or attribute
     */
    public void setPropertyXMLKind(Property property, boolean isXmlElement);

    /**
     * Create a new open content property in the specified TypeHelper scope.
     */
    public Property createOpenContentProperty(HelperContext hc, String uri, String name, Type type);

    /**
     * Add an aliasName to the specified property.
     */
    public void addAliasName(Property property, String aliasName);

    /**
     * Set the isMany value of the specified property.
     */
    public void setMany(Property property, boolean isMany);

    /**
     * Set the isContainment value of the specified property.
     */
    public void setContainment(Property property, boolean isContainment);

    /**
     * Set the default value of the specified property.
     */
    public void setDefault(Property property, String defaultValue);

    /**
     * Set the isReadOnly value of the specified property.
     */
    public void setReadOnly(Property property, boolean isReadOnly);

    /**
     * Set the opposite value of the specified property.
     */
    public void setOpposite(Property property, Property opposite);

    /**
     * Add an instance property to the specified type.
     */
    public void addTypeInstanceProperty(Type definedType, Property instanceProperty, Object value);

    /**
     * Add anf instance property to the specified property.
     */
    public void addPropertyInstanceProperty(Property definedProperty, Property instanceProperty, Object value);
  }

  /**
   * This interface contains options that can be passed to the XMLHelper load() and save() methods.
   */
  public interface XMLOptions
  {
    /**
     * Line Break String such as "\n", "\r\n", "\r" and "", absence/null is the default (line.separator System Property)
     */
    final String XML_SAVE_LINE_BREAK = "LineBreak";

    /**
     * Indent String such as "\t", "", etc. absence/null is the default ("  ")
     */
    final String XML_SAVE_INDENT = "indent";

    /**
     * Margin String such as " ", "\t\t", etc. Absence/null/"" is the default (no margin)
     */
    final String XML_SAVE_MARGIN = "margin";

    /**
     * Attribute formatting that exceeds the specified width as Integer will cause a line break so that formatting will continue indented on the next line
     */
    final String XML_SAVE_LINE_WIDTH = "LINE_WIDTH";

    /**
     * Boolean to save a doctype declaration 
     */
    final String XML_SAVE_DOCTYPE = "SAVE_DOCTYPE";

    /**
     * Boolean to process the schemaLocation/noNamespaceSchemaLocation attributes occurring in the instance document to {@link XSDHelper#define convert XSD(s) to Types} 
     */
    final String XML_LOAD_SCHEMA = "ProcessSchemaLocations";

    /**
     * To tolerate malformed elements and attributes (default unless set by System property XML.load.form.lax). 0 not to.  
     */
    final String XML_LOAD_LAX_FORM = "load malform";
    
    /**
     * Allows you to record unknown features during deserialization/loading. 
     * The default is Boolean.FALSE unless set to Boolean.TRUE explicitly. 
     */
    final String XML_LOAD_UNKNOWN_PROPERTIES = "load unknown properties";
  }

}