PropertyDetailsTableModel.java
001 /*
002  *  PropertyDetailsTableModel.java
003  *
004  *  Niraj Aswani, 09/March/07
005  *
006  *  $Id: PropertyDetailsTableModel.html,v 1.0 2007/03/09 16:13:01 niraj Exp $
007  */
008 package gate.gui.ontology;
009 
010 import gate.creole.ontology.*;
011 
012 import java.util.*;
013 
014 import javax.swing.table.AbstractTableModel;
015 
016 /**
017  * A DataModel that is created when a node is selected in the ontology
018  * property tree. It contains information such as direct/all sub/super
019  * properties, equivalent properties, domain/range of each property and
020  * property values and so on. The information from this model is then
021  * shown in the right hand side panel of the ontology editor.
022  
023  @author niraj
024  
025  */
026 @SuppressWarnings("serial")
027 public class PropertyDetailsTableModel extends AbstractTableModel {
028   public PropertyDetailsTableModel() {
029     resourceInfo = new DetailsGroup("Resource Information", true, null);
030     directSuperProps = new DetailsGroup("Direct Super Properties", true, null);
031     allSuperProps = new DetailsGroup("All Super Properties", true, null);
032     directSubProps = new DetailsGroup("Direct Sub Properties", true, null);
033     allSubProps = new DetailsGroup("All Sub Properties", true, null);
034     equivalentProps = new DetailsGroup("Equivalent Properties", true, null);
035     domain = new DetailsGroup("Domain", true, null);
036     range = new DetailsGroup("Range", true, null);
037     propertyTypes = new DetailsGroup("Properties", true, null);
038     propertyValues = new DetailsGroup("PropertyValues", true, null);
039     detailGroups = new DetailsGroup[0];
040     itemComparator = new OntologyItemComparator();
041   }
042 
043   @Override
044   public int getColumnCount() {
045     return COLUMN_COUNT;
046   }
047 
048   @Override
049   public int getRowCount() {
050     int i = detailGroups.length;
051     for(int j = 0; j < detailGroups.length; j++)
052       if(detailGroups[j].isExpanded()) i += detailGroups[j].getSize();
053     return i;
054   }
055 
056   @Override
057   public String getColumnName(int i) {
058     switch(i) {
059       case 0// '\0'
060         return "";
061       case 1// '\001'
062         return "";
063       case 2:
064         return "";
065       case 3:
066         return "";
067     }
068     return "";
069   }
070 
071   @Override
072   public Class<?> getColumnClass(int i) {
073     switch(i) {
074       case 0:
075         return Boolean.class;
076       case 1:
077         return Object.class;
078       case 2:
079         return Object.class;
080       case 3:
081         return Object.class;
082     }
083     return Object.class;
084   }
085 
086   @Override
087   public boolean isCellEditable(int i, int j) {
088     return false;
089   }
090 
091   @Override
092   public void setValueAt(Object obj, int i, int j) {
093     Object obj1 = getItemForRow(i);
094     if(j == && (obj1 instanceof DetailsGroup)) {
095       DetailsGroup detailsgroup = (DetailsGroup)obj1;
096       detailsgroup.setExpanded(((Boolean)obj).booleanValue());
097     }
098     fireTableDataChanged();
099   }
100 
101   protected Object getItemForRow(int i) {
102     int j = 0;
103     for(int k = 0; j <= i; k++) {
104       if(j == ireturn detailGroups[k];
105       int l = (detailGroups[k].isExpanded() ? detailGroups[k].getSize() 0);
106       if(j + l > ireturn detailGroups[k].getValueAt(i - j - 1);
107       j += l;
108     }
109     return null;
110   }
111 
112   @Override
113   public Object getValueAt(int i, int j) {
114     Object obj = getItemForRow(i);
115     switch(j) {
116       case 0:
117         return (obj instanceof DetailsGroupnew Boolean(((DetailsGroup)obj)
118                 .isExpanded()) null;
119       case 1:
120         return obj;
121       case 2:
122         return obj;
123       case 3:
124         return obj;
125     }
126     return null;
127   }
128 
129   @SuppressWarnings("unchecked")
130   public void setItem(Object obj) {
131     detailGroups = (new DetailsGroup[] {resourceInfo, directSuperProps, allSuperProps,
132         directSubProps, allSubProps, equivalentProps, domain, range,
133         propertyTypes, propertyValues});
134     
135     RDFProperty property = (RDFProperty)obj;
136     resourceInfo.getValues().clear();
137     directSuperProps.getValues().clear();
138     allSuperProps.getValues().clear();
139     directSubProps.getValues().clear();
140     allSubProps.getValues().clear();
141     equivalentProps.getValues().clear();
142     domain.getValues().clear();
143     range.getValues().clear();
144     propertyTypes.getValues().clear();
145     propertyValues.getValues().clear();
146     
147     resourceInfo.getValues().clear();
148     resourceInfo.getValues().add(property);
149     resourceInfo.getValues().add(new KeyValuePair(property, "URI", property.getONodeID().toString()false));
150     
151     Set<RDFProperty> dprops = property.getPropertiesWithResourceAsDomain();
152     propertyTypes.getValues().addAll(dprops);
153     Collections.sort(propertyTypes.getValues(), itemComparator);
154     
155 //    for(RDFProperty prop : dprops) {
156 //      propertyTypes.getValues().addAll(Utils.getDetailsToAdd(prop));
157 //    }
158     
159     Set<AnnotationProperty> props = property.getSetAnnotationProperties();
160     if(props != null) {
161       Iterator<AnnotationProperty> apIter = props.iterator();
162       while(apIter.hasNext()) {
163         AnnotationProperty ap = apIter.next();
164         List<Literal> literals = property.getAnnotationPropertyValues(ap);
165         for(int i = 0; i < literals.size(); i++) {
166           PropertyValue pv = new PropertyValue(ap, literals.get(i));
167           propertyValues.getValues().add(pv);
168         }
169       }
170     }
171 
172     if(property instanceof AnnotationProperty) {
173       resourceInfo.getValues().add(new KeyValuePair(property, "TYPE""Annotation Property"false));
174     else if(property instanceof DatatypeProperty) {
175       resourceInfo.getValues().add(new KeyValuePair(property, "TYPE""Datatype Property"false));
176     else if(property instanceof SymmetricProperty) {
177       resourceInfo.getValues().add(new KeyValuePair(property, "TYPE""Symmetric Property"false));
178     else if(property instanceof TransitiveProperty) {
179       resourceInfo.getValues().add(new KeyValuePair(property, "TYPE""Transitive Property"false));      
180     else {
181       resourceInfo.getValues().add(new KeyValuePair(property, "TYPE""Object Property"false));      
182     }
183     
184     if(property instanceof AnnotationProperty) {
185       fireTableDataChanged();
186       return;
187     }
188     // else provide further details
189 
190     Set<RDFProperty> set = property
191             .getSuperProperties(OConstants.Closure.DIRECT_CLOSURE);
192     if(set != null) {
193       directSuperProps.getValues().addAll(set);
194       Collections.sort(directSuperProps.getValues(), itemComparator);
195     }
196     
197     set = property.getSuperProperties(OConstants.Closure.TRANSITIVE_CLOSURE);
198     if(set != null) {
199       allSuperProps.getValues().addAll(set);
200       Collections.sort(allSuperProps.getValues(), itemComparator);
201     }
202     set = property.getSubProperties(OConstants.Closure.DIRECT_CLOSURE);
203     if(set != null) {
204       directSubProps.getValues().addAll(set);
205       Collections.sort(directSubProps.getValues(), itemComparator);
206     }
207     set = property.getSubProperties(OConstants.Closure.TRANSITIVE_CLOSURE);
208     if(set != null) {
209       allSubProps.getValues().addAll(set);
210       Collections.sort(allSubProps.getValues(), itemComparator);
211     }
212 
213     set = property.getEquivalentPropertyAs();
214     if(set != null) {
215       equivalentProps.getValues().addAll(set);
216       Collections.sort(equivalentProps.getValues(), itemComparator);
217     }
218 
219     @SuppressWarnings("deprecation")
220     Set<OResource> set1 = property.getDomain();
221     if(set1 != null) {
222       domain.getValues().addAll(set1);
223       Collections.sort(domain.getValues(), itemComparator);
224       
225 //      Iterator iterator = set1.iterator();
226 //      while(iterator.hasNext()) {
227 //        OResource resource = (OResource)iterator.next();
228 //        domain.getValues().addAll(Utils.getDetailsToAdd(resource));
229 //      }
230     }
231 
232     // TODO: this used getXmlSchemaURI originally -- test if this breaks
233     // anything!
234     if(property instanceof DatatypeProperty) {
235       range.getValues().add(new KeyValuePair(property, "DATATYPE"
236           ((DatatypeProperty)property).getDataType().getXmlSchemaURIString()false));
237       fireTableDataChanged();
238       return;
239     }
240 
241     @SuppressWarnings("deprecation")
242     Set<OResource> set2 = property.getRange();
243     if(set2 != null) {
244       range.getValues().addAll(set2);
245       Collections.sort(range.getValues(), itemComparator);
246       
247 //      Iterator iterator = set2.iterator();
248 //      while(iterator.hasNext()) {
249 //        OResource resource = (OResource)iterator.next();
250 //        range.getValues().addAll(Utils.getDetailsToAdd(resource));
251 //      }
252     }
253 
254     fireTableDataChanged();
255   }
256 
257   protected DetailsGroup resourceInfo;
258   
259   protected DetailsGroup directSuperProps;
260 
261   protected DetailsGroup allSuperProps;
262 
263   protected DetailsGroup directSubProps;
264 
265   protected DetailsGroup equivalentProps;
266 
267   protected DetailsGroup allSubProps;
268 
269   protected DetailsGroup domain;
270 
271   protected DetailsGroup range;
272 
273   protected DetailsGroup propertyTypes;
274 
275   protected DetailsGroup propertyValues;
276 
277   protected DetailsGroup detailGroups[];
278 
279   protected OntologyItemComparator itemComparator;
280 
281   public static final int COLUMN_COUNT = 4;
282 
283   public static final int EXPANDED_COLUMN = 0;
284 
285   public static final int LABEL_COLUMN = 1;
286   
287   public static final int VALUE_COLUMN = 2;
288   
289   public static final int DELETE_COLUMN = 3;
290 }