/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can obtain
* a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
* or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
* Sun designates this particular file as subject to the "Classpath" exception
* as provided by Sun in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the License
* Header, with the fields enclosed by brackets [] replaced by your own
* identifying information: "Portions Copyrighted [year]
* [name of copyright owner]"
*
* Contributor(s):
*
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* This generated bean class Ejb matches the DTD element ejb
*
* Generated on Mon Dec 10 09:16:05 PST 2001
*/
package com.sun.enterprise.deployment.runtime;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.logging.Level;
import com.sun.enterprise.deployment.Application;
import com.sun.enterprise.deployment.EjbDescriptor;
import com.sun.enterprise.deployment.MethodDescriptor;
import com.sun.enterprise.deployment.DescriptorConstants;
import com.sun.enterprise.deployment.runtime.RuntimeDescriptor;
import com.sun.enterprise.deployment.util.DOLUtils;
/**
* Class that contains all the extra iAS elements for an EJB that are not
* in the RI DTD like:
*
* MdbConnectionFactoryDescriptor
* jmsMaxMessagesLoad
* isReadOnlyBean
* refreshPeriodInSeconds
* commitOption
* checkpointedMethods
* passByReference
* BeanPoolDescriptor
* BeanCacheDescriptor
* FlushAtEndOfMethodDescriptor
* CheckpointAtEndOfMethodDescriptor
*
* @author Ludo
* @since JDK 1.4
*/
public class IASEjbExtraDescriptors extends RuntimeDescriptor {
public static final String AVAILABILITY_ENABLED =
"AvailabilityEnabled";
private boolean isReadOnlyBean;
/**
* A string field whose value denoted the rate at which the read-only-bean
* must be refreshed from the data source.
* Valid values are: negative (never refreshed), 0 (always refreshed)
* and positive (refreshed at specified intervals).
* Note that the value is just a hint to the container.
*/
private int refreshPeriodInSeconds;
/**
* A string value specifies the maximum number of messages to
* load into a JMS session at one time for a message-driven
* bean to serve. If not specified, the default is 1.
*/
private int jmsMaxMessagesLoad;
private MdbConnectionFactoryDescriptor mdbConnectionFactory;
/**
* A string field whose valid values are either A, B, or C.
* Default value is set in the server configuration (server.xml).
*/
private String commitOption = null;
/**
* This contains the bean pool properties. Used only for stateless
* session bean and mdb pools.
*/
private BeanPoolDescriptor beanPool;
/**
* This contains the bean cache properties. Used only for entity beans.
*/
private BeanCacheDescriptor beanCache;
private FlushAtEndOfMethodDescriptor flushMethodDescriptor = null;
private CheckpointAtEndOfMethodDescriptor checkpointMethodDescriptor = null;
private String checkpointedMethods = null;
/**
* This contains the pass-by-reference property.
*/
private Boolean passByReference = null;
private boolean perRequestLoadBalancing = false;
/*
* This contains the EjbDescriptor - J2EE specific descriptor
* @see com.sun.enterprise.deployment.EjbDescriptor EjbDescriptor
*/
private EjbDescriptor ejbDescriptor = null;
/**
* This contains the timeout used for container started transactions
* This value is used by the container only if the value is greater than 0
*/
private int cmtTimeoutInSeconds = 0;
/**
* Specifes the thread pool to be used for this ejb's invocation
*/
private String useThreadPoolId;
// contants used to parse the checkpointedMethods
private final static String METHODS_DELIM = ";";
private final static String PARAMS_DELIM = ",";
private final static String LEFT_PAREN = "(";
private final static String RIGHT_PAREN = ")";
private final static String PARAM_DELIM = " ";
/**
* Default constructor.
*/
public IASEjbExtraDescriptors() {
jmsMaxMessagesLoad = 1;
isReadOnlyBean = false;
refreshPeriodInSeconds = DescriptorConstants.REFRESH_PERIOD_IN_SECONDS_DEFAULT;//RO Bean never refreshed???
}
/**
* Getter for property beanCache.
* @return Value of property beanCache.
*/
public BeanCacheDescriptor getBeanCache() {
return beanCache;
}
/**
* Setter for property beanCache.
* @param beanCache New value of property beanCache.
*/
public void setBeanCache(BeanCacheDescriptor beanCache) {
this.beanCache = beanCache;
}
/**
* Getter for property beanPool.
* @return Value of property beanPool.
*/
public BeanPoolDescriptor getBeanPool() {
return beanPool;
}
/**
* Setter for property beanPool.
* @param beanPool New value of property beanPool.
*/
public void setBeanPool(BeanPoolDescriptor beanPool) {
this.beanPool = beanPool;
}
public void setPerRequestLoadBalancing(boolean flag) {
perRequestLoadBalancing = flag;
}
public boolean hasPerRequestLoadBalancing() {
return perRequestLoadBalancing;
}
/**
* Getter for flush-at-end-of-method
* @return Value of flushMethodDescriptor
*/
public FlushAtEndOfMethodDescriptor getFlushAtEndOfMethodDescriptor() {
return flushMethodDescriptor;
}
/**
* Setter for flush-at-end-of-method
* @param flushMethodDescriptor New value of flushMethodDescriptor.
*/
public void setFlushAtEndOfMethodDescriptor(
FlushAtEndOfMethodDescriptor flushMethodDescriptor) {
this.flushMethodDescriptor = flushMethodDescriptor;
}
/**
* Getter for checkpoint-at-end-of-method
* @return Value of checkpointMethodDescriptor
*/
public CheckpointAtEndOfMethodDescriptor
getCheckpointAtEndOfMethodDescriptor() {
return checkpointMethodDescriptor;
}
/**
* Setter for checkpoint-at-end-of-method
* @param checkpointMethodDescriptor New value of
* checkpointMethodDescriptor.
*/
public void setCheckpointAtEndOfMethodDescriptor(
CheckpointAtEndOfMethodDescriptor checkpointMethodDescriptor) {
this.checkpointMethodDescriptor = checkpointMethodDescriptor;
}
/**
* Getter for property checkpointedMethods
* @return Value of property checkpointedMethods
*/
public String getCheckpointedMethods() {
return checkpointedMethods;
}
/**
* Setter for property checkpointedMethods
* @param checkpointedMethods New value of checkpointed methods.
*/
public void setCheckpointedMethods(String checkpointedMethods) {
this.checkpointedMethods = checkpointedMethods;
}
/**
* Getter for property commitOption.
* @return Value of property commitOption.
*/
public java.lang.String getCommitOption() {
return commitOption;
}
/**
* Setter for property commitOption.
* @param commitOption New value of property commitOption.
*/
public void setCommitOption(java.lang.String commitOption) {
this.commitOption = commitOption;
}
/**
* Getter for property cmt-timeout-in-seconds.
* @return Value of property cmt-timeout-in-seconds.
*/
public int getCmtTimeoutInSeconds() {
return this.cmtTimeoutInSeconds;
}
/**
* Setter for property cmt-timeout-in-seconds.
* @param commitOption New value of property cmt-timeout-in-seconds.
*/
public void setCmtTimeoutInSeconds(int val) {
this.cmtTimeoutInSeconds = val;
}
/**
* Getter for the property use-thread-pool-id
* @return The value of use-thread-pool-id
*/
public String getUseThreadPoolId() {
return this.useThreadPoolId;
}
/**
* Setter for the property use-thread-pool-id
* @param The value for use-thread-pool-id
*/
public void setUseThreadPoolId(String val) {
this.useThreadPoolId = val;
}
/**
* Getter for property isReadOnlyBean.
* @return Value of property isReadOnlyBean.
*/
public boolean isIsReadOnlyBean() {
return isReadOnlyBean;
}
/**
* Setter for property isReadOnlyBean.
* @param isReadOnlyBean New value of property isReadOnlyBean.
*/
public void setIsReadOnlyBean(boolean isReadOnlyBean) {
this.isReadOnlyBean = isReadOnlyBean;
}
/**
* Getter for property jmsMaxMessagesLoad.
* @return Value of property jmsMaxMessagesLoad.
*/
public int getJmsMaxMessagesLoad() {
return jmsMaxMessagesLoad;
}
/**
* Setter for property jmsMaxMessagesLoad.
* @param jmsMaxMessagesLoad New value of property jmsMaxMessagesLoad.
*/
public void setJmsMaxMessagesLoad(int jmsMaxMessagesLoad) {
this.jmsMaxMessagesLoad = jmsMaxMessagesLoad;
}
/**
* Getter for property mdbConnectionFactory.
* @return Value of property mdbConnectionFactory.
*/
public MdbConnectionFactoryDescriptor getMdbConnectionFactory() {
return mdbConnectionFactory;
}
/**
* Setter for property mdbConnectionFactory.
* @param mdbConnectionFactory New value of property mdbConnectionFactory.
*/
public void setMdbConnectionFactory(
MdbConnectionFactoryDescriptor mdbConnectionFactory) {
this.mdbConnectionFactory = mdbConnectionFactory;
}
/**
* Getter for property refreshPeriodInSeconds.
* @return Value of property refreshPeriodInSeconds.
*/
public int getRefreshPeriodInSeconds() {
return refreshPeriodInSeconds;
}
/**
* Setter for property refreshPeriodInSeconds.
* @param refreshPeriodInSeconds New value of property
* refreshPeriodInSeconds.
*/
public void setRefreshPeriodInSeconds(int refreshPeriodInSeconds) {
this.refreshPeriodInSeconds = refreshPeriodInSeconds;
}
/**
* Gets ejb pass-by-reference value.
* @return Value of property passByReference if it is not null. Otherwise
* returns value of passByReference property of Application if
* it is not null. Default value is false.
*/
public boolean getPassByReference() {
boolean passByReference = false; // default
// if pass-by-reference defined for ejb
if (this.isPassByReferenceDefined()) {
passByReference = this.passByReference.booleanValue();
// if pass-by-reference undefined for ejb set to
// application's pass-by-reference value if defined
} else {
ejbDescriptor = this.getEjbDescriptor();
if (ejbDescriptor != null) {
Application application = ejbDescriptor.getApplication();
if (application != null) {
if (application.isPassByReferenceDefined()) {
passByReference = application.getPassByReference();
}
}
}
}
return passByReference;
}
/**
* Sets ejb pass-by-reference value.
* @param pass-by-reference New value of property pass-by-reference.
*/
public void setPassByReference(boolean passByReference) {
this.passByReference = Boolean.valueOf(passByReference);
}
/**
* Sets ejb pass-by-reference value.
* @param pass-by-reference New value of property pass-by-reference.
*/
public void setPassByReference(Boolean passByReference) {
this.passByReference = passByReference;
}
/**
* Evaluates property passByReference for null value
* @return boolean true if property passByReference is not null
* boolean false if property passByReference is null
*/
public boolean isPassByReferenceDefined() {
boolean passByReferenceDefined = false;
if (this.passByReference != null) {
passByReferenceDefined = true;
}
return passByReferenceDefined;
}
/**
* Getter for property ejbDescriptor.
* @returns EjbDescriptor object property - J2EE specific
* ejb descriptor
*/
public EjbDescriptor getEjbDescriptor() {
return this.ejbDescriptor;
}
/**
* Setter for property ejbDescriptor
* @param ejbDescriptor - EjbDescriptor object - J2EE specific ejb descriptor
*/
public void setEjbDescriptor(EjbDescriptor ejbDescriptor) {
this.ejbDescriptor = ejbDescriptor;
}
/**
* Convenience method to check if a method is flush enabled or not
* @param methodDesc - Method Descriptor object to check
* @return boolean true if methodDesc is flushed enabled
* boolean false if methodDesc is not flushed enabled
*/
public boolean isFlushEnabledFor(MethodDescriptor methodDesc) {
if (flushMethodDescriptor != null) {
return flushMethodDescriptor.isFlushEnabledFor(methodDesc);
}
return false;
}
/**
* Parse checkpointed-methods element and save its values in
* CheckpointAtEndOfMethodDescriptor
*
* The methods should be separated by semicolons.
* The param list should separated by commas.
* All method param types should be full qualified.
* Variable name is allowed for the param type.
* No return type or exception type.
*
* Example:
* foo(java.lang.String, a.b.c d); bar(java.lang.String s)
*
*/
public void parseCheckpointedMethods(EjbDescriptor ejbDesc) {
if (checkpointedMethods == null ||
checkpointedMethods.trim().length() == 0) {
return;
}
if (checkpointMethodDescriptor == null) {
checkpointMethodDescriptor =
new CheckpointAtEndOfMethodDescriptor();
setCheckpointAtEndOfMethodDescriptor(checkpointMethodDescriptor);
checkpointMethodDescriptor.setEjbDescriptor(ejbDesc);
}
StringTokenizer methodsTokenizer =
new StringTokenizer(checkpointedMethods, METHODS_DELIM);
while (methodsTokenizer.hasMoreTokens()) {
// process each method
String method = methodsTokenizer.nextToken().trim();
if (method.length() == 0) {
continue;
}
MethodDescriptor methodDescriptor =
parseCheckpointedMethod(method);
if (methodDescriptor != null) {
checkpointMethodDescriptor.getMethodDescriptors().add(
methodDescriptor);
}
}
}
// parse the given method string into a MethodDescriptor
private MethodDescriptor parseCheckpointedMethod (String method) {
String methodName, methodParams;
ArrayList paramTypeList = new ArrayList();
try {
if ( method.indexOf(LEFT_PAREN) != -1 &&
method.indexOf(RIGHT_PAREN) != -1 ) {
int pos = method.indexOf(LEFT_PAREN);
int pos2 = method.indexOf(RIGHT_PAREN);
// retrieve the method name
methodName = method.substring(0, pos).trim();
// retrieve the parameter list
if (pos < pos2-1) {
methodParams = method.substring(pos+1, pos2).trim();
StringTokenizer paramsTokenizer =
new StringTokenizer(methodParams, PARAMS_DELIM);
while (paramsTokenizer.hasMoreTokens()) {
// process each param
String param = paramsTokenizer.nextToken().trim();
if (param.length() == 0) {
continue;
}
StringTokenizer paramTokenizer =
new StringTokenizer(param, PARAM_DELIM);
while (paramTokenizer.hasMoreTokens()) {
String paramType =
paramTokenizer.nextToken().trim();
if (paramType.length() != 0) {
paramTypeList.add(paramType);
// only interested in the first token
break;
}
}
}
}
if (paramTypeList.size() > 0) {
String[] paramTypeArray = (String[])paramTypeList.toArray(
new String[paramTypeList.size()]);
return new MethodDescriptor(methodName, null,
paramTypeArray, null);
} else {
return new MethodDescriptor(methodName, null, null, null);
}
} else {
DOLUtils.getDefaultLogger().log(Level.WARNING, "enterprise.deployment_badformat_checkpointedmethods", new Object[] {method});
return null;
}
} catch (Exception e) {
e.printStackTrace();
// any parsing exception indicates it is not a well-formed
// string, we will just print warning and return null
DOLUtils.getDefaultLogger().log(Level.WARNING, "enterprise.deployment_badformat_checkpointedmethods", new Object[] {method});
return null;
}
}
}