diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server')
2 files changed, 103 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/InstancesQueryHandler.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/InstancesQueryHandler.java new file mode 100644 index 0000000000..1343909e2d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/InstancesQueryHandler.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.internal.server; + +import org.eclipse.emf.cdo.common.branch.CDOBranch; +import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; +import org.eclipse.emf.cdo.common.util.CDOQueryInfo; +import org.eclipse.emf.cdo.server.IQueryContext; +import org.eclipse.emf.cdo.server.IQueryHandler; +import org.eclipse.emf.cdo.spi.server.InternalRepository; +import org.eclipse.emf.cdo.spi.server.QueryHandlerFactory; + +import org.eclipse.net4j.util.factory.ProductCreationException; + +import org.eclipse.emf.ecore.EClass; + +import java.util.List; + +/** + * @author Eike Stepper + */ +public class InstancesQueryHandler implements IQueryHandler +{ + public InstancesQueryHandler() + { + } + + public void executeQuery(CDOQueryInfo info, IQueryContext context) + { + EClass type = (EClass)info.getParameters().get(CDOProtocolConstants.QUERY_LANGUAGE_INSTANCES_TYPE); + executeQuery(type, context); + + boolean exact = Boolean.TRUE.equals(info.getParameters().get(CDOProtocolConstants.QUERY_LANGUAGE_INSTANCES_EXACT)); + if (!exact) + { + List<EClass> subTypes = context.getView().getRepository().getPackageRegistry().getSubTypes().get(type); + if (subTypes != null && !subTypes.isEmpty()) + { + for (EClass subType : subTypes) + { + if (context.getResultCount() == 0) + { + break; + } + + executeQuery(subType, context); + } + } + } + } + + private void executeQuery(EClass type, final IQueryContext context) + { + if (type.isInterface() || type.isAbstract()) + { + return; + } + + CDOBranch branch = context.getBranch(); + long timeStamp = context.getTimeStamp(); + + InternalRepository repository = (InternalRepository)context.getView().getRepository(); + repository.handleRevisions(type, branch, false, timeStamp, false, new CDORevisionHandler() + { + public boolean handleRevision(CDORevision revision) + { + return context.addResult(revision); + } + }); + } + + /** + * @author Eike Stepper + */ + public static class Factory extends QueryHandlerFactory + { + public Factory() + { + super(CDOProtocolConstants.QUERY_LANGUAGE_INSTANCES); + } + + @Override + public InstancesQueryHandler create(String description) throws ProductCreationException + { + return new InstancesQueryHandler(); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java index 32fe8afe2f..84a9d1ac5b 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java @@ -1079,6 +1079,11 @@ public class Repository extends Container<Object> implements InternalRepository return new ResourcesQueryHandler(); } + if (CDOProtocolConstants.QUERY_LANGUAGE_INSTANCES.equals(language)) + { + return new InstancesQueryHandler(); + } + if (CDOProtocolConstants.QUERY_LANGUAGE_XREFS.equals(language)) { return new XRefsQueryHandler(); |