private void validateDeploymentProperties(D definition, Map<String, String> properties) {
		List<ModuleDescriptor> modules = null;
		if(!ComposedJobUtil.isComposedJobDefinition(definition.getDefinition())){
			modules = parser.parse(definition.getName(), definition.getDefinition(), definitionKind);
		}
		else {
			modules = new ArrayList<ModuleDescriptor>();
			ModuleDescriptor.Builder builder =
					new ModuleDescriptor.Builder()
							.setType(ModuleType.job)
							.setGroup("job")
							.setModuleName(ComposedJobUtil.getComposedJobModuleName(definition.getName()))
							.setModuleLabel("")
							.setIndex(0);
			modules.add(builder.build());
		}
		Set<String> moduleLabels = new HashSet<String>(modules.size());
		for (ModuleDescriptor md : modules) {
			moduleLabels.add(md.getModuleLabel());
		}
		for (Map.Entry<String, String> pair : properties.entrySet()) {
			Matcher matcher = DEPLOYMENT_PROPERTY_PATTERN.matcher(pair.getKey());
			Assert.isTrue(matcher.matches(),
					String.format("'%s' does not match '%s'", pair.getKey(), DEPLOYMENT_PROPERTY_PATTERN));
			String moduleName = matcher.group(1);
			Assert.isTrue("*".equals(moduleName) || moduleLabels.contains(moduleName),
					String.format("'%s' refers to a module that is not in the list: %s", pair.getKey(), moduleLabels));
		}
	}
Validates that all deployment properties (of the form "module.<modulename>.<key>" do indeed
reference module names that belong to the stream/job definition).
spring-xd-dirt/src/main/java/org/springframework/xd/dirt/stream/AbstractDeployer.java