javax.persistence.Subgraph Java Examples

The following examples show how to use javax.persistence.Subgraph. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: StaticEntityRepositoryImpl.java    From we-cmdb with Apache License 2.0 6 votes vote down vote up
private void queryJoin(CriteriaBuilder cb, CriteriaQuery query, From from, FilterPath path, EntityGraph<?> eg, Subgraph sg, List<Predicate> predicates) {
    String joinAttr = path.getJoinAttr();
    From joinPath = null;
    if (".".equals(joinAttr)) {
        joinPath = from;
    } else {
        if (sg == null) {
            sg = eg.addSubgraph(path.getJoinAttr());
        } else {
            sg = sg.addSubgraph(path.getJoinAttr());
        }
        joinPath = from.join(path.getJoinAttr());
    }
    applyFilter(cb, query, path.getFilters(), joinPath, predicates);
    if (path.getJoinChildren() != null && path.getJoinChildren().size() > 0) {
        for (FilterPath fp : path.getJoinChildren()) {
            queryJoin(cb, query, joinPath, fp, eg, sg, predicates);
        }
    }
}
 
Example #2
Source File: AbstractEntityGraphVisitationStrategy.java    From lams with GNU General Public License v2.0 6 votes vote down vote up
/**
 * I'm using the NULL-OBJECT pattern here.
 * For attributes that don't exist in the EntityGraph,
 * a predefined NULL-ATTRIBUTE-NODE is pushed to the stack.
 *
 * And for a nonexistent subgraph, a predefined NULL-SUBGRAPH is pushed to the stack.
 *
 * So, whenever we start visiting an attribute, there will be an attribute node pushed to the attribute stack,
 * and a subgraph node pushed to the graph stack.
 *
 * when we finish visiting an attribute, these two will be popped from each stack.
 */
@Override
public boolean startingAttribute(AttributeDefinition attributeDefinition) {
	Map<String, AttributeNodeImplementor> attributeMap = attributeMapStack.peekLast();
	final String attrName = attributeDefinition.getName();
	AttributeNodeImplementor attributeNode = NON_EXIST_ATTRIBUTE_NODE;
	GraphNodeImplementor subGraphNode = NON_EXIST_SUBGRAPH_NODE;
	//the attribute is in the EntityGraph, so, let's continue
	if ( attributeMap.containsKey( attrName ) ) {
		attributeNode = attributeMap.get( attrName );
		//here we need to check if there is a subgraph (or sub key graph if it is an indexed attribute )
		Map<Class, Subgraph> subGraphs = attributeNode.getSubgraphs();
		Class javaType = attributeDefinition.getType().getReturnedClass();
		if ( !subGraphs.isEmpty() && subGraphs.containsKey( javaType ) ) {
			subGraphNode = (GraphNodeImplementor) subGraphs.get( javaType );
		}

	}
	attributeStack.addLast( attributeNode );
	graphStack.addLast( subGraphNode );
	return super.startingAttribute( attributeDefinition );
}
 
Example #3
Source File: EntityGraphBuilderImpl.java    From crnk-framework with Apache License 2.0 5 votes vote down vote up
private <T> Subgraph<Object> applyFetchPaths(EntityGraph<T> graph, MetaAttributePath fetchPath) {
	if (fetchPath.length() >= 2) {
		// ensure parent is fetched
		MetaAttributePath parentPath = fetchPath.subPath(0, fetchPath.length() - 1);
		Subgraph<Object> parentGraph = applyFetchPaths(graph, parentPath);
		return parentGraph.addSubgraph(fetchPath.getLast().getName());
	} else {
		return graph.addSubgraph(fetchPath.toString());
	}
}
 
Example #4
Source File: AbstractEntityGraphVisitationStrategy.java    From lams with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void startingCollectionElements(
		final CollectionElementDefinition elementDefinition) {
	AttributeNodeImplementor attributeNode = attributeStack.peekLast();
	GraphNodeImplementor subGraphNode = NON_EXIST_SUBGRAPH_NODE;
	Map<Class, Subgraph> subGraphs = attributeNode.getSubgraphs();
	Class javaType = elementDefinition.getType().getReturnedClass();
	if ( !subGraphs.isEmpty() && subGraphs.containsKey( javaType ) ) {
		subGraphNode = (GraphNodeImplementor) subGraphs.get( javaType );
	}
	graphStack.addLast( subGraphNode );
	super.startingCollectionElements( elementDefinition );
}
 
