/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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.jbpm.runtime.manager.impl.deploy;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlTransient;
import org.kie.internal.runtime.conf.AuditMode;
import org.kie.internal.runtime.conf.BuilderHandler;
import org.kie.internal.runtime.conf.DeploymentDescriptor;
import org.kie.internal.runtime.conf.DeploymentDescriptorBuilder;
import org.kie.internal.runtime.conf.NamedObjectModel;
import org.kie.internal.runtime.conf.ObjectModel;
import org.kie.internal.runtime.conf.PersistenceMode;
import org.kie.internal.runtime.conf.RuntimeStrategy;
/*
* NOTE: Whenever adding new fields that represent actual item of deployment descriptor always update:
* - isEmpty method
* - clearClone method
* - Builder
*/
@XmlRootElement(name="deployment-descriptor")
@XmlAccessorType(XmlAccessType.NONE)
public class DeploymentDescriptorImpl implements DeploymentDescriptor, Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(name="persistence-unit")
@XmlSchemaType(name="string")
private String persistenceUnit;
@XmlElement(name="audit-persistence-unit")
@XmlSchemaType(name="string")
private String auditPersistenceUnit;
@XmlElement(name="audit-mode")
private AuditMode auditMode = AuditMode.JPA;
@XmlElement(name="persistence-mode")
private PersistenceMode persistenceMode = PersistenceMode.JPA;
@XmlElement(name="runtime-strategy")
private RuntimeStrategy runtimeStrategy = RuntimeStrategy.SINGLETON;
@XmlElement(name="marshalling-strategy")
@XmlElementWrapper(name="marshalling-strategies")
private Set<ObjectModel> marshallingStrategies = new LinkedHashSet<ObjectModel>();
@XmlElement(name="event-listener")
@XmlElementWrapper(name="event-listeners")
private Set<ObjectModel> eventListeners = new LinkedHashSet<ObjectModel>();
@XmlElement(name="task-event-listener")
@XmlElementWrapper(name="task-event-listeners")
private Set<ObjectModel> taskEventListeners = new LinkedHashSet<ObjectModel>();
@XmlElement(name="global")
@XmlElementWrapper(name="globals")
private Set<NamedObjectModel> globals = new LinkedHashSet<NamedObjectModel>();
@XmlElement(name="work-item-handler")
@XmlElementWrapper(name="work-item-handlers")
private Set<NamedObjectModel> workItemHandlers = new LinkedHashSet<NamedObjectModel>();
@XmlElement(name="environment-entry")
@XmlElementWrapper(name="environment-entries")
private Set<NamedObjectModel> environmentEntries = new LinkedHashSet<NamedObjectModel>();
@XmlElement(name="configuration")
@XmlElementWrapper(name="configurations")
private Set<NamedObjectModel> configuration = new LinkedHashSet<NamedObjectModel>();
@XmlElement(name="required-role")
@XmlElementWrapper(name="required-roles")
private Set<String> requiredRoles = new LinkedHashSet<String>();
@XmlElement(name="remoteable-class")
@XmlElementWrapper(name="remoteable-classes")
private List<String> classes = new ArrayList<String>();
@XmlElement(name="limit-serialization-classes")
private Boolean limitSerializationClasses = true;
@XmlTransient
private Map<String, Set<String>> mappedRoles;
protected void mapRequiredRoles() {
if (mappedRoles != null) {
return;
}
mappedRoles = new HashMap<String, Set<String>>();
Set<String> typeAll = new LinkedHashSet<String>();
Set<String> typeView = new LinkedHashSet<String>();
Set<String> typeExecute = new LinkedHashSet<String>();
mappedRoles.put(TYPE_ALL, typeAll);
mappedRoles.put(TYPE_VIEW, typeView);
mappedRoles.put(TYPE_EXECUTE, typeExecute);
if (requiredRoles != null && !requiredRoles.isEmpty()) {
for (String roleString : requiredRoles) {
String rolePrefix = null;
String role = roleString;
if (roleString.indexOf(":") != -1) {
String[] roleInfo = roleString.split(":");
rolePrefix = roleInfo[0];
role = roleInfo[1];
mappedRoles.get(rolePrefix).add(role);
typeAll.add(role);
} else {
typeAll.add(role);
typeView.add(role);
typeExecute.add(role);
}
}
}
}
public DeploymentDescriptorImpl() {
// fox jaxb only
}
public DeploymentDescriptorImpl(String defaultPU) {
this.persistenceUnit = defaultPU;
this.auditPersistenceUnit = defaultPU;
}
@Override
public String getPersistenceUnit() {
return persistenceUnit;
}
@Override
public String getAuditPersistenceUnit() {
return auditPersistenceUnit;
}
@Override
public AuditMode getAuditMode() {
return auditMode;
}
@Override
public PersistenceMode getPersistenceMode() {
return persistenceMode;
}
@Override
public RuntimeStrategy getRuntimeStrategy() {
return runtimeStrategy;
}
@Override
public List<ObjectModel> getMarshallingStrategies() {
return new ArrayList<ObjectModel>(cleanSet(marshallingStrategies));
}
@Override
public List<ObjectModel> getEventListeners() {
return new ArrayList<ObjectModel>(cleanSet(eventListeners));
}
@Override
public List<NamedObjectModel> getGlobals() {
return new ArrayList<NamedObjectModel>(cleanNamedSet(globals));
}
@Override
public List<NamedObjectModel> getWorkItemHandlers() {
return new ArrayList<NamedObjectModel>(cleanNamedSet(workItemHandlers));
}
@Override
public List<ObjectModel> getTaskEventListeners() {
return new ArrayList<ObjectModel>(cleanSet(taskEventListeners));
}
@Override
public List<NamedObjectModel> getEnvironmentEntries() {
return new ArrayList<NamedObjectModel>(cleanNamedSet(environmentEntries));
}
@Override
public List<NamedObjectModel> getConfiguration() {
return new ArrayList<NamedObjectModel>(cleanNamedSet(configuration));
}
@Override
public List<String> getRequiredRoles() {
return new ArrayList<String>(requiredRoles);
}
@Override
public List<String> getRequiredRoles(String type) {
mapRequiredRoles();
Set<String> roles = mappedRoles.get(type);
if (roles == null) {
return new ArrayList<String>();
} else {
return new ArrayList<String>(roles);
}
}
@Override
public List<String> getClasses() {
if (classes == null) {
return new ArrayList<String>();
}
return new ArrayList<String>(classes);
}
public void setPersistenceUnit(String persistenceUnit) {
this.persistenceUnit = persistenceUnit;
}
public void setAuditPersistenceUnit(String auditPersistenceUnit) {
this.auditPersistenceUnit = auditPersistenceUnit;
}
public void setAuditMode(AuditMode auditMode) {
this.auditMode = auditMode;
}
public void setPersistenceMode(PersistenceMode persistenceMode) {
this.persistenceMode = persistenceMode;
}
public void setRuntimeStrategy(RuntimeStrategy runtimeStrategy) {
this.runtimeStrategy = runtimeStrategy;
}
public void setMarshallingStrategies(List<ObjectModel> marshallingStrategies) {
if (marshallingStrategies != null) {
this.marshallingStrategies = new HashSet<ObjectModel>(marshallingStrategies);
}
}
public void setEventListeners(List<ObjectModel> eventListeners) {
if (eventListeners != null) {
this.eventListeners = new HashSet<ObjectModel>(eventListeners);
}
}
public void setTaskEventListeners(List<ObjectModel> taskEventListeners) {
if (taskEventListeners != null) {
this.taskEventListeners = new HashSet<ObjectModel>(taskEventListeners);
}
}
public void setGlobals(List<NamedObjectModel> globals) {
if (globals != null) {
this.globals = new HashSet<NamedObjectModel>(globals);
}
}
public void setWorkItemHandlers(List<NamedObjectModel> workItemHandlers) {
if (workItemHandlers != null) {
this.workItemHandlers = new HashSet<NamedObjectModel>(workItemHandlers);
}
}
public void setEnvironmentEntries(List<NamedObjectModel> environmentEntires) {
if (environmentEntires != null) {
this.environmentEntries = new HashSet<NamedObjectModel>(environmentEntires);
}
}
public void setConfiguration(List<NamedObjectModel> configuration) {
if (configuration != null) {
this.configuration = new HashSet<NamedObjectModel>(configuration);
}
}
public void setRequiredRoles(List<String> requiredRoles) {
if (requiredRoles != null) {
this.requiredRoles = new HashSet<String>(requiredRoles);
}
}
public void setClasses(List<String> classes) {
if (classes != null) {
this.classes = new ArrayList<String>(classes);
}
}
public Boolean getLimitSerializationClasses() {
return limitSerializationClasses;
}
public void setLimitSerializationClasses( Boolean limitSerializationClasses ) {
this.limitSerializationClasses = limitSerializationClasses;
}
protected Set<NamedObjectModel> cleanNamedSet(Set<NamedObjectModel> input) {
input.remove(null);
return input;
}
protected Set<ObjectModel> cleanSet(Set<ObjectModel> input) {
input.remove(null);
return input;
}
protected void removeTransient(Set<?> input) {
Iterator<?> it = input.iterator();
while (it.hasNext()) {
Object object = (Object) it.next();
if (object instanceof TransientNamedObjectModel
|| object instanceof TransientObjectModel) {
it.remove();
}
}
}
public DeploymentDescriptor clearClone() throws CloneNotSupportedException {
DeploymentDescriptorImpl clone = new DeploymentDescriptorImpl();
clone.getBuilder()
.setClasses(getClasses())
.setConfiguration(getConfiguration())
.setEnvironmentEntries(getEnvironmentEntries())
.setEventListeners(getEventListeners())
.setGlobals(getGlobals())
.setMarshalingStrategies(getMarshallingStrategies())
.setRequiredRoles(getRequiredRoles())
.setTaskEventListeners(getTaskEventListeners())
.setWorkItemHandlers(getWorkItemHandlers())
.auditMode(getAuditMode())
.auditPersistenceUnit(getAuditPersistenceUnit())
.persistenceMode(getPersistenceMode())
.persistenceUnit(getPersistenceUnit())
.runtimeStrategy(getRuntimeStrategy())
.setLimitSerializationClasses(getLimitSerializationClasses());
removeTransient(clone.configuration);
removeTransient(clone.environmentEntries);
removeTransient(clone.eventListeners);
removeTransient(clone.globals);
removeTransient(clone.marshallingStrategies);
removeTransient(clone.taskEventListeners);
removeTransient(clone.workItemHandlers);
return clone;
}
public boolean isEmpty() {
boolean empty = true;
if (persistenceUnit != null) {
return false;
}
if (auditPersistenceUnit != null) {
return false;
}
if (auditMode != AuditMode.JPA) {
return false;
}
if (persistenceMode != PersistenceMode.JPA) {
return false;
}
if (runtimeStrategy != RuntimeStrategy.SINGLETON) {
return false;
}
if ( marshallingStrategies != null && !marshallingStrategies.isEmpty()) {
return false;
}
if (eventListeners != null && !eventListeners.isEmpty()) {
return false;
}
if (taskEventListeners != null && !taskEventListeners.isEmpty()) {
return false;
}
if (globals != null && !globals.isEmpty()) {
return false;
}
if (workItemHandlers != null && !workItemHandlers.isEmpty()) {
return false;
}
if (environmentEntries != null && !environmentEntries.isEmpty()) {
return false;
}
if (configuration != null && !configuration.isEmpty()) {
return false;
}
if (requiredRoles != null && !requiredRoles.isEmpty()) {
return false;
}
if (classes != null && !classes.isEmpty()) {
return false;
}
if (!limitSerializationClasses) {
return false;
}
return empty;
}
@Override
public DeploymentDescriptorBuilder getBuilder() {
return new DeploymentDescriptorBuilder() {
private BuilderHandler handler = new BuilderHandler() {
@Override
public boolean accepted(Object value) {
return true;
}
};
private DeploymentDescriptorImpl descriptor = DeploymentDescriptorImpl.this;
@Override
public DeploymentDescriptorBuilder runtimeStrategy(RuntimeStrategy strategy) {
if (handler.accepted(strategy)) {
descriptor.setRuntimeStrategy(strategy);
}
return this;
}
@Override
public DeploymentDescriptorBuilder persistenceUnit(String pu) {
if (handler.accepted(pu)) {
descriptor.setPersistenceUnit(pu);
}
return this;
}
@Override
public DeploymentDescriptorBuilder persistenceMode(PersistenceMode mode) {
if (handler.accepted(mode)) {
descriptor.setPersistenceMode(mode);
}
return this;
}
@Override
public DeploymentDescriptorBuilder auditPersistenceUnit(String pu) {
if (handler.accepted(pu)) {
descriptor.setAuditPersistenceUnit(pu);
}
return this;
}
@Override
public DeploymentDescriptorBuilder auditMode(AuditMode mode) {
if (handler.accepted(mode)) {
descriptor.setAuditMode(mode);
}
return this;
}
@Override
public DeploymentDescriptorBuilder addWorkItemHandler(NamedObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.workItemHandlers.add(model)) {
descriptor.workItemHandlers.remove(model);
descriptor.workItemHandlers.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addTaskEventListener(ObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.taskEventListeners.add(model)) {
descriptor.taskEventListeners.remove(model);
descriptor.taskEventListeners.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addMarshalingStrategy(ObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.marshallingStrategies.add(model)) {
descriptor.marshallingStrategies.remove(model);
descriptor.marshallingStrategies.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addGlobal(NamedObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.globals.add(model)) {
descriptor.globals.remove(model);
descriptor.globals.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addEventListener(ObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.eventListeners.add(model)) {
descriptor.eventListeners.remove(model);
descriptor.eventListeners.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addEnvironmentEntry(NamedObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.environmentEntries.add(model)) {
descriptor.environmentEntries.remove(model);
descriptor.environmentEntries.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addConfiguration(NamedObjectModel model) {
if (handler.accepted(model)) {
if (!descriptor.configuration.add(model)) {
descriptor.configuration.remove(model);
descriptor.configuration.add(model);
}
}
return this;
}
@Override
public DeploymentDescriptorBuilder addRequiredRole(String role) {
if (handler.accepted(role)) {
descriptor.requiredRoles.add(role);
}
return this;
}
@Override
public DeploymentDescriptorBuilder addClass(String clazz) {
if (handler.accepted(clazz)) {
descriptor.classes.add(clazz);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setConfiguration(List<NamedObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setConfiguration(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setEnvironmentEntries(List<NamedObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setEnvironmentEntries(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setWorkItemHandlers(List<NamedObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setWorkItemHandlers(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setGlobals(List<NamedObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setGlobals(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setEventListeners(List<ObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setEventListeners(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setTaskEventListeners(List<ObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setTaskEventListeners(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setMarshalingStrategies(List<ObjectModel> models) {
if (handler.accepted(models)) {
descriptor.setMarshallingStrategies(models);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setRequiredRoles(List<String> roles) {
if (handler.accepted(roles)) {
descriptor.setRequiredRoles(roles);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setClasses(List<String> classes) {
if (handler.accepted(classes)) {
descriptor.setClasses(classes);
}
return this;
}
@Override
public DeploymentDescriptorBuilder setLimitSerializationClasses(Boolean limit) {
if (handler.accepted(limit)) {
descriptor.setLimitSerializationClasses(limit);
}
return this;
}
@Override
public void setBuildHandler(BuilderHandler handler) {
this.handler = handler;
}
@Override
public DeploymentDescriptor get() {
return descriptor;
}
};
}
@Override
public String toXml() {
return DeploymentDescriptorIO.toXml(this);
}
}