Java源码示例:org.apache.cayenne.ObjectContext

示例1
@Before
public void before() {

    ObjectContext sharedContext = TestWithCayenneMapping.runtime.newContext();
    cayenneService = mock(ICayennePersister.class);
    when(cayenneService.sharedContext()).thenReturn(sharedContext);
    when(cayenneService.newContext()).thenReturn(TestWithCayenneMapping.runtime.newContext());

    IAttributeEncoderFactory aef = new AttributeEncoderFactory(new ValueEncodersProvider(Collections.emptyMap()).get());
    IStringConverterFactory stringConverterFactory = mock(IStringConverterFactory.class);
    IRelationshipMapper relationshipMapper = new SenchaRelationshipMapper();

    encoderService = new SenchaEncoderService(
            aef,
            stringConverterFactory,
            relationshipMapper,
            Collections.emptyMap());
}
 
示例2
protected <T extends DataObject> void doExecute(DeleteContext<T> context) {

        ObjectContext cayenneContext = CayenneDeleteStartStage.cayenneContext(context);

        // dirty ... we have no concept of DeleteResponse, and we need to
        // pass context to the ObjectMapper, so creating a throwaway response
        // and EntityUpdate .. TODO: somehow need to adapt ObjectMapper to
        // delete responses

        // delete by id
        if (context.isById()) {
            AgEntity<T> agEntity = metadataService.getAgEntity(context.getType());
            deleteById(context, cayenneContext, agEntity);
        }
        // delete by parent
        else if (context.getParent() != null) {
            AgEntity<?> parentAgEntity = metadataService.getAgEntity(context.getParent().getType());
            deleteByParent(context, cayenneContext, parentAgEntity);
        }
        // delete all !!
        else {
            deleteAll(context, cayenneContext);
        }
    }
 
示例3
private <T extends DataObject> void deleteByParent(DeleteContext<T> context, ObjectContext cayenneContext, AgEntity<?> agParentEntity) {

        EntityParent<?> parent = context.getParent();
        Object parentObject = CayenneUtil.findById(cayenneContext, parent.getType(), agParentEntity, parent.getId().get());

        if (parentObject == null) {
            ObjEntity entity = cayenneContext.getEntityResolver().getObjEntity(parent.getType());
            throw new AgException(Response.Status.NOT_FOUND, "No parent object for ID '" + parent.getId()
                    + "' and entity '" + entity.getName() + "'");
        }

        Expression qualifier = CayenneUtil.parentQualifier(parent, cayenneContext.getEntityResolver());
        SelectQuery<?> select = SelectQuery.query(context.getType());
        select.andQualifier(qualifier);

        List<?> objects = cayenneContext.select(select);

        cayenneContext.deleteObjects(objects);
        cayenneContext.commitChanges();
    }
 
示例4
private <T extends DataObject> void checkExisting(
        ObjectContext objectContext,
        AgEntity<T> agEntity,
        Map<DbAttribute, Object> idByDbAttribute,
        Map<String, Object> idByAgAttribute) {

    ObjectSelect<DataRow> query = ObjectSelect.dataRowQuery(agEntity.getType());
    for (Map.Entry<DbAttribute, Object> e : idByDbAttribute.entrySet()) {
        query.and(ExpressionFactory.matchDbExp(e.getKey().getName(), e.getValue()));
    }

    if (query.selectOne(objectContext) != null) {
        throw new AgException(Response.Status.BAD_REQUEST, "Can't create '"
                + agEntity.getName()
                + "' with id "
                + CompoundObjectId.mapToString(idByAgAttribute)
                + " - already exists");
    }
}
 
示例5
@SuppressWarnings("unchecked")
private Object getOptionalExistingObject(Class<?> type, ObjectContext context, Object id) {

    ObjEntity entity = context.getEntityResolver().getObjEntity(type);

    // sanity checking...
    if (entity == null) {
        throw new AgException(Response.Status.INTERNAL_SERVER_ERROR, "Unknown entity class: " + type);
    }

    // TODO: should we start using optimistic locking on PK by default
    // instead of SELECT/DELETE|UPDATE?

    String idName = entity.getPrimaryKeyNames().iterator().next();
    ObjectIdQuery select = new ObjectIdQuery(new ObjectId(entity.getName(), idName, id));

    return Cayenne.objectForQuery(context, select);
}
 
