/* * Copyright [2013] [Cloud4SOA, www.cloud4soa.eu] * * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ /* * Copyright 2009-2012 the original author or authors. * * 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.cloudfoundry.client.lib.domain; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.codehaus.jackson.annotate.JsonAutoDetect; import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; import static org.cloudfoundry.client.lib.util.CloudUtil.parse; @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, creatorVisibility = Visibility.NONE) public class CloudApplication extends CloudEntity { private static final String V1_FRAMEWORK_KEY = "model"; private static final String V1_RUNTIME_KEY = "stack"; private static final String V2_FRAMEWORK_KEY = "framework"; private static final String V2_RUNTIME_KEY = "runtime"; private static final String COMMAND_KEY = "command"; private static final String MEMORY_KEY = "memory"; public static final String JAVA_WEB = "java_web/1.0"; public static final String SPRING = "spring_web/1.0"; public static final String GRAILS = "grails/1.0"; public static final String STANDALONE = "standalone"; private Staging staging; private int instances; private List<String> uris; private List<String> services; private AppState state; private DebugMode debug; private Map<String, Integer> resources = new HashMap<String, Integer>(); private int runningInstances; private List<String> env = new ArrayList<String>(); // Constructor for V2 entities public CloudApplication(Meta meta, String name) { super(meta, name); } public CloudApplication(String name, String stagingStack, String stagingModel, int memory, int instances, List<String> uris, List<String> serviceNames, AppState state) { super(CloudEntity.Meta.defaultMeta(), name); this.staging = new Staging(stagingStack, stagingModel); this.resources.put(MEMORY_KEY, memory); this.instances = instances; this.uris = uris; this.services = serviceNames; this.state = state; } @SuppressWarnings("unchecked") public CloudApplication(Map<String, Object> attributes) { super(CloudEntity.Meta.defaultMeta(), parse(attributes.get("name"))); Map<String, String> stagingMap = (Map<String, String>) attributes.get("staging"); if (stagingMap != null) { if (stagingMap.containsKey(V1_RUNTIME_KEY) && stagingMap.containsKey(V1_FRAMEWORK_KEY)) { setStaging(new Staging(stagingMap.get(V1_RUNTIME_KEY), stagingMap.get(V1_FRAMEWORK_KEY))); } else if (stagingMap.containsKey(V2_RUNTIME_KEY) && stagingMap.containsKey(V2_FRAMEWORK_KEY)) { setStaging(new Staging(stagingMap.get(V2_RUNTIME_KEY), stagingMap.get(V2_FRAMEWORK_KEY))); } else { setStaging(new Staging(null, null)); } } instances = (Integer)attributes.get("instances"); Integer runningInstancesAttribute = (Integer) attributes.get("runningInstances"); if (runningInstancesAttribute != null) { runningInstances = runningInstancesAttribute; } uris = (List<String>)attributes.get("uris"); services = (List<String>)attributes.get("services"); state = AppState.valueOf((String) attributes.get("state")); resources = (Map<String, Integer>) attributes.get("resources"); env = (List<String>) attributes.get("env"); Map<String, Object> metaValue = parse(Map.class, attributes.get("meta")); if (metaValue != null) { String debugAttribute = (String) metaValue.get("debug"); if (debugAttribute != null) { debug = DebugMode.valueOf(debugAttribute); } long created = parse(Long.class, metaValue.get("created")); Meta meta = null; if (created != 0) { meta = new Meta(null, new Date(created * 1000), null); } else { meta = new Meta(null, null, null); } setMeta(meta); if (metaValue.containsKey(COMMAND_KEY)) { setCommand((String) metaValue.get(COMMAND_KEY)); } } } public enum AppState { UPDATING, STARTED, STOPPED } public enum DebugMode { run, suspend } public Staging getStaging() { return staging; } public void setStaging(Staging staging) { this.staging = staging; } public void setResources(Map<String,Integer> resources) { this.resources = resources; } public Map<String,Integer> getResources() { return new HashMap<String, Integer>(resources); } public int getInstances() { return instances; } public void setInstances(int instances) { this.instances = instances; } public int getMemory() { return resources.get(MEMORY_KEY); } public void setMemory(int memory) { resources.put(MEMORY_KEY, memory); } public List<String> getUris() { return uris; } public void setUris(List<String> uris) { this.uris = uris; } public AppState getState() { return state; } public void setState(AppState state) { this.state = state; } public DebugMode getDebug() { return debug; } public void setDebug(DebugMode debug) { this.debug = debug; } public List<String> getServices() { return services; } public void setServices(List<String> services) { this.services = services; } public int getRunningInstances() { return runningInstances; } public void setRunningInstances(int runningInstances) { this.runningInstances = runningInstances; } public Map<String, String> getEnvAsMap() { Map<String,String> envMap = new HashMap<String, String>(); for (String nameAndValue : env) { String[] parts = nameAndValue.split("="); envMap.put(parts[0], parts[1]); } return envMap; } public List<String> getEnv() { return env; } public void setEnv(Map<String, String> env) { List<String> joined = new ArrayList<String>(); for (Map.Entry<String, String> entry : env.entrySet()) { joined.add(entry.getKey() + '=' + entry.getValue()); } this.env = joined; } public void setEnv(List<String> env) { for (String s : env) { if (!s.contains("=")) { throw new IllegalArgumentException("Environment setting without '=' is invalid: " + s); } } this.env = env; } public void setCommand(String command) { this.staging.setCommand(command); } @Override public String toString() { return "CloudApplication [framework=" + staging.getFramework() + ", instances=" + instances + ", name=" + getName() + ", runtime=" + staging.getRuntime() + ", memory=" + resources.get(MEMORY_KEY) + ", state=" + state + ", debug=" + debug + ", uris=" + uris + ",services=" + services + ", env=" + env + "]"; } }