/*
 * Copyright 2015 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.
 *
 *      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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.ByteArrayInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;

import javax.xml.bind.annotation.XmlElement;

import org.drools.compiler.kie.builder.impl.InternalKieModule;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.builder.ReleaseId;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.runtime.conf.AuditMode;
import org.kie.internal.runtime.conf.DeploymentDescriptor;
import org.kie.internal.runtime.conf.MergeMode;
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;
import org.kie.test.util.compare.ComparePair;

public class DeploymentDescriptorManagerTest extends AbstractDeploymentDescriptorTest {

	private static final String SIMPLE_DRL = "package org.jbpm; "
			+ "	rule \"Start Hello1\"" + "	  when" + "	  then"
			+ "	    System.out.println(\"Hello\");" + "	end";

	protected static final String ARTIFACT_ID = "test-module";
	protected static final String GROUP_ID = "org.jbpm.test";
	protected static final String VERSION = "1.0.0-SNAPSHOT";



	@Test
	public void testDefaultDeploymentDescriptor() {
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		DeploymentDescriptor descriptor = manager.getDefaultDescriptor();

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());
	}

	@Test
	public void testDefaultDeploymentDescriptorFromClasspath() {
		System.setProperty("org.kie.deployment.desc.location",
				"classpath:/deployment/deployment-descriptor-defaults-and-ms.xml");
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		DeploymentDescriptor descriptor = manager.getDefaultDescriptor();

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(1, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());
	}

	@Test
	public void testDefaultDeploymentDescriptorFromFile() {
		System.setProperty("org.kie.deployment.desc.location",
				"file:src/test/resources/deployment/deployment-descriptor-defaults-and-ms.xml");
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		DeploymentDescriptor descriptor = manager.getDefaultDescriptor();

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(1, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());
	}

	@Test
	public void testDeploymentDescriptorFromKieContainerNoDescInKjar() {
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		KieServices ks = KieServices.Factory.get();
		ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);

		Map<String, String> resources = new HashMap<String, String>();
		resources.put("src/main/resources/simple.drl", SIMPLE_DRL);

		InternalKieModule kJar1 = createKieJar(ks, releaseId, resources);
		installKjar(releaseId, kJar1);

		KieContainer kieContainer = ks.newKieContainer(releaseId);
		assertNotNull(kieContainer);

		List<DeploymentDescriptor> descriptorHierarchy = manager.getDeploymentDescriptorHierarchy(kieContainer);
		assertNotNull(descriptorHierarchy);
		assertEquals(1, descriptorHierarchy.size());

		DeploymentDescriptor descriptor = descriptorHierarchy.get(0);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

	}

	@Test
	public void testDeploymentDescriptorFromKieContainer() {
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		KieServices ks = KieServices.Factory.get();
		ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);

		DeploymentDescriptor descriptor = new DeploymentDescriptorImpl("org.jbpm.domain");
		descriptor.getBuilder().runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);

		Map<String, String> resources = new HashMap<String, String>();
		resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
		resources.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
				descriptor.toXml());

		InternalKieModule kJar1 = createKieJar(ks, releaseId, resources);
		installKjar(releaseId, kJar1);

		KieContainer kieContainer = ks.newKieContainer(releaseId);
		assertNotNull(kieContainer);

		List<DeploymentDescriptor> descriptorHierarchy = manager
				.getDeploymentDescriptorHierarchy(kieContainer);
		assertNotNull(descriptorHierarchy);
		assertEquals(2, descriptorHierarchy.size());

		descriptor = descriptorHierarchy.get(0);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

		descriptor = descriptorHierarchy.get(1);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

	}

	@Test
	public void testDeploymentDescriptorFromKieContainerWithDependency() {
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		KieServices ks = KieServices.Factory.get();
		// create dependency kjar
		ReleaseId releaseIdDep = ks.newReleaseId(GROUP_ID, "dependency-data", VERSION);

		DeploymentDescriptor descriptorDep = new DeploymentDescriptorImpl("org.jbpm.domain");
		descriptorDep.getBuilder()
		.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE)
		.auditPersistenceUnit("org.jbpm.audit");

		Map<String, String> resourcesDep = new HashMap<String, String>();
		resourcesDep.put("src/main/resources/simple.drl", SIMPLE_DRL);
		resourcesDep.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
				descriptorDep.toXml());

		InternalKieModule kJarDep = createKieJar(ks, releaseIdDep, resourcesDep);
		installKjar(releaseIdDep, kJarDep);

		// create first kjar that will have dependency to another
		ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);

		DeploymentDescriptor descriptor = new DeploymentDescriptorImpl("org.jbpm.domain");
		descriptor.getBuilder()
		.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);

		Map<String, String> resources = new HashMap<String, String>();
		resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
		resources.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
				descriptor.toXml());

		InternalKieModule kJar1 = createKieJar(ks, releaseId, resources, releaseIdDep);
		installKjar(releaseId, kJar1);

		KieContainer kieContainer = ks.newKieContainer(releaseId);
		assertNotNull(kieContainer);

		List<DeploymentDescriptor> descriptorHierarchy = manager.getDeploymentDescriptorHierarchy(kieContainer);
		assertNotNull(descriptorHierarchy);
		assertEquals(3, descriptorHierarchy.size());

		descriptor = descriptorHierarchy.get(0);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

		descriptor = descriptorHierarchy.get(1);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.audit", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

		descriptor = descriptorHierarchy.get(2);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

	}

	@Test
	public void testDeploymentDescriptorFromKieContainerWithDependencyMerged() {
		DeploymentDescriptorManager manager = new DeploymentDescriptorManager("org.jbpm.domain");

		KieServices ks = KieServices.Factory.get();
		// create dependency kjar
		ReleaseId releaseIdDep = ks.newReleaseId(GROUP_ID, "dependency-data", VERSION);

		DeploymentDescriptor descriptorDep = new DeploymentDescriptorImpl("org.jbpm.domain");
		descriptorDep.getBuilder()
		.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE)
		.auditPersistenceUnit("org.jbpm.audit")
		.addGlobal(new NamedObjectModel("service", "org.jbpm.global.Service"));

		Map<String, String> resourcesDep = new HashMap<String, String>();
		resourcesDep.put("src/main/resources/simple.drl", SIMPLE_DRL);
		resourcesDep.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
				descriptorDep.toXml());

		InternalKieModule kJarDep = createKieJar(ks, releaseIdDep, resourcesDep);
		installKjar(releaseIdDep, kJarDep);

		// create first kjar that will have dependency to another
		ReleaseId releaseId = ks.newReleaseId(GROUP_ID, ARTIFACT_ID, VERSION);

		DeploymentDescriptor descriptor = new DeploymentDescriptorImpl("org.jbpm.domain");
		descriptor.getBuilder()
		.runtimeStrategy(RuntimeStrategy.PER_PROCESS_INSTANCE);

		Map<String, String> resources = new HashMap<String, String>();
		resources.put("src/main/resources/simple.drl", SIMPLE_DRL);
		resources.put("src/main/resources/META-INF/kie-deployment-descriptor.xml",
				descriptor.toXml());

		InternalKieModule kJar1 = createKieJar(ks, releaseId, resources, releaseIdDep);
		installKjar(releaseId, kJar1);

		KieContainer kieContainer = ks.newKieContainer(releaseId);
		assertNotNull(kieContainer);

		List<DeploymentDescriptor> descriptorHierarchy = manager.getDeploymentDescriptorHierarchy(kieContainer);
		assertNotNull(descriptorHierarchy);
		assertEquals(3, descriptorHierarchy.size());

		descriptor = descriptorHierarchy.get(0);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

		descriptor = descriptorHierarchy.get(1);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.audit", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(1, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

		descriptor = descriptorHierarchy.get(2);

		assertNotNull(descriptor);
		assertEquals("org.jbpm.domain", descriptor.getPersistenceUnit());
		assertEquals("org.jbpm.domain", descriptor.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, descriptor.getAuditMode());
		assertEquals(PersistenceMode.JPA, descriptor.getPersistenceMode());
		assertEquals(RuntimeStrategy.SINGLETON, descriptor.getRuntimeStrategy());
		assertEquals(0, descriptor.getMarshallingStrategies().size());
		assertEquals(0, descriptor.getConfiguration().size());
		assertEquals(0, descriptor.getEnvironmentEntries().size());
		assertEquals(0, descriptor.getEventListeners().size());
		assertEquals(0, descriptor.getGlobals().size());
		assertEquals(0, descriptor.getTaskEventListeners().size());
		assertEquals(0, descriptor.getWorkItemHandlers().size());

		DeploymentDescriptorMerger merger = new DeploymentDescriptorMerger();
		DeploymentDescriptor outcome = merger.merge(descriptorHierarchy, MergeMode.MERGE_COLLECTIONS);

		assertNotNull(outcome);
		assertEquals("org.jbpm.domain", outcome.getPersistenceUnit());
		assertEquals("org.jbpm.domain", outcome.getAuditPersistenceUnit());
		assertEquals(AuditMode.JPA, outcome.getAuditMode());
		assertEquals(PersistenceMode.JPA, outcome.getPersistenceMode());
		assertEquals(RuntimeStrategy.PER_PROCESS_INSTANCE, outcome.getRuntimeStrategy());
		assertEquals(0, outcome.getMarshallingStrategies().size());
		assertEquals(0, outcome.getConfiguration().size());
		assertEquals(0, outcome.getEnvironmentEntries().size());
		assertEquals(0, outcome.getEventListeners().size());
		assertEquals(1, outcome.getGlobals().size());
		assertEquals(0, outcome.getTaskEventListeners().size());
		assertEquals(0, outcome.getWorkItemHandlers().size());

	}

	@Test
	public void roundTripDescriptorMarshallingTest() throws Exception {
	   DeploymentDescriptorImpl depDescImpl = new DeploymentDescriptorImpl();

	   List<Field> fieldsToFill = new LinkedList<Field>();
	   for( Field field : DeploymentDescriptorImpl.class.getDeclaredFields() ) {
	       if( field.getAnnotation(XmlElement.class) != null ) {
	           fieldsToFill.add(field);
	       }
	   }
	   for( Field field : fieldsToFill ) {
	       field.setAccessible(true);
	      Class fieldType = field.getType();
	      if( fieldType.equals(String.class) ) {
	          field.set(depDescImpl, getStringVal());
	      } else if( fieldType.equals(Boolean.class) ) {
	          field.set(depDescImpl, true);
	      } else if( fieldType.equals(PersistenceMode.class) ) {
	         field.set(depDescImpl, PersistenceMode.NONE);
	      } else if( fieldType.equals(AuditMode.class) ) {
	         field.set(depDescImpl, AuditMode.JMS);
	      } else if( fieldType.equals(RuntimeStrategy.class) ) {
	         field.set(depDescImpl, RuntimeStrategy.PER_PROCESS_INSTANCE);
	      } else if( Set.class.isAssignableFrom(fieldType) ) {
	         Type genType = field.getGenericType();
	         Type genParamType = ((ParameterizedType) genType).getActualTypeArguments()[0];
	         Set val = new HashSet();
	         if( genParamType.equals(String.class) ) {
	            val.add(getStringVal());
	         } else if( genParamType.equals(ObjectModel.class) ) {
	             val.add(getObjectModelParameter(getStringVal(), false));
	         } else if( genParamType.equals(NamedObjectModel.class) ) {
	             val.add(getObjectModelParameter(getStringVal(), true));
	         }
	         field.set(depDescImpl, val);
	      }
	   }

	   String depDescXml = DeploymentDescriptorIO.toXml(depDescImpl);

	   ByteArrayInputStream inputStream = new ByteArrayInputStream(depDescXml.getBytes());

	   DeploymentDescriptor copyDepDescImpl = DeploymentDescriptorIO.fromXml(inputStream);

	   new ComparePair(depDescImpl, copyDepDescImpl)
	       .addNullFields( "mappedRoles" )
	       .useFields()
	       .compare();

	}

	private static String getStringVal() {
	    String val = UUID.randomUUID().toString();
	    return val.substring(0, val.indexOf("-"));
	}


    private static Random random = new Random();

    private static ObjectModel getObjectModelParameter( String resolver, boolean named ) {
        if( named ) {
            return new NamedObjectModel(resolver, UUID.randomUUID().toString(), Integer.toString(random.nextInt(100000)));
        } else {
            return new ObjectModel(resolver, UUID.randomUUID().toString(), Integer.toString(random.nextInt(100000)));
        }
    }
}
