| /******************************************************************************* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.ofbiz.entity.model; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| |
| import org.apache.ofbiz.base.util.UtilValidate; |
| import org.apache.ofbiz.base.util.UtilXml; |
| import org.apache.ofbiz.entity.Delegator; |
| import org.apache.ofbiz.entity.model.ModelViewEntity.ComplexAliasMember; |
| import org.apache.ofbiz.entity.model.ModelViewEntity.ModelAlias; |
| import org.apache.ofbiz.entity.model.ModelViewEntity.ModelAliasAll; |
| import org.apache.ofbiz.entity.model.ModelViewEntity.ModelMemberEntity; |
| import org.apache.ofbiz.entity.model.ModelViewEntity.ModelViewLink; |
| /** |
| * This class is used for declaring Dynamic View Entities, to be used and thrown away. |
| * A special method exists on the Delegator to accept a DynamicViewEntity instead |
| * of an entity-name. |
| * |
| */ |
| public class DynamicViewEntity { |
| public static final String module = DynamicViewEntity.class.getName(); |
| |
| /** The entity-name of the Entity */ |
| protected String entityName = "DynamicViewEntity"; |
| |
| /** The package-name of the Entity */ |
| protected String packageName = "org.apache.ofbiz.dynamicview"; |
| |
| /** The default-resource-name of the Entity, used with the getResource call to check for a value in a resource bundle */ |
| protected String defaultResourceName = ""; |
| |
| /** The title for documentation purposes */ |
| protected String title = ""; |
| |
| /** Contains member-entity alias name definitions: key is alias, value is ModelMemberEntity */ |
| protected Map<String, ModelMemberEntity> memberModelMemberEntities = new HashMap<String, ModelMemberEntity>(); |
| |
| /** List of alias-alls which act as a shortcut for easily pulling over member entity fields */ |
| protected List<ModelAliasAll> aliasAlls = new ArrayList<ModelAliasAll>(); |
| |
| /** List of aliases with information in addition to what is in the standard field list */ |
| protected List<ModelAlias> aliases = new ArrayList<ModelAlias>(); |
| |
| /** List of fields to group by */ |
| protected List<String> groupBy; |
| |
| /** List of view links to define how entities are connected (or "joined") */ |
| protected List<ModelViewLink> viewLinks = new ArrayList<ModelViewLink>(); |
| |
| /** relations defining relationships between this entity and other entities */ |
| protected List<ModelRelation> relations = new ArrayList<ModelRelation>(); |
| |
| public DynamicViewEntity() { |
| } |
| |
| public ModelViewEntity makeModelViewEntity(Delegator delegator) { |
| ModelViewEntity modelViewEntity = new ModelViewEntity(this, delegator.getModelReader()); |
| return modelViewEntity; |
| } |
| |
| public String getViewXml(String entityName) throws IOException { |
| Document doc = UtilXml.makeEmptyXmlDocument(); |
| Element viewElement = getViewElement(doc, entityName); |
| return UtilXml.writeXmlDocument(viewElement); |
| } |
| |
| public Element getViewElement(Document doc, String entityName) { |
| Element viewElement = doc.createElement("view-entity"); |
| viewElement.setAttribute("entity-name", entityName); |
| |
| for (ModelMemberEntity member: memberModelMemberEntities.values()) { |
| Element memberElement = doc.createElement("member-entity"); |
| memberElement.setAttribute("entity-alias", member.getEntityAlias()); |
| memberElement.setAttribute("entity-name", member.getEntityName()); |
| viewElement.appendChild(memberElement); |
| } |
| for (ModelAliasAll aliasAll: aliasAlls) { |
| Element aliasAllElement = doc.createElement("alias-all"); |
| aliasAllElement.setAttribute("entity-alias", aliasAll.getEntityAlias()); |
| if (UtilValidate.isNotEmpty(aliasAll.getPrefix())) aliasAllElement.setAttribute("prefix", aliasAll.getPrefix()); |
| if (aliasAll.getGroupBy()) aliasAllElement.setAttribute("group-by", "true"); |
| if (UtilValidate.isNotEmpty(aliasAll.getFunction())) aliasAllElement.setAttribute("function", aliasAll.getFunction()); |
| for (String excludeField: aliasAll) { |
| Element excludeElement = doc.createElement("exclude"); |
| excludeElement.setAttribute("field", excludeField); |
| aliasAllElement.appendChild(excludeElement); |
| } |
| viewElement.appendChild(aliasAllElement); |
| } |
| for (ModelAlias alias: aliases) { |
| Element aliasElement = doc.createElement("alias"); |
| aliasElement.setAttribute("entity-alias", alias.getEntityAlias()); |
| aliasElement.setAttribute("name", alias.getName()); |
| if (!alias.getName().equals(alias.getField())) aliasElement.setAttribute("field", alias.getField()); |
| String colAlias = ModelUtil.dbNameToVarName(alias.getColAlias()); |
| if (!alias.getName().equals(colAlias)) aliasElement.setAttribute("col-alias", colAlias); |
| if (alias.getIsPk() != null) aliasElement.setAttribute("prim-key", alias.getIsPk().toString()); |
| if (alias.getGroupBy()) aliasElement.setAttribute("group-by", "true"); |
| if (UtilValidate.isNotEmpty(alias.getFunction())) aliasElement.setAttribute("function", alias.getFunction()); |
| // TODO: description, complex-alias |
| viewElement.appendChild(aliasElement); |
| } |
| for (ModelViewLink viewLink: viewLinks) { |
| Element viewLinkElement = doc.createElement("view-link"); |
| viewLinkElement.setAttribute("entity-alias", viewLink.getEntityAlias()); |
| if (viewLink.isRelOptional()) viewLinkElement.setAttribute("rel-optional", "true"); |
| viewLinkElement.setAttribute("rel-entity-alias", viewLink.getRelEntityAlias()); |
| for (ModelKeyMap keyMap: viewLink) { |
| Element keyMapElement = doc.createElement("key-map"); |
| keyMapElement.setAttribute("field-name", keyMap.getFieldName()); |
| if (!keyMap.getFieldName().equals(keyMap.getRelFieldName())) keyMapElement.setAttribute("rel-field-name", keyMap.getRelFieldName()); |
| viewLinkElement.appendChild(keyMapElement); |
| } |
| // TODO: conditions |
| viewElement.appendChild(viewLinkElement); |
| } |
| for (ModelRelation relation: relations) { |
| viewElement.appendChild(relation.toXmlElement(doc)); |
| } |
| return viewElement; |
| } |
| |
| public String getOneRealEntityName() { |
| // return first entity name for memberModelMemberEntities Map |
| if (this.memberModelMemberEntities.size() == 0) { |
| return null; |
| } |
| |
| ModelMemberEntity modelMemberEntity = this.memberModelMemberEntities.entrySet().iterator().next().getValue(); |
| return modelMemberEntity.getEntityName(); |
| } |
| |
| /** Getter for property entityName. |
| * @return Value of property entityName. |
| * |
| */ |
| public String getEntityName() { |
| return entityName; |
| } |
| |
| /** Setter for property entityName. |
| * @param entityName New value of property entityName. |
| * |
| */ |
| public void setEntityName(String entityName) { |
| this.entityName = entityName; |
| } |
| |
| /** Getter for property packageName. |
| * @return Value of property packageName. |
| * |
| */ |
| public String getPackageName() { |
| return packageName; |
| } |
| |
| /** Setter for property packageName. |
| * @param packageName New value of property packageName. |
| * |
| */ |
| public void setPackageName(String packageName) { |
| this.packageName = packageName; |
| } |
| |
| /** Getter for property defaultResourceName. |
| * @return Value of property defaultResourceName. |
| * |
| */ |
| public String getDefaultResourceName() { |
| return defaultResourceName; |
| } |
| |
| /** Setter for property defaultResourceName. |
| * @param defaultResourceName New value of property defaultResourceName. |
| * |
| */ |
| public void setDefaultResourceName(String defaultResourceName) { |
| this.defaultResourceName = defaultResourceName; |
| } |
| |
| /** Getter for property title. |
| * @return Value of property title. |
| * |
| */ |
| public String getTitle() { |
| return title; |
| } |
| |
| /** Setter for property title. |
| * @param title New value of property title. |
| * |
| */ |
| public void setTitle(String title) { |
| this.title = title; |
| } |
| |
| public void addMemberEntity(String entityAlias, String entityName) { |
| ModelMemberEntity modelMemberEntity = new ModelMemberEntity(entityAlias, entityName); |
| this.memberModelMemberEntities.put(entityAlias, modelMemberEntity); |
| } |
| |
| public Iterator<Map.Entry<String, ModelMemberEntity>> getModelMemberEntitiesEntryIter() { |
| return this.memberModelMemberEntities.entrySet().iterator(); |
| } |
| |
| /** |
| * @deprecated use {@link #addAliasAll(String, String, Collection)} |
| */ |
| @Deprecated |
| public void addAliasAll(String entityAlias, String prefix) { |
| addAliasAll(entityAlias, prefix, null); |
| } |
| |
| public void addAliasAll(String entityAlias, String prefix, Collection<String> excludes) { |
| ModelAliasAll aliasAll = new ModelAliasAll(entityAlias, prefix, false, null, null, excludes); |
| this.aliasAlls.add(aliasAll); |
| } |
| |
| public void addAllAliasAllsToList(List<ModelAliasAll> addList) { |
| addList.addAll(this.aliasAlls); |
| } |
| |
| public void addAlias(String entityAlias, String name) { |
| this.addAlias(entityAlias, name, null, null, null, null, null); |
| } |
| |
| /** Add an alias, full detail. All parameters can be null except entityAlias and name. */ |
| public void addAlias(String entityAlias, String name, String field, String colAlias, Boolean primKey, Boolean groupBy, String function) { |
| addAlias(entityAlias, name, field, colAlias, primKey, groupBy, function, null, null); |
| } |
| |
| public void addAlias(String entityAlias, String name, String field, String colAlias, Boolean primKey, Boolean groupBy, String function, ComplexAliasMember complexAliasMember) { |
| addAlias(entityAlias, name, field, colAlias, primKey, groupBy, function, null, complexAliasMember); |
| } |
| |
| public void addAlias(String entityAlias, String name, String field, String colAlias, Boolean primKey, Boolean groupBy, String function, String fieldSet, ComplexAliasMember complexAliasMember) { |
| if (entityAlias == null && complexAliasMember == null) { |
| throw new IllegalArgumentException("entityAlias cannot be null if this is not a complex alias in call to DynamicViewEntity.addAlias"); |
| } |
| if (name == null) { |
| throw new IllegalArgumentException("name cannot be null in call to DynamicViewEntity.addAlias"); |
| } |
| |
| ModelAlias alias = new ModelAlias(entityAlias, name, field, colAlias, primKey, groupBy, function, fieldSet); |
| if (complexAliasMember != null) { |
| alias.setComplexAliasMember(complexAliasMember); |
| } |
| this.aliases.add(alias); |
| } |
| |
| public void addAllAliasesToList(List<ModelAlias> addList) { |
| addList.addAll(this.aliases); |
| } |
| |
| public void addViewLink(String entityAlias, String relEntityAlias, Boolean relOptional, List<ModelKeyMap> modelKeyMaps) { |
| ModelViewLink modelViewLink = new ModelViewLink(entityAlias, relEntityAlias, relOptional, null, modelKeyMaps); |
| this.viewLinks.add(modelViewLink); |
| } |
| |
| public void addAllViewLinksToList(List<ModelViewLink> addList) { |
| addList.addAll(this.viewLinks); |
| } |
| |
| public void addRelation(String type, String title, String relEntityName, List<ModelKeyMap> modelKeyMaps) { |
| ModelRelation relation = ModelRelation.create(null, null, type, title, relEntityName, null, modelKeyMaps, false); |
| this.relations.add(relation); |
| } |
| |
| public void addAllRelationsToList(List<ModelRelation> addList) { |
| addList.addAll(this.relations); |
| } |
| |
| public void setGroupBy(List<String> groupBy) { |
| this.groupBy = groupBy; |
| } |
| |
| public void addAllGroupByFieldsToList(List<String> addList) { |
| if (groupBy != null) { |
| addList.addAll(this.groupBy); |
| } |
| } |
| } |