/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.mapper; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.api.service.impl.response.ResourceTypeMapping; import com.emc.storageos.api.service.impl.response.RestLinkFactory; import com.emc.storageos.db.client.URIUtil; import com.emc.storageos.db.client.constraint.NamedElementQueryResultList; import com.emc.storageos.db.client.model.AbstractChangeTrackingSet; import com.emc.storageos.db.client.model.CustomConfig; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.model.DiscoveredDataObject; import com.emc.storageos.db.client.model.DiscoveredSystemObject; import com.emc.storageos.db.client.model.NamedURI; import com.emc.storageos.db.client.model.Project; import com.emc.storageos.db.client.model.SchedulePolicy; import com.emc.storageos.db.client.model.ScopedLabel; import com.emc.storageos.db.client.model.StringMap; import com.emc.storageos.db.client.model.TenantOrg; import com.emc.storageos.db.client.model.TenantResource; import com.emc.storageos.db.client.model.VolumeGroup; import com.emc.storageos.db.client.util.NullColumnValueGetter; import com.emc.storageos.db.common.VdcUtil; import com.emc.storageos.model.DataObjectRestRep; import com.emc.storageos.model.DiscoveredDataObjectRestRep; import com.emc.storageos.model.DiscoveredSystemObjectRestRep; import com.emc.storageos.model.NamedRelatedResourceRep; import com.emc.storageos.model.RelatedResourceRep; import com.emc.storageos.model.ResourceTypeEnum; import com.emc.storageos.model.RestLinkRep; import com.emc.storageos.model.TypedRelatedResourceRep; import com.emc.storageos.model.application.VolumeGroupRestRep; import com.emc.storageos.model.customconfig.CustomConfigRestRep; import com.emc.storageos.model.customconfig.RelatedConfigTypeRep; import com.emc.storageos.model.customconfig.ScopeParam; import com.emc.storageos.model.host.TenantResourceRestRep; import com.emc.storageos.model.project.ProjectRestRep; import com.emc.storageos.model.schedulepolicy.SchedulePolicyRestRep; import com.emc.storageos.model.tenant.TenantOrgRestRep; import com.emc.storageos.security.authorization.BasePermissionsHelper; import com.google.common.collect.Lists; public class DbObjectMapper { private static final Logger _log = LoggerFactory.getLogger(DbObjectMapper.class); // NamedRelatedResourceRep public static NamedRelatedResourceRep toNamedRelatedResource(NamedURI resource) { ResourceTypeEnum resourceType = null; try { resourceType = ResourceTypeMapping.getResourceType(URIUtil.getModelClass(resource.getURI())); } catch (Exception e) { _log.error("Resource Type not found for " + resource.getURI(), e); } return new NamedRelatedResourceRep(resource.getURI(), toLink(resourceType, resource.getURI()), resource.getName()); } public static NamedRelatedResourceRep toNamedRelatedResource(DataObject resource) { return new NamedRelatedResourceRep(resource.getId(), toLink(resource), resource.getLabel()); } public static NamedRelatedResourceRep toNamedRelatedResource(DataObject resource, String alternativeName) { return new NamedRelatedResourceRep(resource.getId(), toLink(resource), alternativeName); } public static NamedRelatedResourceRep toNamedRelatedResource(ResourceTypeEnum type, URI id, String name) { return new NamedRelatedResourceRep(id, toLink(type, id), name); } public static NamedRelatedResourceRep toNamedRelatedResource(ResourceTypeEnum type, URI id, URI parentId, String name) { return new NamedRelatedResourceRep(id, toLink(type, id, parentId), name); } // TypedRelatedResourceRep public static TypedRelatedResourceRep toTypedRelatedResource(DataObject resource) { return new TypedRelatedResourceRep(resource.getId(), toLink(resource), resource.getLabel(), ResourceTypeMapping.getResourceType(resource)); } // Links public static RestLinkRep toLink(DataObject resource) { return new RestLinkRep("self", RestLinkFactory.newLink(resource)); } public static RestLinkRep toLink(ResourceTypeEnum type, URI id) { return new RestLinkRep("self", RestLinkFactory.newLink(type, id)); } public static RestLinkRep toLink(ResourceTypeEnum type, URI id, URI parentId) { return new RestLinkRep("self", RestLinkFactory.newLink(type, id, parentId)); } // RelatedResourceRep public static RelatedResourceRep toRelatedResource(ResourceTypeEnum type, URI id) { if (NullColumnValueGetter.isNullURI(id)) { return null; } return new RelatedResourceRep(id, toLink(type, id)); } public static RelatedResourceRep toRelatedResource(ResourceTypeEnum type, URI id, URI parentId) { if (NullColumnValueGetter.isNullURI(id)) { return null; } return new RelatedResourceRep(id, toLink(type, id, parentId)); } public static List<NamedRelatedResourceRep> map(ResourceTypeEnum type, List<NamedElementQueryResultList.NamedElement> from) { List<NamedRelatedResourceRep> to = Lists.newArrayList(); for (NamedElementQueryResultList.NamedElement el : from) { to.add(new NamedRelatedResourceRep(el.getId(), toLink(type, el.getId()), el.getName())); } return to; } public static List<NamedRelatedResourceRep> map(ResourceTypeEnum type, URI parentId, List<NamedElementQueryResultList.NamedElement> from) { List<NamedRelatedResourceRep> to = Lists.newArrayList(); for (NamedElementQueryResultList.NamedElement el : from) { to.add(new NamedRelatedResourceRep(el.getId(), toLink(type, el.getId(), parentId), el.getName())); } return to; } public static void mapDataObjectFields(DataObject from, DataObjectRestRep to) { to.setLink(new RestLinkRep("self", RestLinkFactory.newLink(from))); mapDataObjectFieldsNoLink(from, to); } public static void mapDataObjectFieldsNoLink(DataObject from, DataObjectRestRep to) { to.setId(from.getId()); to.setName(from.getLabel()); to.setCreationTime(from.getCreationTime()); to.setInactive(from.getInactive()); to.setGlobal(from.isGlobal()); to.setRemote(to.getGlobal() ? null : VdcUtil.isRemoteObject(from)); if (from.getTag() != null) { for (ScopedLabel tag : from.getTag()) { to.getTags().add(tag.getLabel()); } } to.setVdc(toRelatedResource(ResourceTypeEnum.VDC, VdcUtil.getVdcUrn(VdcUtil.getVdcId(from.getClass(), from.getId()).toString()))); if (from.checkInternalFlags(DataObject.Flag.INTERNAL_OBJECT)) { to.setInternal(true); } else { to.setInternal(false); } } public static void mapDiscoveredDataObjectFields(DiscoveredDataObject from, DiscoveredDataObjectRestRep to) { mapDataObjectFields(from, to); to.setNativeGuid(from.getNativeGuid()); } public static void mapDiscoveredSystemObjectFields(DiscoveredSystemObject from, DiscoveredSystemObjectRestRep to) { mapDiscoveredDataObjectFields(from, to); to.setSystemType(from.getSystemType()); to.setDiscoveryJobStatus(from.getDiscoveryStatus()); to.setMeteringJobStatus(from.getMeteringStatus()); to.setLastDiscoveryRunTime(from.getLastDiscoveryRunTime()); to.setNextDiscoveryRunTime(from.getNextDiscoveryRunTime()); to.setLastMeteringRunTime(from.getLastMeteringRunTime()); to.setNextMeteringRunTime(from.getNextMeteringRunTime()); to.setSuccessDiscoveryTime(from.getSuccessDiscoveryTime()); to.setSuccessMeteringTime(from.getSuccessMeteringTime()); to.setCompatibilityStatus(from.getCompatibilityStatus()); to.setRegistrationStatus(from.getRegistrationStatus()); to.setLastDiscoveryStatusMessage(from.getLastDiscoveryStatusMessage()); } public static ProjectRestRep map(Project from) { if (from == null) { return null; } ProjectRestRep to = new ProjectRestRep(); mapDataObjectFields(from, to); if (from.getTenantOrg() != null) { to.setTenant(toRelatedResource(ResourceTypeEnum.TENANT, from.getTenantOrg().getURI())); } to.setOwner(from.getOwner()); if (from.getAssignedVNasServers() != null && !from.getAssignedVNasServers().isEmpty()) { to.setAssignedVNasServers(from.getAssignedVNasServers()); } if (from.getFilePolicies() != null && !from.getFilePolicies().isEmpty()) { to.setFileProtectionPolicies(from.getFilePolicies()); } return to; } public static TenantOrgRestRep map(TenantOrg from) { if (from == null) { return null; } TenantOrgRestRep to = new TenantOrgRestRep(); mapDataObjectFields(from, to); if (from.getParentTenant() != null) { if (!TenantOrg.isRootTenant(from)) { to.setParentTenant(toRelatedResource(ResourceTypeEnum.TENANT, from.getParentTenant().getURI())); } } to.setDescription(from.getDescription()); if (from.getUserMappings() != null) { for (AbstractChangeTrackingSet<String> userMappingSet : from.getUserMappings().values()) { for (String existingMapping : userMappingSet) { to.getUserMappings().add(BasePermissionsHelper.UserMapping.toParam( BasePermissionsHelper.UserMapping.fromString(existingMapping))); } } } if (from.getNamespace() != null && !"null".equals(from.getNamespace())) { to.setNamespace(from.getNamespace()); } if (from.getNamespaceStorage() != null) { to.setNamespaceStorage(from.getNamespaceStorage()); } return to; } public static void mapTenantResource(TenantResource from, TenantResourceRestRep to) { mapDataObjectFields(from.findDataObject(), to); to.setTenant(toRelatedResource(ResourceTypeEnum.TENANT, from.getTenant())); } public static CustomConfigRestRep map(CustomConfig from) { if (from == null) { return null; } CustomConfigRestRep to = new CustomConfigRestRep(); to.setLink(new RestLinkRep("self", RestLinkFactory.newLink(from))); // build the config type Link String service = ResourceTypeEnum.CONFIG_TYPE.getService(); StringBuilder build = (new StringBuilder(service)).append('/').append(from.getConfigType()); try { RelatedConfigTypeRep type = new RelatedConfigTypeRep(); type.setConfigName(from.getConfigType()); type.setSelfLink(new RestLinkRep("self", new URI(build.toString()))); to.setConfigType(type); } catch (URISyntaxException e) { // it should not happen } to.setId(from.getId()); to.setName(from.getLabel()); StringMap scopeMap = from.getScope(); ScopeParam scopeParm = new ScopeParam(); for (Map.Entry<String, String> entry : scopeMap.entrySet()) { scopeParm.setType(entry.getKey()); scopeParm.setValue(entry.getValue()); } to.setScope(scopeParm); to.setValue(from.getValue()); to.setRegistered(from.getRegistered()); to.setSystemDefault(from.getSystemDefault()); return to; } /** * Map an VolumeGroup to VolumeGroupRestRep * * @param from VolumeGroup * @return VolumeGroupRestRep */ public static VolumeGroupRestRep map(VolumeGroup from) { if (from == null) { return null; } VolumeGroupRestRep rep = new VolumeGroupRestRep(); mapDataObjectFields(from, rep); rep.setDescription(from.getDescription()); rep.setRoles(from.getRoles()); rep.setParent(toRelatedResource(ResourceTypeEnum.VOLUME_GROUP, from.getParent())); rep.setMigrationGroupBy(from.getMigrationGroupBy()); rep.setMigrationType(from.getMigrationType()); return rep; } public static SchedulePolicyRestRep map(SchedulePolicy from) { if (from == null) { return null; } SchedulePolicyRestRep to = new SchedulePolicyRestRep(); if (from.getTenantOrg() != null) { to.setTenant(toRelatedResource(ResourceTypeEnum.TENANT, from.getTenantOrg().getURI())); } to.setPolicyId(from.getId()); to.setPolicyType(from.getPolicyType()); to.setPolicyName(from.getPolicyName()); if (from.getScheduleFrequency() != null) { to.setScheduleFrequency(from.getScheduleFrequency()); to.setScheduleRepeat(from.getScheduleRepeat()); to.setScheduleTime(from.getScheduleTime()); } if (from.getScheduleDayOfWeek() != null) { to.setScheduleDayOfWeek(from.getScheduleDayOfWeek()); } if (from.getScheduleDayOfMonth() != null) { to.setScheduleDayOfMonth(from.getScheduleDayOfMonth()); } if (from.getSnapshotExpireType() != null) { to.setSnapshotExpireType(from.getSnapshotExpireType()); } if (from.getSnapshotExpireTime() != null) { to.setSnapshotExpireTime(from.getSnapshotExpireTime()); } return to; } }