Example #5
Source File: AbstractEntityGraphVisitationStrategy.java    From lams with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void startingCollectionIndex(final CollectionIndexDefinition indexDefinition) {
	AttributeNodeImplementor attributeNode = attributeStack.peekLast();
	GraphNodeImplementor subGraphNode = NON_EXIST_SUBGRAPH_NODE;
	Map<Class, Subgraph> subGraphs = attributeNode.getKeySubgraphs();
	Class javaType = indexDefinition.getType().getReturnedClass();
	if ( !subGraphs.isEmpty() && subGraphs.containsKey( javaType ) ) {
		subGraphNode = (GraphNodeImplementor) subGraphs.get( javaType );
	}
	graphStack.addLast( subGraphNode );
	super.startingCollectionIndex( indexDefinition );
}
 
Example #6
Source File: AttributeNodeImpl.java    From lams with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Intended only for use from {@link #makeImmutableCopy()}
 */
private AttributeNodeImpl(
		SessionFactoryImplementor sessionFactory,
		ManagedType managedType,
		Attribute<?, T> attribute,
		Map<Class, Subgraph> subgraphMap,
		Map<Class, Subgraph> keySubgraphMap) {
	this.sessionFactory = sessionFactory;
	this.managedType = managedType;
	this.attribute = attribute;
	this.subgraphMap = subgraphMap;
	this.keySubgraphMap = keySubgraphMap;
}
 
Example #7
Source File: AttributeNodeImpl.java    From lams with GNU General Public License v2.0 5 votes vote down vote up
private static Map<Class, Subgraph> makeSafeMapCopy(Map<Class, Subgraph> subgraphMap) {
	if ( subgraphMap == null ) {
		return null;
	}

	final int properSize = CollectionHelper.determineProperSizing( subgraphMap );
	final HashMap<Class,Subgraph> copy = new HashMap<>( properSize );
	for ( Map.Entry<Class, Subgraph> subgraphEntry : subgraphMap.entrySet() ) {
		copy.put(
				subgraphEntry.getKey(),
				( ( SubgraphImpl ) subgraphEntry.getValue() ).makeImmutableCopy()
		);
	}
	return copy;
}
 
Example #8
Source File: SignInService.java    From bouncr with Eclipse Public License 1.0 5 votes vote down vote up
public Map<String, List<String>> getPermissionsByRealm(User user) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Assignment> assignmentCriteria = cb.createQuery(Assignment.class);
    Root<Assignment> assignmentRoot = assignmentCriteria.from(Assignment.class);
    Join<Group, Assignment> groupJoin = assignmentRoot.join("group");
    Join<User, Group> userJoin = groupJoin.join("users");
    assignmentRoot.fetch("role").fetch("permissions");
    assignmentCriteria.where(cb.equal(userJoin.get("id"), user.getId()));

    EntityGraph<Assignment> assignmentGraph = em.createEntityGraph(Assignment.class);
    assignmentGraph.addAttributeNodes("realm", "role");
    Subgraph<Role> roleGraph = assignmentGraph.addSubgraph("role");
    roleGraph.addAttributeNodes("permissions");
    Subgraph<Permission> permissionsGraph = roleGraph.addSubgraph("permissions");
    permissionsGraph.addAttributeNodes("name");

    return em.createQuery(assignmentCriteria)
            .setHint("javax.persistence.cache.storeMode", CacheStoreMode.REFRESH)
            .setHint("javax.persistence.fetchgraph", assignmentGraph)
            .getResultStream()
            .collect(Collectors.groupingBy(Assignment::getRealm))
            .entrySet()
            .stream()
            .collect(Collectors.toMap(
                    e -> e.getKey().getId().toString(),
                    e -> new ArrayList<>(e.getValue().stream()
                            .flatMap(v -> v.getRole().getPermissions().stream())
                            .map(Permission::getName)
                            .collect(Collectors.toSet()))));
}
 
Example #9
Source File: AbstractQueryExecutorImpl.java    From katharsis-framework with Apache License 2.0 5 votes vote down vote up
private Subgraph<Object> applyFetchPaths(EntityGraph<T> graph, MetaAttributePath fetchPath) {
	if (fetchPath.length() >= 2) {
		// ensure parent is fetched
		MetaAttributePath parentPath = fetchPath.subPath(0, fetchPath.length() - 1);
		Subgraph<Object> parentGraph = applyFetchPaths(graph, parentPath);
		return parentGraph.addSubgraph(fetchPath.toString());
	}
	else {
		return graph.addSubgraph(fetchPath.toString());
	}
}
 
Example #10
Source File: AbstractEntityGraphVisitationStrategy.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
@Override
public Map<Class, Subgraph> getSubgraphs() {
	return Collections.emptyMap();
}
 
Example #11
Source File: AbstractEntityGraphVisitationStrategy.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
@Override
public Map<Class, Subgraph> getKeySubgraphs() {
	return Collections.emptyMap();
}
 
Example #12
Source File: AttributeNodeImpl.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
@Override
public Map<Class, Subgraph> getSubgraphs() {
	return subgraphMap == null ? Collections.emptyMap() : subgraphMap;
}
 
