org.modeshape.jdbc.delegate.RepositoryDelegateFactory Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of modeshape-jdbc-local
Show all versions of modeshape-jdbc-local
JDBC driver to allow clients to use JCR-SQL2 to query a ModeShape JCR repository within the same JVM process.
/*
* ModeShape (http://www.modeshape.org)
*
* Licensed 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.modeshape.jdbc.delegate;
import java.sql.SQLException;
import java.util.Properties;
import org.modeshape.common.util.StringUtil;
import org.modeshape.jdbc.JdbcLocalI18n;
import org.modeshape.jdbc.LocalJcrDriver;
import org.modeshape.jdbc.LocalJcrDriver.JcrContextFactory;
/**
* The RepositoryDelegateFactory is used to create the required type of {@link RepositoryDelegate} based upon the url
* provided. The url must be prefixed by {@value LocalJcrDriver#JNDI_URL_PREFIX}.
*/
public class RepositoryDelegateFactory {
protected static final int PROTOCOL_UNKNOWN = -1;
protected static final int PROTOCOL_JNDI = 1;
protected RepositoryDelegateFactory() {
}
/**
* Create a RepositoryDelegate instance, given the connection information.
*
* @param url the JDBC URL; may be null
* @param info the connection properties
* @param contextFactory the factory for a JCR context; may not be null
* @return the RepositoryDelegate for the supplied connection information
* @throws SQLException if the URL is unknown
*/
public RepositoryDelegate createRepositoryDelegate( String url,
Properties info,
JcrContextFactory contextFactory ) throws SQLException {
if (!acceptUrl(url)) {
throw new SQLException(JdbcLocalI18n.invalidUrlPrefix.text(LocalJcrDriver.JNDI_URL_PREFIX));
}
return create(determineProtocol(url), url, info, contextFactory);
}
/**
* Determine if this factory accepts the supplied URL.
*
* @param url the connection URL
* @return true if this factory accepts the supplied URL, or false otherwise
*/
public boolean acceptUrl( String url ) {
return !StringUtil.isBlank(url) && determineProtocol(url.trim()) > 0;
}
protected int determineProtocol( String url ) {
assert url != null;
assert url.length() != 0;
if (url.startsWith(LocalJcrDriver.JNDI_URL_PREFIX) && url.length() > LocalJcrDriver.JNDI_URL_PREFIX.length()) {
// This fits the pattern so far ...
return PROTOCOL_JNDI;
}
return PROTOCOL_UNKNOWN;
}
protected RepositoryDelegate create( int protocol,
String url,
Properties info,
JcrContextFactory contextFactory ) {
switch (protocol) {
case PROTOCOL_JNDI:
return new LocalRepositoryDelegate(url, info, contextFactory);
default:
throw new IllegalArgumentException("Invalid protocol: " + protocol);
}
}
}