/*
* Copyright 2012 David Blevins
*
* 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.jboss.as.test.integration.ejb.mdb.dynamic.adapter;
import org.jboss.as.test.integration.ejb.mdb.dynamic.api.Command;
import org.jboss.as.test.integration.ejb.mdb.dynamic.api.Prompt;
import org.jboss.as.test.integration.ejb.mdb.dynamic.impl.Cmd;
import javax.resource.ResourceException;
import javax.resource.spi.ActivationSpec;
import javax.resource.spi.InvalidPropertyException;
import javax.resource.spi.ResourceAdapter;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TelnetActivationSpec implements ActivationSpec {
private ResourceAdapter resourceAdapter;
private final List<Cmd> cmds = new ArrayList<Cmd>();
private String prompt;
// JCA 1.6 doesn't allow Class as a valid property type
private String beanClassName;
/**
* @author <a href="mailto:cdewolf@redhat.com">Carlo de Wolf</a>
* @return the bean class
* @throws InvalidPropertyException
*/
private Class<?> beanClass() throws InvalidPropertyException {
// Carlo: this is different as opposed to the original proposal
try {
// we can only hope for the best here
return Class.forName(beanClassName);
} catch (ClassNotFoundException e) {
throw new InvalidPropertyException(e);
}
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getBeanClass() {
return beanClassName;
}
public void setBeanClass(final String beanClassName) {
this.beanClassName = beanClassName;
}
public List<Cmd> getCmds() {
return cmds;
}
@Override
public void validate() throws InvalidPropertyException {
if (beanClassName == null)
throw new InvalidPropertyException("beanClass is null");
final Class<?> beanClass = beanClass();
// Set Prompt
final Prompt prompt = beanClass.getAnnotation(Prompt.class);
if (prompt != null) {
this.prompt = prompt.value();
}
// Get Commands
final Method[] methods = beanClass.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(Command.class)) {
final Command command = method.getAnnotation(Command.class);
cmds.add(new Cmd(command.value(), method));
}
}
// Validate
if (this.prompt == null || this.prompt.length() == 0) {
this.prompt = "prompt>";
}
if (this.cmds.size() == 0) {
throw new InvalidPropertyException("No @Command methods");
}
}
@Override
public ResourceAdapter getResourceAdapter() {
return resourceAdapter;
}
@Override
public void setResourceAdapter(ResourceAdapter ra) throws ResourceException {
this.resourceAdapter = ra;
}
}