/*
* Copyright 2012 LinkedIn Corp.
*
* 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 azkaban.project;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import azkaban.flow.Flow;
import azkaban.user.Permission;
import azkaban.user.Permission.Type;
import azkaban.user.User;
import azkaban.utils.Pair;
public class Project {
private final int id;
private final String name;
private boolean active = true;
private String description;
private int version = -1;
private long createTimestamp;
private long lastModifiedTimestamp;
private String lastModifiedUser;
private String source;
private LinkedHashMap<String, Permission> userPermissionMap =
new LinkedHashMap<String, Permission>();
private LinkedHashMap<String, Permission> groupPermissionMap =
new LinkedHashMap<String, Permission>();
private Map<String, Flow> flows = null;
private HashSet<String> proxyUsers = new HashSet<String>();
private Map<String, Object> metadata = new HashMap<String, Object>();
public Project(int id, String name) {
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
public void setFlows(Map<String, Flow> flows) {
this.flows = flows;
}
public Flow getFlow(String flowId) {
if (flows == null) {
return null;
}
return flows.get(flowId);
}
public Map<String, Flow> getFlowMap() {
return flows;
}
public List<Flow> getFlows() {
List<Flow> retFlow = null;
if (flows != null) {
retFlow = new ArrayList<Flow>(flows.values());
} else {
retFlow = new ArrayList<Flow>();
}
return retFlow;
}
public Permission getCollectivePermission(User user) {
Permission permissions = new Permission();
Permission perm = userPermissionMap.get(user.getUserId());
if (perm != null) {
permissions.addPermissions(perm);
}
for (String group : user.getGroups()) {
perm = groupPermissionMap.get(group);
if (perm != null) {
permissions.addPermissions(perm);
}
}
return permissions;
}
public Set<String> getProxyUsers() {
return new HashSet<String>(proxyUsers);
}
public void addAllProxyUsers(Collection<String> proxyUsers) {
this.proxyUsers.addAll(proxyUsers);
}
public boolean hasProxyUser(String proxy) {
return this.proxyUsers.contains(proxy);
}
public void addProxyUser(String user) {
this.proxyUsers.add(user);
}
public void removeProxyUser(String user) {
this.proxyUsers.remove(user);
}
public boolean hasPermission(User user, Type type) {
Permission perm = userPermissionMap.get(user.getUserId());
if (perm != null
&& (perm.isPermissionSet(Type.ADMIN) || perm.isPermissionSet(type))) {
return true;
}
return hasGroupPermission(user, type);
}
public boolean hasUserPermission(User user, Type type) {
Permission perm = userPermissionMap.get(user.getUserId());
if (perm == null) {
// Check group
return false;
}
if (perm.isPermissionSet(Type.ADMIN) || perm.isPermissionSet(type)) {
return true;
}
return false;
}
public boolean hasGroupPermission(User user, Type type) {
for (String group : user.getGroups()) {
Permission perm = groupPermissionMap.get(group);
if (perm != null) {
if (perm.isPermissionSet(Type.ADMIN) || perm.isPermissionSet(type)) {
return true;
}
}
}
return false;
}
public List<String> getUsersWithPermission(Type type) {
ArrayList<String> users = new ArrayList<String>();
for (Map.Entry<String, Permission> entry : userPermissionMap.entrySet()) {
Permission perm = entry.getValue();
if (perm.isPermissionSet(type)) {
users.add(entry.getKey());
}
}
return users;
}
public List<Pair<String, Permission>> getUserPermissions() {
ArrayList<Pair<String, Permission>> permissions =
new ArrayList<Pair<String, Permission>>();
for (Map.Entry<String, Permission> entry : userPermissionMap.entrySet()) {
permissions.add(new Pair<String, Permission>(entry.getKey(), entry
.getValue()));
}
return permissions;
}
public List<Pair<String, Permission>> getGroupPermissions() {
ArrayList<Pair<String, Permission>> permissions =
new ArrayList<Pair<String, Permission>>();
for (Map.Entry<String, Permission> entry : groupPermissionMap.entrySet()) {
permissions.add(new Pair<String, Permission>(entry.getKey(), entry
.getValue()));
}
return permissions;
}
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public void setUserPermission(String userid, Permission perm) {
userPermissionMap.put(userid, perm);
}
public void setGroupPermission(String group, Permission perm) {
groupPermissionMap.put(group, perm);
}
public Permission getUserPermission(User user) {
return userPermissionMap.get(user.getUserId());
}
public Permission getGroupPermission(String group) {
return groupPermissionMap.get(group);
}
public Permission getUserPermission(String userID) {
return userPermissionMap.get(userID);
}
public void removeGroupPermission(String group) {
groupPermissionMap.remove(group);
}
public void removeUserPermission(String userId) {
userPermissionMap.remove(userId);
}
public void clearUserPermission() {
userPermissionMap.clear();
}
public long getCreateTimestamp() {
return createTimestamp;
}
public void setCreateTimestamp(long createTimestamp) {
this.createTimestamp = createTimestamp;
}
public long getLastModifiedTimestamp() {
return lastModifiedTimestamp;
}
public void setLastModifiedTimestamp(long lastModifiedTimestamp) {
this.lastModifiedTimestamp = lastModifiedTimestamp;
}
public Object toObject() {
HashMap<String, Object> projectObject = new HashMap<String, Object>();
projectObject.put("id", id);
projectObject.put("name", name);
projectObject.put("description", description);
projectObject.put("createTimestamp", createTimestamp);
projectObject.put("lastModifiedTimestamp", lastModifiedTimestamp);
projectObject.put("lastModifiedUser", lastModifiedUser);
projectObject.put("version", version);
if (!active) {
projectObject.put("active", false);
}
if (source != null) {
projectObject.put("source", source);
}
if (metadata != null) {
projectObject.put("metadata", metadata);
}
ArrayList<String> proxyUserList = new ArrayList<String>(proxyUsers);
projectObject.put("proxyUsers", proxyUserList);
return projectObject;
}
@SuppressWarnings("unchecked")
public static Project projectFromObject(Object object) {
Map<String, Object> projectObject = (Map<String, Object>) object;
int id = (Integer) projectObject.get("id");
String name = (String) projectObject.get("name");
String description = (String) projectObject.get("description");
String lastModifiedUser = (String) projectObject.get("lastModifiedUser");
long createTimestamp = coerceToLong(projectObject.get("createTimestamp"));
long lastModifiedTimestamp =
coerceToLong(projectObject.get("lastModifiedTimestamp"));
String source = (String) projectObject.get("source");
Boolean active = (Boolean) projectObject.get("active");
active = active == null ? true : active;
int version = (Integer) projectObject.get("version");
Map<String, Object> metadata =
(Map<String, Object>) projectObject.get("metadata");
Project project = new Project(id, name);
project.setVersion(version);
project.setDescription(description);
project.setCreateTimestamp(createTimestamp);
project.setLastModifiedTimestamp(lastModifiedTimestamp);
project.setLastModifiedUser(lastModifiedUser);
project.setActive(active);
if (source != null) {
project.setSource(source);
}
if (metadata != null) {
project.setMetadata(metadata);
}
List<String> proxyUserList = (List<String>) projectObject.get("proxyUsers");
project.addAllProxyUsers(proxyUserList);
return project;
}
private static long coerceToLong(Object obj) {
if (obj == null) {
return 0;
} else if (obj instanceof Integer) {
return (Integer) obj;
}
return (Long) obj;
}
public String getLastModifiedUser() {
return lastModifiedUser;
}
public void setLastModifiedUser(String lastModifiedUser) {
this.lastModifiedUser = lastModifiedUser;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (active ? 1231 : 1237);
result =
prime * result + (int) (createTimestamp ^ (createTimestamp >>> 32));
result =
prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + id;
result =
prime * result
+ (int) (lastModifiedTimestamp ^ (lastModifiedTimestamp >>> 32));
result =
prime * result
+ ((lastModifiedUser == null) ? 0 : lastModifiedUser.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((source == null) ? 0 : source.hashCode());
result = prime * result + version;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Project other = (Project) obj;
if (active != other.active)
return false;
if (createTimestamp != other.createTimestamp)
return false;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (id != other.id)
return false;
if (lastModifiedTimestamp != other.lastModifiedTimestamp)
return false;
if (lastModifiedUser == null) {
if (other.lastModifiedUser != null)
return false;
} else if (!lastModifiedUser.equals(other.lastModifiedUser))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (source == null) {
if (other.source != null)
return false;
} else if (!source.equals(other.source))
return false;
if (version != other.version)
return false;
return true;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public Map<String, Object> getMetadata() {
if (metadata == null) {
metadata = new HashMap<String, Object>();
}
return metadata;
}
protected void setMetadata(Map<String, Object> metadata) {
this.metadata = metadata;
}
public int getId() {
return id;
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}