/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.jboss;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import org.jboss.as.controller.ModelController;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.teiid.adminapi.Admin;
import org.teiid.adminapi.AdminException;
import org.teiid.adminapi.VDB.Status;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.jboss.AdminFactory;
import org.teiid.deployers.CompositeVDB;
import org.teiid.deployers.RestWarGenerator;
import org.teiid.deployers.VDBLifeCycleListener;
import org.teiid.deployers.VDBRepository;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.vdb.runtime.VDBKey;
public class ResteasyEnabler implements VDBLifeCycleListener, Service<Void> {
protected final InjectedValue<ModelController> controllerValue = new InjectedValue<ModelController>();
protected final InjectedValue<Executor> executorInjector = new InjectedValue<Executor>();
final InjectedValue<VDBRepository> vdbRepoInjector = new InjectedValue<VDBRepository>();
private HashMap<VDBKey, AtomicBoolean> deployed = new HashMap<VDBKey, AtomicBoolean>();
private RestWarGenerator generator;
private boolean started = false;
public ResteasyEnabler(RestWarGenerator generator) {
this.generator = generator;
}
@Override
public synchronized void added(String name, CompositeVDB vdb) {
this.deployed.put(vdb.getVDBKey(), new AtomicBoolean(false));
}
@Override
public void beforeRemove(String name, CompositeVDB cvdb) {
if (cvdb != null) {
this.deployed.remove(cvdb.getVDBKey());
}
}
@Override
public synchronized void finishedDeployment(String name, CompositeVDB cvdb) {
final VDBMetaData vdb = cvdb.getVDB();
if (!vdb.getStatus().equals(Status.ACTIVE) || !started) {
return;
}
final String warName = buildName(name, cvdb.getVDB().getVersion());
if (generator.hasRestMetadata(vdb) && this.deployed.get(cvdb.getVDBKey()).compareAndSet(false, true)) {
final Runnable job = new Runnable() {
@Override
public void run() {
try {
byte[] warContents = generator.getContent(vdb);
if (!vdb.getStatus().equals(Status.ACTIVE)) {
return;
}
if (warContents != null) {
//make it a non-persistent deployment
getAdmin().deploy(warName, new ByteArrayInputStream(warContents), false);
}
} catch (IOException e) {
LogManager.logWarning(LogConstants.CTX_RUNTIME, e,
IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50109, warName));
} catch (AdminException e) {
LogManager.logWarning(LogConstants.CTX_RUNTIME, e,
IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50109, warName));
}
}
};
getExecutor().execute(job);
}
}
@Override
public synchronized void removed(String name, CompositeVDB cvdb) {
}
private String buildName(String name, String version) {
return name+"_"+version +".war"; //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public Void getValue() throws IllegalStateException, IllegalArgumentException {
return null;
}
@Override
public void start(StartContext arg0) throws StartException {
started = true;
this.vdbRepoInjector.getValue().addListener(this);
}
@Override
public void stop(StopContext arg0) {
started = false;
}
Admin getAdmin() {
return AdminFactory.getInstance()
.createAdmin(controllerValue.getValue().createClient(executorInjector.getValue()));
}
Executor getExecutor() {
return executorInjector.getValue();
}
}