示例6
@GET
@Path("test_mix_up_relations")
public DataResponse<E5> test_mix_up_relations(@Context UriInfo uriInfo) {

    ObjectContext context = AgRuntime.service(ICayennePersister.class, config).sharedContext();

    AgEntityOverlay<E5> o1 = AgEntity
            .overlay(E5.class)
            .redefineToMany(E5.E3S.getName(), E2.class, e5 ->
                    ObjectSelect.query(E2.class)
                            .where(ExpressionFactory.greaterDbExp(E2.ID__PK_COLUMN, Cayenne.longPKForObject(e5)))
                            .select(context)
            );

    AgEntityOverlay<E2> o2 = AgEntity
            .overlay(E2.class)
            .redefineToOne("ex", E3.class, e2 ->
                    SelectById.query(E3.class, Cayenne.intPKForObject(e2)).selectOne(context)
            );

    return Ag.select(E5.class, config)
            .entityOverlay(o1)
            .entityOverlay(o2)
            .uri(uriInfo)
            .get();
}
 
示例7
public DataFrame merge(ObjectContext context, DataFrame df) {

        Index sourceSubIndex = df
                .getColumnsIndex()
                .dropLabels(CreateOrUpdateSegment.TARGET_COLUMN, CreateOrUpdateSegment.TARGET_CREATED_COLUMN);

        Map<TargetAttribute, Set<Object>> fks = collectFks(df, sourceSubIndex);
        Map<TargetAttribute, Map<Object, Object>> related = fetchRelated(context, fks);

        Index changeTrackingIndex = df.getColumnsIndex().addLabels(CreateOrUpdateSegment.TARGET_CHANGED_COLUMN);

        return df
                .map(df.getColumnsIndex(), (f, t) -> resolveFks(f, t, related))
                // TODO: rebuild "$lm_target" column individually instead of rebuilding the entire DataFrame
                .map(changeTrackingIndex, (f, t) -> merge(f, t, sourceSubIndex))
                .filterRows(r -> (boolean) r.get(CreateOrUpdateSegment.TARGET_CHANGED_COLUMN))
                .dropColumns(CreateOrUpdateSegment.TARGET_CHANGED_COLUMN);
    }
 
示例8
private <T extends DataObject> void deleteById(DeleteContext<T> context, ObjectContext cayenneContext, AgEntity<T> agEntity) {

        for (AgObjectId id : context.getIds()) {
            Object o = CayenneUtil.findById(cayenneContext, context.getType(), agEntity, id.get());

            if (o == null) {
                ObjEntity entity = cayenneContext.getEntityResolver().getObjEntity(context.getType());
                throw new AgException(Response.Status.NOT_FOUND, "No object for ID '" + id + "' and entity '"
                        + entity.getName() + "'");
            }

            cayenneContext.deleteObject(o);
        }
        cayenneContext.commitChanges();
    }
 
示例9
private <T extends DataObject> void deleteAll(DeleteContext<?> context, ObjectContext cayenneContext) {
    ObjEntity e = cayenneContext.getEntityResolver().getObjEntity(context.getType());

    // TODO: is this kosher? All other deletes are done via Cayenne and
    // hence process all delete rules. This one does not
    cayenneContext.performQuery(new EJBQLQuery("delete from " + e.getName()));
}
 
