All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.appng.api.support.XmlGenerator Maven / Gradle / Ivy

There is a newer version: 1.24.5
Show newest version
/*
 * Copyright 2011-2021 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.appng.api.support;

import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.appng.api.ActionProvider;
import org.appng.api.DataProvider;
import org.appng.api.model.Identifiable;
import org.appng.api.model.Versionable;
import org.appng.tools.locator.Coordinate;
import org.appng.xml.BuilderFactory;
import org.appng.xml.MarshallService;
import org.appng.xml.MarshallService.AppNGSchema;
import org.appng.xml.platform.Action;
import org.appng.xml.platform.ActionRef;
import org.appng.xml.platform.ApplicationConfig;
import org.appng.xml.platform.ApplicationRootConfig;
import org.appng.xml.platform.Bean;
import org.appng.xml.platform.BeanOption;
import org.appng.xml.platform.Condition;
import org.appng.xml.platform.Config;
import org.appng.xml.platform.DataConfig;
import org.appng.xml.platform.Datasource;
import org.appng.xml.platform.DatasourceRef;
import org.appng.xml.platform.Datasources;
import org.appng.xml.platform.Event;
import org.appng.xml.platform.FieldDef;
import org.appng.xml.platform.FieldType;
import org.appng.xml.platform.GetParams;
import org.appng.xml.platform.Icon;
import org.appng.xml.platform.Label;
import org.appng.xml.platform.Link;
import org.appng.xml.platform.Linkmode;
import org.appng.xml.platform.Linkpanel;
import org.appng.xml.platform.MetaData;
import org.appng.xml.platform.PageConfig;
import org.appng.xml.platform.PageDefinition;
import org.appng.xml.platform.Pages;
import org.appng.xml.platform.PanelLocation;
import org.appng.xml.platform.Param;
import org.appng.xml.platform.Params;
import org.appng.xml.platform.Permission;
import org.appng.xml.platform.PermissionMode;
import org.appng.xml.platform.Permissions;
import org.appng.xml.platform.PostParams;
import org.appng.xml.platform.SectionDef;
import org.appng.xml.platform.SectionelementDef;
import org.appng.xml.platform.Session;
import org.appng.xml.platform.SessionParams;
import org.appng.xml.platform.StructureDef;
import org.appng.xml.platform.UrlParams;
import org.appng.xml.platform.UrlSchema;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

/**
 * Utility class for generating source XML (for {@link Action}s and {@link Datasource}) from a given list of
 * {@link Entity}s. The generated XML will contain a basic master-detail navigation which can be used as a starting
 * point to implement CRUD functionality. Anyhow, no Java-sourcecode ( {@link ActionProvider}s or {@link DataProvider}s
 * ) will be generated. This can be done for example by using custom freemarker templating.
 * 

* Example usage: * *

 * XmlGenerator generator = new XmlGenerator();
 * generator.setDatePattern("yyyy-MM-dd");
 * Entity entity = new Entity(Person.class, new String[] { "name", "firstName", "street", "birthDate" });
 * generator.generate("target/generated", "My generated person app", "messages-persons", entity);
 * 
* * See also {@link #generate(String, String, String, Entity...)} *

* * @author Matthias Müller */ public class XmlGenerator { private static final String UTF_8 = "UTF-8"; private static final String ACTION_PARAM = "${action}"; private static final String ACTION = "action"; private static final String ACTIONS = "actions"; private static final String CONFIRM = "confirm"; private static final String CREATE = "create"; private static final String CURRENT_ID = "${current.id}"; private static final String DELETE = "delete"; private static final String EDIT = "edit"; private static final String EVENT = "Event"; private static final String FORM_ACTION = "form_action"; private static final String FORM_ACTION_PARAM = "${form_action}"; private static final String ID = "id"; private static final String ID_PARAM = "${id}"; private static final String LIST = "list"; private static final String NAME = "name"; private static final String SLASH = "/"; private static final String TRUE = "true"; private static final String UPDATE = "update"; private MarshallService marshallService; private boolean addPermissions; private SortedMap dictionary = new TreeMap<>(); private SortedMap permissionNames = new TreeMap<>(); private String datePattern = "yyyy-MM-dd HH:mm:ss"; /** * Represents a domain object of a certain type with a number of properties */ public static class Entity { private final Class type; private final String[] properties; /** * Creates a new entity * * @param type * the type of the entity to create * @param properties * the properties to map when generating XML */ public Entity(Class type, String[] properties) { this.type = type; this.properties = properties; } public String getName() { return type.getName(); } public String getSimpleName() { return type.getSimpleName(); } public String getSimpleNameLower() { return StringUtils.uncapitalize(getSimpleName()); } public String getPlural() { String simpleName = getSimpleName(); if (simpleName.endsWith("y")) { return simpleName.substring(0, simpleName.length() - 1) + "ies"; } return simpleName + "s"; } public String getPluralLower() { return StringUtils.uncapitalize(getPlural()); } public Class getType() { return type; } public String[] getProperties() { return properties; } public String getIdType() { return new BeanWrapperImpl(type).getPropertyType("id").getSimpleName(); } } /** * Generates the source XML for the given {@link Entity}s. The following files will be created for each * {@link Entity}, assuming the {@code Person.class} as the entities type: *
    *
  • conf/datasource/ds-persons.xml
  • *
  • conf/action/ev-persons.xml
  • *
  • conf/page/pg-persons.xml
  • *
* The following files are created once: *
    *
  • conf/config.xml - contains the {@link ApplicationRootConfig}
  • *
  • dictionary/<dictionaryName>.properties
  • *
  • application.xml
  • *
* * @param outPath * the target folder for the files to be generated * @param name * the name for the {@link ApplicationRootConfig}-file to be created * @param dictionaryName * the name for the dictionary file to be created (<dictionaryName>.properties) * @param entities * the list of {@link Entity}s to generate the source XML for * * @throws Exception * if something goes really wrong ;-) */ public void generate(String outPath, String name, String dictionaryName, Entity... entities) throws Exception { ApplicationRootConfig rootConfig = generateRootConfig(name); File conf = new File(outPath, "conf"); for (Entity entity : entities) { String nameTpl = entity.getPluralLower(); File dsFile = new File(conf, "datasource/ds-" + nameTpl + ".xml"); dsFile.getParentFile().mkdirs(); generateDatasources(entity, new FileOutputStream(dsFile), entity.getProperties()); File actionFile = new File(conf, "action/ev-" + nameTpl + ".xml"); actionFile.getParentFile().mkdirs(); generateActions(new org.appng.xml.application.Permissions(), entity, new FileOutputStream(actionFile)); File pageFile = new File(conf, "page/pg-" + nameTpl + ".xml"); pageFile.getParentFile().mkdirs(); generatePages(entity, rootConfig.getNavigation(), new FileOutputStream(pageFile)); } File cfgFile = new File(conf, "config.xml"); cfgFile.getParentFile().mkdirs(); writeToOutputStream(rootConfig, new FileOutputStream(cfgFile)); File dictFile = new File(outPath, "dictionary/" + dictionaryName + ".properties"); dictFile.getParentFile().mkdirs(); writeDictionary(new FileOutputStream(dictFile)); writeApplicationXml(new FileOutputStream(new File(outPath, "application.xml"))); } /** * Creates a new XmlGenerator * * @param addPermissions * if {@link Permissions} should be generated and used when referencing {@link Action}s * * @throws JAXBException * if creating a {@link MarshallService} fails * @throws TransformerConfigurationException * if an error occurs while configuring the {@link TransformerFactory} */ public XmlGenerator(boolean addPermissions) throws JAXBException, TransformerConfigurationException { this.addPermissions = addPermissions; this.marshallService = new MarshallService(); marshallService.setSchema(AppNGSchema.PLATFORM); marshallService.setPrettyPrint(true); marshallService.setSchemaLocation("http://www.appng.org/schema/platform/appng-platform.xsd"); marshallService.setUseSchema(true); marshallService.setCdataElements(new ArrayList<>()); marshallService.setDocumentBuilderFactory(BuilderFactory.documentBuilderFactory()); marshallService.setTransformerFactory(BuilderFactory.transformerFactory()); marshallService.init(); } public XmlGenerator() throws JAXBException, TransformerConfigurationException { this(true); } public Pages generatePages(Entity entity, Linkpanel navigation, OutputStream out) throws Exception { PageDefinition page = new PageDefinition(); String typeName = entity.getType().getSimpleName(); String singular = StringUtils.uncapitalize(typeName); String plural = entity.getPluralLower(); page.setId(plural); PageConfig config = new PageConfig(); config.setTitle(getLabel(plural)); UrlSchema urlSchema = new UrlSchema(); UrlParams urlParams = new UrlParams(); urlParams.getParamList().add(getParam(ACTION, null)); urlParams.getParamList().add(getParam(ID, null)); urlSchema.setUrlParams(urlParams); PostParams postParams = new PostParams(); postParams.getParamList().add(getParam(FORM_ACTION, null)); urlSchema.setPostParams(postParams); GetParams getParams = new GetParams(); getParams.getParamList().add(getParam(ACTION, null)); urlSchema.setGetParams(getParams); config.setUrlSchema(urlSchema); page.setConfig(config); String eventId = singular + EVENT; StructureDef structure = new StructureDef(); SectionDef section = new SectionDef(); section.setTitle(getLabel(plural)); SectionelementDef create = new SectionelementDef(); String onSuccess = SLASH + plural; ActionRef createRef = geActionRef(eventId, CREATE + typeName, onSuccess, "${empty id and 'create' eq action}", getParam(FORM_ACTION, FORM_ACTION_PARAM)); create.setAction(createRef); section.getElement().add(create); SectionelementDef update = new SectionelementDef(); ActionRef updateRef = geActionRef(eventId, UPDATE + typeName, onSuccess, "${not empty id and 'update' eq action}", getParam(FORM_ACTION, FORM_ACTION_PARAM), getParam(ID, ID_PARAM)); update.setAction(updateRef); section.getElement().add(update); SectionelementDef list = new SectionelementDef(); DatasourceRef listRef = new DatasourceRef(); listRef.setId(plural); list.setDatasource(listRef); listRef.setParams(getParams(getParam("selectedId", ID_PARAM))); section.getElement().add(list); structure.getSection().add(section); SectionDef hiddenSection = new SectionDef(); hiddenSection.setHidden(TRUE); SectionelementDef hiddenElement = new SectionelementDef(); ActionRef deleteRef = geActionRef(eventId, DELETE + typeName, onSuccess, null, getParam(ACTION, ACTION_PARAM), getParam(ID, ID_PARAM)); hiddenElement.setAction(deleteRef); hiddenSection.getElement().add(hiddenElement); structure.getSection().add(hiddenSection); page.setStructure(structure); Pages pages = new Pages(); pages.getPageList().add(page); if (null != out) { marshallService.marshallNonRoot(pages, out); } Link pageLink = new Link(); pageLink.setTarget("/" + page.getId()); pageLink.setMode(Linkmode.INTERN); pageLink.setLabel(getLabel(page.getId())); navigation.getLinks().add(pageLink); return pages; } private ActionRef geActionRef(String eventId, String id, String onSuccess, String condition, Param... params) { ActionRef actionRef = new ActionRef(); actionRef.setEventId(eventId); actionRef.setId(id); actionRef.setOnSuccess(onSuccess); if (params.length > 0) { actionRef.setParams(new Params()); for (Param param : params) { actionRef.getParams().getParam().add(param); } } if (null != condition) { Condition cond = new Condition(); cond.setExpression(condition); actionRef.setCondition(cond); } return actionRef; } private Param getParam(String name, String value) { Param param = new Param(); param.setName(name); param.setValue(value); return param; } private Params getParams(Param... parameters) { Params params = new Params(); for (Param param : parameters) { params.getParam().add(param); } return params; } public Event generateActions(org.appng.xml.application.Permissions permissions, Entity entity, OutputStream out) throws Exception { Class bindClass = entity.getType(); String entityName = bindClass.getSimpleName(); String singular = StringUtils.uncapitalize(entityName); String plural = entity.getPluralLower(); Event event = new Event(); event.setId(singular + EVENT); event.setConfig(new Config()); Action create = getCreateAction(bindClass, entityName, singular, plural); event.getActions().add(create); addPermissions(permissions, create, CREATE, singular); Action delete = getDeleteAction(bindClass, entityName, singular, plural); event.getActions().add(delete); addPermissions(permissions, delete, DELETE, singular); Action update = getUpdateAction(bindClass, entityName, singular, plural); event.getActions().add(update); addPermissions(permissions, update, UPDATE, singular); writeToOutputStream(event, out); return event; } public Event generateActions(org.appng.xml.application.Permissions permissions, Entity entity) throws Exception { return generateActions(permissions, entity, null); } public Datasources generateDatasources(Entity entity, OutputStream out) throws Exception { return generateDatasources(entity, out, new String[0]); } public Datasources generateDatasources(Entity entity, OutputStream out, String... properties) throws Exception { Datasources datasources = new Datasources(); Datasource all = getListDatasource(entity, null, properties); datasources.getDatasourceList().add(all); Datasource single = getSingleItemDatasource(entity, null, properties); datasources.getDatasourceList().add(single); writeToOutputStream(datasources, out); return datasources; } public void writeToOutputStream(Object object, OutputStream out) throws ParserConfigurationException, JAXBException, TransformerException { if (null != out) { marshallService.marshallNonRoot(object, out); } } public Datasource getSingleItemDatasource(Entity entity, OutputStream out, String... properties) throws Exception { Datasource single = new Datasource(); Class bindClass = entity.getType(); String singular = bindClass.getSimpleName().toLowerCase(); single.setId(singular); DataConfig singleConfig = new DataConfig(); singleConfig.setParams(getParams(getParam(ID, null))); single.setConfig(singleConfig); MetaData singleMetaData = new MetaData(); singleConfig.setMetaData(singleMetaData); addFields(bindClass, singleMetaData, true, properties); Bean singleBean = new Bean(); singleBean.setId(entity.getPluralLower()); BeanOption singleOption = new BeanOption(); singleOption.setName(ID); singleOption.getOtherAttributes().put(new QName(singular + "Id"), ID_PARAM); singleBean.getOptions().add(singleOption); single.setBean(singleBean); writeToOutputStream(single, out); return single; } private Datasource getListDatasource(Entity entity, OutputStream out, String... properties) throws Exception { Class bindClass = entity.getType(); String plural = entity.getPluralLower(); Datasource all = new Datasource(); all.setId(plural); DataConfig config = new DataConfig(); config.setParams(new Params()); config.getParams().getParam().add(getParam("selectedId", null)); Permissions dsPermissions = getPermissions(bindClass, LIST); config.setPermissions(dsPermissions); config.setTitle(getLabel(plural)); MetaData metaData = new MetaData(); metaData.setBindClass(bindClass.getName()); boolean hasName = false; boolean checkWriteable = false; hasName = addFields(bindClass, metaData, checkWriteable, properties); FieldDef linkField = new FieldDef(); linkField.setName(ACTIONS); linkField.setType(FieldType.LINKPANEL); linkField.setLabel(getLabel(ACTIONS)); metaData.setResultSelector("${current.id eq selectedId}"); metaData.getFields().add(linkField); config.setMetaData(metaData); all.setConfig(config); Linkpanel actions = new Linkpanel(); actions.setId(ACTIONS); actions.setLocation(PanelLocation.INLINE); String editTarget = SLASH + plural + SLASH + UPDATE + SLASH + CURRENT_ID; Link editLink = createLink(bindClass, Linkmode.INTERN, editTarget, EDIT, EDIT, UPDATE); editLink.setDefault(TRUE); actions.getLinks().add(editLink); String deleteTarget = SLASH + plural + "?action=" + DELETE + bindClass.getSimpleName() + "&id=" + CURRENT_ID; Link deleteLink = createLink(bindClass, Linkmode.INTERN, deleteTarget, DELETE, DELETE, DELETE); Label confirmation = getLabel(getPermissionName(bindClass, DELETE) + "." + CONFIRM); deleteLink.setConfirmation(confirmation); if (hasName) { confirmation.setParams("#{name}"); } actions.getLinks().add(deleteLink); config.getLinkpanel().add(actions); Linkpanel create = new Linkpanel(); create.setId("create"); create.setLocation(PanelLocation.BOTH); Link createLink = createLink(bindClass, Linkmode.INTERN, SLASH + plural + SLASH + CREATE, CREATE, "new", CREATE); create.getLinks().add(createLink); config.getLinkpanel().add(create); Bean bean = new Bean(); bean.setId(plural); all.setBean(bean); writeToOutputStream(all, out); return all; } private Permissions getPermissions(Class bindClass, String action) { Permissions permissions = null; if (addPermissions) { permissions = new Permissions(); Permission permission = new Permission(); permission.setMode(PermissionMode.SET); permission.setRef(getPermissionName(bindClass, action)); permissions.getPermissionList().add(permission); permissionNames.put(permission.getRef(), StringUtils.capitalize(action) + " a " + bindClass.getSimpleName()); } return permissions; } private String getPermissionName(Class bindClass, String action) { return bindClass.getSimpleName().toLowerCase() + "." + action; } private Link createLink(Class bindClass, Linkmode mode, String target, String labelId, String iconValue, String action) { Link link = new Link(); Icon icon = new Icon(); icon.setContent(iconValue); link.setIcon(icon); link.setMode(mode); link.setTarget(target); Label label = getLabel(labelId); link.setLabel(label); if (null != action) { Permissions permissions = getPermissions(bindClass, action); link.setPermissions(permissions); } return link; } private boolean addFields(Class bindClass, MetaData metaData, boolean checkWriteable, String... properties) { boolean versionable = Versionable.class.isAssignableFrom(bindClass); boolean identifiable = Identifiable.class.isAssignableFrom(bindClass); metaData.setBindClass(bindClass.getName()); BeanWrapper beanWrapper = new BeanWrapperImpl(bindClass); boolean hasName = beanWrapper.isReadableProperty(NAME); boolean skipId = true; boolean skipVersion = true; List propertyNames; if (null == properties || properties.length == 0) { propertyNames = new ArrayList<>(); PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { propertyNames.add(propertyDescriptor.getName()); } } else { propertyNames = Arrays.asList(properties); skipId = false; skipVersion = false; } for (String propertyName : propertyNames) { if (beanWrapper.isReadableProperty(propertyName)) { FieldDef fieldDef = new FieldDef(); fieldDef.setName(propertyName); Class type = beanWrapper.getPropertyType(propertyName); if (type.isAssignableFrom(Integer.class)) { fieldDef.setType(FieldType.INT); } else if (type.isAssignableFrom(Long.class)) { fieldDef.setType(FieldType.LONG); } else if (type.isAssignableFrom(Float.class) || type.isAssignableFrom(Double.class)) { fieldDef.setType(FieldType.DECIMAL); } else if (type.isAssignableFrom(Date.class)) { fieldDef.setType(FieldType.DATE); fieldDef.setFormat(datePattern); } else if (type.isAssignableFrom(Coordinate.class)) { fieldDef.setType(FieldType.COORDINATE); } else { fieldDef.setType(FieldType.TEXT); } if (checkWriteable && !beanWrapper.isWritableProperty(propertyName)) { fieldDef.setReadonly(TRUE); } boolean isVersion = skipVersion && versionable && "version".equals(propertyName); boolean isId = skipId && identifiable && "id".equals(propertyName); boolean skip = checkWriteable && (isVersion || isId); if (null != fieldDef.getType() && !skip) { fieldDef.setLabel(getLabel(propertyName)); metaData.getFields().add(fieldDef); } } } return hasName; } private Action getUpdateAction(Class bindClass, String entityName, String singular, String plural) { Action update = new Action(); update.setId(UPDATE + entityName); DataConfig config = new DataConfig(); config.setPermissions(getPermissions(bindClass, UPDATE)); Condition condition = new Condition(); condition.setExpression("${not empty id and '" + update.getId() + "' eq form_action}"); update.setCondition(condition); config.setParams(getParams(getParam(ID, null), getParam(FORM_ACTION, null))); config.setTitle(getLabel(singular + "." + UPDATE)); update.setConfig(config); DatasourceRef datasourceRef = new DatasourceRef(); datasourceRef.setId(singular); datasourceRef.setParams(new Params()); datasourceRef.getParams().getParam().add(getParam(ID, ID_PARAM)); update.setDatasource(datasourceRef); Bean bean = new Bean(); bean.setId(plural); BeanOption idOption = new BeanOption(); idOption.setName(ACTION); idOption.getOtherAttributes().put(new QName(ID), UPDATE); idOption.getOtherAttributes().put(new QName(singular + "Id"), ID_PARAM); bean.getOptions().add(idOption); update.setBean(bean); return update; } private Action getCreateAction(Class bindClass, String entityName, String singular, String plural) { Action update = new Action(); update.setId(CREATE + entityName); DataConfig config = new DataConfig(); config.setPermissions(getPermissions(bindClass, CREATE)); Condition condition = new Condition(); condition.setExpression("${'" + update.getId() + "' eq form_action}"); update.setCondition(condition); config.setParams(getParams(getParam(FORM_ACTION, null))); config.setTitle(getLabel(singular + "." + CREATE)); update.setConfig(config); DatasourceRef datasourceRef = new DatasourceRef(); datasourceRef.setId(singular); update.setDatasource(datasourceRef); Bean bean = new Bean(); bean.setId(plural); BeanOption idOption = new BeanOption(); idOption.setName(ACTION); idOption.getOtherAttributes().put(new QName(ID), CREATE); bean.getOptions().add(idOption); update.setBean(bean); return update; } private Action getDeleteAction(Class bindClass, String entityName, String singular, String plural) { Action delete = new Action(); delete.setId(DELETE + entityName); DataConfig config = new DataConfig(); config.setPermissions(getPermissions(bindClass, DELETE)); Condition condition = new Condition(); condition.setExpression("${not empty id and '" + delete.getId() + "' eq action}"); delete.setCondition(condition); config.setParams(getParams(getParam(ID, null), getParam(ACTION, null))); config.setTitle(getLabel(singular + "." + DELETE)); delete.setConfig(config); Bean bean = new Bean(); bean.setId(plural); BeanOption idOption = new BeanOption(); idOption.setName(ACTION); idOption.getOtherAttributes().put(new QName(ID), DELETE); idOption.getOtherAttributes().put(new QName(singular + "Id"), ID_PARAM); bean.getOptions().add(idOption); delete.setBean(bean); return delete; } private void addPermissions(org.appng.xml.application.Permissions permissions, Action action, String actionName, String entityName) { Permissions actionPermissions = action.getConfig().getPermissions(); if (null != actionPermissions) { List permissionList = actionPermissions.getPermissionList(); for (Permission permission : permissionList) { org.appng.xml.application.Permission p = new org.appng.xml.application.Permission(); p.setId(permission.getRef()); p.setValue(actionName + " a " + entityName); permissions.getPermission().add(p); } } } private Label getLabel(String id) { Label label = new Label(); label.setId(id); dictionary.put(id, id); return label; } public void writeDictionary(OutputStream out) throws IOException { char previous = ' '; for (String key : dictionary.keySet()) { if (key.charAt(0) != previous) { IOUtils.write(("#" + key.charAt(0)).toUpperCase() + "\n", out, UTF_8); } previous = key.charAt(0); IOUtils.write(key + "=" + dictionary.get(key) + "\n", out, UTF_8); } } private void writeApplicationXml(OutputStream out) throws IOException { IOUtils.write("\r\n", out, UTF_8); IOUtils.write("\r\n", out, UTF_8); IOUtils.write("\t\r\n", out, UTF_8); IOUtils.write("\t\t\r\n", out, UTF_8); IOUtils.write("\t\t\tAdmin\r\n", out, UTF_8); IOUtils.write("\t\t\tAdmin with all permissions\r\n", out, UTF_8); for (String p : permissionNames.keySet()) { IOUtils.write("\t\t\t\r\n", out, UTF_8); } IOUtils.write("\t\t\r\n", out, UTF_8); IOUtils.write("\t\r\n", out, UTF_8); IOUtils.write("\t\r\n", out, UTF_8); for (String p : permissionNames.keySet()) { IOUtils.write("\t\t" + permissionNames.get(p) + "\r\n", out, UTF_8); } IOUtils.write("\t\r\n", out, UTF_8); IOUtils.write("", out, UTF_8); } public ApplicationRootConfig generateRootConfig(String name) { ApplicationRootConfig rootConfig = new ApplicationRootConfig(); rootConfig.setName(name); ApplicationConfig appCfg = new ApplicationConfig(); appCfg.setSession(new Session()); appCfg.getSession().setSessionParams(new SessionParams()); rootConfig.setConfig(appCfg); Linkpanel navigation = new Linkpanel(); navigation.setLocation(PanelLocation.TOP); navigation.setId("nav"); rootConfig.setNavigation(navigation); return rootConfig; } public String getDatePattern() { return datePattern; } public void setDatePattern(String datePattern) { this.datePattern = datePattern; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy