package com.thinkbiganalytics.metadata.modeshape.extension; /*- * #%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.google.common.base.MoreObjects; import com.thinkbiganalytics.metadata.api.extension.UserFieldDescriptor; import com.thinkbiganalytics.metadata.modeshape.JcrMetadataAccess; import com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException; import com.thinkbiganalytics.metadata.modeshape.support.JcrPropertyUtil; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Objects; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.jcr.nodetype.PropertyDefinition; /** * A {@link UserFieldDescriptor} backed by a JCR {@link PropertyDefinition}. */ public class JcrUserFieldDescriptor implements UserFieldDescriptor { /** * JCR node property for the {@code code} value */ public static final String ORDER = JcrMetadataAccess.USR_PREFIX + ":order"; /** * JCR node property for the {@code required} value */ public static final String REQUIRED = JcrMetadataAccess.USR_PREFIX + ":mandatory"; /** * JCR property definition */ private PropertyDefinition definition; /** * JCR property node */ private Node node; /** * Constructs a {@code JcrUserFieldDescriptor} for the specified node and definition. * * @param node the property node * @param definition the property definition */ public JcrUserFieldDescriptor(final Node node, final PropertyDefinition definition) { this.node = node; this.definition = definition; } @Nullable @Override public String getDescription() { try { return node.getProperty(JcrExtensibleType.DESCRIPTION).getString(); } catch (PathNotFoundException e) { return null; } catch (RepositoryException e) { throw new MetadataRepositoryException("Unable to access field node: " + node, e); } } @Nullable @Override public String getDisplayName() { try { return node.getProperty(JcrExtensibleType.NAME).getString(); } catch (PathNotFoundException e) { return null; } catch (RepositoryException e) { throw new MetadataRepositoryException("Unable to access field node: " + node, e); } } @Override public int getOrder() { try { final String value = node.getProperty(ORDER).getString(); return (value != null && !value.isEmpty()) ? Integer.parseInt(value) : 0; } catch (PathNotFoundException e) { return 0; } catch (RepositoryException e) { throw new MetadataRepositoryException("Unable to access field node: " + node, e); } } @Override public boolean isRequired() { try { final String value = node.getProperty(REQUIRED).getString(); return (value != null && !value.isEmpty()) && Boolean.parseBoolean(value); } catch (PathNotFoundException e) { return false; } catch (RepositoryException e) { throw new MetadataRepositoryException("Unable to access field node: " + node, e); } } @Nonnull @Override public String getSystemName() { try { return URLDecoder.decode(definition.getName().substring(JcrMetadataAccess.USR_PREFIX.length() + 1), JcrPropertyUtil.USER_PROPERTY_ENCODING); } catch (UnsupportedEncodingException e) { throw new IllegalStateException("Unsupported encoding for property \"" + definition.getName() + "\" on definition: " + definition, e); } } @Override public int hashCode() { return Objects.hashCode(getSystemName()); } @Override public String toString() { return MoreObjects.toStringHelper(UserFieldDescriptor.class) .add("name", getSystemName()) .toString(); } }