示例10
@SuppressWarnings("unchecked")
public static <A> A findById(ObjectContext context, Class<A> type, AgEntity<?> agEntity, Object id) {
    ObjEntity entity = context.getEntityResolver().getObjEntity(type);

    // sanity checking...
    if (entity == null) {
        throw new AgException(Status.INTERNAL_SERVER_ERROR, "Unknown entity class: " + type);
    }

    if (id == null) {
        throw new AgException(Status.BAD_REQUEST, "No id specified");
    }

    if (id instanceof Map) {
        Map<String, Object> ids = (Map<String, Object>) id;
        DbEntity dbEntity = entity.getDbEntity();

        ObjectSelect<A> query = ObjectSelect.query(type);
        for (Map.Entry<String, Object> entry : ids.entrySet()) {
            query.and(ExpressionFactory.matchDbExp(dbEntity.getAttribute(entry.getKey()).getName(), entry.getValue()));
        }
        return query.selectOne(context);
    } else {
        // TODO: this will break if this is am ID attribute not mapped as ObjAttribute in Cayenne
        AgAttribute attribute = agEntity.getIds().iterator().next();
        return ObjectSelect.query(type, new ASTEqual(attribute.getPathExp(), id)).selectOne(context);
    }
}
 
示例11
protected <T extends DataObject> void createSingle(UpdateContext<T> context, ObjectRelator relator, EntityUpdate<T> u) {

        ObjectContext objectContext = CayenneUpdateStartStage.cayenneContext(context);
        DataObject o = objectContext.newObject(context.getType());
        Map<String, Object> idByAgAttribute = u.getId();

        // set explicit ID
        if (idByAgAttribute != null) {

            if (context.isIdUpdatesDisallowed() && u.isExplicitId()) {
                throw new AgException(Response.Status.BAD_REQUEST, "Setting ID explicitly is not allowed: " + idByAgAttribute);
            }

            ObjEntity objEntity = objectContext.getEntityResolver().getObjEntity(context.getType());
            DbEntity dbEntity = objEntity.getDbEntity();
            AgEntity agEntity = context.getEntity().getAgEntity();

            Map<DbAttribute, Object> idByDbAttribute = mapToDbAttributes(agEntity, idByAgAttribute);

            if (isPrimaryKey(dbEntity, idByDbAttribute.keySet())) {
                createSingleFromPk(objEntity, idByDbAttribute, o);
            } else {
                // need to make an additional check that the AgId is unique
                checkExisting(objectContext, agEntity, idByDbAttribute, idByAgAttribute);
                createSingleFromIdValues(objEntity, idByDbAttribute, idByAgAttribute, o);
            }
        }

        mergeChanges(u, o, relator);
        relator.relateToParent(o);
    }
 
示例12
protected <T extends DataObject> void doExecute(UnrelateContext<T> context) {

        ObjectContext cayenneContext = CayenneUnrelateStartStage.cayenneContext(context);

        if (context.getId() != null) {
            unrelateSingle(context, cayenneContext);
        } else {
            unrelateAll(context, cayenneContext);
        }
    }
 
示例13
private <T extends DataObject> void unrelateSingle(UnrelateContext<T> context, ObjectContext cayenneContext) {

        // validate relationship before doing anything else
        AgRelationship relationship = metadataService.getAgRelationship(
                context.getParent().getType(),
                context.getParent().getRelationship());

        DataObject parent = (DataObject) getExistingObject(context.getParent().getType(), cayenneContext, context
                .getParent().getId().get());

        Class<?> childType = relationship.getTargetEntity().getType();

        // among other things this call checks that the target exists
        DataObject child = (DataObject) getExistingObject(childType, cayenneContext, context.getId());

        if (relationship.isToMany()) {

            // sanity check...
            Collection<?> relatedCollection = (Collection<?>) parent.readProperty(relationship.getName());
            if (!relatedCollection.contains(child)) {
                throw new AgException(Response.Status.EXPECTATION_FAILED, "Source and target are not related");
            }

            parent.removeToManyTarget(relationship.getName(), child, true);
        } else {

            // sanity check...
            if (parent.readProperty(relationship.getName()) != child) {
                throw new AgException(Response.Status.EXPECTATION_FAILED, "Source and target are not related");
            }

            parent.setToOneTarget(relationship.getName(), null, true);
        }

        cayenneContext.commitChanges();
    }
 
