Changeset 868


Ignore:
Timestamp:
May 3, 2010, 7:12:46 PM (14 years ago)
Author:
tobias
Message:

configurationView moved to new DataTree class.
implemented selectOneMenu on DataTree

Location:
vanHelsing/trunk/gui
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • vanHelsing/trunk/gui/WebContent/menu.jspx

    r867 r868  
    2121        <ice:panelTabSet>
    2222                <ice:panelTab  label="Configuration">
    23                             <ice:panelGroup style="float:top">
    24                                 <ice:commandButton id="newClient"
    25                                         value="create client"
    26                                         actionListener="#{configurationBean.newClientButtonListener}" />
    27                                        
    28                                 <ice:commandButton id="newRes"
    29                                     value="create resource"
    30                                     actionListener="#{configurationBean.newResourceButtonListener}">
    31                                     </ice:commandButton>
    32                                    
    33                                         <ice:commandButton id="reloadRes"
    34                                                 value="reload Tree"
    35                                                 actionListener="#{configurationBean.reloadResourceButtonListener}" />
    36                                        
    37                                         <ice:commandButton id="saveRes"
    38                                         value="update resource"
    39                                         actionListener="#{configurationBean.saveButtonListener}"/>
    40                                        
    41                                         <ice:commandButton id="deleteRes"
    42                                                 value="delete resource"
    43                                                 actionListener="#{configurationBean.deleteResourceButtonListener}" />
    44                                 </ice:panelGroup>
    4523               
    46                         <ice:panelDivider style="height:600px;width:85%" dividerPosition="30">
     24                        <ice:panelDivider style="height:600px;width:95%" dividerPosition="30">
    4725                        <f:facet name="first">
    4826                        <ice:tree id="baum"     
    49                                         value="#{configurationBean.tree}"
     27                                        value="#{configurationBean.dataTree.tree}"
    5028                                        var="item"
    5129                                        hideRootNode = "false"
     
    6139                                        </f:facet>
    6240                                        <f:facet name="content">
    63                                         <ice:panelGroup  styleClass="selectedNode#{item.userObject.userObject.resId eq configurationBean.selectedId} selectedComponent#{item.userObject.selected}"
    64                                                         style="display:inline" >
     41                                        <!--<ice:panelGroup  styleClass="selectedNode#{item.userObject.userObject.resId eq configurationBean.selectedId} selectedComponent#{item.userObject.selected}"
     42                                                        style="display:inline" > -->
    6543
    66                                                 <ice:commandLink actionListener="#{configurationBean.userObjectItemNodeSelected}">
     44                                                <ice:commandLink actionListener="#{configurationBean.renderResource}">
    6745                                                <f:param name="userObject.resId" value="#{item.userObject.userObject.resId}"/>
    68                                                 <f:param name="userObject.resName" value="#{item.userObject.userObject.value}" />
    69                                                 <ice:outputText id="knoten" value="#{item.userObject.userObject.value}"/>
     46                                                <f:param name="userObject.resName" value="#{item.userObject.userObject.resName}" />
     47                                                <ice:outputText id="knoten" value="#{item.userObject.userObject.resName}"/>
    7048                                                </ice:commandLink>
    71                                         </ice:panelGroup>
     49                                        <!--</ice:panelGroup> -->
    7250                                        </f:facet>
    7351                                </ice:treeNode>
     
    7654                        <f:facet name="second">
    7755                        <ice:panelGrid cellpadding="0" cellspacing="3"
    78                                 columns="2" rendered="#{configurationBean.selectedObject != null}">
     56                                columns="2" rendered="#{configurationBean.selectedObject.viewItemList != null}">
    7957                                <ice:dataTable
    8058                                        var="item"
    81                                          value="#{configurationBean.selectedObject}"
     59                                         value="#{configurationBean.selectedObject.viewItemList}"
    8260                                         style="float:left,bottom; width:90%"
    8361                                         >
     
    8664                                                         <ice:outputText value="Key" />
    8765                                                 </f:facet>
    88                                                 <ice:outputText style="color:red" rendered="#{item.required eq true}" value="#{item.key}" />
    89                                                 <ice:outputText style="color:green" rendered="#{item.required eq false}" value="#{item.key}" />
     66                                                <ice:outputText rendered="#{item.required eq true}" value="#{item.key}" />
     67                                                <ice:outputText style="color:grey" rendered="#{item.required eq false}" value="#{item.key}" />
    9068                                        </ice:column>
    9169                                        <ice:column>
     
    11795                        </f:facet>
    11896                        </ice:panelDivider>
     97                            <ice:panelGroup style="float:top">
     98                                <ice:commandButton id="newClient"
     99                                        value="create client"
     100                                        actionListener="#{configurationBean.newClientButtonListener}" />
     101                                       
     102                                <ice:commandButton id="newRes"
     103                                    value="create resource"
     104                                    actionListener="#{configurationBean.newResourceButtonListener}">
     105                                    </ice:commandButton>
     106                                   
     107                                        <ice:commandButton id="reloadRes"
     108                                                value="reload Tree"
     109                                                actionListener="#{configurationBean.reloadResourceButtonListener}" />
     110                                       
     111                                        <ice:commandButton id="saveRes"
     112                                        value="update resource"
     113                                        actionListener="#{configurationBean.saveButtonListener}"/>
     114                                       
     115                                        <ice:commandButton id="deleteRes"
     116                                                value="delete resource"
     117                                                actionListener="#{configurationBean.deleteResourceButtonListener}" />
     118                                </ice:panelGroup>
     119                       
    119120                </ice:panelTab>
    120121         
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/BeanUtil.java

    r867 r868  
    5858        public static boolean getRequired(String type, String key) {
    5959                String s = getFieldProperty(type, key, 2);
     60                if (s == null) return false;
    6061                if (s.equals("true"))
    6162                        return true;
     
    104105                key = key.replaceAll(" ", "");
    105106                String result[] = getProperties((daemon + "." + type + "." + key));
     107                if (result[0] == null) return null;
    106108                if (i == 0) {
    107109                        if (result[1].equals("boolean")) {
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/Client.java

    r867 r868  
    8888                        System.err.println("getSR: " + grt.getResId() + " : " + e.toString());
    8989                }
    90                 return new SimpleResource(new ResourceInfo(), new ResourceAttributeType[0]);
     90                return null;
    9191        }
    9292        /**
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/ConfigurationBean.java

    r867 r868  
    44import java.util.ArrayList;
    55
     6import javax.faces.context.FacesContext;
    67import javax.faces.event.ActionEvent;
    78import javax.faces.event.ValueChangeEvent;
     
    1718 * List all Bacula configuration components by name.
    1819 */
    19 public class ConfigurationBean extends TreeNavigation {
    20 
    21         private DefaultTreeModel tree;
    22         private ArrayList<ViewItem> selectedObject;
     20public class ConfigurationBean implements ViewBean{
     21       
     22       
     23        private DataTree dataTree;
     24        private ConcreteUserObjectItem selectedObject;
     25        private boolean createResource;
    2326        private String selectedId;
    24         private String selectedName;
    25         private boolean createResource = false;
    2627
    2728        public ConfigurationBean() {
     
    3435         */
    3536        private void init(){
    36                 DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    37                 DefaultMutableTreeNode header;
    38                 DefaultMutableTreeNode leaf;
    39                 String type;
    40                 ListResourcesType lrt;
    41                 GetResourceType grt;
    42                 DefaultMutableTreeNode myNode;
    43                 ResourceInfo[] ri;
     37                DefaultMutableTreeNode parent;
     38                ResourceInfo resItems[];
    4439                SimpleResource sr;
    45 
    4640                Client c = new Client();
    47                 setTree(super.createTree(root, BeanUtil.getProperty("nodes").split(","), "Configuration"));
    48 
    49                
    50                 for (int i = 0; i < tree.getChildCount(root); i++) {
    51                         header = (DefaultMutableTreeNode) tree.getChild(root, i);
    52                         type = ((UserObjectItemType) header.getUserObject())
    53                                         .getUserObject().getResType();
    54                         lrt = new ListResourcesType();
    55                         lrt.setDirector("bacula-dir");
    56                         lrt.setResourceType(type);
    57                         ri = c.getListResources(lrt);
    58                         if (ri == null || ri.length == 0)
    59                                 continue;
    60                         for (int j = 0; j < ri.length; j++) {
    61                                 myNode = addNode(header, type, ri[j]);
    62                                 grt = new GetResourceType();
    63                                 grt.setDirector(lrt.getDirector());
    64                                 grt.setResId(ri[j].getResId());
    65                                 sr = c.getSimpleResource(grt);
    66                                 myNode = addNode(myNode, type, sr.getResourceAttributeType());
    67                                 if (myNode != null) {
    68                                         header.add(myNode);
     41                UserObjectItemFactory UOFactory = new UserObjectItemFactory();
     42                setDataTree(new DataTree());
     43                dataTree.setTree("Configuration");
     44                for (String name : BeanUtil.getProperty("nodes").split(",")){
     45                        parent = dataTree.createNode(dataTree.getRoot(),
     46                                        UOFactory.createUserObjectItem(
     47                                                        c.makeResourceInfo(BeanUtil.getProperty("defaultdirector"), -1, name, name)
     48                                        )
     49                        );
     50                        resItems = c.getListResources(BeanUtil.getProperty("defaultdirector"), name);
     51                        if (resItems != null){
     52                                for (ResourceInfo rinfo : resItems){
     53                                        sr = c.getSimpleResource(rinfo.getDirector(), rinfo.getResId());
     54                                        if (sr != null){
     55                                                //TODO: discard the SimpleResource ResInfo return value and work with the query object
     56                                                dataTree.createNode(parent,
     57                                                                UOFactory.createUserObjectItem(
     58                                                                                sr.getResourceAttributeType(), rinfo));
     59                                        }
    6960                                }
    7061                        }
    71                 }
    72         }
    73 
     62                }
     63                dataTree.createKeyValueLists();
     64                dataTree.updateUserObjects();
     65        }
     66       
    7467        /**
    7568         * transfers the selected (by attribute resId) dataobject (resource) into an ArrayList of ViewItems.<br/>
     
    7972         * @param ae    ActionEvent which contains relevant information about the component tree. the variable is not used.
    8073         */
    81         public void userObjectItemNodeSelected(ActionEvent ae) {
     74        public void renderResource(ActionEvent ae){
     75                DefaultMutableTreeNode node;
     76                String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userObject.resId");
     77                int numId = new Integer(id);
     78                String name = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userObject.resName");
     79                if (numId > 0){
     80                        node = dataTree.getNodeById(numId);
     81                        selectedObject = (ConcreteUserObjectItem)((UserObjectItemType)(node.getUserObject())).getUserObject();
     82                } else {
     83                        node = dataTree.getNodeByName(name);
     84                        selectedObject = (ConcreteUserObjectItem)((UserObjectItemType)(node.getUserObject())).getUserObject();
     85                }
     86        }
     87        /*public void userObjectItemNodeSelected(ActionEvent ae) {
    8288                DefaultMutableTreeNode node;
    8389                UserObjectItem userObject;
    84                 selectedObject = new ArrayList<ViewItem>();
     90                selectedObject.setViewItemList(viewItemList) = new ArrayList<ViewItem>();
    8591                String Id = BeanUtil.getRequestParameter("userObject.resId");
    8692                String name = BeanUtil.getRequestParameter("userObject.resName");
     
    147153                        e.printStackTrace();
    148154                }
    149         }
     155        }*/
    150156        /**
    151157         * return an array of nodes of a given resource type
     
    156162         * @return null         null object there are no nodes of the requested type
    157163         */
    158         private DefaultMutableTreeNode[] getChildNodes(DefaultTreeModel tree2, String key) {
     164        /*private DefaultMutableTreeNode[] getChildNodes(DefaultTreeModel tree2, String key) {
    159165                DefaultMutableTreeNode[] dmtn;
    160166                DefaultMutableTreeNode root = (DefaultMutableTreeNode)tree2.getRoot();
     
    171177                }
    172178                return null;
    173         }
     179        }*/
    174180       
    175181        /**
     
    177183         * @param ae
    178184         */
    179         public void newClientButtonListener(ActionEvent ae){
     185        /*public void newClientButtonListener(ActionEvent ae){
    180186                String type = "client";
    181187                ArrayList newResource = new ArrayList<ViewItem>();
     
    211217               
    212218               
    213         }
    214        
    215         public void newResourceButtonListener(ActionEvent ae){
     219        }*/
     220       
     221        /*public void newResourceButtonListener(ActionEvent ae){
    216222                DefaultMutableTreeNode node;
    217223                UserObjectItem userObject;
     
    267273                }
    268274               
    269         }
     275        }*/
    270276        /**
    271277         * **EXPERIMENTAL** returns type of the selected resource.
     
    274280         * @return viewName     name of the resource type of the selected data tree node       
    275281         */
    276         public String newResourceListener(ActionEvent ae){
     282        /*public String newResourceListener(ActionEvent ae){
    277283                if (selectedObject != null && selectedObject.size() > 0){
    278284                        String resType = selectedObject.get(0).getResType();
     
    281287                }
    282288                return "";
    283         }
     289        }*/
    284290       
    285291        public void userObjectItemOptionSelected(ValueChangeEvent vce){
     
    296302                BeanUtil.setInfoMessage(null, "Diese Methode ist noch nicht implementiert.");
    297303        }
    298         public void saveClientButtonListener(ActionEvent ae){
     304        /*public void saveClientButtonListener(ActionEvent ae){
    299305                Client c = new Client();
    300306                String name = "";
     
    315321                                );
    316322                System.err.println(newResId);
    317         }
     323        }*/
    318324        /**
    319325         * **EXPERIMENTAL** writes the selected resource to the data tree of the web service.
     
    321327         * @param ae    ActionEvent contains relevant information
    322328         */
    323         public void saveButtonListener(ActionEvent ae) {
     329        /*public void saveButtonListener(ActionEvent ae) {
    324330                if (selectedObject == null){
    325331                        BeanUtil.setInfoMessage(null, "bitte eine Resource zum Ändern auswählen");
     
    353359                        if (selectedObject.get(0) != null){
    354360                                selectedObject.get(0).setResId(s2r2.getResId());
    355                         }*/
     361                        }
    356362                        // TODO: write ResId to selectedObject
    357363                        // selectedObject.get(0).setResId(grt.getResId());
    358364                        // valueChangeEffect.setFired(false);
    359365                }
    360         }
     366        }*/
    361367        /**
    362368         * Setter method for the tree attribute
    363369         * @param tree  tree contains the DefaultTreeModel for the data tree
    364370         */
    365         public void setTree(DefaultTreeModel tree) {
    366                 this.tree = tree;
     371        public void setDataTree(DataTree dataTree) {
     372                this.dataTree = dataTree;
    367373        }
    368374        /**
     
    370376         * @return tree         tree contains the DefaultTreeModel for the data tree
    371377         */
    372         public DefaultTreeModel getTree() {
    373                 return tree;
     378        public DataTree getDataTree() {
     379                return dataTree;
     380        }
     381
     382        public void createNodeButtonListener(ActionEvent ae) {
     383                // TODO Auto-generated method stub
     384               
     385        }
     386
     387        public void deleteNodeButtonListener(ActionEvent ae) {
     388                // TODO Auto-generated method stub
     389               
     390        }
     391
     392
     393        public void readNodeButtonListener(ActionEvent ae) {
     394                // TODO Auto-generated method stub
     395               
     396        }
     397
     398        public void selectNode(ActionEvent ae) {
     399                // TODO Auto-generated method stub
     400               
     401        }
     402
     403        public void updateNodeButtonListener(ActionEvent ae) {
     404                // TODO Auto-generated method stub
     405               
    374406        }
    375407       
     
    378410         * @return selectedObject       selectedObject contains the data object of the selected leaf node.
    379411         */
    380         public ArrayList<ViewItem> getSelectedObject() {
     412        public ConcreteUserObjectItem getSelectedObject() {
    381413                return selectedObject;
    382414        }
     
    386418         * @param selectedObject        selectedObject contains the data object of the selected leaf node
    387419         */
    388         public void setSelectedObject(ArrayList<ViewItem> selectedObject) {
     420        public void setSelectedObject(ConcreteUserObjectItem selectedObject) {
    389421                this.selectedObject = selectedObject;
    390422        }
     
    396428        public int getSelectedId(){
    397429                if (selectedObject != null){
    398                         if (selectedObject.size() > 0){
    399                                 return selectedObject.get(0).getResId();
    400                         }
    401                 }
     430                                return selectedObject.getResId();
     431                        }
    402432                return -1;
    403433        }
    404         public String getSelectedName(){
     434        /*public String getSelectedName(){
    405435                if (selectedObject != null){
    406436                        if (selectedObject.size() > 0){
     
    409439                }
    410440                return "";
    411         }
     441        }*/
    412442        public void setCreateResource(boolean b){
    413443                this.createResource = b;
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/DataTree.java

    r867 r868  
    11package de.dass_it.vanhelsing.gui;
    22
     3import java.util.ArrayList;
    34import java.util.Enumeration;
     5import java.util.HashMap;
     6
     7import javax.faces.model.SelectItem;
    48import javax.swing.tree.DefaultMutableTreeNode;
    59import javax.swing.tree.DefaultTreeModel;
     
    1519        private DefaultTreeModel tree;
    1620        private DefaultMutableTreeNode root;
     21        private HashMap<String, SelectItem[]> keyValueList;
    1722       
    1823        public DataTree() {}
     
    3136                obj.setResName(name);
    3237        }
     38
    3339        /**
    3440         * creates a tree node as a child to the parent node containing the given UserObectItem
     
    4652                return node;
    4753        }
     54
    4855        /**
    4956         * replace a tree nodes UserObject
     
    5461                ((UserObjectItemType)node.getUserObject()).setUserObject(userObject);
    5562        }
     63
    5664        /**
    5765         * retrieves a node by the value of the UserObjects resId
     
    7381                return null;
    7482        }
     83
    7584        /**
    7685         * retrieves a node by the value of the UserObjects resName
     
    91100                return null;
    92101        }
     102       
    93103        /**
    94104         * deletes the given node from the data tree
     
    104114        }
    105115       
     116        public void createKeyValueLists(){
     117                DefaultMutableTreeNode parent;
     118                DefaultMutableTreeNode node;
     119                ConcreteUserObjectItem userObject;
     120                SelectItem[] selItems;
     121                String key;
     122                parent = (DefaultMutableTreeNode)tree.getRoot();
     123                for (int i = 0; i < parent.getChildCount(); i++){
     124                        node = (DefaultMutableTreeNode)parent.getChildAt(i);
     125                        selItems = new SelectItem[node.getChildCount()];
     126                        for (int j = 0; j < node.getChildCount(); j++){
     127                                userObject = (ConcreteUserObjectItem)((DefaultMutableTreeNode)node.getChildAt(j)).getUserObject();
     128                                selItems[j] = new SelectItem(userObject.getResName(), userObject.getResName());
     129                        }
     130                        key = ((ConcreteUserObjectItem)((DefaultMutableTreeNode)node.getChildAt(i)).getUserObject()).getResType();
     131                        keyValueList.put(key, selItems);
     132                }
     133        }
     134        public SelectItem[] getSelectItem(String type){
     135                return keyValueList.get(type);
     136        }
    106137        public DefaultMutableTreeNode getRoot(){
    107138                return root;
     
    116147                this.tree = tree;
    117148        }
     149        public void updateUserObjects(){
     150                DefaultMutableTreeNode parent;
     151                DefaultMutableTreeNode node;
     152                parent = (DefaultMutableTreeNode)tree.getRoot();
     153                ArrayList<ViewItem> viList;
     154                for(int i = 0; i < parent.getChildCount(); i++){
     155                        node = (DefaultMutableTreeNode)parent.getChildAt(i);
     156                        for (int j = 0; j < node.getChildCount(); j++){
     157                                viList = ((ConcreteUserObjectItem)((UserObjectItemType)node.getUserObject()).getUserObject()).getViewItemList();
     158                                for (ViewItem vi : viList){
     159                                        if (vi.getRenderer().equals("selectOneMenu")){
     160                                                vi.setKeyValueList(keyValueList.get(vi.getResType()));
     161                                        }
     162                                }
     163                        }
     164                }
     165        }
     166
     167       
    118168}
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/JobScheduleBean.java

    r867 r868  
    1212 * with a given schedule.
    1313 */
    14 public class JobScheduleBean {
     14public class JobScheduleBean implements ViewBean {
    1515        private DataTree dataTree;
    1616        private ConcreteUserObjectItem selectedObject;
     
    5252         * @param ae    ActionEvent parameter as required by JSF. Not used by this method
    5353         */
    54         public void createNodeListener(ActionEvent ae){
     54        public void createNodeButtonListener(ActionEvent ae){
    5555                //Methode kann nur mit ausgewählten ParentNode ausgeführt werden
    5656                DefaultMutableTreeNode parent = dataTree.getNodeByName("horst");
     
    6262         * @param ae    ActionEvent parameter as required by JSF. Not used by this method
    6363         */
    64         public void updateNodeListener(ActionEvent ae){
     64        public void updateNodeButtonListener(ActionEvent ae){
    6565                BeanUtil.setInfoMessage(null, "Die Methode ist noch nicht implementiert");
    6666               
     
    7070         * @param ae
    7171         */
    72         public void deleteNodeListener(ActionEvent ae){
     72        public void deleteNodeButtonListener(ActionEvent ae){
    7373                DefaultMutableTreeNode node;
    7474                ae.getComponent().getAttributes();
     
    100100         * @param ae    ActionEvent parameter as required by JSF. Not used by this method
    101101         */
    102         public void reloadTreeListener(ActionEvent ae){
     102        public void readNodeButtonListener(ActionEvent ae){
    103103                init();
    104104        }
    105105        public void selectNode(ActionEvent ae){
    106106                //BeanUtil.setInfoMessage(null, "Die Methode ist noch nicht implementiert");
     107                String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userObject.resId");
     108                String name = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userObject.resName");
     109                BeanUtil.setInfoMessage(null, ("id: "+id+" name: "+name) );
     110               
    107111               
    108112        }
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/UserObjectItemFactory.java

    r865 r868  
    3636                ArrayList<ViewItem> viewItemList = new ArrayList<ViewItem>();
    3737                ViewItem vi;
     38                String s;
     39                boolean b;
    3840                for (ResourceAttributeType attr : ra){
    3941                        vi = new ViewItem();
    40                         vi.setDataType(BeanUtil.getDataType(obj.getResType(), attr.getKey()));
    41                         vi.setRendererFlag(BeanUtil.getRenderer(obj.getResType(), attr.getKey()));
    42                         vi.setRequired(BeanUtil.getRequired(obj.getResType(), attr.getKey()));
     42                       
     43                        s = BeanUtil.getDataType(BeanUtil.getAccessType(obj.getResType().toLowerCase()), attr.getKey());
     44                        if (s == null){
     45                                s = "String";
     46                        }
     47                        vi.setDataType(s);
     48                       
     49                        s = BeanUtil.getRenderer(BeanUtil.getAccessType(obj.getResType().toLowerCase()), attr.getKey());
     50                        if (s == null){
     51                                s = "inputType";
     52                        }
     53                        vi.setRendererFlag(s);
     54                       
     55                        b = false;
     56                        b = BeanUtil.getRequired(BeanUtil.getAccessType(obj.getResType().toLowerCase()), attr.getKey());
     57                        vi.setRequired(b);
     58                       
    4359                        vi.setKey(attr.getKey());
    4460                        vi.setKeyValue(attr.getValue());
  • vanHelsing/trunk/gui/src/de/dass_it/vanhelsing/gui/messages_en.properties

    r864 r868  
    11defaultdirector = bacula-dir
    2 nodes = Director,Storage,Autochanger,Client,FileSet,FDClient,Schedule,SDStorage,Console,Catalog,SDDevice,Job,JobDefs,Messages,Pool
     2nodes = Director,Storage,Client,FileSet,Schedule,Console,Catalog,Job,JobDefs,Messages,Pool
    33director.director.name.ref =  0
    44director.director.name.type = String
Note: See TracChangeset for help on using the changeset viewer.