blob: ca466bc05f485b4f491a19cc52fa1e3ec9224bb9 [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.payara.jakartaee.db;
import org.netbeans.modules.payara.tooling.utils.StringPrefixTree;
import org.netbeans.modules.j2ee.deployment.common.api.Datasource;
/**
* Payara JDBC resource (data source) server property content.
* <p/>
* @author Tomas Kraus
*/
public class JDBCResource implements Datasource {
////////////////////////////////////////////////////////////////////////////
// Inner classes //
////////////////////////////////////////////////////////////////////////////
/**
* Recognized attributes in JDBC resource.
*/
public enum AttrType {
/** Unknown JDBC resource attribute. */
UNKNOWN,
/** Resource JNDI name. */
JNDI_NAME,
/** Resource object type. */
OBJECT_TYPE,
/** JDBC connection pool name. */
POOL_NAME,
/** Is this JDBC resource enabled? */
ENABLED,
/** Deployment order. */
DEPLOYMENT_ORDER;
/** A <code>String</code> representation of UNKNOWN value. */
private static final String UNKNOWN_STR = "UNKNOWN";
/** A <code>String</code> representation of JNDI_NAME value. */
private static final String JNDI_NAME_STR = "jndi-name";
/** A <code>String</code> representation of OBJECT_TYPE value. */
private static final String OBJECT_TYPE_STR = "object-type";
/** A <code>String</code> representation of UNKNOWN value. */
private static final String POOL_NAME_STR = "pool-name";
/** A <code>String</code> representation of ENABLED value. */
private static final String ENABLED_STR = "enabled";
/** A <code>String</code> representation of DEPLOYMENT_ORDER value. */
private static final String DEPLOYMENT_ORDER_STR = "deployment-order";
/** Stored <code>String</code> values for backward <code>String</code>
* conversion. */
private static final StringPrefixTree<AttrType> stringValues
= new StringPrefixTree<>(false);
static {
stringValues.add(JNDI_NAME.toString(), JNDI_NAME);
stringValues.add(OBJECT_TYPE.toString(), OBJECT_TYPE);
stringValues.add(POOL_NAME.toString(), POOL_NAME);
stringValues.add(ENABLED.toString(), ENABLED);
stringValues.add(DEPLOYMENT_ORDER.toString(), DEPLOYMENT_ORDER);
}
/**
* Returns a <code>AttrType</code> with a value represented
* by the specified <code>String</code>.
* <p/>
* The <code>AttrType</code> returned represents existing value
* only if specified <code>String</code> matches any <code>String</code>
* returned by <code>toString</code> method. Otherwise <code>null</code>
* value is returned.
* <p>
* @param name Value containing <code>AttrType</code>
* <code>toString</code> representation.
* @return <code>AttrType</code> value represented
* by <code>String</code> or <code>UNKNOWN</code> if value
* was not recognized.
*/
public static AttrType toValue(final String name) {
if (name != null) {
AttrType type = stringValues.match(name.toLowerCase());
return type != null ? type : UNKNOWN;
} else {
return null;
}
}
/**
* Convert <code>AttrType</code> value to <code>String</code>.
* <p/>
* @return A <code>String</code> representation of the value
* of this object.
*/
@Override
public String toString() {
switch (this) {
case UNKNOWN: return UNKNOWN_STR;
case JNDI_NAME: return JNDI_NAME_STR;
case OBJECT_TYPE: return OBJECT_TYPE_STR;
case POOL_NAME: return POOL_NAME_STR;
case ENABLED: return ENABLED_STR;
case DEPLOYMENT_ORDER: return DEPLOYMENT_ORDER_STR;
// This is unrecheable. Being here means this class does not handle
// all possible values correctly.
default:
throw new IllegalStateException(
"Invalid ResourceType value");
}
}
}
////////////////////////////////////////////////////////////////////////////
// Instance attributes //
////////////////////////////////////////////////////////////////////////////
/** Resource JNDI name. */
private String jndiName;
/** Resource object type. */
private String objectType;
/** JDBC connection pool name. */
private String poolName;
/** Is this JDBC resource enabled? Default value is false. */
private boolean enabled;
/** Deployment order. Negative value (usually <code>-1</code>)
* represents <code>null</code>. */
private int deploymentOrder;
/** JDBC connection pool reference. */
private JDBCConnectionPool pool;
////////////////////////////////////////////////////////////////////////////
// Constructors //
////////////////////////////////////////////////////////////////////////////
/**
* Creates an instance of JDBC resource (data source) content with
* no values set.
*/
public JDBCResource() {
this.jndiName = null;
this.objectType = null;
this.poolName = null;
this.enabled = false;
this.deploymentOrder = -1;
this.pool = null;
}
/**
* Creates an instance of JDBC resource (data source) content with
* all values set.
* <p/>
* @param jndiName Resource JNDI name.
* @param objectType Resource object type.
* @param poolName JDBC connection pool name.
* @param enabled Is this JDBC resource enabled?
* @param deploymentOrder Deployment order.
* @param pool JDBC connection pool reference.
*/
public JDBCResource(final String jndiName, final String objectType,
final String poolName, final boolean enabled,
final int deploymentOrder, final JDBCConnectionPool pool) {
this.jndiName = jndiName;
this.objectType = objectType;
this.poolName = poolName;
this.enabled = enabled;
this.deploymentOrder = deploymentOrder;
this.pool = pool;
}
////////////////////////////////////////////////////////////////////////////
// Datasource interface getters //
////////////////////////////////////////////////////////////////////////////
/**
* Get resource JNDI name.
* <p/>
* @return Resource JNDI name.
*/
@Override
public String getJndiName() {
return jndiName;
}
/**
* Get data source JNDI name.
* <p/>
* @return Data source JNDI name.
*/
@Override
public String getDisplayName() {
return jndiName;
}
/**
* Get data source URL.
* <p/>
* @return Data source URL.
*/
@Override
public String getUrl() {
return pool != null ? pool.getUrl() : null;
}
/**
* Get data source user name.
* <p/>
* @return Data source user name.
*/
@Override
public String getUsername() {
return pool != null ? pool.getUser() : null;
}
/**
* Get data source user password.
* <p/>
* @return Data source user password.
*/
@Override
public String getPassword() {
return pool != null ? pool.getPassword() : null;
}
/**
* Get data source driver class name.
* <p/>
* @return Data source driver class name.
*/
@Override
public String getDriverClassName() {
return pool != null ? pool.getDriverClass() : null;
}
////////////////////////////////////////////////////////////////////////////
// Getters and setters //
////////////////////////////////////////////////////////////////////////////
/**
* Get resource object type.
* <p/>
* @return Resource object type.
*/
public String getObjectType() {
return objectType;
}
/**
* Get JDBC connection pool name.
* <p/>
* @return JDBC connection pool name.
*/
public String getPoolName() {
return poolName;
}
/**
* Is this JDBC resource enabled? Default value is false.
* <p/>
* @return Is this JDBC resource enabled?
*/
public boolean isEnabled() {
return enabled;
}
/**
* Get deployment order.
* <p/>
* Negative value (usually <code>-1</code>) represents <code>null</code>.
* <p/>
* @return Deployment order.
*/
public int getDeploymentOrder() {
return deploymentOrder;
}
/**
* Get JDBC connection pool reference.
* <p/>
* @return JDBC connection pool reference.
*/
public JDBCConnectionPool getPool() {
return pool;
}
/**
* Set JDBC connection pool reference.
* <p/>
* @param pool JDBC connection pool reference.
*/
public void setPool(JDBCConnectionPool pool) {
this.pool = pool;
}
////////////////////////////////////////////////////////////////////////////
// Methods //
////////////////////////////////////////////////////////////////////////////
/**
* Set property value depending on {@link AttrType} type
* <code>enum</code> value.
* <p/>
* @return Value of <code>true</code> if property was set
* or <code>false</code> otherwise (what means that
* {@link Properties} type value vas <code>UNKNOWN</code>.
*/
public boolean setProperty(AttrType type, String value) {
switch (type) {
case JNDI_NAME:
this.jndiName = value;
return true;
case OBJECT_TYPE:
this.objectType = value;
return true;
case POOL_NAME:
this.poolName = value;
return true;
case ENABLED:
this.enabled = Boolean.parseBoolean(value);
return true;
case DEPLOYMENT_ORDER:
try {
this.deploymentOrder = Integer.parseInt(value);
return true;
} catch (NumberFormatException nfe) {
this.deploymentOrder = -1;
return false;
}
default:
return false;
}
}
/**
* Create a copy of existing JDBC data source object with new JNDI name.
* <p/>
* @param jndiName JNDI name to be assigned to new JDBC data source
* copy.
*/
public JDBCResource copy(final String jndiName) {
return new JDBCResource(
jndiName, this.objectType, this.poolName,
this.enabled, this.deploymentOrder, this.pool);
}
}