示例14
private <T extends DataObject> void unrelateAll(UnrelateContext<T> context, ObjectContext cayenneContext) {
    // validate relationship before doing anything else
    AgRelationship agRelationship = metadataService.getAgRelationship(
            context.getParent().getType(),
            context.getParent().getRelationship());

    DataObject parent = (DataObject) getExistingObject(context.getParent().getType(), cayenneContext, context
            .getParent().getId().get());

    if (agRelationship.isToMany()) {

        // clone relationship before we start deleting to avoid concurrent
        // modification of the iterator, and to be able to batch-delete
        // objects if needed
        @SuppressWarnings("unchecked")
        Collection<DataObject> relatedCollection = new ArrayList<>(
                (Collection<DataObject>) parent.readProperty(agRelationship.getName()));

        for (DataObject o : relatedCollection) {
            parent.removeToManyTarget(agRelationship.getName(), o, true);
        }

    } else {

        DataObject target = (DataObject) parent.readProperty(agRelationship.getName());
        if (target != null) {
            parent.setToOneTarget(agRelationship.getName(), null, true);
        }
    }

    cayenneContext.commitChanges();
}
 
示例15
private Object getExistingObject(Class<?> type, ObjectContext context, Object id) {

        Object object = getOptionalExistingObject(type, context, id);
        if (object == null) {
            ObjEntity entity = context.getEntityResolver().getObjEntity(type);
            throw new AgException(Response.Status.NOT_FOUND, "No object for ID '" + id + "' and entity '"
                    + entity.getName() + "'");
        }

        return object;
    }
 
示例16
@Before
public void initAgDataMap() {

    ObjectContext sharedContext = runtime.newContext();

    this.mockCayennePersister = mock(ICayennePersister.class);
    when(mockCayennePersister.entityResolver()).thenReturn(runtime.getChannel().getEntityResolver());
    when(mockCayennePersister.sharedContext()).thenReturn(sharedContext);
    when(mockCayennePersister.newContext()).thenReturn(runtime.newContext());

    this.metadataService = new MetadataService(createEntityCompilers());
    this.resourceParser = new ResourceParser(metadataService);
    this.resourceMetadataService = createResourceMetadataService();
}
 
示例17
@Before
public void initAgDataMap() {

    ObjectContext sharedContext = runtime.newContext();

    this.mockCayennePersister = mock(ICayennePersister.class);
    when(mockCayennePersister.entityResolver()).thenReturn(runtime.getChannel().getEntityResolver());
    when(mockCayennePersister.sharedContext()).thenReturn(sharedContext);
    when(mockCayennePersister.newContext()).thenReturn(runtime.newContext());

    this.metadataService = new MetadataService(createEntityCompilers());
    this.resourceParser = new ResourceParser(metadataService);
    this.resourceMetadataService = createResourceMetadataService();
}
 
示例18
@Override
public GraphDiff onSync(ObjectContext originatingContext, GraphDiff changes, int syncType, DataChannelFilterChain filterChain) {

    if (syncType == DataChannel.FLUSH_CASCADE_SYNC) {
        commitCounter++;
    }

    return filterChain.onSync(originatingContext, changes, syncType);
}
 
示例19
public JdbcExtractor(ObjectContext context, RowAttribute[] rowHeader, String sqlTemplate,
                     CapsStrategy capsStrategy) {
    this.context = context;
    this.sqlTemplate = sqlTemplate;
    this.capsStrategy = capsStrategy;
    this.rowHeader = rowHeader;
}
 
示例20
protected BatchProcessor<T> createBatchProcessor(Execution execution) {

        Index columns = Index.forLabels(DeleteSegment.TARGET_COLUMN);

        return rows -> {

            // executing in the select context..
            ObjectContext context = rows.get(0).getObjectContext();
            DataFrame df = DataFrame.newFrame(columns)
                    // TODO: when we can upgrade to 0.7, switch to Series.forData(rows)
                    .columns(Series.forData(rows.toArray()));
            processor.process(execution, new DeleteSegment<>(context, df));
        };
    }
 
