/*
* Copyright (C) 2011 Everit Kft. (http://everit.org)
*
* 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.everit.osgi.dev.maven.configuration;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Parameter;
import org.everit.osgi.dev.dist.util.configuration.MergeUtil;
import org.everit.osgi.dev.dist.util.configuration.schema.UseByType;
/**
* The configuration of the launched OSGi Container.
*/
public class LaunchConfig extends AbstractLaunchConfig {
/**
* The overrides applied on this launch configuration.
*/
@Parameter
private LaunchConfigOverride[] overrides;
public LaunchConfig() {
super();
}
LaunchConfig(final Map<String, String> programArguments, final Map<String, String> vmArguments,
final LaunchConfigOverride[] overrides) {
super(programArguments, vmArguments);
this.overrides = overrides;
}
private void checkForDuplicateOverrides(final LaunchConfigOverride[] launchConfigOverrides)
throws MojoExecutionException {
if (launchConfigOverrides == null) {
return;
}
Set<UseByType> useBys = new HashSet<>();
for (LaunchConfigOverride launchConfigOverride : launchConfigOverrides) {
UseByType useBy = launchConfigOverride.useBy;
if (useBys.contains(useBy)) {
throw new MojoExecutionException("[" + useBy + "] defined twice in the configuration");
}
useBys.add(useBy);
}
}
/**
* Merges the <code>this</code> {@link LaunchConfig} to the {@link LaunchConfig} of the
* environment and returns a new {@link LaunchConfig}.
*/
public LaunchConfig createLaunchConfigForEnvironment(final LaunchConfig environmentLaunchConfig)
throws MojoExecutionException {
LaunchConfig rval = new LaunchConfig();
mergeDefaults(rval, environmentLaunchConfig);
checkForDuplicateOverrides(
overrides);
checkForDuplicateOverrides(
environmentLaunchConfig == null ? null : environmentLaunchConfig.overrides);
Set<UseByType> processedUseBys = new HashSet<>();
List<LaunchConfigOverride> rvalOverrides = new ArrayList<>();
if (overrides != null) {
for (LaunchConfigOverride o1 : overrides) {
UseByType useBy = o1.useBy;
LaunchConfigOverride o2 = null;
if (environmentLaunchConfig != null) {
o2 = getPairOfUseBy(useBy, environmentLaunchConfig.overrides);
}
LaunchConfigOverride mergedLaunchConfigOverride =
createMergedLaunchConfigOverride(o1, environmentLaunchConfig, o2, useBy);
rvalOverrides.add(mergedLaunchConfigOverride);
processedUseBys.add(useBy);
}
}
if ((environmentLaunchConfig != null) && (environmentLaunchConfig.overrides != null)) {
for (LaunchConfigOverride o2 : environmentLaunchConfig.overrides) {
UseByType useBy = o2.useBy;
if (!processedUseBys.contains(useBy)) {
LaunchConfigOverride mergedLaunchConfigOverride =
createMergedLaunchConfigOverride(null, environmentLaunchConfig, o2, useBy);
rvalOverrides.add(mergedLaunchConfigOverride);
}
}
}
rval.overrides = rvalOverrides.toArray(new LaunchConfigOverride[] {});
return rval;
}
private LaunchConfigOverride createMergedLaunchConfigOverride(final LaunchConfigOverride o1,
final LaunchConfig d2, final LaunchConfigOverride o2, final UseByType useBy)
throws MojoExecutionException {
LaunchConfigOverride mergedLaunchConfigOverride = new LaunchConfigOverride();
mergedLaunchConfigOverride.useBy = useBy;
mergedLaunchConfigOverride.vmArguments = MergeUtil.mergeOverrides(
getVmArgumentsIfAvailable(o1),
getVmArgumentsIfAvailable(d2),
getVmArgumentsIfAvailable(o2));
mergedLaunchConfigOverride.programArguments = MergeUtil.mergeOverrides(
getProgramArgumentsIfAvailable(o1),
getProgramArgumentsIfAvailable(d2),
getProgramArgumentsIfAvailable(o2));
return mergedLaunchConfigOverride;
}
public LaunchConfigOverride[] getOverrides() {
return overrides;
}
private LaunchConfigOverride getPairOfUseBy(final UseByType useBy,
final LaunchConfigOverride[] environmentOverrides) {
for (LaunchConfigOverride launchConfigOverride : environmentOverrides) {
if (launchConfigOverride.useBy.equals(useBy)) {
return launchConfigOverride;
}
}
return null;
}
private Map<String, String> getProgramArgumentsIfAvailable(
final AbstractLaunchConfig abstractLaunchConfig) {
if (abstractLaunchConfig == null) {
return null;
}
return abstractLaunchConfig.programArguments;
}
private Map<String, String> getVmArgumentsIfAvailable(
final AbstractLaunchConfig abstractLaunchConfig) {
if (abstractLaunchConfig == null) {
return null;
}
return abstractLaunchConfig.vmArguments;
}
private void mergeDefaults(final LaunchConfig rval, final LaunchConfig environmentLaunchConfig)
throws MojoExecutionException {
rval.vmArguments = MergeUtil.mergeDefaults(
vmArguments,
environmentLaunchConfig == null ? null : environmentLaunchConfig.vmArguments);
rval.programArguments = MergeUtil.mergeDefaults(
programArguments,
environmentLaunchConfig == null ? null : environmentLaunchConfig.programArguments);
}
}