/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.internal.helper; import java.sql.SQLException; import java.util.regex.Pattern; import java.util.concurrent.ConcurrentHashMap; /** * INTERNAL: * Implements operations specific to JDK 1.5 */ public class JDK15Platform implements JDKPlatform { /** * PERF: The like expression compiled Pattern objects are cached * to avoid re-compilation on every usage. */ protected static final ConcurrentHashMap patternCache = new ConcurrentHashMap(); /** * PERF: The regular expression compiled Pattern objects are cached * to avoid re-compilation on every usage. */ protected static final ConcurrentHashMap regexpPatternCache = new ConcurrentHashMap(); /** * INTERNAL: * An implementation of in memory queries with Like which uses the * regular expression framework. */ public Boolean conformLike(Object left, Object right) { if ((left == null) && (right == null)) { return Boolean.TRUE; } else if ((left == null) || (right == null)) { return Boolean.FALSE; } left = String.valueOf(left); right = String.valueOf(right); // PERF: First check the pattern cache for the pattern. // Note that the original string is the key, to avoid having to translate it first. Pattern pattern = (Pattern)patternCache.get(right); if (pattern == null) { // Bug 3936427 - Replace regular expression reserved characters with escaped version of those characters // For instance replace ? with \? String convertedRight = Helper.convertLikeToRegex((String)right); pattern = Pattern.compile(convertedRight); // Ensure cache does not grow beyond 100. if (patternCache.size() > 100) { patternCache.remove(patternCache.keySet().iterator().next()); } patternCache.put(right, pattern); } boolean match = pattern.matcher((String)left).matches(); if (match) { return Boolean.TRUE; } else { return Boolean.FALSE; } } /** * INTERNAL: * An implementation of in memory queries with Regexp which uses the * regular expression framework. */ public Boolean conformRegexp(Object left, Object right) { if ((left == null) && (right == null)) { return Boolean.TRUE; } else if ((left == null) || (right == null)) { return Boolean.FALSE; } left = String.valueOf(left); right = String.valueOf(right); // PERF: First check the pattern cache for the pattern. // Note that the original string is the key, to avoid having to translate it first. Pattern pattern = (Pattern)regexpPatternCache.get(right); if (pattern == null) { pattern = Pattern.compile((String)right); // Ensure cache does not grow beyond 100. if (regexpPatternCache.size() > 100) { regexpPatternCache.remove(regexpPatternCache.keySet().iterator().next()); } regexpPatternCache.put(right, pattern); } boolean match = pattern.matcher((String)left).matches(); if (match) { return Boolean.TRUE; } else { return Boolean.FALSE; } } /** * Indicates whether the passed object implements java.sql.SQLXML introduced in jdk 1.6 */ public boolean isSQLXML(Object object) { return false; } /** * Casts the passed object to SQLXML and calls getString and free methods */ public String getStringAndFreeSQLXML(Object sqlXml) throws SQLException { return null; } }