/*
* (C) Copyright 2015 Netcentric AG.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package biz.netcentric.cq.tools.actool.dumpservice;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import biz.netcentric.cq.tools.actool.configmodel.AceBean;
import biz.netcentric.cq.tools.actool.configmodel.AuthorizableConfigBean;
import biz.netcentric.cq.tools.actool.configmodel.Restriction;
import biz.netcentric.cq.tools.actool.helper.AcHelper;
public class AcDumpElementYamlVisitor implements AcDumpElementVisitor {
private final static int PRINCIPAL_BASED_SORTING = 1;
private final static int PATH_BASED_SORTING = 2;
public static final int DUMP_INDENTATION_KEY = 4;
public static final int DUMP_INDENTATION_FIRST_PROPERTY = 7;
public static final int DUMP_INDENTATION_PROPERTY = 9;
public static final int DUMP_INDENTATION_RESTRICTIONS = 11;
public static final String YAML_STRUCTURAL_ELEMENT_PREFIX = "- ";
private final StringBuilder sb;
private final int mapOrder;
public AcDumpElementYamlVisitor(final int mapOrder, final StringBuilder sb) {
this.mapOrder = mapOrder;
this.sb = sb;
}
@Override
public void visit(final AuthorizableConfigBean authorizableConfigBean) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_KEY))
.append("- " + authorizableConfigBean.getAuthorizableId() + ":")
.append("\n");
sb.append("\n");
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_FIRST_PROPERTY))
.append("- name: '").append(authorizableConfigBean.getName()).append("'\n");
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("memberOf: "
+ authorizableConfigBean.getMemberOfString())
.append("\n");
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("path: " + authorizableConfigBean.getPath())
.append("\n");
if (StringUtils.isNotBlank(authorizableConfigBean.getExternalId())) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("externalId: " + authorizableConfigBean.getExternalId())
.append("\n");
}
sb.append("\n");
}
@Override
public void visit(final AceBean aceBean) {
if (mapOrder == PATH_BASED_SORTING) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_FIRST_PROPERTY))
.append("- principal: " + aceBean.getPrincipalName())
.append("\n");
} else if (mapOrder == PRINCIPAL_BASED_SORTING) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_FIRST_PROPERTY))
.append("- path: " + StringUtils.defaultIfEmpty(aceBean.getJcrPath(), "")).append("\n");
}
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("permission: " + aceBean.getPermission()).append("\n");
if (StringUtils.isNotBlank(aceBean.getActionsString())) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("actions: " + aceBean.getActionsString()).append("\n");
}
if (StringUtils.isNotBlank(aceBean.getPrivilegesString())) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("privileges: " + aceBean.getPrivilegesString()).append("\n");
}
if (aceBean.isKeepOrder()) {
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY))
.append("keepOrder: true").append("\n");
}
writeRestrictions(aceBean, sb);
sb.append("\n");
sb.append("\n");
}
private void writeRestrictions(final AceBean aceBean, final StringBuilder sb) {
final List<Restriction> restrictions = aceBean.getRestrictions();
if (restrictions.isEmpty()) {
return;
}
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_PROPERTY)).append("restrictions:");
sb.append("\n");
for (Restriction restriction : restrictions) {
String restrictionsValueString = StringUtils.join(restriction.getValues(), ",");
String restrictionsValEscaped;
if (StringUtils.equals(restrictionsValueString, "")) {
restrictionsValEscaped = "''";
} else if (restrictionsValueString != null && restrictionsValueString.matches("[A-Za-z0-9,/]+")) {
restrictionsValEscaped = restrictionsValueString;
} else {
restrictionsValEscaped = "'" + restrictionsValueString + "'";
}
sb.append(AcHelper.getBlankString(DUMP_INDENTATION_RESTRICTIONS)).append(restriction.getName()).append(": ")
.append(restrictionsValEscaped);
sb.append("\n");
}
}
@Override
public void visit(final CommentingDumpElement commentingDumpElement) {
sb.append(CommentingDumpElement.YAML_COMMENT_PREFIX
+ commentingDumpElement.getString());
sb.append("\n");
sb.append("\n");
}
@Override
public void visit(final StructuralDumpElement structuralDumpElement) {
sb.append("\n");
String key = structuralDumpElement.getString();
if (StringUtils.isBlank(key) || !key.matches("[A-Za-z0-9\\-_/.]+")) {
key = "'" + key + "'";
}
sb.append(AcHelper.getBlankString(structuralDumpElement.getLevel() * 2)
+ YAML_STRUCTURAL_ELEMENT_PREFIX + key + MapKey.YAML_MAP_KEY_SUFFIX);
sb.append("\n");
sb.append("\n");
}
}