/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.translator.odata.sap; import java.util.HashMap; import org.odata4j.core.NamespacedAnnotation; import org.odata4j.core.PrefixedNamespace; import org.odata4j.edm.EdmEntitySet; import org.odata4j.edm.EdmProperty; import org.teiid.metadata.Column; import org.teiid.metadata.Column.SearchType; import org.teiid.metadata.KeyRecord; import org.teiid.metadata.KeyRecord.Type; import org.teiid.metadata.MetadataFactory; import org.teiid.metadata.Table; import org.teiid.translator.TranslatorException; import org.teiid.translator.odata.ODataMetadataProcessor; import org.teiid.translator.odata.ODataTypeManager; public class SAPMetadataProcessor extends ODataMetadataProcessor { private static final String SAPURI = "http://www.sap.com/Protocols/SAPData"; //$NON-NLS-1$ private HashMap<Table, KeyRecord> accessPatterns = new HashMap(); @Override protected Table buildTable(MetadataFactory mf, EdmEntitySet entitySet) { boolean creatable = true; boolean updatable = true; boolean deletable = true; boolean pageable = true; boolean topable = true; Table t = mf.addTable(entitySet.getName()); Iterable<? extends NamespacedAnnotation> annotations = entitySet.getAnnotations(); for (NamespacedAnnotation annotation:annotations) { PrefixedNamespace namespace = annotation.getNamespace(); if (namespace.getUri().equals(SAPURI)) { String name = annotation.getName(); if (name.equalsIgnoreCase("label")) { //$NON-NLS-1$ t.setAnnotation((String)annotation.getValue()); } else if (name.equalsIgnoreCase("creatable")) { //$NON-NLS-1$ creatable = Boolean.parseBoolean((String)annotation.getValue()); } else if (name.equalsIgnoreCase("updatable")) { //$NON-NLS-1$ updatable = Boolean.parseBoolean((String)annotation.getValue()); } else if (name.equalsIgnoreCase("pageable")) { //$NON-NLS-1$ pageable = Boolean.parseBoolean((String)annotation.getValue()); } else if (name.equalsIgnoreCase("topable")) { //$NON-NLS-1$ topable = Boolean.parseBoolean((String)annotation.getValue()); } else if (name.equalsIgnoreCase("deletable")) { //$NON-NLS-1$ deletable = Boolean.parseBoolean((String)annotation.getValue()); } } } t.setSupportsUpdate(creatable && updatable && deletable); if (!topable || !pageable) { // TODO: currently Teiid can not do this in fine grained manner; // will be turned on by default; but user needs to turn off using the // capabilities if any table does not support this feature } return t; } String getProperty(EdmEntitySet entitySet, String key) { Iterable<? extends NamespacedAnnotation> annotations = entitySet.getAnnotations(); for (NamespacedAnnotation annotation:annotations) { PrefixedNamespace namespace = annotation.getNamespace(); if (namespace.getUri().equals(SAPURI)) { if (annotation.getName().equalsIgnoreCase(key)) { return (String)annotation.getValue(); } } } return null; } @Override protected Column buildColumn(MetadataFactory mf, Table table, EdmProperty ep, EdmEntitySet entitySet, String prefix) { boolean creatable = true; boolean updatable = true; boolean filterable = true; boolean required_in_filter = false; String columnName = ep.getName(); if (prefix != null) { columnName = prefix+"_"+columnName; //$NON-NLS-1$ } Column c = mf.addColumn(columnName, ODataTypeManager.teiidType(ep.getType().getFullyQualifiedTypeName()), table); c.setNameInSource(ep.getName()); Iterable<? extends NamespacedAnnotation> annotations = ep.getAnnotations(); for (NamespacedAnnotation annotation:annotations) { PrefixedNamespace namespace = annotation.getNamespace(); if (namespace.getUri().equals(SAPURI)) { String name = annotation.getName(); if (name.equalsIgnoreCase("label")) { //$NON-NLS-1$ c.setAnnotation((String)annotation.getValue()); } else if (name.equalsIgnoreCase("creatable")) { //$NON-NLS-1$ creatable = Boolean.parseBoolean((String)annotation.getValue()); } if (name.equalsIgnoreCase("visible")) { //$NON-NLS-1$ c.setSelectable(Boolean.parseBoolean((String)annotation.getValue())); } if (name.equalsIgnoreCase("updatable")) { //$NON-NLS-1$ updatable = Boolean.parseBoolean((String)annotation.getValue()); } if (name.equalsIgnoreCase("sortable")) { //$NON-NLS-1$ if (!Boolean.parseBoolean((String)annotation.getValue())){ c.setSearchType(SearchType.Unsearchable); } } if (name.equalsIgnoreCase("filterable")) { //$NON-NLS-1$ filterable = Boolean.parseBoolean((String)annotation.getValue()); } if (name.equalsIgnoreCase("required-in-filter")) { //$NON-NLS-1$ required_in_filter = Boolean.parseBoolean((String)annotation.getValue()); } if (name.equalsIgnoreCase("filter-restriction")) { //$NON-NLS-1$ //TODO: } } } c.setUpdatable(creatable && updatable); if (!filterable) { c.setSearchType(SearchType.Unsearchable); } if (required_in_filter) { if (this.accessPatterns.get(table) == null) { KeyRecord record = new KeyRecord(Type.AccessPattern); record.addColumn(c); this.accessPatterns.put(table, record); } else { this.accessPatterns.get(table).addColumn(c); } } // entity set defined to as must have filter boolean requiresFilter = Boolean.parseBoolean(getProperty(entitySet, "requires-filter")); //$NON-NLS-1$ if (requiresFilter && filterable && !required_in_filter) { KeyRecord record = new KeyRecord(Type.AccessPattern); record.addColumn(c); table.getAccessPatterns().add(record); } return c; } @Override protected Table addEntitySetAsTable(MetadataFactory mf, EdmEntitySet entitySet) throws TranslatorException { Table table = super.addEntitySetAsTable(mf, entitySet); KeyRecord accessPattern = this.accessPatterns.get(table); if (accessPattern != null) { table.getAccessPatterns().add(accessPattern); } return table; } }