blob: be5faaae9d741ab4fe08ad0f6b01f3d282cc12c4 [file] [log] [blame]
/*
* 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.netbeans.modules.j2ee.persistence.provider;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.netbeans.api.db.explorer.DatabaseConnection;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.modules.j2ee.persistence.dd.common.Persistence;
import org.netbeans.modules.j2ee.persistence.dd.common.Property;
/**
* This class represents a persistence provider.
*
* @author Erno Mononen
*/
public abstract class Provider {
// constants for properties
public static final String TABLE_GENERATION_CREATE = "tableGenerationCreate";
public static final String TABLE_GENERATION_DROPCREATE = "tableGenerationDropCreate";
public static final String TABLE_GENERATTION_UNKOWN = "tableGenerationUnknown";
/**
* Fully qualified class name of the provider.
*/
private final String providerClass;
private final Set vendorSpecificProperties;
private final String version;
/**
* Creates a new instance of Provider
*/
protected Provider(String providerClass) {
this(providerClass, null);
}
/**
* Creates a new instance of Provider
*/
protected Provider(String providerClass, String version) {
assert !(null == providerClass || "".equals(providerClass.trim())) : "Provider class must be given!";
this.providerClass = providerClass;
this.version = version;
this.vendorSpecificProperties = initPropertyNames();
}
public abstract String getDisplayName();
/**
* @see #providerClass
*/
public final String getProviderClass(){
return this.providerClass;
}
public boolean isOnClassPath(ClassPath cp)
{
String classRelativePath = getProviderClass().replace('.', '/') + ".class"; //NOI18N
boolean ret = cp.findResource(classRelativePath) != null;
if(ret && version != null)
{
if(Persistence.VERSION_2_1.equals(version)){
ret &= cp.findResource("javax/persistence/criteria/CriteriaUpdate.class") != null;
} else if(Persistence.VERSION_2_0.equals(version)){
ret &= cp.findResource("javax/persistence/criteria/JoinType.class") != null;
} else if(Persistence.VERSION_1_0.equals(version)){
ret &= cp.findResource("javax/persistence/Entity.class") != null && cp.findResource("javax/persistence/criteria/JoinType.class") == null;
}
}
return ret;
}
protected String getVersion()
{
return version;
}
private Set initPropertyNames(){
Set result = new HashSet();
result.add(getJdbcDriver());
result.add(getJdbcUsername());
result.add(getJdbcUrl());
result.add(getJdbcPassword());
result.add(getTableGenerationPropertyName());
for (Iterator it = getUnresolvedVendorSpecificProperties().keySet().iterator(); it.hasNext();) {
String propertyName = (String) it.next();
result.add(propertyName);
}
return result;
}
/**
* Gets the names of all provider specific properties.
* @return Set of Strings representing names of provider specific properties.
*/
public Set getPropertyNames(){
return this.vendorSpecificProperties;
}
/**
* @return the property that represents table generation strategy.
*/
public final Property getTableGenerationProperty(String strategy, String version){
if ("".equals(getTableGenerationPropertyName())){
// provider doesn't support table generation
return null;
}
Property result;
if (Persistence.VERSION_2_1.equals(version)) {
result = new org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_1.Property();
} else if (Persistence.VERSION_2_0.equals(version)) {
result = new org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_0.Property();
} else {
result = new org.netbeans.modules.j2ee.persistence.dd.persistence.model_1_0.Property();
}
result.setName(getTableGenerationPropertyName());
if (TABLE_GENERATION_CREATE.equals(strategy)){
result.setValue(getTableGenerationCreateValue());
} else if (TABLE_GENERATION_DROPCREATE.equals(strategy)){
result.setValue(getTableGenerationDropCreateValue());
} else {
return null;
}
return result;
}
/**
* @return name of the default datasource.
*/
public final String getDefaultJtaDatasource(){
return "jdbc/__default";
}
/**
* default inplementation is valid for jpa 2.0+
* @return names of the property representing JDBC URL, map version-property name
*/
public String getJdbcUrl() {
return "javax.persistence.jdbc.url";
}
/**
* default inplementation is valid for jpa 2.0+
* @return name of the property representing JDBC driver.
*/
public String getJdbcDriver() {
return "javax.persistence.jdbc.driver";
}
/**
* default inplementation is valid for jpa 2.0+
* @return name of the property representing JDBC user name.
*/
public String getJdbcUsername() {
return "javax.persistence.jdbc.user";
}
/**
* default inplementation is valid for jpa 2.0+
* @return name of the property representing JDBC password.
*/
public String getJdbcPassword() {
return "javax.persistence.jdbc.password";
}
/**
* Return annotation processor for metamodel generation
*/
public String getAnnotationProcessor() {
return null;
}
/**
* Return annotation processor subpackage property name for metamodel generation for differet pu in deifferent packages
*/
public String getAnnotationSubPackageProperty() {
return null;
}
/**
* default inplementation is valid for jpa 2.1+
* @return name of the property representing table generation strategy in database
*/
public String getTableGenerationPropertyName() {
return PersistenceUnitProperties.SCHEMA_GENERATION_DATABASE_ACTION;
}
/**
* default inplementation is valid for jpa 2.1+
* @return value of the property that represents <tt>create tables</tt> strategy.
*/
public String getTableGenerationCreateValue(){
return PersistenceUnitProperties.SCHEMA_GENERATION_CREATE_ACTION;
}
/**
* default inplementation is valid for jpa 2.1+
* @return value of the property that represents <tt>create and drop tables</tt> strategy.
*/
public String getTableGenerationDropCreateValue(){
return PersistenceUnitProperties.SCHEMA_GENERATION_DROP_AND_CREATE_ACTION;
}
/**
* @return Map<String, String> containing vendor specific properties.
*/
public abstract Map getUnresolvedVendorSpecificProperties();
/**
* @return Map<String, String> containing vendor specific properties
* which should be set on a new unit by default.
*/
public abstract Map getDefaultVendorSpecificProperties();
/**
* Gets a map containing provider specific name / values pairs of given
* database connection's properties. If given connection was null, will
* return a map containing keys (names) of properties but empty Strings as values.
* @param connection
* @version isn't used yt, may need to be removed
* @return Map (key String representing name of the property, value String
* representing value of the property).
*/
public final Map<String, String> getConnectionPropertiesMap(DatabaseConnection connection, String version){
Map<String, String> result = new HashMap<String, String>();
result.put(getJdbcDriver(), connection != null ? connection.getDriverClass() : "");
result.put(getJdbcUrl(), connection != null ? connection.getDatabaseURL() : "");
result.put(getJdbcUsername(), connection != null ? connection.getUser(): "");
// must set an empty string for password if a null password
// was returned from the connection, see #81729
result.put(getJdbcPassword(),
connection != null && connection.getPassword() != null ? connection.getPassword() : "");
return result;
}
/**
* @return true if this provider support table generation, false otherwise.
*/
public final boolean supportsTableGeneration(){
return getTableGenerationPropertyName() != null && !"".equals(getTableGenerationPropertyName().trim());
}
@Override
public String toString() {
return getDisplayName();
}
@Override
public int hashCode() {
return providerClass.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Provider)){
return false;
}
Provider that = (Provider) obj;
boolean sameVersion = (getVersion()!=null && getVersion().equals(that.getVersion())) || (getVersion()==null && that.getVersion()==null);
return getClass().equals(that.getClass()) && providerClass.equals(that.providerClass) && sameVersion;
}
}