blob: e8c61cbb545483b99f17ffdf83a135dc0206555c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 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 ConcurrentHashMap patternCache = new ConcurrentHashMap();
/**
* PERF: The regular expression compiled Pattern objects are cached
* to avoid re-compilation on every usage.
*/
protected static 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;
}
}