package com.thinkbiganalytics.metadata.modeshape.category;
/*-
* #%L
* thinkbig-metadata-modeshape
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.thinkbiganalytics.metadata.api.category.Category;
import com.thinkbiganalytics.metadata.api.extension.UserFieldDescriptor;
import com.thinkbiganalytics.metadata.api.feed.Feed;
import com.thinkbiganalytics.metadata.api.security.HadoopSecurityGroup;
import com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException;
import com.thinkbiganalytics.metadata.modeshape.category.security.JcrCategoryAllowedActions;
import com.thinkbiganalytics.metadata.modeshape.common.AbstractJcrAuditableSystemEntity;
import com.thinkbiganalytics.metadata.modeshape.common.JcrEntity;
import com.thinkbiganalytics.metadata.modeshape.security.JcrAccessControlUtil;
import com.thinkbiganalytics.metadata.modeshape.security.action.JcrAllowedActions;
import com.thinkbiganalytics.metadata.modeshape.security.mixin.AccessControlledMixin;
import com.thinkbiganalytics.metadata.modeshape.support.JcrUtil;
import com.thinkbiganalytics.security.UsernamePrincipal;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
/**
* An implementation of {@link Category} backed by a JCR repository.
*/
public class JcrCategory extends AbstractJcrAuditableSystemEntity implements Category, AccessControlledMixin {
public static final String DETAILS = "tba:details";
public static String CATEGORY_NAME = "tba:category";
public static String NODE_TYPE = "tba:category";
public static String ICON = "tba:icon";
public static String ICON_COLOR = "tba:iconColor";
private CategoryDetails details;
public JcrCategory(Node node) {
super(node);
}
// -=-=--=-=- Delegate Propertied methods to details -=-=-=-=-=-
@Override
public Map<String, Object> getProperties() {
return getDetails().map(d -> d.getProperties()).orElse(Collections.emptyMap());
}
@Override
public void setProperties(Map<String, Object> properties) {
getDetails().ifPresent(d -> d.setProperties(properties));
}
@Override
public void setProperty(String name, Object value) {
getDetails().ifPresent(d -> d.setProperty(name, value));
}
@Override
public void removeProperty(String key) {
getDetails().ifPresent(d -> d.removeProperty(key));
}
@Override
public Map<String, Object> mergeProperties(Map<String, Object> props) {
return getDetails().map(d -> d.mergeProperties(props)).orElse(Collections.emptyMap());
}
@Override
public Map<String, Object> replaceProperties(Map<String, Object> props) {
return getDetails().map(d -> d.replaceProperties(props)).orElse(Collections.emptyMap());
}
public Optional<CategoryDetails> getDetails() {
if (this.details == null) {
if (JcrUtil.hasNode(getNode(), DETAILS)) {
this.details = JcrUtil.getJcrObject(getNode(), DETAILS, CategoryDetails.class);
return Optional.of(this.details);
} else {
return Optional.empty();
}
} else {
return Optional.of(this.details);
}
}
public List<? extends Feed> getFeeds() {
return getDetails().map(d -> d.getFeeds()).orElse(Collections.emptyList());
}
@Nonnull
@Override
public Map<String, String> getUserProperties() {
return getDetails().map(d -> d.getUserProperties()).orElse(Collections.emptyMap());
}
@Override
public void setUserProperties(@Nonnull final Map<String, String> userProperties, @Nonnull final Set<UserFieldDescriptor> userFields) {
getDetails().ifPresent(d -> d.setUserProperties(userProperties, userFields));
}
public List<? extends HadoopSecurityGroup> getSecurityGroups() {
return getDetails().map(d -> d.getSecurityGroups()).orElse(Collections.emptyList());
}
public void setSecurityGroups(List<? extends HadoopSecurityGroup> hadoopSecurityGroups) {
getDetails().ifPresent(d -> d.setSecurityGroups(hadoopSecurityGroups));
}
// @Override
// public void setupAccessControl(JcrAllowedActions prototype, UsernamePrincipal owner) {
// JcrAccessControlUtil.
// AccessControlledMixin.super.setupAccessControl(prototype, owner);
// }
@Override
public CategoryId getId() {
try {
return new JcrCategory.CategoryId(getObjectId());
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Failed to retrieve the entity id", e);
}
}
@Override
public String getDisplayName() {
return getTitle();
}
@Override
public void setDisplayName(String displayName) {
setTitle(displayName);
}
@Override
public String getName() {
return getSystemName();
}
@Override
public void setName(String name) {
if (!getName().equals(name)) {
throw new UnsupportedOperationException();
}
}
public String getDescription() {
return super.getProperty(DESCRIPTION, String.class);
}
public void setDescription(String description) {
super.setProperty(DESCRIPTION, description);
}
public String getSystemName() {
return super.getProperty(SYSTEM_NAME, String.class);
}
public void setSystemName(String systemName) {
super.setProperty(SYSTEM_NAME, systemName);
}
public String getTitle() {
return super.getProperty(TITLE, String.class);
}
public void setTitle(String title) {
super.setProperty(TITLE, title);
}
@Override
public String getIconColor() {
return super.getProperty(ICON_COLOR, String.class, true);
}
public void setIconColor(String iconColor) {
super.setProperty(ICON_COLOR, iconColor);
}
@Override
public Integer getVersion() {
return null;
}
@Override
public String getIcon() {
return super.getProperty(ICON, String.class, true);
}
public void setIcon(String icon) {
super.setProperty(ICON, icon);
}
@Override
public Class<? extends JcrAllowedActions> getJcrAllowedActionsType() {
return JcrCategoryAllowedActions.class;
}
public String getFeedParentPath() {
return JcrUtil.path(getNode(), DETAILS).toString();
}
public static class CategoryId extends JcrEntity.EntityId implements Category.ID {
public CategoryId(Serializable ser) {
super(ser);
}
}
}