/**
* Copyright 2011-2017 Asakusa Framework Team.
*
* 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 com.asakusafw.windgate.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.asakusafw.windgate.core.process.ProcessProfile;
import com.asakusafw.windgate.core.process.ProcessProvider;
import com.asakusafw.windgate.core.resource.ResourceProfile;
import com.asakusafw.windgate.core.session.SessionProfile;
import com.asakusafw.windgate.core.util.VoidResourceProvider;
/**
* A total profile for WindGate execution.
* @since 0.2.2
*/
public class GateProfile {
static final WindGateLogger WGLOG = new WindGateCoreLogger(GateProfile.class);
static final Logger LOG = LoggerFactory.getLogger(GateProfile.class);
private final String name;
private final CoreProfile core;
private final SessionProfile session;
private final List<ProcessProfile> processes;
private final List<ResourceProfile> resources;
/**
* Creates a new instance.
* @param name the name (for hint)
* @param core the core segment
* @param session the session segment
* @param processes the process segment
* @param resources the resource segment
* @throws IllegalArgumentException if any parameter is {@code null}
*/
public GateProfile(
String name,
CoreProfile core,
SessionProfile session,
Collection<? extends ProcessProfile> processes,
Collection<? extends ResourceProfile> resources) {
if (core == null) {
throw new IllegalArgumentException("core must not be null"); //$NON-NLS-1$
}
if (session == null) {
throw new IllegalArgumentException("session must not be null"); //$NON-NLS-1$
}
if (processes == null) {
throw new IllegalArgumentException("processes must not be null"); //$NON-NLS-1$
}
if (resources == null) {
throw new IllegalArgumentException("resources must not be null"); //$NON-NLS-1$
}
this.name = name;
this.core = core;
this.session = session;
this.processes = Collections.unmodifiableList(new ArrayList<>(processes));
this.resources = Collections.unmodifiableList(new ArrayList<>(resources));
}
/**
* The name of this profile (for hint).
* @return the name
*/
public String getName() {
return name;
}
/**
* Returns the core segment of this profile.
* @return the core segment
*/
public CoreProfile getCore() {
return core;
}
/**
* Returns the session segment of this profile.
* @return the session segment
*/
public SessionProfile getSession() {
return session;
}
/**
* Returns the process segment of this profile.
* @return the process segment
*/
public List<ProcessProfile> getProcesses() {
return processes;
}
/**
* Returns the resource segment of this profile.
* @return the resource segment
*/
public List<ResourceProfile> getResources() {
return resources;
}
/**
* Loads a total profile from the properties.
* @param name the profile name (for hint)
* @param properties source properties
* @param loader class loader to load the {@link ProcessProvider}
* @return the loaded profile
* @throws IllegalArgumentException if properties are invalid, or if any parameter is {@code null}
* @deprecated use {@link #loadFrom(String, Properties, ProfileContext)} instead
*/
@Deprecated
public static GateProfile loadFrom(String name, Properties properties, ClassLoader loader) {
if (name == null) {
throw new IllegalArgumentException("name must not be null"); //$NON-NLS-1$
}
if (properties == null) {
throw new IllegalArgumentException("properties must not be null"); //$NON-NLS-1$
}
if (loader == null) {
throw new IllegalArgumentException("loader must not be null"); //$NON-NLS-1$
}
return loadFrom(name, properties, ProfileContext.system(loader));
}
/**
* Loads a total profile from the properties.
* @param name the profile name (for hint)
* @param properties source properties
* @param context the current profile context
* @return the loaded profile
* @throws IllegalArgumentException if properties are invalid, or if any parameter is {@code null}
* @since 0.2.4
*/
public static GateProfile loadFrom(String name, Properties properties, ProfileContext context) {
if (name == null) {
throw new IllegalArgumentException("name must not be null"); //$NON-NLS-1$
}
if (properties == null) {
throw new IllegalArgumentException("properties must not be null"); //$NON-NLS-1$
}
if (context == null) {
throw new IllegalArgumentException("context must not be null"); //$NON-NLS-1$
}
LOG.debug("Restoring WindGate profile");
Properties copy = (Properties) properties.clone();
CoreProfile core = CoreProfile.loadFrom(copy, context);
CoreProfile.removeCorrespondingKeys(copy);
SessionProfile session = SessionProfile.loadFrom(copy, context);
SessionProfile.removeCorrespondingKeys(copy);
Collection<? extends ProcessProfile> processes = ProcessProfile.loadFrom(copy, context);
ProcessProfile.removeCorrespondingKeys(copy);
Collection<? extends ResourceProfile> resources = ResourceProfile.loadFrom(copy, context);
ResourceProfile.removeCorrespondingKeys(copy);
if (copy.isEmpty() == false) {
WGLOG.warn("W02001",
copy.keySet());
}
resources = addVoidResource(resources, context);
return new GateProfile(name, core, session, processes, resources);
}
private static Collection<? extends ResourceProfile> addVoidResource(
Collection<? extends ResourceProfile> resources, ProfileContext context) {
for (ResourceProfile profile : resources) {
if (profile.getName().equals(VoidResourceProvider.NAME)) {
return resources;
}
}
List<ResourceProfile> results = new ArrayList<>(resources.size() + 1);
results.addAll(resources);
results.add(new ResourceProfile(
VoidResourceProvider.NAME,
VoidResourceProvider.class,
context,
Collections.emptyMap()));
return results;
}
}