criteriabuilder.java

来自「bpel执行引擎用来执行bpel业务流程」· Java 代码 · 共 196 行

JAVA
196
字号
/* * 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.ode.daohib.bpel;import org.apache.ode.bpel.common.BpelEventFilter;import org.apache.ode.bpel.common.Filter;import org.apache.ode.bpel.common.InstanceFilter;import org.apache.ode.utils.ISO8601DateParser;import org.hibernate.Criteria;import org.hibernate.criterion.Disjunction;import org.hibernate.criterion.Property;import org.hibernate.criterion.Restrictions;import java.text.ParseException;import java.util.Date;import java.util.List;import java.util.Map;/** * Class used for converting "filter" objects into Hibernate * {@link org.hibernate.Criteria} objects. */class CriteriaBuilder {  /**   * Build a Hibernate {@link Criteria} from an instance filter.   * @param crit target (destination) criteria   * @param filter filter   */  void buildCriteria(Criteria crit, InstanceFilter filter) {    Criteria processCrit = crit.createCriteria("process");    // Filtering on PID    if (filter.getPidFilter() != null)      processCrit.add(Restrictions.like("processId",filter.getPidFilter().replaceAll("\\*","%")));        if (filter.getIidFilter() != null)      crit.add(Restrictions.eq("id",new Long(filter.getIidFilter())));        // Filtering on name and namespace    if (filter.getNameFilter() != null) {      processCrit.add(Restrictions.like("typeName", filter.getNameFilter().replaceAll("\\*", "%")));    }    if (filter.getNamespaceFilter() != null) {      processCrit.add(Restrictions.like("typeNamespace", filter.getNamespaceFilter().replaceAll("\\*", "%")));    }    // Specific filter for status (using a disjunction between possible statuses)    if (filter.getStatusFilter() != null) {      List<Short> statuses = filter.convertFilterState();      Disjunction disj = Restrictions.disjunction();      for (short status : statuses) {        disj.add(Restrictions.eq("state", status));      }      crit.add(disj);    }    // Specific filter for started and last active dates.    if (filter.getStartedDateFilter() != null) {      for (String sdf : filter.getStartedDateFilter()) {        addFilterOnPrefixedDate(crit, sdf, "created");      }    }    if (filter.getLastActiveDateFilter() != null) {      for (String ladf : filter.getLastActiveDateFilter()) {        addFilterOnPrefixedDate(crit, ladf,  "lastActiveTime");      }    }    // Specific filter for correlation properties    if (filter.getPropertyValuesFilter() != null) {      Criteria propCrit = crit.createCriteria("correlationSets").createCriteria("properties");      for (Map.Entry corValue : filter.getPropertyValuesFilter().entrySet()) {        String propName = (String)corValue.getKey();        if (propName.startsWith("{")) {          String namespace = propName.substring(1, propName.lastIndexOf("}"));          propName = propName.substring(propName.lastIndexOf("}") + 1, propName.length());          propCrit.add(Restrictions.eq("name", propName))                  .add(Restrictions.eq("namespace", namespace))                  .add(Restrictions.eq("value", corValue.getValue()));        } else {          propCrit.add(Restrictions.eq("name", corValue.getKey()))                  .add(Restrictions.eq("value", corValue.getValue()));        }      }    }    // Ordering    if (filter.orders != null) {      for (String key : filter.orders) {        boolean ascending = true;        String orderKey = key;        if (key.startsWith("+") || key.startsWith("-")) {          orderKey = key.substring(1, key.length());          if (key.startsWith("-")) ascending = false;        }        if ("name".equals(orderKey)) {          if (ascending) processCrit.addOrder(Property.forName("typeName").asc());          else processCrit.addOrder(Property.forName("typeName").desc());        } else if ("namespace".equals(orderKey)) {          if (ascending) processCrit.addOrder(Property.forName("typeNamespace").asc());          else processCrit.addOrder(Property.forName("typeNamespace").desc());        } else if ("pid".equals(orderKey)) {          if (ascending) processCrit.addOrder(Property.forName("processId").asc());          else processCrit.addOrder(Property.forName("processId").desc());        } else if ("version".equals(orderKey)) {          if (ascending) processCrit.addOrder(Property.forName("version").asc());          else processCrit.addOrder(Property.forName("version").desc());        } else if ("status".equals(orderKey)) {          if (ascending) crit.addOrder(Property.forName("state").asc());          else crit.addOrder(Property.forName("state").desc());        } else if ("started".equals(orderKey)) {          if (ascending) crit.addOrder(Property.forName("created").asc());          else crit.addOrder(Property.forName("created").desc());        } else if ("last-active".equals(orderKey)) {          if (ascending) crit.addOrder(Property.forName("lastActiveTime").asc());          else crit.addOrder(Property.forName("lastActiveTime").desc());        }      }    }    if (filter.getLimit() > 0) crit.setMaxResults(filter.getLimit());  }  /**   * Build criteria for an event filter.   * @param crit target criteria   * @param efilter event filter   */  void buildCriteria(Criteria crit, BpelEventFilter efilter) {    if (efilter.getTypeFilter() != null)      crit.add(Restrictions.like("type", efilter.getTypeFilter().replace('*','%')));          // Specific filter for started and last active dates.    if (efilter.getTimestampFilter() != null) {      for (Filter.Restriction<Date> sdf : efilter.getTimestampFilter()) {        addFilterOnPrefixedDate(crit, sdf.op, sdf.value, "tstamp");      }    }    if (efilter.limit > 0) crit.setMaxResults(efilter.limit);  }    void addScopeFilter(Criteria crit, String scopeId) {    crit.add(Restrictions.eq("",scopeId));  }    static void addFilterOnPrefixedDate(Criteria crit, String prefixedDate, String dateAttribute) {    Date realDate = null;    try {      realDate = ISO8601DateParser.parse(getDateWithoutOp(prefixedDate));    } catch (ParseException e) {      // Never occurs, the deploy date format is pre-validated by the filter    }    addFilterOnPrefixedDate(crit,prefixedDate,realDate,dateAttribute);  }    static void addFilterOnPrefixedDate(Criteria crit, String op, Date date, String dateAttribute) {    if (op.startsWith("=")) {      crit.add(Restrictions.eq(dateAttribute, date));    } else if (op.startsWith("<=")) {      crit.add(Restrictions.le(dateAttribute, date));    } else if (op.startsWith(">=")) {      crit.add(Restrictions.ge(dateAttribute, date));    } else if (op.startsWith("<")) {      crit.add(Restrictions.lt(dateAttribute, date));    } else if (op.startsWith(">")) {      crit.add(Restrictions.gt(dateAttribute, date));    }  }  private static String getDateWithoutOp(String ddf) {    return Filter.getDateWithoutOp(ddf);  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?