示例21
private Map<TargetAttribute, Map<Object, Object>> fetchRelated(
        ObjectContext context,
        Map<TargetAttribute, Set<Object>> fkMap) {

    if (fkMap.isEmpty()) {
        return Collections.emptyMap();
    }

    // map of *path* to map of *pk* to *object*...
    Map<TargetAttribute, Map<Object, Object>> related = new HashMap<>();

    fkMap.forEach((a, fks) -> {

        if (!fks.isEmpty()) {

            TargetAttribute relatedPk = a.getForeignKey().get().getTarget();
            String relatedPath = relatedPk.getNormalizedPath().substring(ASTDbPath.DB_PREFIX.length());
            String relatedEntityName = relatedPk.getEntity().getName();

            Map<Object, Object> relatedFetched = new HashMap<>((int) (fks.size() / 0.75));
            ObjectSelect
                    .query(Object.class)
                    .entityName(relatedEntityName)
                    .where(ExpressionFactory.inDbExp(relatedPath, fks))
                    .select(context)
                    // map by fk value (which is a PK of the matched object of course)
                    .forEach(r -> relatedFetched.put(Cayenne.pkForObject((Persistent) r), r));

            related.put(a, relatedFetched);
        }
    });

    return related;
}
 
示例22
public DataFrame map(
        ObjectContext context,
        DataFrame sources,
        DataFrame targets) {

    Hasher lkm = r -> r.get(CreateOrUpdateSegment.KEY_COLUMN);
    Hasher rkm = r -> mapper.keyForTarget((DataObject) r.get(CreateOrUpdateSegment.TARGET_COLUMN));

    return sources
            .leftJoin().on(lkm, rkm).with(targets)
            .addColumn(CreateOrUpdateSegment.TARGET_CREATED_COLUMN, r -> isCreated(r.get(CreateOrUpdateSegment.TARGET_COLUMN)))
            .convertColumn(CreateOrUpdateSegment.TARGET_COLUMN, r -> createIfMissing(r, context));
}
 
示例23
public DataFrame match(ObjectContext context, DataFrame df) {

        Map<Object, Expression> expressions = new LinkedHashMap<>();

        df.forEach(r -> expressions.computeIfAbsent(r.get(CreateOrUpdateSegment.KEY_COLUMN),
                key -> mapper.expressionForKey(key)));

        // no keys (?)
        if (expressions.isEmpty()) {
            return toDataFrame(Collections.emptyList());
        } else {
            return toDataFrame(ObjectSelect.query(type).where(ExpressionFactory.or(expressions.values())).select(context));
        }
    }
 
示例24
@Before
public void deleteSourceData() {

	ObjectContext context = srcStack.newContext();

	// first query in a test set will also load the schema...

	context.performGenericQuery(new SQLTemplate(Object.class, "DELETE from utest.etl1"));
	context.performGenericQuery(new SQLTemplate(Object.class, "DELETE from utest.etl3"));
	context.performGenericQuery(new SQLTemplate(Object.class, "DELETE from utest.etl2"));
	context.performGenericQuery(new SQLTemplate(Object.class, "DELETE from utest.etl4"));
	context.performGenericQuery(new SQLTemplate(Object.class, "DELETE from utest.etl5"));
}
 
示例25
@Test
public void testSharedContext() {
    ObjectContext context = connector.sharedContext();
    assertNotNull(context);

    SQLExec.query("INSERT INTO utest.etl1 (NAME) VALUES ('a')").execute(context);
    assertEquals(1, srcScalar("SELECT count(1) from utest.etl1"));
}
 
示例26
@Test
public void testCayenneJava8Support() {
    ObjectContext context = connector.sharedContext();

    ValueObjectTypeRegistry typeRegistry = context.getEntityResolver().getValueObjectTypeRegistry();
    ValueObjectType<LocalDateTime, ?> vt = typeRegistry.getValueType(LocalDateTime.class);
    assertTrue(vt instanceof LocalDateTimeValueType);
}
 
