summaryrefslogtreecommitdiffstats
path: root/tags/java-M1-final/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/graphbuilder/schema/ESchemaMaker.java
blob: 308238416039f53884262b857cb0bbab170ee31d (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
/**
 *
 *  Copyright 2005 The Apache Software Foundation or its licensors, as applicable.
 *
 *  Licensed 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.das.rdb.graphbuilder.schema;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import org.apache.tuscany.das.rdb.config.Relationship;
import org.apache.tuscany.das.rdb.config.wrapper.MappingWrapper;
import org.apache.tuscany.das.rdb.graphbuilder.impl.GraphBuilderMetadata;
import org.apache.tuscany.das.rdb.graphbuilder.impl.ResultMetadata;
import org.apache.tuscany.das.rdb.util.DebugUtil;
import org.apache.tuscany.sdo.util.DataObjectUtil;
import org.apache.tuscany.sdo.util.SDOUtil;

import commonj.sdo.Property;
import commonj.sdo.Type;
import commonj.sdo.helper.TypeHelper;

/**
 * 
 * An ESchemaMaker is used to create an EMF Schema from an instance of JDBC
 * Mediator Metadata.
 * 
 */
public class ESchemaMaker {

	private final GraphBuilderMetadata metadata;

	private boolean debug = false;

	/**
	 * Constructor for ESchemaMaker. Creates an SDO model based on the metadata
	 * passed in.
	 * 
	 * @param metadata
	 */
	public ESchemaMaker(GraphBuilderMetadata metadata) {
		this.metadata = metadata;
	}	

	/**
	 * Creates an EMF Schema by using the
	 * 
	 * @link TableMaker and
	 * @link RelationshipMaker to transform
	 * @link Metadata elements into EMF Schema elements.
	 */

	public Type createTypes() {
		TypeHelper types = SDOUtil.createTypeHelper();	
		
		DataObjectUtil.initRuntime();
		SDOUtil.createDataGraph();

	
		Type rootType = SDOUtil.createType(types, getURI(), "DataGraphRoot", false);	

		Iterator iter = metadata.getResultMetadata().iterator();
		while (iter.hasNext()) {

			ResultMetadata resultMetadata = (ResultMetadata) iter.next();

			Iterator names = resultMetadata.getAllTablePropertyNames()
					.iterator();
			while (names.hasNext()) {
				String tableName = (String) names.next();
	
				Type tableType = SDOUtil.createType(types, getURI(), tableName, false);										
				Property property = SDOUtil.createProperty(rootType, tableName, tableType);
				SDOUtil.setMany(property,true);		
				SDOUtil.setContainment(property, true);
			}
		
			// TODO tablePropertyMap is temporary until Tuscany-203 is fixed
			HashMap tablePropertyMap = new HashMap();
			
			for (int i = 1; i <= resultMetadata.getColumnNames().size(); i++) {

				Property ref = rootType.getProperty(resultMetadata.getTablePropertyName(i));
				
				// TODO Temporary code to check to see if a property has already been added.
				// Replace when Tuscany-203 is fixed
				ArrayList addedProperties = (ArrayList) tablePropertyMap.get(ref.getName());
				if ( addedProperties == null ) {
					addedProperties = new ArrayList();
					tablePropertyMap.put(ref.getName(), addedProperties);
				}
				
				if (ref == null)
					throw new RuntimeException("Could not find table "
							+ resultMetadata.getTablePropertyName(i)
							+ " in the SDO model");
			
				String columnName = resultMetadata.getColumnPropertyName(i);

				// TODO temporary check until Tuscany-203 is fixed
				if ( !addedProperties.contains(columnName)) {
					addedProperties.add(columnName);
					Type atype = (Type) resultMetadata.getDataType(i);					
	
					SDOUtil.createProperty(ref.getType(), columnName, atype);				

					DebugUtil.debugln(getClass(), debug, "Adding column "
							+ columnName + " to "
							+ resultMetadata.getTablePropertyName(i));	
				}

			}
		}

		if (metadata.hasMappingModel()) {
			MappingWrapper wrapper = new MappingWrapper(metadata.getMapping());
			Iterator i = metadata.getRelationships().iterator();
			while (i.hasNext()) {
				Relationship r = (Relationship) i.next();

				Type parent = rootType.getProperty(
						wrapper.getTablePropertyName(r.getPrimaryKeyTable())).getType();
				Type child = rootType.getProperty(
						wrapper.getTablePropertyName(r.getForeignKeyTable())).getType();
				if (parent == null) {
					throw new RuntimeException("The parent table ("
							+ r.getPrimaryKeyTable() + ") in relationship "
							+ r.getName()
							+ " was not found in the mapping information.");
				} else if (child == null) {
					throw new RuntimeException("The child table ("
							+ r.getForeignKeyTable() + ") in relationship "
							+ r.getName()
							+ " was not found in the mapping information.");
				}

			//	ReferenceImpl ref = refMaker.createReference(r, parent, child);	
				
				Property parentProp = SDOUtil.createProperty(parent, r.getName(), child);	
				Property childProp = SDOUtil.createProperty(child, r.getName() + "_opposite", parent);
				SDOUtil.setOpposite(parentProp, childProp);
				SDOUtil.setOpposite(childProp, parentProp);
				SDOUtil.setMany(parentProp, r.isMany());
				
								

			}

		}
		
		return rootType;
	}

	private String getURI() {
		return "http:///org.apache.tuscany.das.rdb/das";
	}	
	

}