001    package nl.cwi.sen1.visplugin.csvexport;
002    
003    import nl.cwi.sen1.relationstores.types.RType;
004    import nl.cwi.sen1.relationstores.types.RTypeColumnTypes;
005    import nl.cwi.sen1.relationstores.types.rtype.Bag;
006    import nl.cwi.sen1.relationstores.types.rtype.Relation;
007    import nl.cwi.sen1.relationstores.types.rtype.Set;
008    import nl.cwi.sen1.visplugin.VisualizationPluginController;
009    import nl.cwi.sen1.visplugin.VisualizationPluginWindow;
010    import aterm.ATerm;
011    
012    /**
013     * The CsvExportController class 
014     * @author  Chris Woolderink
015     * @author  Antoine Savelkoul
016     * @date    13-03-2007
017     */
018    public class CsvExportController extends VisualizationPluginController {
019            
020    
021        /**************** 
022         CONSTRUCTORS
023        ****************/ 
024        
025            public CsvExportController() {
026                    super();
027            }
028    
029        
030        /**************** 
031         VISUALIZATION PLUGIN CONTROLLER IMPLEMENTATION
032        ****************/
033        
034            /**
035             * Return Table visualization window
036             * @author  Chris Woolderink
037             * @author  Antoine Savelkoul
038             * @date    13-03-2007
039             */
040            public VisualizationPluginWindow createWindow() {
041                    CsvExportVisualizationWindow window = new CsvExportVisualizationWindow();
042            
043                    return window;
044            }
045            
046            
047            
048            /**
049             * Gets the plugin name [Table Visualization Plugin]
050             * @author  Chris Woolderink
051             * @author  Antoine Savelkoul
052             * @date    13-03-2007
053             */
054            public String getPluginName(){
055                    return "CSV export";
056            }
057            
058            
059        /**************** 
060         TOOLBUS EVENT HANDLERS 
061        ****************/
062        
063            /**
064             * Define the supported types. Not implemented
065         * because we override the isTypeSupported() 
066         * function.
067         * @author  Anton Lycklama  
068         * @author  Bas Basten
069             * @date    13-03-2007
070             */
071            public ATerm[] getSupportedTypes() {
072            ATerm[] atermList = new ATerm[0];
073                    return atermList;
074            }
075        
076        /**
077         * Check if a type is supported
078         * @param   type The type to check
079         * @author  Anton Lycklama  
080         * @author  Bas Basten
081             * @date    13-03-2007
082         */
083        protected boolean isTypeSupported(ATerm type) {        
084            RType rtype = m_factory.RTypeFromTerm(type);        
085            
086            boolean isBag = rtype.isBag();
087            boolean isRelation = rtype.isRelation();
088            boolean isSet = rtype.isSet();
089                    
090            if (isRelation) {            
091                Relation relation = (Relation) rtype;
092                RTypeColumnTypes columnTypes = relation.getColumnTypes();
093                
094                int numColumns = columnTypes.getLength();
095                if (numColumns > 0) {
096                    for (int i = 0; i < numColumns; i++) {
097                        RType childType = columnTypes.getRTypeAt(i);
098                        // We don't support complex types.
099                        if (isComplexType(childType)) {
100                            return false;
101                        }
102                    }
103                    return true;
104                }            
105            }
106            // Maybe we can refactor this when we have more time.
107            // The set and the bag use the same code to determine
108            // if the type is supported or not.
109            else if (isSet) {
110                Set set = (Set) rtype;
111                RType elementType = set.getElementType();
112                // If the type is complex we don't support it,
113                // otherwise we do support it.
114                return !isComplexType(elementType); 
115            }
116            else if (isBag) {
117                Bag bag = (Bag) rtype;           
118                RType elementType = bag.getElementType();
119                // If the type is complex we don't support it,
120                // otherwise we do support it.
121                return !isComplexType(elementType);            
122            }        
123                   
124            return false;
125        }
126    
127        /**
128         * 
129         * @param   rtype  The RType to be evaluated
130         * @return  true if the given RType represents a complex type (not int/string)
131         * @author  Anton Lycklama  
132         * @author  Bas Basten
133             * @date    13-03-2007
134         */
135        private boolean isComplexType(RType rtype) {
136            boolean isBag = rtype.isBag();
137            boolean isRelation = rtype.isRelation();
138            boolean isSet = rtype.isSet();
139            boolean isTuple = rtype.isTuple();
140            
141            if (isBag || isRelation || isSet || isTuple) {
142                return true;
143            }
144    
145            return false;
146        }
147    }