8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2007 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: PropertyXMLBuilderBase.java,v 1.20 2009/12/11 23:23:55 veiming Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Portions Copyrighted 2011-2016 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Portions Copyrighted 2013-2014 Nomura Research Institute, Ltd
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.console.property;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport static com.sun.identity.sm.AttributeSchema.UIType.*;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.console.base.model.AMAdminConstants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.console.base.model.AMModel;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.console.service.model.SubConfigModel;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.Constants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.debug.Debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.AttributeSchema;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.SchemaType;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceSchema;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.sm.ServiceSchemaManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport org.forgerock.openam.console.ui.taglib.propertysheet.CCPropertySheetTag;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport org.forgerock.openam.utils.CollectionUtils;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.text.MessageFormat;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.ArrayList;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Collection;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Collections;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashMap;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.LinkedHashSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.List;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Map;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.MissingResourceException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.ResourceBundle;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.StringTokenizer;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.TreeSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic abstract class PropertyXMLBuilderBase
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster implements PropertyTemplate
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static Debug debug = Debug.getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMAdminConstants.CONSOLE_DEBUG_FILENAME);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static ResourceBundle properties =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle.getBundle("amProperty");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static Map mapSchemaTypeToName = new HashMap(8);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static List orderDisplaySchemaType = new ArrayList(4);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static Map mapUITypeToName = new HashMap(8);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static Map mapTypeToName = new HashMap(8);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static Map mapSyntaxToName = new HashMap(20);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSchemaTypeToName.put(SchemaType.GLOBAL, "schemaType.global");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSchemaTypeToName.put(SchemaType.ORGANIZATION,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "schemaType.organization");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSchemaTypeToName.put(SchemaType.USER, "schemaType.user");
0503f9abf9d0469a149d3aa0d009409f328a6e59Phill Cunnington mapSchemaTypeToName.put(SchemaType.DYNAMIC, "schemaType.dynamic");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster orderDisplaySchemaType.add(SchemaType.GLOBAL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster orderDisplaySchemaType.add(SchemaType.ORGANIZATION);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster orderDisplaySchemaType.add(SchemaType.USER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster orderDisplaySchemaType.add(SchemaType.DYNAMIC);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.BUTTON, "button");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.LINK, "link");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.ADDREMOVELIST, "addremove");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.NAME_VALUE_LIST,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "namevaluelist");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.RADIO, "radio");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.UNORDEREDLIST,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "unorderedlist");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.ORDEREDLIST,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "orderedlist");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.MAPLIST, "maplist");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.GLOBALMAPLIST,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "globalmaplist");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapUITypeToName.put(AttributeSchema.UIType.SCRIPTSELECT, "scriptSelect");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapTypeToName.put(AttributeSchema.Type.LIST, "list");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapTypeToName.put(AttributeSchema.Type.MULTIPLE_CHOICE,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "multiple_choice");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapTypeToName.put(AttributeSchema.Type.SINGLE_CHOICE, "single_choice");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapTypeToName.put(AttributeSchema.Type.SINGLE, "single");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.BOOLEAN, "boolean");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.PASSWORD, "password");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.ENCRYPTED_PASSWORD,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "password");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.PARAGRAPH, "paragraph");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.XML, "xml");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.SCRIPT, "script");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.STRING, "string");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.NUMERIC, "numeric");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.NUMBER_RANGE,"number_range");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.NUMBER, "number");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.DN, "dn");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapSyntaxToName.put(AttributeSchema.Syntax.URL, "url");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected ServiceSchemaManager svcSchemaManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected AMModel model;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected boolean supportSubConfig;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String viewBeanName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected ResourceBundle serviceBundle;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected Map mapTypeToAttributeSchema;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String serviceName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected boolean allAttributesReadonly;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String currentRealm;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String VALIDATE_LABEL = "label.validate";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String UPLOAD_LABEL = "label.upload";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static String getTagClassName(AttributeSchema as) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tagClassName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.UIType uitype = as.getUIType();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (uitype != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String val = (String)mapUITypeToName.get(uitype);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tagClassName = properties.getString(val);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.Type type = as.getType();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String valType = (String)mapTypeToName.get(type);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((tagClassName == null) && (valType != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tagClassName = properties.getString(valType);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tagClassName == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.Syntax syntax = as.getSyntax();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String valSyntax = (String)mapSyntaxToName.get(syntax);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (valSyntax != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tagClassName = properties.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster valType + "." + valSyntax);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // last try
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tagClassName == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tagClassName = properties.getString(valType + ".whatever");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((tagClassName != null) && (tagClassName.trim().length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tagClassName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return tagClassName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Removes hidden attribute schemas.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param attributeSchemas Set of Attribute Schemas.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static void filterHiddenAttributes(Set attributeSchemas) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster removeAttributeSchemaWithoutI18nKey(attributeSchemas);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = attributeSchemas.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as = (AttributeSchema)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String any = as.getAny();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!hasAnyAttribute(any, ANY_REQUIRED) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster !hasAnyAttribute(any, ANY_DISPLAY) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster !hasAnyAttribute(any, ANY_ADMIN_DISPLAY) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster !hasAnyAttribute(any, ANY_DISPLAYRO) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster !hasAnyAttribute(any, ANY_ADMIN_DISPLAYRO)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster iter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (getTagClassName(as) == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster iter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Removes attribute schema that does not have <code>i18nKey</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param attributeSchemas Set of Attribute Schemas.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static void removeAttributeSchemaWithoutI18nKey(Set attributeSchemas)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = attributeSchemas.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as = (AttributeSchema)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String i18n = as.getI18NKey();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((i18n == null) || (i18n.trim().length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster iter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Removes the attributes that do not match a specified set of any
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * display strings.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param attributeSchemas Set of Attribute Schemas.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static void filterAttributes(Set attributeSchemas, String a[]) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster removeAttributeSchemaWithoutI18nKey(attributeSchemas);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int size = a.length;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = attributeSchemas.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as = (AttributeSchema)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String any = as.getAny();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean found = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int x = 0; x < size && !found; x++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster found = hasAnyAttribute(any, a[x]);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!found || (getTagClassName(as) == null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster iter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static boolean hasAnyAttribute(String any, String attribute) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean has = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((any != null) && (any.trim().length() > 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringTokenizer st = new StringTokenizer(any, "|");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (st.hasMoreTokens() && !has) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String token = st.nextToken();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster has = token.equals(attribute);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return has;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a replaced XML. This method replaces a property element.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml XML to operate on.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param propertyName Name of the property (attribute) that is going to be
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * replaced.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param propertyXML XML to replace.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a replaced XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String swapXMLProperty(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String propertyName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String propertyXML
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String ccHead = "<cc name=\"" + propertyName + "\"";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int start = xml.indexOf(ccHead);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (start != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster start = xml.lastIndexOf(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PropertyTemplate.PROPERTY_START_OPEN_TAG, start);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int end = xml.indexOf("</property>", start);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (end != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml = xml.substring(0, start) + propertyXML +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.substring(end + 11);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return xml;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Inserts XML to a property XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml Original property XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param insertXML XML to be inserted to <code>xml</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param marker A marker where <code>insertXML</code> will be inserted.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param afterMarker <code>true</code> to insert XML after marker.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return the modified XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String insertXML(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String insertXML,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String marker,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean afterMarker
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int idx = xml.indexOf(marker);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (idx != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int start = (afterMarker) ? idx + marker.length() : idx;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml = xml.substring(0, start) + insertXML +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.substring(start);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return xml;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Inserts XML to a property XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml Original property XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param insertXML XML to be inserted to <code>xml</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param marker A marker where <code>insertXML</code> will be inserted.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return the modified XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String insertXML(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String insertXML,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String marker
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int idx = xml.indexOf(marker);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (idx != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml = xml.substring(0, idx) + insertXML +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.substring(idx + marker.length()+1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return xml;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns true if sub configuration is supported.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return true if sub configuration is supported.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean isSubConfigSupported() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return supportSubConfig;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Set support sub configuration state.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param state <code>true</code> to support sub configuration.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void setSupportSubConfig(boolean state) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster supportSubConfig = state;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Set name of view bean.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param name Name of view bean.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void setViewBeanName(String name) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster viewBeanName = name;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns name of view bean.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return Name of view bean.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String getViewBeanName() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return viewBeanName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void getServiceResourceBundle() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String rbName = svcSchemaManager.getI18NFileName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceBundle = ResourceBundle.getBundle(rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getUserLocale());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "PropertyXMLBuilderBase.getServiceResourceBundle " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster e.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a set of attributeSchemas that are displayed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return Set of attribute names that are displayed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public Set getAttributeSchemas() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Collection values = mapTypeToAttributeSchema.values();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set set = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = values.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster set.addAll((Set)iter.next());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void getServiceResourceBundle(ServiceSchema ss) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String rbName = ss.getI18NFileName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceBundle = ResourceBundle.getBundle(rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getUserLocale());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "PropertyXMLBuilderBase.getServiceResourceBundle", e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void buildReadonlyXML(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMModel model,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addLabel(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] param = {name};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(READONLY_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tagClassName = getTagClassName(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tagClassName.equals(TAGNAME_PASSWORD)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster param[0] = name + PropertyTemplate.PASSWORD_VALUE_TAG;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(READONLY_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getInlineHelp(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void buildAttributeSchemaTypeXML(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMModel model,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean addSubSection
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tagClassName = getTagClassName(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tagClassName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean editableList = tagClassName.equals(TAGNAME_EDITABLE_LIST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean orderedList = tagClassName.equals(TAGNAME_ORDERED_LIST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean unorderedList = tagClassName.equals(TAGNAME_UNORDERED_LIST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean mapList = tagClassName.equals(TAGNAME_MAP_LIST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean globalMapList = tagClassName.equals(TAGNAME_GLOBAL_MAP_LIST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.Type type = as.getType();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.UIType uitype = as.getUIType();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean addremovelist =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster type.equals(AttributeSchema.Type.MULTIPLE_CHOICE) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (uitype != null) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster uitype.equals(AttributeSchema.UIType.ADDREMOVELIST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean listTyped = editableList || orderedList || unorderedList ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mapList || globalMapList || addremovelist;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (listTyped && addSubSection) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * create a subsection without a title to hold the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * editable list component.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(SUBSECTION_DUMMY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (needRequiredTag(as)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_REQUIRED_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addLabel(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (addremovelist) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(GROUP_START_TAG).append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendAddRemoveListComponent(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addremovelist = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //need to handle link specially.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tagClassName.equals(TAGNAME_BUTTON)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String editString = model.getLocalizedString("label.edit");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] pLink = {"'" + name + "'", editString};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_BUTTON_START_TAG, pLink));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (tagClassName.equals(TAGNAME_HREF)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String editString = model.getLocalizedString("label.edit");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] pLink = {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PropertyTemplate.PARAM_ATTR_NAME + "=" + name +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "&amp;" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PropertyTemplate.PARAM_PROPERTIES_VIEW_BEAN_URL +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "=" + as.getPropertiesViewBeanURL(),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "linkLabel" + name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster editString
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster };
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_LINK_START_TAG, pLink));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (tagClassName.equals(TAGNAME_CHECKBOX)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] param = {name, tagClassName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getLocalizedString("label.Enable")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster };
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_BOOLEAN_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (listTyped) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * putting the editable list component wihin a group tag
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to help isolate the list box and text box together on the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * page. Otherwise the list component blends in with other
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * components on the page.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] param = {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getLocalizedString("label.current.value"),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getLocalizedString("label.new.value")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster };
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(GROUP_START_TAG).append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (editableList) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_EDITABLE_LIST_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (orderedList) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_ORDERED_LIST_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (unorderedList) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_UNORDERED_LIST_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (mapList) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_MAP_LIST_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendChoiceValues(as, xml, model, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (globalMapList) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster COMPONENT_GLOBAL_MAP_LIST_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] param = {name, tagClassName};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(COMPONENT_START_TAG,param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if its a textarea component add the no localize attribute
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * set the size of the text field based on its syntax
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tagClassName.equals(TAGNAME_TEXTFIELD)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] pSize = {getStringFieldSize(as)};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(TEXTBOX_SIZE_TAG,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pSize));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(NON_LOCALIZED_FIELD);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(NO_AUTO_SUBMIT);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (tagClassName.equals(TAGNAME_TEXTAREA)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final Map<String, String> sizeMap = getTextAreaSize(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!sizeMap.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] textAreaSize = {sizeMap.get("columns"), sizeMap.get("rows")};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(TEXTAREA_SIZE_TAG, textAreaSize));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(NON_LOCALIZED_FIELD);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (tagClassName.equals(TAGNAME_PASSWORD)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(NO_AUTO_SUBMIT);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendChoiceValues(as, xml, model, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (type.equals(AttributeSchema.Type.MULTIPLE_CHOICE)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((uitype == null) ||
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster !uitype.equals(AttributeSchema.UIType.ADDREMOVELIST)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendMultipleChoiceCheckboxes(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendDateMarker(as, xml);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getInlineHelp(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // close off the group and subsection tags for the editable list
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (listTyped) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(GROUP_END_TAG)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append("&lt;p>")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (addSubSection) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(SUBSECTION_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This will get the syntax of the attribute, and compute an appropriate
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * size for the length of the text field. This will help the user
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * understand what the expected value is for the field. The field sizes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * are set in amProperty.properties so the customer can change the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * defaults as necessary.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String getStringFieldSize(AttributeSchema as) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String size = "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.Syntax syntax = as.getSyntax();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String valSyntax = (String)mapSyntaxToName.get(syntax);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (valSyntax != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (valSyntax.equals("number_range")) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tmp = as.getEndRange();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster size = Integer.toString(tmp.length());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster size = properties.getString("textfield." + valSyntax);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster size = properties.getString("textfield.default");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return size;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This will get the syntax of the attribute and retrieve the desired size for the text area.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The text area rows and columns are set in amProperty.properties and can be configured as required.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param as the attribute schema holding the text area properties.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a Map with keys "columns" and "rows" as specified in the properties
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * file or an empty map if nothing was specified.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Map<String, String> getTextAreaSize(AttributeSchema as) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final Map<String, String> sizeMap = new HashMap<String, String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final AttributeSchema.Syntax syntax = as.getSyntax();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final String valSyntax = (String)mapSyntaxToName.get(syntax);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final String columnsKey = "textarea." + valSyntax + ".columns";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final String rowsKey = "textarea." + valSyntax + ".rows";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (properties.containsKey(columnsKey) && properties.containsKey(rowsKey)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sizeMap.put("columns", properties.getString(columnsKey));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sizeMap.put("rows", properties.getString(rowsKey));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sizeMap;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void appendDateMarker(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.Syntax syntax = as.getSyntax();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (syntax.equals(AttributeSchema.Syntax.DATE)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] arg = {as.getName()};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(PropertyTemplate.DATE_MARKER, arg));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void buildConfirmPasswordXML(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMModel model,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (needRequiredTag(as)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_REQUIRED_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addPasswordConfirmLabel(as, xml, serviceBundle, model);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] param = {name};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(COMPONENT_PWD_START_TAG, param));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Adds a file upload button below the last attribute added. This will dynamically upload a file and then paste
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the contents back into the field of the previous attribute on the form.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param as The attribute that describes this UI element.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml The XML document to add the element to.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param model The AMModel that stores admin constants.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void buildFileUploadXML(AttributeSchema as, StringBuffer xml, AMModel model) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final String name = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster final String label = model.getLocalizedString(UPLOAD_LABEL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_START_TAG)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(MessageFormat.format(COMPONENT_UPLOAD_BUTTON_START_TAG, name, label))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(COMPONENT_END_TAG)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void buildScriptSelectXML(AttributeSchema as, StringBuffer xml, AMModel model, ResourceBundle bundle,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean globalOnly) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrName = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addLabel(as, xml, bundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(COMPONENT_START_TAG, attrName, TAGNAME_DROPDOWN_MENU));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, String> choiceValues = getSortedChoiceValueMap(as, model);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Map.Entry<String, String> entry : choiceValues.entrySet()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(OPTION_TAG, escapeSpecialChars(model.getLocalizedString(entry.getValue())),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster escapeSpecialChars(entry.getKey())));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(COMPONENT_END_TAG)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(MessageFormat.format(COMPONENT_ACTION_BUTTON_START_TAG, "refresh", attrName, "",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getLocalizedString("button.refresh")))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getInlineHelp(as, xml, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(PROPERTY_START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Users can't create global scripts
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!globalOnly) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(COMPONENT_ACTION_BUTTON_START_TAG, "create", attrName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster as.getPropertiesViewBeanURL(), model.getLocalizedString("button.create")))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(COMPONENT_ACTION_BUTTON_START_TAG, "edit", attrName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster as.getPropertiesViewBeanURL(), model.getLocalizedString("button.edit")))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(COMPONENT_END_TAG)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(PROPERTY_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void addLabel(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {name,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster escapeSpecialChars(com.sun.identity.shared.locale.Locale.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceBundle, as.getI18NKey(), debug)),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster name};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(LABEL_TAG, params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void addPasswordConfirmLabel(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMModel model
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = as.getName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] labelParam = {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster escapeSpecialChars(com.sun.identity.shared.locale.Locale.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceBundle, as.getI18NKey(), debug))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster };
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String label = MessageFormat.format(model.getLocalizedString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "password.confirm.label"), labelParam);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {name, label, name};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(LABEL_TAG, params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void getInlineHelp(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String i18nKey = as.getI18NKey();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((i18nKey == null) || (i18nKey.length() < 1)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String helpString = CCPropertySheetTag.getDynamicHelp(serviceBundle, i18nKey + ".help");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (helpString == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {as.getName(), escapeSpecialChars(helpString)};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(HELP_TAG, params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (MissingResourceException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // no-op, assumption here is help is not defined for this attr.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public String escapeSpecialChars(String text) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String escaped = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((text != null) && (text.trim().length() > 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder(text.length());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int len = text.length();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < len; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char c = text.charAt(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster switch (c) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case '&':
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&amp;");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case '<':
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&lt;");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case '>':
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&gt;");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case '"':
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&quot;");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster default:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(c);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster escaped = sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster escaped = text;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return escaped;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void appendChoiceValues(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMModel model,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.Type type = as.getType();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (type.equals(AttributeSchema.Type.SINGLE)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema.UIType uitype = as.getUIType();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((uitype != null) && uitype.equals(AttributeSchema.UIType.RADIO))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] p1 = {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster model.getLocalizedString("label.Yes"), "true"};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(OPTION_TAG, p1));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] p2 = {model.getLocalizedString("label.No"), "false"};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(OPTION_TAG, p2));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (type.equals(AttributeSchema.Type.SINGLE_CHOICE)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendChoiceValueForSelectableComponent(as, xml, serviceBundle, true, OPTION_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (type.equals(AttributeSchema.Type.LIST)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appendChoiceValueForSelectableComponent(as, xml, serviceBundle, false, VALUE_OPTION_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void appendMultipleChoiceCheckboxes(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map map = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set sorted = getSortedChoiceValues(as, map, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = getAttributeNameForPropertyXML(as);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] nameArg = {name};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(DYN_GUI_MULTIPLE_LIST_MARKER_XML,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster nameArg));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = sorted.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String localizedName = (String)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster name, (String)map.get(localizedName), localizedName};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(DYN_GUI_MULTIPLE_LIST_CHECKBOX_XML,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void appendAddRemoveListComponent(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map map = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set sorted = getSortedChoiceValues(as, map, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String name = as.getName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] nameArg = {name};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(ADD_REMOVE_COMPONENT_XML, nameArg));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = sorted.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String localizedName = (String)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {localizedName, (String)map.get(localizedName)};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(OPTION_TAG, params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(COMPONENT_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String getMultipleChoiceCheck(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attrName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set choices
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder xml = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set sorted = new TreeSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((choices != null) && !choices.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = choices.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sorted.add(iter.next());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = sorted.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String choice = (String)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {attrName, choice, choice};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster MessageFormat.format(DYN_GUI_MULTIPLE_LIST_CHECKBOX_XML,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return xml.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the value for the current realm name being used to build the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * property sheet xml page.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value the name of the realm
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void setCurrentRealm(String value) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster currentRealm = value;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the current realm name value which can be used for constructing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the xml page. If the realm name has not been set the default location
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * which is stored in <code>AMModelBase</code> will be returned. If no
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * location has been set in the model the realm where the user logged in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is returned.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return name of the realm used for building the page.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String getCurrentRealm() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (currentRealm != null) ? currentRealm : model.getLocationDN();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set getSortedChoiceValues(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map values,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set sorted = new TreeSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (AttributeSchema.ListOrder.INSERTION.equals(as.getListOrder())) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sorted = new LinkedHashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map tmp = new HashMap(2);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmp.put(Constants.ORGANIZATION_NAME, getCurrentRealm());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] choices = as.getChoiceValues(tmp);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((choices != null) && (choices.length > 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < choices.length; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String val = choices[i];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String i18nKey = as.getChoiceValueI18NKey(val);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String localizedName = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((i18nKey == null) || (i18nKey.trim().length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster localizedName = val;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster localizedName =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster com.sun.identity.shared.locale.Locale.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceBundle, i18nKey, debug);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster values.put(localizedName, val);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sorted.add(localizedName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sorted;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Map<String, String> getSortedChoiceValueMap(AttributeSchema as, AMModel model) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, String> env = new HashMap<>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (model instanceof SubConfigModel) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster env.put(Constants.CONFIGURATION_NAME, ((SubConfigModel)model).getName());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster env.put(Constants.ORGANIZATION_NAME, getCurrentRealm());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster @SuppressWarnings("unchecked")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, String> choiceValues = as.getChoiceValuesMap(env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return CollectionUtils.sortMapByValue(choiceValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void appendChoiceValueForSelectableComponent(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AttributeSchema as,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceBundle serviceBundle,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean includeDefault,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String template
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map map = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean defaultValue = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set sorted = getSortedChoiceValues(as, map, serviceBundle);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator iter = sorted.iterator(); iter.hasNext(); ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String localizedName = (String)iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String value = (String)map.get(localizedName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] params = {escapeSpecialChars(localizedName),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster escapeSpecialChars(value)};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (includeDefault && !defaultValue) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<attribute name=\"defaultValue\" value=\"")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append(escapeSpecialChars(value))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .append("\" />");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster defaultValue = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(MessageFormat.format(template, params));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This will remove an entire subsection which surrounds the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * specified attribute. The subsection will be replaced with a
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>&lt;property&gt;</code> tag.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param original xml string to be modified.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param attribute name which is going to be removed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param insert string with new xml.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return new xml string without subsection.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String removeSubSection(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String original,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String attribute,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String insert
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int mark = original.indexOf(attribute);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String start = original.substring(0, mark);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int index = start.lastIndexOf("<subsection");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // the attribute is not within a subsection
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (index == -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return original;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster start = start.substring(0, index);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String end = original.substring(mark);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster index = end.indexOf("</subsection>") + 13;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // the end of the subsection is missing. invalid xml perhaps.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (index == -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return original;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster end = end.substring(index);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return start + insert + end;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns an altered XML. This method prepends a property element.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml XML to operate on.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param propertyXML XML to replace.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return the altered XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String prependXMLProperty(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String propertyXML
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int idx = xml.indexOf(PropertyTemplate.START_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster idx += PropertyTemplate.START_TAG.length();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return xml.substring(0, idx) + propertyXML + xml.substring(idx);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns an altered XML. This method appends a property element.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml XML to operate on.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param propertyXML XML to replace.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return the altered XML.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String appendXMLProperty(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String propertyXML
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int idx = xml.lastIndexOf(PropertyTemplate.SECTION_END_TAG);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (idx != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml = xml.substring(0, idx) + propertyXML + xml.substring(idx);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return xml;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns service schema manager.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return service schema manager.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public ServiceSchemaManager getServiceSchemaManager() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return svcSchemaManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void buildSchemaTypeXML(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String schemaTypeName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set attributeSchemas,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuffer xml,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMModel model,
ResourceBundle serviceBundle,
Set readonly
) {
buildSchemaTypeXML(schemaTypeName, attributeSchemas, xml, model, serviceBundle, readonly, true, true);
}
protected void buildSchemaTypeXML(
String schemaTypeName,
Set attributeSchemas,
StringBuffer xml,
AMModel model,
ResourceBundle serviceBundle,
Set readonly,
boolean section,
boolean addSubSection
) {
if (section) {
String label = "lbl" + schemaTypeName.replace('.', '_');
Object[] params = { label, schemaTypeName};
xml.append(MessageFormat.format(SECTION_START_TAG, params));
}
List sorted = new ArrayList(attributeSchemas);
if (!(attributeSchemas instanceof LinkedHashSet)) {
// Sort attribute schemas by property key if they are not sorted by section properties.
Collections.sort(sorted, new AttributeSchemaComparator(null));
}
for (Iterator iter = sorted.iterator(); iter.hasNext(); ) {
AttributeSchema as = (AttributeSchema)iter.next();
if (allAttributesReadonly || readonly.contains(as.getName())) {
buildReadonlyXML(as, xml, model, serviceBundle);
} else if (SCRIPTSELECT.equals(as.getUIType())) {
buildScriptSelectXML(as, xml, model, serviceBundle, false);
} else if (GLOBALSCRIPTSELECT.equals(as.getUIType())) {
buildScriptSelectXML(as, xml, model, serviceBundle, true);
} else {
buildAttributeSchemaTypeXML(as, xml, model, serviceBundle, addSubSection);
String tagClassName = getTagClassName(as);
if (tagClassName.equals(TAGNAME_PASSWORD)) {
buildConfirmPasswordXML(as, xml, model, serviceBundle);
}
if (AttributeSchema.Syntax.SCRIPT.equals(as.getSyntax())) {
buildFileUploadXML(as, xml, model);
}
}
}
xml.append((section ? SECTION_END_TAG : ""));
}
protected void buildSchemaTypeXML(
String schemaTypeName,
Set<AttributeSchema> attributeSchemas,
StringBuffer xml,
AMModel model,
ResourceBundle serviceBundle,
Set readonly,
List<String> sectionList
) {
Object[] params = { schemaTypeName, schemaTypeName, "true" };
Set<AttributeSchema> as = getAttributeSchemaForSection(attributeSchemas, sectionList);
// skip empty sections
if (as.isEmpty()) {
return;
}
xml.append(MessageFormat.format(SUBSECTION_START_TAG, params));
buildSchemaTypeXML(schemaTypeName, as, xml, model, serviceBundle, readonly, false, false);
xml.append(SUBSECTION_END_TAG);
}
protected Set<AttributeSchema> getAttributeSchemaForSection(Set<AttributeSchema> attributeSchemas, List<String> sectionList) {
// Create an attribute schema set sorted by section properties.
Set<AttributeSchema> result = new LinkedHashSet<AttributeSchema>();
for (String section : sectionList) {
for (AttributeSchema attribute : attributeSchemas) {
if (section.equals(attribute.getName())) {
result.add(attribute);
break;
}
}
}
return result;
}
/**
* Returns a property XML of a given well formed attributes XML string.
*
* @param properties Well formed attributes XML string..
* @return a property XML of a given well formed attributes XML string.
*/
public static String formPropertySheetXML(String properties) {
return formPropertySheetXML(properties, false);
}
/**
* Returns a property XML of a given well formed attributes XML string.
*
* @param properties Well formed attributes XML string..
* @param addSection <code>true</code> to add a dummy section to the XML.
* @return a property XML of a given well formed attributes XML string.
*/
public static String formPropertySheetXML(
String properties,
boolean addSection
) {
return (addSection)
?
getXMLDefinitionHeader() + PropertyTemplate.START_TAG +
PropertyTemplate.SECTION_DUMMY_START_TAG +
properties + PropertyTemplate.SECTION_END_TAG +
PropertyTemplate.END_TAG
:
getXMLDefinitionHeader() + PropertyTemplate.START_TAG +
properties + PropertyTemplate.END_TAG;
}
/**
* Set all all attribute values read only.
*
* @param flag true if all attribute values are read only.
*/
public void setAllAttributeReadOnly(boolean flag) {
allAttributesReadonly = flag;
}
protected String getAttributeNameForPropertyXML(AttributeSchema as) {
return as.getName();
}
/**
* Performs a tag substitution on a string.
*
* @param template Template for tag swapping.
* @param tag Tag.
* @param value Value of Tag.
*/
protected String tagSwap(String template, String tag, String value) {
int valLen = value.length();
int tagLen = tag.length();
int idx = template.indexOf(tag);
while (idx != -1) {
template = template.substring(0, idx) + value +
template.substring(idx + tagLen);
idx = template.indexOf(tag, idx + valLen);
}
return template;
}
private static boolean needRequiredTag(AttributeSchema as) {
return hasAnyAttribute(as.getAny(), ANY_REQUIRED) ||
((as.getValidator() != null) &&
as.getValidator().equals("RequiredValueValidator"));
}
public static String getXMLDefinitionHeader() {
return PropertyTemplate.DEFINITION;
}
}