http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/main/java/org/apache/cayenne/merge/AddColumnToDb.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/AddColumnToDb.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/AddColumnToDb.java index 2192203..77b7486 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/merge/AddColumnToDb.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/AddColumnToDb.java @@ -1,30 +1,29 @@ -/***************************************************************** - * 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 +/* + * 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 + * 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. - ****************************************************************/ + * 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.cayenne.merge; import java.util.Collections; import java.util.List; -import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.dba.JdbcAdapter; import org.apache.cayenne.dba.QuotingStrategy; -import org.apache.cayenne.dba.TypesMapping; import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; @@ -52,41 +51,8 @@ public class AddColumnToDb extends AbstractToDbToken.EntityAndColumn { QuotingStrategy context = adapter.getQuotingStrategy(); appendPrefix(sqlBuffer, context); - // copied from JdbcAdapter.createTableAppendColumn - String[] types = adapter.externalTypesForJdbcType(getColumn().getType()); - if (types == null || types.length == 0) { - String entityName = getColumn().getEntity() != null ? getColumn() - .getEntity().getFullyQualifiedName() : "<null>"; - throw new CayenneRuntimeException("Undefined type for attribute '" - + entityName + "." + getColumn().getName() + "': " + getColumn().getType()); - } - - String type = types[0]; - sqlBuffer.append(type); - - // append size and precision (if applicable) - if (adapter.typeSupportsLength(getColumn().getType())) { - int len = getColumn().getMaxLength(); - int scale = TypesMapping.isDecimal(getColumn().getType()) ? getColumn().getScale() : -1; - - // sanity check - if (scale > len) { - scale = -1; - } - - if (len > 0) { - sqlBuffer.append('(').append(len); - - if (scale >= 0) { - sqlBuffer.append(", ").append(scale); - } - - sqlBuffer.append(')'); - } - } - - // use separate token to set value and not null if needed - // sqlBuffer.append(" NULL"); + sqlBuffer.append(JdbcAdapter.getType(adapter, getColumn())); + sqlBuffer.append(JdbcAdapter.sizeAndPrecision(adapter, getColumn())); return Collections.singletonList(sqlBuffer.toString()); }
http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java index d2f538f..61a266a 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/CreateTableToModel.java @@ -72,30 +72,14 @@ public class CreateTableToModel extends AbstractToModelToken.Entity { String className = objEntityClassName; if (className == null) { // we should generate a className based on the objEntityName - String packageName = map.getDefaultPackage(); - if (Util.isEmptyString(packageName)) { - packageName = ""; - } - else if (!packageName.endsWith(".")) { - packageName = packageName + "."; - } - className = packageName + objEntityName; + className = map.getNameWithDefaultPackage(objEntityName); } objEntity.setClassName(className); - objEntity.setSuperClassName(map.getDefaultSuperclass()); if (map.isClientSupported()) { - String clientPkg = map.getDefaultClientPackage(); - if (clientPkg != null) { - if (!clientPkg.endsWith(".")) { - clientPkg = clientPkg + "."; - } - - objEntity.setClientClassName(clientPkg + objEntity.getName()); - } - + objEntity.setClientClassName(map.getNameWithDefaultClientPackage(objEntity.getName())); objEntity.setClientSuperClassName(map.getDefaultClientSuperclass()); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java index 55219f2..31cb65c 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/DbMerger.java @@ -1,27 +1,29 @@ -/***************************************************************** - * 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 +/* + * 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 + * 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. - ****************************************************************/ + * 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.cayenne.merge; import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.access.DataNode; import org.apache.cayenne.access.DbLoader; -import org.apache.cayenne.access.DefaultDbLoaderDelegate; +import org.apache.cayenne.access.loader.DbLoaderConfiguration; +import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate; +import org.apache.cayenne.access.loader.NameFilter; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.map.Attribute; import org.apache.cayenne.map.DataMap; @@ -55,20 +57,13 @@ public class DbMerger { private final ValueForNullProvider valueForNull; - private final String schema; - public DbMerger(MergerFactory factory) { this(factory, null); } - public DbMerger(MergerFactory factory, String schema) { - this(factory, null, schema); - } - - public DbMerger(MergerFactory factory, ValueForNullProvider valueForNull, String schema) { + public DbMerger(MergerFactory factory, ValueForNullProvider valueForNull) { this.factory = factory; this.valueForNull = valueForNull == null ? new EmptyValueForNullProvider() : valueForNull; - this.schema = schema; } /** @@ -83,24 +78,24 @@ public class DbMerger { * Create and return a {@link List} of {@link MergerToken}s to alter the given * {@link DataNode} to match the given {@link DataMap} */ - public List<MergerToken> createMergeTokens(DataNode dataNode, DataMap existing) { - return createMergeTokens(dataNode.getDataSource(), dataNode.getAdapter(), existing); + public List<MergerToken> createMergeTokens(DataNode dataNode, DataMap existing, DbLoaderConfiguration config) { + return createMergeTokens(dataNode.getDataSource(), dataNode.getAdapter(), existing, config); } /** * Create and return a {@link List} of {@link MergerToken}s to alter the given * {@link DataNode} to match the given {@link DataMap} */ - public List<MergerToken> createMergeTokens(DbLoader dbLoader, DataMap existing) { - return createMergeTokens(existing, loadDataMapFromDb(dbLoader)); + public List<MergerToken> createMergeTokens(DbLoader dbLoader, DataMap existing, DbLoaderConfiguration config) { + return createMergeTokens(existing, loadDataMapFromDb(dbLoader, config)); } /** * Create and return a {@link List} of {@link MergerToken}s to alter the given * {@link DataNode} to match the given {@link DataMap} */ - public List<MergerToken> createMergeTokens(DataSource dataSource, DbAdapter adapter, DataMap existingDataMap) { - return createMergeTokens(existingDataMap, loadDataMapFromDb(dataSource, adapter)); + public List<MergerToken> createMergeTokens(DataSource dataSource, DbAdapter adapter, DataMap existingDataMap, DbLoaderConfiguration config) { + return createMergeTokens(existingDataMap, loadDataMapFromDb(dataSource, adapter, config)); } /** @@ -131,26 +126,17 @@ public class DbMerger { return tokens; } - private DataMap loadDataMapFromDb(DataSource dataSource, DbAdapter adapter) { + private DataMap loadDataMapFromDb(DataSource dataSource, DbAdapter adapter, DbLoaderConfiguration config) { Connection conn = null; try { conn = dataSource.getConnection(); - final DbMerger merger = this; - // TODO pass naming strategy - DbLoader dbLoader = new DbLoader(conn, adapter, new DefaultDbLoaderDelegate()) { - - @Override - public boolean includeTableName(String tableName) { - return merger.includeTableName(tableName); - } - }; - - return loadDataMapFromDb(dbLoader); + DbLoader dbLoader = new DbLoader(conn, adapter, new DefaultDbLoaderDelegate()); + return loadDataMapFromDb(dbLoader, config); } catch (SQLException e) { - throw new CayenneRuntimeException("Can't load dataMap from db.", e); + throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e); } finally { if (conn != null) { @@ -164,10 +150,10 @@ public class DbMerger { } } - private DataMap loadDataMapFromDb(DbLoader dbLoader) { + private DataMap loadDataMapFromDb(DbLoader dbLoader, DbLoaderConfiguration config) { DataMap detectedDataMap = new DataMap(); try { - dbLoader.load(detectedDataMap, null, schema, null, (String[]) null); + dbLoader.load(detectedDataMap, config, (String[]) null); } catch (SQLException e) { // TODO log } @@ -190,6 +176,8 @@ public class DbMerger { String tableName = dbEntity.getName(); if (!includeTableName(tableName)) { + // TODO we have to cut this entities in db loader + // TODO log continue; } @@ -359,20 +347,15 @@ public class DbMerger { Collection<DbAttribute> primaryKeyNew = dbEntity.getPrimaryKeys(); String primaryKeyName = null; - if ((detectedEntity instanceof DetectedDbEntity)) { + if (detectedEntity instanceof DetectedDbEntity) { primaryKeyName = ((DetectedDbEntity) detectedEntity).getPrimaryKeyName(); } - if (upperCaseEntityNames(primaryKeyOriginal).equals( - upperCaseEntityNames(primaryKeyNew))) { + if (upperCaseEntityNames(primaryKeyOriginal).equals(upperCaseEntityNames(primaryKeyNew))) { return null; } - return factory.createSetPrimaryKeyToDb( - dbEntity, - primaryKeyOriginal, - primaryKeyNew, - primaryKeyName); + return factory.createSetPrimaryKeyToDb(dbEntity, primaryKeyOriginal, primaryKeyNew, primaryKeyName); } private Set<String> upperCaseEntityNames(Collection<? extends Attribute> attrs) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/main/java/org/apache/cayenne/merge/SetColumnTypeToDb.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/merge/SetColumnTypeToDb.java b/cayenne-server/src/main/java/org/apache/cayenne/merge/SetColumnTypeToDb.java index a074188..466a9d9 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/merge/SetColumnTypeToDb.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/merge/SetColumnTypeToDb.java @@ -1,21 +1,21 @@ -/***************************************************************** - * 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 +/* + * 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 + * 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. - ****************************************************************/ + * 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.cayenne.merge; import java.util.Collections; @@ -23,6 +23,7 @@ import java.util.List; import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.dba.JdbcAdapter; import org.apache.cayenne.dba.QuotingStrategy; import org.apache.cayenne.dba.TypesMapping; import org.apache.cayenne.map.DbAttribute; @@ -57,41 +58,10 @@ public class SetColumnTypeToDb extends AbstractToDbToken.Entity { @Override public List<String> createSql(DbAdapter adapter) { StringBuffer sqlBuffer = new StringBuffer(); - appendPrefix(sqlBuffer, adapter.getQuotingStrategy()); - // copied from JdbcAdapter.createTableAppendColumn - String[] types = adapter.externalTypesForJdbcType(columnNew.getType()); - if (types == null || types.length == 0) { - String entityName = columnNew.getEntity() != null ? columnNew - .getEntity().getFullyQualifiedName() : "<null>"; - throw new CayenneRuntimeException("Undefined type for attribute '" - + entityName + "." + columnNew.getName() + "': " + columnNew.getType()); - } - - String type = types[0]; - sqlBuffer.append(type); - - // append size and precision (if applicable) - if (adapter.typeSupportsLength(columnNew.getType())) { - int len = columnNew.getMaxLength(); - int scale = TypesMapping.isDecimal(columnNew.getType()) ? columnNew.getScale() : -1; - - // sanity check - if (scale > len) { - scale = -1; - } - - if (len > 0) { - sqlBuffer.append('(').append(len); - - if (scale >= 0) { - sqlBuffer.append(", ").append(scale); - } - - sqlBuffer.append(')'); - } - } + sqlBuffer.append(JdbcAdapter.getType(adapter, columnNew)); + sqlBuffer.append(JdbcAdapter.sizeAndPrecision(adapter, columnNew)); return Collections.singletonList(sqlBuffer.toString()); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java index 1b1fa90..e1555eb 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/util/EntityMergeSupport.java @@ -46,20 +46,21 @@ import org.apache.cayenne.map.naming.ObjectNameGenerator; */ public class EntityMergeSupport { - private static final Map<String, String> CLASS_TO_PRIMITVE; + private static final Map<String, String> CLASS_TO_PRIMITIVE; static { - CLASS_TO_PRIMITVE = new HashMap<String, String>(); - CLASS_TO_PRIMITVE.put(Byte.class.getName(), "byte"); - CLASS_TO_PRIMITVE.put(Long.class.getName(), "long"); - CLASS_TO_PRIMITVE.put(Double.class.getName(), "double"); - CLASS_TO_PRIMITVE.put(Boolean.class.getName(), "boolean"); - CLASS_TO_PRIMITVE.put(Float.class.getName(), "float"); - CLASS_TO_PRIMITVE.put(Short.class.getName(), "short"); - CLASS_TO_PRIMITVE.put(Integer.class.getName(), "int"); + CLASS_TO_PRIMITIVE = new HashMap<String, String>(); + CLASS_TO_PRIMITIVE.put(Byte.class.getName(), "byte"); + CLASS_TO_PRIMITIVE.put(Long.class.getName(), "long"); + CLASS_TO_PRIMITIVE.put(Double.class.getName(), "double"); + CLASS_TO_PRIMITIVE.put(Boolean.class.getName(), "boolean"); + CLASS_TO_PRIMITIVE.put(Float.class.getName(), "float"); + CLASS_TO_PRIMITIVE.put(Short.class.getName(), "short"); + CLASS_TO_PRIMITIVE.put(Integer.class.getName(), "int"); } - protected DataMap map; + private final DataMap map; + protected boolean removeMeaningfulFKs; protected boolean removeMeaningfulPKs; protected boolean usePrimitives; @@ -67,12 +68,12 @@ public class EntityMergeSupport { /** * Strategy for choosing names for entities, attributes and relationships */ - protected ObjectNameGenerator nameGenerator; + private final ObjectNameGenerator nameGenerator; /** * Listeners of merge process. */ - protected List<EntityMergeListener> listeners; + private final List<EntityMergeListener> listeners = new ArrayList<EntityMergeListener>(); public EntityMergeSupport(DataMap map) { this(map, new LegacyNameGenerator(), true); @@ -83,10 +84,9 @@ public class EntityMergeSupport { */ public EntityMergeSupport(DataMap map, ObjectNameGenerator nameGenerator, boolean removeMeaningfulPKs) { this.map = map; + this.nameGenerator = nameGenerator; this.removeMeaningfulFKs = true; - this.listeners = new ArrayList<EntityMergeListener>(); this.removeMeaningfulPKs = removeMeaningfulPKs; - this.nameGenerator = nameGenerator; /** * Adding a listener, so that all created ObjRelationships would have @@ -102,7 +102,7 @@ public class EntityMergeSupport { * @return true if any ObjEntity has changed as a result of synchronization. * @since 1.2 changed signature to use Collection instead of List. */ - public boolean synchronizeWithDbEntities(Collection<ObjEntity> objEntities) { + public boolean synchronizeWithDbEntities(Iterable<ObjEntity> objEntities) { boolean changed = false; for (ObjEntity nextEntity : objEntities) { if (synchronizeWithDbEntity(nextEntity)) { @@ -147,71 +147,79 @@ public class EntityMergeSupport { boolean changed = false; // synchronization on DataMap is some (weak) protection - // against simultaneous modification of the map (like double-clicking on - // sync - // button) + // against simultaneous modification of the map (like double-clicking on sync button) synchronized (map) { if (removeFK(dbEntity)) { - - // get rid of attributes that are now src attributes for - // relationships - for (DbAttribute da : getMeaningfulFKs(entity)) { - ObjAttribute oa = entity.getAttributeForDbAttribute(da); - while (oa != null) { - String attrName = oa.getName(); - entity.removeAttribute(attrName); - changed = true; - oa = entity.getAttributeForDbAttribute(da); - } - } + changed = getRidOfAttributesThatAreNowSrcAttributesForRelationships(entity); } - // add missing attributes - for (DbAttribute da : getAttributesToAdd(entity)) { + changed |= addMissingAttributes(entity); + changed |= addMissingRelationships(entity); + } - String attrName = nameGenerator.createObjAttributeName(da); - // avoid duplicate names - attrName = DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, entity, attrName); + return changed; + } - String type = TypesMapping.getJavaBySqlType(da.getType()); + private boolean addMissingRelationships(ObjEntity entity) { + boolean changed = false; + for (DbRelationship dr : getRelationshipsToAdd(entity)) { + DbEntity targetEntity = dr.getTargetEntity(); - if (usePrimitives) { - String primitive = CLASS_TO_PRIMITVE.get(type); - if (primitive != null) { - type = primitive; - } - } + for (Entity mappedTarget : map.getMappedEntities(targetEntity)) { - ObjAttribute oa = new ObjAttribute(attrName, type, entity); - oa.setDbAttributePath(da.getName()); - entity.addAttribute(oa); - fireAttributeAdded(oa); - changed = true; - } + // avoid duplicate names + String relationshipName = nameGenerator.createObjRelationshipName(dr); + relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName); - // add missing relationships - for (DbRelationship dr : getRelationshipsToAdd(entity)) { - DbEntity targetEntity = (DbEntity) dr.getTargetEntity(); + ObjRelationship or = new ObjRelationship(relationshipName); + or.addDbRelationship(dr); + or.setSourceEntity(entity); + or.setTargetEntity(mappedTarget); + entity.addRelationship(or); - for (Entity mappedTarget : map.getMappedEntities(targetEntity)) { + fireRelationshipAdded(or); + changed = true; + } + } + return changed; + } - // avoid duplicate names - String relationshipName = nameGenerator.createObjRelationshipName(dr); - relationshipName = DefaultUniqueNameGenerator.generate(NameCheckers.objRelationship, entity, relationshipName); + private boolean addMissingAttributes(ObjEntity entity) { + boolean changed = false; + for (DbAttribute da : getAttributesToAdd(entity)) { - ObjRelationship or = new ObjRelationship(relationshipName); - or.addDbRelationship(dr); - or.setSourceEntity(entity); - or.setTargetEntity(mappedTarget); - entity.addRelationship(or); + String attrName = DefaultUniqueNameGenerator.generate(NameCheckers.objAttribute, entity, + nameGenerator.createObjAttributeName(da)); - fireRelationshipAdded(or); - changed = true; + String type = TypesMapping.getJavaBySqlType(da.getType()); + if (usePrimitives) { + String primitive = CLASS_TO_PRIMITIVE.get(type); + if (primitive != null) { + type = primitive; } } + + ObjAttribute oa = new ObjAttribute(attrName, type, entity); + oa.setDbAttributePath(da.getName()); + entity.addAttribute(oa); + fireAttributeAdded(oa); + changed = true; } + return changed; + } + private boolean getRidOfAttributesThatAreNowSrcAttributesForRelationships(ObjEntity entity) { + boolean changed = false; + for (DbAttribute da : getMeaningfulFKs(entity)) { + ObjAttribute oa = entity.getAttributeForDbAttribute(da); + while (oa != null) { + String attrName = oa.getName(); + entity.removeAttribute(attrName); + changed = true; + oa = entity.getAttributeForDbAttribute(da); + } + } return changed; } @@ -249,16 +257,11 @@ public class EntityMergeSupport { for (DbAttribute dba : dbEntity.getAttributes()) { - if (dba.getName() == null) { - continue; - } - - if (objEntity.getAttributeForDbAttribute(dba) != null) { + if (dba.getName() == null || objEntity.getAttributeForDbAttribute(dba) != null) { continue; } boolean removeMeaningfulPKs = removePK(dbEntity); - if (removeMeaningfulPKs && dba.isPrimaryKey()) { continue; } @@ -330,28 +333,20 @@ public class EntityMergeSupport { protected List<DbRelationship> getRelationshipsToAdd(ObjEntity objEntity) { List<DbRelationship> missing = new ArrayList<DbRelationship>(); - for (DbRelationship dbrel : objEntity.getDbEntity().getRelationships()) { + for (DbRelationship dbRel : objEntity.getDbEntity().getRelationships()) { // check if adding it makes sense at all - if (dbrel.getName() == null) { + if (dbRel.getName() == null) { continue; } - if (objEntity.getRelationshipForDbRelationship(dbrel) == null) { - missing.add(dbrel); + if (objEntity.getRelationshipForDbRelationship(dbRel) == null) { + missing.add(dbRel); } } return missing; } - public DataMap getMap() { - return map; - } - - public void setMap(DataMap map) { - this.map = map; - } - /** * @since 1.2 */ @@ -391,8 +386,8 @@ public class EntityMergeSupport { * Notifies all listeners that an ObjAttribute was added */ protected void fireAttributeAdded(ObjAttribute attr) { - for (int i = 0; i < listeners.size(); i++) { - listeners.get(i).objAttributeAdded(attr); + for (EntityMergeListener listener : listeners) { + listener.objAttributeAdded(attr); } } @@ -400,19 +395,12 @@ public class EntityMergeSupport { * Notifies all listeners that an ObjRelationship was added */ protected void fireRelationshipAdded(ObjRelationship rel) { - for (int i = 0; i < listeners.size(); i++) { - listeners.get(i).objRelationshipAdded(rel); + for (EntityMergeListener listener : listeners) { + listener.objRelationshipAdded(rel); } } /** - * Sets new naming strategy for reverse engineering - */ - public void setNameGenerator(ObjectNameGenerator strategy) { - this.nameGenerator = strategy; - } - - /** * @return naming strategy for reverse engineering */ public ObjectNameGenerator getNameGenerator() { http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialTest.java index 72d6fce..8b75c37 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialTest.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialTest.java @@ -26,7 +26,7 @@ import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate; import org.apache.cayenne.unit.di.server.ServerCase; import org.apache.cayenne.unit.di.server.ServerCaseDataSourceFactory; import org.apache.cayenne.unit.di.server.UseServerRuntime; http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderTest.java index b8898c4..baf484e 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderTest.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderTest.java @@ -23,6 +23,7 @@ import java.sql.Types; import java.util.Collection; import java.util.List; +import org.apache.cayenne.access.loader.DbLoaderConfiguration; import org.apache.cayenne.configuration.server.ServerRuntime; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dba.TypesMapping; @@ -41,6 +42,7 @@ import org.apache.cayenne.unit.di.server.UseServerRuntime; @UseServerRuntime(ServerCase.TESTMAP_PROJECT) public class DbLoaderTest extends ServerCase { + public static final DbLoaderConfiguration CONFIG = new DbLoaderConfiguration(); @Inject private ServerRuntime runtime; @@ -86,7 +88,7 @@ public class DbLoaderTest extends ServerCase { String tableLabel = adapter.tableTypeForTable(); - List<DbEntity> tables = loader.getTables(null, null, "%", new String[] { tableLabel }); + List<DbEntity> tables = loader.getTables(new DbLoaderConfiguration(), new String[] { tableLabel }); assertNotNull(tables); @@ -105,20 +107,21 @@ public class DbLoaderTest extends ServerCase { public void testLoadWithMeaningfulPK() throws Exception { DataMap map = new DataMap(); - String tableLabel = adapter.tableTypeForTable(); + String[] tableLabel = { adapter.tableTypeForTable() }; loader.setCreatingMeaningfulPK(true); - List<DbEntity> testLoader = loader.getTables(null, null, "artist", new String[] { tableLabel }); - if (testLoader.size() == 0) { - testLoader = loader.getTables(null, null, "ARTIST", new String[] { tableLabel }); + List<DbEntity> testLoader = loader.getTables(CONFIG, tableLabel); + if (testLoader.isEmpty()) { + testLoader = loader.getTables(CONFIG, tableLabel); } - loader.loadDbEntities(map, testLoader); + List<DbEntity> entities = loader.loadDbEntities(map, CONFIG, testLoader); + loader.loadObjEntities(map, CONFIG, entities); - loader.loadObjEntities(map); ObjEntity artist = map.getObjEntity("Artist"); assertNotNull(artist); + ObjAttribute id = artist.getAttribute("artistId"); assertNotNull(id); } @@ -141,7 +144,7 @@ public class DbLoaderTest extends ServerCase { String tableLabel = adapter.tableTypeForTable(); // *** TESTING THIS *** - loader.loadDbEntities(map, loader.getTables(null, null, "%", new String[] { tableLabel })); + List<DbEntity> entities = loader.loadDbEntities(map, CONFIG, loader.getTables(CONFIG, new String[]{tableLabel})); assertDbEntities(map); @@ -150,12 +153,12 @@ public class DbLoaderTest extends ServerCase { } // *** TESTING THIS *** - loader.loadDbRelationships(map); + loader.loadDbRelationships(map, CONFIG, entities); if (supportsFK) { Collection<DbRelationship> rels = getDbEntity(map, "ARTIST").getRelationships(); assertNotNull(rels); - assertTrue(rels.size() > 0); + assertTrue(!rels.isEmpty()); // test one-to-one rels = getDbEntity(map, "PAINTING").getRelationships(); @@ -182,7 +185,7 @@ public class DbLoaderTest extends ServerCase { // *** TESTING THIS *** loader.setCreatingMeaningfulPK(false); - loader.loadObjEntities(map); + loader.loadObjEntities(map, CONFIG, entities); assertObjEntities(map); @@ -277,7 +280,7 @@ public class DbLoaderTest extends ServerCase { assertNotNull(blobEnt); // BLOBs should be mapped as byte[] ObjAttribute blobAttr = blobEnt.getAttribute("blobCol"); - assertNotNull("BlobTest.blobCol failed to load", blobAttr); + assertNotNull("BlobTest.blobCol failed to doLoad", blobAttr); assertEquals("byte[]", blobAttr.getType()); ObjEntity clobEnt = map.getObjEntity("ClobTest"); assertNotNull(clobEnt); @@ -359,19 +362,200 @@ public class DbLoaderTest extends ServerCase { } } - private String msgForTypeMismatch(DbAttribute origAttr, DbAttribute newAttr) { + private static String msgForTypeMismatch(DbAttribute origAttr, DbAttribute newAttr) { return msgForTypeMismatch(origAttr.getType(), newAttr); } - private String msgForTypeMismatch(int origType, DbAttribute newAttr) { + private static String msgForTypeMismatch(int origType, DbAttribute newAttr) { String nt = TypesMapping.getSqlNameByType(newAttr.getType()); String ot = TypesMapping.getSqlNameByType(origType); return attrMismatch(newAttr.getName(), "expected type: <" + ot + ">, but was <" + nt + ">"); } - private String attrMismatch(String attrName, String msg) { - StringBuffer buf = new StringBuffer(); - buf.append("[Error loading attribute '").append(attrName).append("': ").append(msg).append("]"); - return buf.toString(); + private static String attrMismatch(String attrName, String msg) { + return "[Error loading attribute '" + attrName + "': " + msg + "]"; + } + +/* + TODO + + @Test + public void testCreateLoader() throws Exception { + + DbLoader loader = parameters.createLoader(mock(DbAdapter.class), connection, + mock(DbLoaderDelegate.class)); + assertNotNull(loader); + assertSame(connection, loader.getConnection()); + + assertTrue(loader.includeTableName("dummy")); + } + + @Test + public void testCreateLoader_IncludeExclude() throws Exception { + DbImportConfiguration parameters = new DbImportConfiguration(); + parameters.setIncludeTables("a,b,c*"); + + DbLoader loader1 = parameters.createLoader(mock(DbAdapter.class), mock(Connection.class), + mock(DbLoaderDelegate.class)); + + assertFalse(loader1.includeTableName("dummy")); + assertFalse(loader1.includeTableName("ab")); + assertTrue(loader1.includeTableName("a")); + assertTrue(loader1.includeTableName("b")); + assertTrue(loader1.includeTableName("cd")); + + parameters.setExcludeTables("cd"); + + DbLoader loader2 = parameters.createLoader(mock(DbAdapter.class), mock(Connection.class), + mock(DbLoaderDelegate.class)); + + assertFalse(loader2.includeTableName("dummy")); + assertFalse(loader2.includeTableName("ab")); + assertTrue(loader2.includeTableName("a")); + assertTrue(loader2.includeTableName("b")); + assertFalse(loader2.includeTableName("cd")); + assertTrue(loader2.includeTableName("cx")); } + + + @Test + public void testCreateLoader_MeaningfulPk_Default() throws Exception { + DbImportConfiguration parameters = new DbImportConfiguration(); + assertNull(parameters.getMeaningfulPkTables()); + + DbLoader loader1 = parameters.createLoader(mock(DbAdapter.class), mock(Connection.class), + mock(DbLoaderDelegate.class)); + + DataMap map = new DataMap(); + + DbEntity e1 = new DbEntity("e1"); + DbAttribute pk = new DbAttribute("pk", Types.INTEGER, e1); + pk.setPrimaryKey(true); + e1.addAttribute(pk); + DbAttribute nonPk = new DbAttribute("nonPk", Types.INTEGER, e1); + e1.addAttribute(nonPk); + + map.addDbEntity(e1); + + // DbLoader is so ugly and hard to test.. + Field dbEntityList = DbLoader.class.getDeclaredField("dbEntityList"); + dbEntityList.setAccessible(true); + List<DbEntity> entities = (List<DbEntity>) dbEntityList.get(loader1); + entities.add(e1); + + loader1.loadObjEntities(map, entities); + + ObjEntity oe1 = map.getObjEntity("E1"); + assertEquals(1, oe1.getAttributes().size()); + assertNotNull(oe1.getAttribute("nonPk")); + } + + @Test + public void testCreateLoader_MeaningfulPk_Specified() throws Exception { + DbImportConfiguration parameters = new DbImportConfiguration(); + parameters.setMeaningfulPkTables("a*"); + + DbLoader loader1 = parameters.createLoader(mock(DbAdapter.class), mock(Connection.class), + mock(DbLoaderDelegate.class)); + + // DbLoader is so ugly and hard to test.. + Field dbEntityList = DbLoader.class.getDeclaredField("dbEntityList"); + dbEntityList.setAccessible(true); + Collection<DbEntity> entities = (List<DbEntity>) dbEntityList.get(loader1); + + DataMap map = new DataMap(); + + DbEntity e1 = new DbEntity("e1"); + DbAttribute pk = new DbAttribute("pk", Types.INTEGER, e1); + pk.setPrimaryKey(true); + e1.addAttribute(pk); + DbAttribute nonPk = new DbAttribute("nonPk", Types.INTEGER, e1); + e1.addAttribute(nonPk); + + map.addDbEntity(e1); + entities.add(e1); + + DbEntity a1 = new DbEntity("a1"); + DbAttribute apk = new DbAttribute("pk", Types.INTEGER, a1); + apk.setPrimaryKey(true); + a1.addAttribute(apk); + DbAttribute anonPk = new DbAttribute("nonPk", Types.INTEGER, a1); + a1.addAttribute(anonPk); + + map.addDbEntity(a1); + entities.add(a1); + + loader1.loadObjEntities(map, entities); + + ObjEntity oe1 = map.getObjEntity("E1"); + assertEquals(1, oe1.getAttributes().size()); + assertNotNull(oe1.getAttribute("nonPk")); + + ObjEntity oe2 = map.getObjEntity("A1"); + assertEquals(2, oe2.getAttributes().size()); + assertNotNull(oe2.getAttribute("nonPk")); + assertNotNull(oe2.getAttribute("pk")); + } + + @Test + public void testCreateLoader_UsePrimitives_False() throws Exception { + DbImportConfiguration parameters = new DbImportConfiguration(); + parameters.setUsePrimitives(false); + + DbLoader loader1 = parameters.createLoader(mock(DbAdapter.class), mock(Connection.class), + mock(DbLoaderDelegate.class)); + + DataMap map = new DataMap(); + + DbEntity e1 = new DbEntity("e1"); + DbAttribute nonPk = new DbAttribute("nonPk", Types.INTEGER, e1); + e1.addAttribute(nonPk); + + map.addDbEntity(e1); + + // DbLoader is so ugly and hard to test.. + Field dbEntityList = DbLoader.class.getDeclaredField("dbEntityList"); + dbEntityList.setAccessible(true); + List<DbEntity> entities = (List<DbEntity>) dbEntityList.get(loader1); + entities.add(e1); + + loader1.loadObjEntities(map, entities); + + ObjEntity oe1 = map.getObjEntity("E1"); + + ObjAttribute oa1 = oe1.getAttribute("nonPk"); + assertEquals("java.lang.Integer", oa1.getType()); + } + + @Test + public void testCreateLoader_UsePrimitives_True() throws Exception { + DbImportConfiguration parameters = new DbImportConfiguration(); + parameters.setUsePrimitives(true); + + DbLoader loader1 = parameters.createLoader(mock(DbAdapter.class), mock(Connection.class), + mock(DbLoaderDelegate.class)); + + DataMap map = new DataMap(); + + DbEntity e1 = new DbEntity("e1"); + DbAttribute nonPk = new DbAttribute("nonPk", Types.INTEGER, e1); + e1.addAttribute(nonPk); + + map.addDbEntity(e1); + + // DbLoader is so ugly and hard to test.. + Field dbEntityList = DbLoader.class.getDeclaredField("dbEntityList"); + dbEntityList.setAccessible(true); + List<DbEntity> entities = (List<DbEntity>) dbEntityList.get(loader1); + entities.add(e1); + + loader1.loadObjEntities(map, entities); + + ObjEntity oe1 = map.getObjEntity("E1"); + + ObjAttribute oa1 = oe1.getAttribute("nonPk"); + assertEquals("int", oa1.getType()); + } +*/ + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java deleted file mode 100644 index 7be3c3d..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/ManyToManyCandidateEntityTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/***************************************************************** - * 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.cayenne.access; - -import junit.framework.TestCase; - -import org.apache.cayenne.configuration.ConfigurationNameMapper; -import org.apache.cayenne.configuration.ConfigurationTree; -import org.apache.cayenne.configuration.DataChannelDescriptor; -import org.apache.cayenne.configuration.DataMapLoader; -import org.apache.cayenne.configuration.DefaultConfigurationNameMapper; -import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader; -import org.apache.cayenne.configuration.XMLDataMapLoader; -import org.apache.cayenne.di.AdhocObjectFactory; -import org.apache.cayenne.di.Binder; -import org.apache.cayenne.di.ClassLoaderManager; -import org.apache.cayenne.di.DIBootstrap; -import org.apache.cayenne.di.Injector; -import org.apache.cayenne.di.Module; -import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory; -import org.apache.cayenne.di.spi.DefaultClassLoaderManager; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.Relationship; -import org.apache.cayenne.map.naming.LegacyNameGenerator; -import org.apache.cayenne.resource.URLResource; - -import java.net.URL; -import java.util.ArrayList; - -public class ManyToManyCandidateEntityTest extends TestCase { - - private DataMap map; - - @Override - public void setUp() throws Exception { - Module testModule = new Module() { - - public void configure(Binder binder) { - binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class); - binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class); - binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class); - binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class); - } - }; - - Injector injector = DIBootstrap.createInjector(testModule); - - // create and initialize loader instance to test - XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader(); - injector.injectMembers(loader); - - String testConfigName = "relationship-optimisation"; - URL url = getClass().getResource("cayenne-" + testConfigName + ".xml"); - - ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url)); - - map = tree.getRootNode().getDataMap(testConfigName); - } - - public void testMatchingForManyToManyEntity() throws Exception { - ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2"); - - assertNotNull(ManyToManyCandidateEntity.build(manyToManyEntity)); - } - - public void testMatchingForNotManyToManyEntity() throws Exception { - ObjEntity entity = map.getObjEntity("Table1"); - - assertNull(ManyToManyCandidateEntity.build(entity)); - } - - public void testOptimisationForManyToManyEntity() { - ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2"); - - ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(new LegacyNameGenerator()); - - ObjEntity table1Entity = map.getObjEntity("Table1"); - ObjEntity table2Entity = map.getObjEntity("Table2"); - - assertEquals(1, table1Entity.getRelationships().size()); - assertEquals(table2Entity, new ArrayList<Relationship>(table1Entity.getRelationships()).get(0) - .getTargetEntity()); - - assertEquals(1, table2Entity.getRelationships().size()); - assertEquals(table1Entity, new ArrayList<Relationship>(table2Entity.getRelationships()).get(0) - .getTargetEntity()); - } - -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntityTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntityTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntityTest.java new file mode 100644 index 0000000..4348edf --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/ManyToManyCandidateEntityTest.java @@ -0,0 +1,106 @@ +/***************************************************************** + * 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.cayenne.access.loader; + +import junit.framework.TestCase; + +import org.apache.cayenne.configuration.ConfigurationNameMapper; +import org.apache.cayenne.configuration.ConfigurationTree; +import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.DataMapLoader; +import org.apache.cayenne.configuration.DefaultConfigurationNameMapper; +import org.apache.cayenne.configuration.XMLDataChannelDescriptorLoader; +import org.apache.cayenne.configuration.XMLDataMapLoader; +import org.apache.cayenne.di.AdhocObjectFactory; +import org.apache.cayenne.di.Binder; +import org.apache.cayenne.di.ClassLoaderManager; +import org.apache.cayenne.di.DIBootstrap; +import org.apache.cayenne.di.Injector; +import org.apache.cayenne.di.Module; +import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory; +import org.apache.cayenne.di.spi.DefaultClassLoaderManager; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.map.Relationship; +import org.apache.cayenne.map.naming.LegacyNameGenerator; +import org.apache.cayenne.resource.URLResource; + +import java.net.URL; +import java.util.ArrayList; + +public class ManyToManyCandidateEntityTest extends TestCase { + + private DataMap map; + + @Override + public void setUp() throws Exception { + Module testModule = new Module() { + + public void configure(Binder binder) { + binder.bind(ClassLoaderManager.class).to(DefaultClassLoaderManager.class); + binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class); + binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class); + binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class); + } + }; + + Injector injector = DIBootstrap.createInjector(testModule); + + // create and initialize loader instance to test + XMLDataChannelDescriptorLoader loader = new XMLDataChannelDescriptorLoader(); + injector.injectMembers(loader); + + String testConfigName = "relationship-optimisation"; + URL url = getClass().getResource("cayenne-" + testConfigName + ".xml"); + + ConfigurationTree<DataChannelDescriptor> tree = loader.load(new URLResource(url)); + + map = tree.getRootNode().getDataMap(testConfigName); + } + + public void testMatchingForManyToManyEntity() throws Exception { + ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2"); + + assertNotNull(ManyToManyCandidateEntity.build(manyToManyEntity)); + } + + public void testMatchingForNotManyToManyEntity() throws Exception { + ObjEntity entity = map.getObjEntity("Table1"); + + assertNull(ManyToManyCandidateEntity.build(entity)); + } + + public void testOptimisationForManyToManyEntity() { + ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2"); + + ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(new LegacyNameGenerator()); + + ObjEntity table1Entity = map.getObjEntity("Table1"); + ObjEntity table2Entity = map.getObjEntity("Table2"); + + assertEquals(1, table1Entity.getRelationships().size()); + assertEquals(table2Entity, new ArrayList<Relationship>(table1Entity.getRelationships()).get(0) + .getTargetEntity()); + + assertEquals(1, table2Entity.getRelationships().size()); + assertEquals(table1Entity, new ArrayList<Relationship>(table2Entity.getRelationships()).get(0) + .getTargetEntity()); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java new file mode 100644 index 0000000..60d4933 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java @@ -0,0 +1,75 @@ +/* + * 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.cayenne.access.loader.filters; + +import org.junit.Test; + +import static org.apache.cayenne.access.loader.filters.FiltersFactory.path; +import static org.junit.Assert.*; + +public class DbPathTest { + + @Test + public void testIsCover() throws Exception { + assertTrue(path(null, null).isCover(path("Hello", "World"))); + assertTrue(path(null, null).isCover(path("Hello", null))); + assertTrue(path(null, null).isCover(path(null, null))); + assertTrue(path(null, "Yo").isCover(path("Yo!", "Yo"))); + assertTrue(path(null, "Yo").isCover(path(null, "Yo"))); + + assertFalse(path(null, "Yo!").isCover(path(null, "Yo!!"))); + assertFalse(path("aa", "Yo!").isCover(path(null, "Yo!!"))); + assertFalse(path("aaa", "Yo!").isCover(path("aa", "Yo!!"))); + + assertTrue(path("aa", null).isCover(path("aa", null))); + assertTrue(path("aa", null).isCover(path("aa", "bb"))); + assertTrue(path("aa", "Yo!").isCover(path("aa", "Yo!"))); + assertFalse(path("aa", "Yo!").isCover(path("aa", "Yo!!"))); + + assertFalse(path("", "APP").isCover(path(null, null))); + + assertTrue(path(null, "schema_01").isCover(path("", "schema_01"))); + assertTrue(path(null, "schema_01").isCover(path(null, "schema_01"))); + assertFalse(path(null, "schema_01").isCover(path("", "schema_02"))); + assertFalse(path(null, "schema_02").isCover(path("", "schema_01"))); + } + + @Test + public void testToString() throws Exception { + assertEquals("%", path(null, null).toString()); + assertEquals("/schema", path("", "schema").toString()); + assertEquals("%/schema", path(null, "schema").toString()); + assertEquals("catalog/schema", path("catalog", "schema").toString()); + assertEquals("catalog//table", path("catalog", "", "table").toString()); + assertEquals("catalog/%/table", path("catalog", null, "table").toString()); + assertEquals("//table", path("", "", "table").toString()); + assertEquals("%/%/table", path(null, null, "table").toString()); + assertEquals("%", path(null, null, null).toString()); + assertEquals("c/%/", path("c", null, "").toString()); + } + + @Test + public void testMerge() throws Exception { + DbPath path1 = path(null, null); + DbPath path2 = path("", "APP"); + assertEquals(path1, path1.merge(path2)); + assertEquals(path1, path2.merge(path1)); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java new file mode 100644 index 0000000..5b936ac --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java @@ -0,0 +1,62 @@ +/* + * 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.cayenne.access.loader.filters; + +import org.junit.Test; + +import static org.apache.cayenne.access.loader.filters.FilterFactory.*; +import static org.junit.Assert.*; + +public class EntityFiltersTest { + + @Test + public void testJoinWithEmpty() throws Exception { + EntityFilters filter1 = new EntityFilters(null, null, null, null); + EntityFilters filter2 = new EntityFilters(null, include("table"), include("column"), include("procedure")); + + assertEquals(filter2, filter1.join(filter2)); + assertEquals(filter2, filter2.join(filter1)); + } + + @Test + public void testJoinExcludeInclude() throws Exception { + EntityFilters filter1 = new EntityFilters(null, exclude("table"), exclude("column"), exclude("procedure")); + EntityFilters filter2 = new EntityFilters(null, include("table"), include("column"), include("procedure")); + + assertEquals(new EntityFilters(null, + list(exclude("table"), include("table")), + list(exclude("column"), include("column")), + list(exclude("procedure"), include("procedure"))), + filter1.join(filter2)); + assertEquals(new EntityFilters(null, + list(include("table"), exclude("table")), + list(include("column"), exclude("column")), + list(include("procedure"), exclude("procedure"))), + filter2.join(filter1)); + } + + @Test + public void testEquals() throws Exception { + EntityFilters filters = new EntityFilters(new DbPath(), NULL, NULL, NULL); + assertTrue(filters.tableFilter().equals(NULL)); + assertTrue(filters.columnFilter().equals(NULL)); + assertTrue(filters.procedureFilter().equals(NULL)); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java new file mode 100644 index 0000000..c6097ec --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java @@ -0,0 +1,198 @@ +/* + * 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.cayenne.access.loader.filters; + +import org.junit.Test; + +import java.util.Iterator; +import java.util.List; + +import static org.apache.cayenne.access.loader.filters.FilterFactory.*; +import static org.apache.cayenne.access.loader.filters.FiltersFactory.path; +import static org.apache.cayenne.access.loader.filters.FiltersFactory.eFilters; +import static org.junit.Assert.*; + +public class FiltersConfigTest { + + @Test + public void testSorting() throws Exception { + FiltersConfig filters = new FiltersConfig( + entityFilter("", ""), + entityFilter("aaa", ""), + entityFilter("aa", ""), + entityFilter("aa", "a"), + entityFilter("aa", "aa"), + entityFilter("aa", "aa"), + entityFilter("b", "b") + ); + + Iterator<DbPath> iterator = filters.getDbPaths().iterator(); + assertEquals(path("", ""), iterator.next()); + assertEquals(path("aa", ""), iterator.next()); + assertEquals(path("aa", "a"), iterator.next()); + assertEquals(path("aa", "aa"), iterator.next()); + assertEquals(path("aaa", ""), iterator.next()); + assertEquals(path("b", "b"), iterator.next()); + } + + private EntityFilters entityFilter(String s, String s1) { + return new EntityFilters(new DbPath(s, s1), include("IncludeTable"), TRUE, TRUE); + } + + @Test + public void testActionsWithEmptyCatalog() throws Exception { + FiltersConfig filters = new FiltersConfig( + entityFilter(null, null), + entityFilter("aaa", null), + entityFilter("aa", null) + ); + + List<DbPath> actions = filters.pathsForQueries(); + assertEquals(1L, actions.size()); + assertEquals(path(), actions.get(0)); + } + + @Test + public void testActionsWithEmptySchemas() throws Exception { + FiltersConfig filters = new FiltersConfig( + entityFilter("aaa", null), + entityFilter("aaa", "11"), + entityFilter("aa", null), + entityFilter("aa", "a"), + entityFilter("aa", "aa"), + entityFilter("aa", "aa") + ); + + + List<DbPath> actions = filters.pathsForQueries(); + assertEquals(2L, actions.size()); + assertEquals(path("aa", null), actions.get(0)); + assertEquals(path("aaa", null), actions.get(1)); + } + + @Test + public void testActionsWithSchemas() throws Exception { + FiltersConfig filters = new FiltersConfig( + entityFilter("aaa", ""), + entityFilter("aa", "a"), + entityFilter("aa", "aa"), + entityFilter("aa", "aa"), + entityFilter("aa", "b"), + entityFilter("aa", "b"), + entityFilter("aa", "b") + ); + + + List<DbPath> actions = filters.pathsForQueries(); + assertEquals(4L, actions.size()); + assertEquals(path("aa", "a"), actions.get(0)); + assertEquals(path("aa", "aa"), actions.get(1)); + assertEquals(path("aa", "b"), actions.get(2)); + assertEquals(path("aaa", ""), actions.get(3)); + } + + @Test + public void testActionsWithSchemasAndEmptyCatalog() throws Exception { + FiltersConfig filters = new FiltersConfig( + entityFilter("", "a"), + entityFilter("", "aa"), + entityFilter("", "aa"), + entityFilter("", "b"), + entityFilter("", "b"), + entityFilter("", "b") + ); + + + List<DbPath> actions = filters.pathsForQueries(); + assertEquals(3L, actions.size()); + assertEquals(path("", "b"), actions.get(2)); + assertEquals(path("", "aa"), actions.get(1)); + assertEquals(path("", "a"), actions.get(0)); + + } + + @Test + public void testFiltersOneFilter() throws Exception { + FiltersConfig filters = new FiltersConfig( + eFilters(path("", "a"), include("table")), + entityFilter("", "aa"), + entityFilter("", "aa"), + entityFilter("", "b"), + entityFilter("", "b"), + entityFilter("", "b") + ); + + assertEquals(eFilters(path("", "a"), include("table")), + filters.filter(path("", "a"))); + } + + @Test + public void testFiltersJoinFilters() throws Exception { + FiltersConfig filters = new FiltersConfig( + eFilters(path("", "a"), include("table")), + eFilters(path("", "a"), exclude("table")), + entityFilter("", "aa"), + entityFilter("", "aa") + ); + + assertEquals(eFilters(path("", "a"), list(include("table"), exclude("table"))), + filters.filter(path("", "a"))); + + assertEquals(entityFilter("", "aa"), filters.filter(path("", "aa"))); + } + + @Test + public void testFiltersJoinFiltersWithNull() throws Exception { + FiltersConfig filters = new FiltersConfig( + eFilters(path("", "a"), include("table")), + eFilters(path("", "a"), exclude("table")), + eFilters(path("", "a"), null) + ); + + assertEquals(eFilters(path("", "a"), list(include("table"), exclude("table"))), + filters.filter(path("", "a"))); + } + + @Test + public void testFiltersTopLevelTables() throws Exception { + FiltersConfig filters = new FiltersConfig( + eFilters(path(null, null), include("TableName")) + ); + + assertEquals(eFilters(path(null, null), include("TableName")), + filters.filter(path("", "APP"))); + } + + @Test + public void testFiltersFor2Schemas() throws Exception { + FiltersConfig filters = new FiltersConfig( + eFilters(path(null, "schema_01"), include("TableName_01")), + eFilters(path(null, "schema_02"), include("TableName_01")) + ); + + assertEquals( + eFilters(path(null, "schema_01"), include("TableName_01")), + filters.filter(path("", "schema_01"))); + + assertEquals("In case we don't have filter that cover path we should return null filter ", + eFilters(path("", "app"), null), + filters.filter(path("", "app"))); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java new file mode 100644 index 0000000..1ef7428 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java @@ -0,0 +1,44 @@ +/* + * 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.cayenne.access.loader.filters; + +/** + * @since 3.2. + */ +public class FiltersFactory { + + public static DbPath path(String catalog, String schema, String table) { + return new DbPath(catalog, schema, table); + } + + public static DbPath path(String catalog, String schema) { + return new DbPath(catalog, schema); + } + + public static DbPath path() { + return new DbPath(); + } + + public static EntityFilters eFilters(DbPath path, Filter<String> tableFilter) { + return new EntityFilters(path, tableFilter, null, null); + } + public static EntityFilters eFilters(DbPath path, Filter<String> table, Filter<String> column, Filter<String> proc) { + return new EntityFilters(path, table, column, proc); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/mapper/DbTypeTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/mapper/DbTypeTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/mapper/DbTypeTest.java new file mode 100644 index 0000000..8b2e8d4 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/mapper/DbTypeTest.java @@ -0,0 +1,87 @@ +/* + * 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.cayenne.access.loader.mapper; + +import org.junit.Test; + +import java.util.Iterator; +import java.util.TreeSet; + +import static org.junit.Assert.*; + +public class DbTypeTest { + + @Test + public void testCompareTo() throws Exception { + TreeSet<DbType> set = new TreeSet<DbType>(); + set.add(new DbType("type-01", null, null, null, null)); + set.add(new DbType("type-02", null, null, null, null)); + set.add(new DbType("type-02", 1, null, null, null)); + set.add(new DbType("type-02", 2, null, null, null)); + set.add(new DbType("type-02", 2, null, null, true)); + set.add(new DbType("type-02", 2, null, null, false)); + set.add(new DbType("type-02", 2, null, 5, null)); + set.add(new DbType("type-02", 2, null, 5, false)); + set.add(new DbType("type-02", 2, null, 5, true)); + set.add(new DbType("type-02", null, 8, 5, true)); + set.add(new DbType("type-02", null, 9, 5, true)); + + Iterator<DbType> iterator = set.iterator(); + assertEquals(new DbType("type-02", 2, null, 5, true), iterator.next()); + assertEquals(new DbType("type-02", 2, null, 5, false), iterator.next()); + assertEquals(new DbType("type-02", null, 9, 5, true), iterator.next()); + assertEquals(new DbType("type-02", null, 8, 5, true), iterator.next()); + assertEquals(new DbType("type-02", 2, null, 5, null), iterator.next()); + assertEquals(new DbType("type-02", 2, null, null, true), iterator.next()); + assertEquals(new DbType("type-02", 2, null, null, false), iterator.next()); + assertEquals(new DbType("type-02", 2, null, null, null), iterator.next()); + assertEquals(new DbType("type-02", 1, null, null, null), iterator.next()); + assertEquals(new DbType("type-02", null, null, null, null), iterator.next()); + assertEquals(new DbType("type-01", null, null, null, null), iterator.next()); + } + + @Test + public void testCover() throws Exception { + DbType typeJava = new DbType("java"); + assertTrue(typeJava.isCover(typeJava)); + assertTrue(typeJava.isCover(new DbType("java", 1, 1, 1, null))); + assertTrue(typeJava.isCover(new DbType("java", 1, null, null, null))); + assertTrue(typeJava.isCover(new DbType("java", null, 1, null, null))); + assertTrue(typeJava.isCover(new DbType("java", null, null, 1, null))); + assertTrue(typeJava.isCover(new DbType("java", null, null, null, true))); + assertTrue(typeJava.isCover(new DbType("java", null, null, null, false))); + assertFalse(typeJava.isCover(new DbType("java1", null, null, null, null))); + + DbType typeWithLength = new DbType("java", 1, null, null, null); + assertTrue(typeWithLength.isCover(typeWithLength)); + assertTrue(typeWithLength.isCover(new DbType("java", 1, null, 1, null))); + assertTrue(typeWithLength.isCover(new DbType("java", 1, null, 1, true))); + assertTrue(typeWithLength.isCover(new DbType("java", 1, null, null, true))); + assertTrue(typeWithLength.isCover(new DbType("java", 1, 1, null, true))); + assertFalse(typeWithLength.isCover(new DbType("java", 2, null, null, null))); + assertFalse(typeWithLength.isCover(new DbType("java", null, null, null, true))); + assertFalse(typeWithLength.isCover(new DbType("java1", 2, null, null, null))); + + DbType typeWithLengthAndNotNull = new DbType("java", 1, null, null, true); + assertTrue(typeWithLength.isCover(typeWithLengthAndNotNull)); + assertTrue(typeWithLength.isCover(new DbType("java", 1, null, 1, true))); + assertTrue(typeWithLength.isCover(new DbType("java", 1, 1, 1, true))); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java b/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java index dc8a349..1305229 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/merge/MergeCase.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.List; import org.apache.cayenne.access.DataNode; +import org.apache.cayenne.access.loader.DbLoaderConfiguration; import org.apache.cayenne.configuration.server.ServerRuntime; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.di.Inject; @@ -98,7 +99,7 @@ public abstract class MergeCase extends ServerCase { } protected DbMerger createMerger(MergerFactory mergerFactory, ValueForNullProvider valueForNullProvider) { - return new DbMerger(mergerFactory, valueForNullProvider, null) { + return new DbMerger(mergerFactory, valueForNullProvider) { @Override public boolean includeTableName(String tableName) { @@ -108,7 +109,7 @@ public abstract class MergeCase extends ServerCase { } protected List<MergerToken> createMergeTokens() { - return createMerger(node.getAdapter().mergerFactory()).createMergeTokens(node, map); + return createMerger(node.getAdapter().mergerFactory()).createMergeTokens(node, map, new DbLoaderConfiguration()); } /** http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/resources/org/apache/cayenne/access/cayenne-relationship-optimisation.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/org/apache/cayenne/access/cayenne-relationship-optimisation.xml b/cayenne-server/src/test/resources/org/apache/cayenne/access/cayenne-relationship-optimisation.xml deleted file mode 100644 index d4fea49..0000000 --- a/cayenne-server/src/test/resources/org/apache/cayenne/access/cayenne-relationship-optimisation.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<domain project-version="6"> - <map name="relationship-optimisation"/> -</domain> http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/cayenne-relationship-optimisation.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/cayenne-relationship-optimisation.xml b/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/cayenne-relationship-optimisation.xml new file mode 100644 index 0000000..d4fea49 --- /dev/null +++ b/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/cayenne-relationship-optimisation.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<domain project-version="6"> + <map name="relationship-optimisation"/> +</domain> http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/relationship-optimisation.map.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/relationship-optimisation.map.xml b/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/relationship-optimisation.map.xml new file mode 100644 index 0000000..e68645f --- /dev/null +++ b/cayenne-server/src/test/resources/org/apache/cayenne/access/loader/relationship-optimisation.map.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd" + project-version="6"> + <property name="defaultPackage" value="com.objectstyle"/> + <db-entity name="table1" catalog="many_to_many_test"> + <db-attribute name="id1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> + <db-attribute name="table1col" type="VARCHAR" length="45"/> + </db-entity> + <db-entity name="table1_table2" catalog="many_to_many_test"> + <db-attribute name="fk1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> + <db-attribute name="fk2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> + </db-entity> + <db-entity name="table2" catalog="many_to_many_test"> + <db-attribute name="id2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> + <db-attribute name="table2col" type="VARCHAR" length="45"/> + </db-entity> + <obj-entity name="Table1" className="com.objectstyle.Table1" dbEntityName="table1"> + <obj-attribute name="table1col" type="java.lang.String" db-attribute-path="table1col"/> + </obj-entity> + <obj-entity name="Table1Table2" className="com.objectstyle.Table1Table2" dbEntityName="table1_table2"> + </obj-entity> + <obj-entity name="Table2" className="com.objectstyle.Table2" dbEntityName="table2"> + <obj-attribute name="table2col" type="java.lang.String" db-attribute-path="table2col"/> + </obj-entity> + <db-relationship name="table1Table2Array" source="table1" target="table1_table2" toDependentPK="true" toMany="true"> + <db-attribute-pair source="id1" target="fk1"/> + </db-relationship> + <db-relationship name="toTable1" source="table1_table2" target="table1" toMany="false"> + <db-attribute-pair source="fk1" target="id1"/> + </db-relationship> + <db-relationship name="toTable2" source="table1_table2" target="table2" toMany="false"> + <db-attribute-pair source="fk2" target="id2"/> + </db-relationship> + <db-relationship name="table1Table2Array" source="table2" target="table1_table2" toDependentPK="true" toMany="true"> + <db-attribute-pair source="id2" target="fk2"/> + </db-relationship> + <obj-relationship name="table1Table2Array" source="Table1" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/> + <obj-relationship name="toTable1" source="Table1Table2" target="Table1" deleteRule="Nullify" db-relationship-path="toTable1"/> + <obj-relationship name="toTable2" source="Table1Table2" target="Table2" deleteRule="Nullify" db-relationship-path="toTable2"/> + <obj-relationship name="table1Table2Array" source="Table2" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/> +</data-map> http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-server/src/test/resources/org/apache/cayenne/access/relationship-optimisation.map.xml ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/resources/org/apache/cayenne/access/relationship-optimisation.map.xml b/cayenne-server/src/test/resources/org/apache/cayenne/access/relationship-optimisation.map.xml deleted file mode 100644 index e68645f..0000000 --- a/cayenne-server/src/test/resources/org/apache/cayenne/access/relationship-optimisation.map.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd" - project-version="6"> - <property name="defaultPackage" value="com.objectstyle"/> - <db-entity name="table1" catalog="many_to_many_test"> - <db-attribute name="id1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> - <db-attribute name="table1col" type="VARCHAR" length="45"/> - </db-entity> - <db-entity name="table1_table2" catalog="many_to_many_test"> - <db-attribute name="fk1" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> - <db-attribute name="fk2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> - </db-entity> - <db-entity name="table2" catalog="many_to_many_test"> - <db-attribute name="id2" type="INTEGER" isPrimaryKey="true" isMandatory="true" length="10"/> - <db-attribute name="table2col" type="VARCHAR" length="45"/> - </db-entity> - <obj-entity name="Table1" className="com.objectstyle.Table1" dbEntityName="table1"> - <obj-attribute name="table1col" type="java.lang.String" db-attribute-path="table1col"/> - </obj-entity> - <obj-entity name="Table1Table2" className="com.objectstyle.Table1Table2" dbEntityName="table1_table2"> - </obj-entity> - <obj-entity name="Table2" className="com.objectstyle.Table2" dbEntityName="table2"> - <obj-attribute name="table2col" type="java.lang.String" db-attribute-path="table2col"/> - </obj-entity> - <db-relationship name="table1Table2Array" source="table1" target="table1_table2" toDependentPK="true" toMany="true"> - <db-attribute-pair source="id1" target="fk1"/> - </db-relationship> - <db-relationship name="toTable1" source="table1_table2" target="table1" toMany="false"> - <db-attribute-pair source="fk1" target="id1"/> - </db-relationship> - <db-relationship name="toTable2" source="table1_table2" target="table2" toMany="false"> - <db-attribute-pair source="fk2" target="id2"/> - </db-relationship> - <db-relationship name="table1Table2Array" source="table2" target="table1_table2" toDependentPK="true" toMany="true"> - <db-attribute-pair source="id2" target="fk2"/> - </db-relationship> - <obj-relationship name="table1Table2Array" source="Table1" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/> - <obj-relationship name="toTable1" source="Table1Table2" target="Table1" deleteRule="Nullify" db-relationship-path="toTable1"/> - <obj-relationship name="toTable2" source="Table1Table2" target="Table2" deleteRule="Nullify" db-relationship-path="toTable2"/> - <obj-relationship name="table1Table2Array" source="Table2" target="Table1Table2" deleteRule="Deny" db-relationship-path="table1Table2Array"/> -</data-map> http://git-wip-us.apache.org/repos/asf/cayenne/blob/fde7761f/cayenne-tools/pom.xml ---------------------------------------------------------------------- diff --git a/cayenne-tools/pom.xml b/cayenne-tools/pom.xml index 835b909..d48a654 100644 --- a/cayenne-tools/pom.xml +++ b/cayenne-tools/pom.xml @@ -66,6 +66,12 @@ <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> </dependency> + <dependency> + <groupId>org.apache.ant</groupId> + <artifactId>ant-testutil</artifactId> + <version>1.9.4</version> + <scope>test</scope> + </dependency> <dependency> <groupId>commons-collections</groupId> @@ -115,6 +121,16 @@ <groupId>net.java.dev.inflector</groupId> <artifactId>inflector</artifactId> </dependency> + <dependency> + <groupId>org.apache.derby</groupId> + <artifactId>derby</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>xmlunit</groupId> + <artifactId>xmlunit</artifactId> + <scope>test</scope> + </dependency> </dependencies> @@ -131,6 +147,16 @@ </executions> </plugin> <plugin> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> <artifactId>maven-checkstyle-plugin</artifactId> <!--<configuration> <suppressionsLocation>${project.basedir}/cayenne-checkstyle-suppression.xml</suppressionsLocation>