blob: be8e144591977957847d3dcc233d2b7157d7c6d9 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}