示例27
@Test
public void testEncoder_FilteredToOne() throws IOException {

    EntityEncoderFilter filter = EntityEncoderFilter.forAll()
            .objectCondition((p, o, d) -> o instanceof E2 && Cayenne.intPKForObject((E2) o) != 7
                    ? false : d.willEncode(p, o)
            )
            .encoder((p, o, out, d) -> o instanceof E2 && Cayenne.intPKForObject((E2) o) != 7
                    ? false : d.encode(p, o, out))
            .build();


    RootResourceEntity<E3> e3Descriptor = getResourceEntity(E3.class);
    e3Descriptor.getEntityEncoderFilters().add(filter);
    e3Descriptor.includeId();

    NestedResourceEntity<E2> e2Descriptor = getChildResourceEntity(E2.class, e3Descriptor, E3.E2.getName());
    e2Descriptor.getEntityEncoderFilters().add(filter);
    e2Descriptor.includeId();
    e3Descriptor.getChildren().put(E3.E2.getName(), e2Descriptor);

    ObjectContext context = cayenneService.newContext();

    E2 e21 = new E2();
    e21.setObjectId(new ObjectId("E2", E2.ID__PK_COLUMN, 7));
    context.registerNewObject(e21);

    E3 e31 = new E3();
    e31.setObjectId(new ObjectId("E3", E3.ID__PK_COLUMN, 5));
    context.registerNewObject(e31);
    e31.setE2(e21);

    // saves result set in ResourceEntity
    e3Descriptor.setResult(Collections.singletonList(e31));
    e2Descriptor.setToOneResult(new SimpleObjectId(5), e21);

    assertEquals("{\"success\":true,\"data\":[{\"id\":5,\"e2\":{\"id\":7},\"e2_id\":7}],\"total\":1}",
            toJson(e31, e3Descriptor));

    E2 e22 = new E2();
    e22.setObjectId(new ObjectId("E2", E2.ID__PK_COLUMN, 8));
    context.registerNewObject(e22);

    E3 e32 = new E3();
    e32.setObjectId(new ObjectId("E3", E3.ID__PK_COLUMN, 6));
    context.registerNewObject(e32);
    e32.setE2(e22);

    // saves result set in ResourceEntity
    e3Descriptor.setResult(Collections.singletonList(e32));
    e2Descriptor.setToOneResult(new SimpleObjectId(6), e22);

    assertEquals("{\"success\":true,\"data\":[{\"id\":6}],\"total\":1}", toJson(e32, e3Descriptor));
}
 
示例28
@Override
public ObjectContext sharedContext() {
	return sharedContext;
}
 
示例29
@Override
public ObjectContext newContext() {
	return runtime.newContext();
}
 
示例30
@Test
public void testGetRootEncoder_ExcludedRelationshipAttributes() {

    RootResourceEntity<E2> descriptor = getResourceEntity(E2.class);
    descriptor.includeId();

    NestedResourceEntity<E3> e3Descriptor = getChildResourceEntity(E3.class, descriptor, E2.E3S.getName());
    e3Descriptor.includeId();
    appendAttribute(e3Descriptor, E3.NAME, String.class);

    descriptor.getChildren().put(E2.E3S.getName(), e3Descriptor);

    ObjectContext context = mockCayennePersister.newContext();
    E2 e2 = new E2();
    e2.setObjectId(new ObjectId("E2", E2.ID__PK_COLUMN, 7));
    e2.setName("XYZ");
    e2.setAddress("bla bla street");
    context.registerNewObject(e2);

    E3 e31 = new E3();
    e31.setObjectId(new ObjectId("E3", E3.ID__PK_COLUMN, 5));
    e31.setName("31");
    e31.setPhoneNumber("+12345678");
    context.registerNewObject(e31);
    e2.addToE3s(e31);

    E3 e32 = new E3();
    e32.setObjectId(new ObjectId("E3", E3.ID__PK_COLUMN, 6));
    e32.setName("32");
    e31.setPhoneNumber("+87654321");
    context.registerNewObject(e32);
    e2.addToE3s(e32);

    // saves result set in ResourceEntity
    descriptor.setResult(Collections.singletonList(e2));
    e3Descriptor.addToManyResult(new SimpleObjectId(7), e31);
    e3Descriptor.addToManyResult(new SimpleObjectId(7), e32);

    assertEquals("{\"data\":[{\"id\":7,\"e3s\":[{\"id\":5,\"name\":\"31\"},{\"id\":6,\"name\":\"32\"}]}],\"total\":1}",
            toJson(e2, descriptor));
}