Example #13
Source File: AttributeNodeImpl.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
@Override
public Map<Class, Subgraph> getKeySubgraphs() {
	return keySubgraphMap == null ? Collections.emptyMap() : keySubgraphMap;
}
 
Example #14
Source File: EntityGraphImpl.java    From lams with GNU General Public License v2.0 4 votes vote down vote up
@Override
public <X> Subgraph<? extends X> addSubclassSubgraph(Class<? extends X> type) {
	// todo : implement
	throw new NotYetImplementedException();
}
 
Example #15
Source File: ApplicationsResource.java    From bouncr with Eclipse Public License 1.0 4 votes vote down vote up
@Decision(HANDLE_OK)
public List<Application> handleOk(ApplicationSearchParams params, UserPermissionPrincipal principal, EntityManager em) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Application> query = cb.createQuery(Application.class);
    Root<Application> applicationRoot = query.from(Application.class);
    query.distinct(true);

    List<Predicate> predicates = new ArrayList<>();
    if (!principal.hasPermission("any_application:read")) {
        Join<User, Group> userJoin = applicationRoot.join("realms")
                .join("assignments")
                .join("group")
                .join("users");
        predicates.add(cb.equal(userJoin.get("id"), principal.getId()));
    }

    Optional.ofNullable(params.getQ())
            .ifPresent(q -> {
                String likeExpr = "%" + q.replaceAll("%", "_%") + "%";
                predicates.add(cb.like(applicationRoot.get("name"), likeExpr, '_'));
            });
    if (!predicates.isEmpty()) {
        query.where(predicates.toArray(Predicate[]::new));
    }

    List<ResourceField> embedEntities = some(params.getEmbed(), embed -> new ResourceFilter().parse(embed))
            .orElse(Collections.emptyList());
    EntityGraph<Application> applicationGraph = em.createEntityGraph(Application.class);
    applicationGraph.addAttributeNodes("name", "description", "passTo", "virtualPath", "topPage", "writeProtected");

    if (embedEntities.stream().anyMatch(r -> r.getName().equalsIgnoreCase("realms"))) {
        applicationGraph.addAttributeNodes("realms");
        Subgraph<Realm> realmsGraph = applicationGraph.addSubgraph("realms");
        realmsGraph.addAttributeNodes("name", "description", "url");
    }

    return em.createQuery(query)
            .setHint("javax.persistence.fetchgraph", applicationGraph)
            .setFirstResult(params.getOffset())
            .setMaxResults(params.getLimit())
            .getResultList();
}
 
Example #16
Source File: UserResource.java    From bouncr with Eclipse Public License 1.0 4 votes vote down vote up
@Decision(EXISTS)
public boolean exists(Parameters params, RestContext context, EntityManager em) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<User> query = builder.createQuery(User.class);
    Root<User> userRoot = query.from(User.class);
    userRoot.fetch("userProfileValues", JoinType.LEFT);
    query.where(builder.equal(userRoot.get("account"), params.get("account")));

    List<ResourceField> embedEntities = some(params.get("embed"), embed -> new ResourceFilter().parse(embed))
            .orElse(Collections.emptyList());

    EntityGraph<User> userGraph = em.createEntityGraph(User.class);
    userGraph.addAttributeNodes("account", "userProfileValues");
    if (embedEntities.stream().anyMatch(r -> r.getName().equalsIgnoreCase("groups"))) {
        userRoot.fetch("groups", JoinType.LEFT);
        query.distinct(true);
        userGraph.addAttributeNodes("groups");
        userGraph.addSubgraph("groups")
                .addAttributeNodes("name", "description");
    }

    // OIDC provider
    if (embedEntities.stream().anyMatch(r -> r.getName().equalsIgnoreCase("oidc_providers"))) {
        userRoot.fetch("oidcUsers", JoinType.LEFT);
        userGraph.addAttributeNodes("oidcUsers");
        Subgraph<Object> oidcUsersGraph = userGraph.addSubgraph("oidcUsers");
        oidcUsersGraph.addSubgraph("oidcProvider")
                .addAttributeNodes("name");
    }

    User user = em.createQuery(query)
            .setHint("javax.persistence.cache.storeMode", CacheStoreMode.REFRESH)
            .setHint("javax.persistence.fetchgraph", userGraph)
            .getResultStream().findAny().orElse(null);

    if (user != null) {
        final UserProfileService userProfileService = new UserProfileService(em);
        final List<UserProfileVerification> userProfileVerifications = userProfileService.findUserProfileVerifications(user.getAccount());
        user.setUnverifiedProfiles(userProfileVerifications.stream()
                .map(UserProfileVerification::getUserProfileField)
                .filter(Objects::nonNull)
                .map(UserProfileField::getJsonName)
                .collect(Collectors.toList()));
        context.putValue(user);
    }
    return user != null;
}