This commit is contained in:
michaelpede 2021-05-07 18:12:39 -07:00
parent 071732a622
commit 6c7b161e18
8 changed files with 238 additions and 38 deletions

View File

@ -269,20 +269,7 @@ public class GenericEntityCollectionProcessor implements EntityCollectionProcess
// add the lookups from the database. // add the lookups from the database.
while (resultSet.next()) while (resultSet.next())
{ {
String lookupKey = resultSet.getString(primaryFieldName); Entity ent = CommonDataProcessing.getEntityFromRow(resultSet,resource,selectLookup);
Entity ent = new Entity();
for (FieldInfo field : fields)
{
String fieldName = field.getFieldName();
Object value = null;
if (selectLookup==null || selectLookup.containsKey(fieldName) )
{
value = CommonDataProcessing.getFieldValueFromRow(field, resultSet);
ent.addProperty(new Property(null, fieldName,ValueType.PRIMITIVE, value));
}
}
ent.setId(createId(resource.getResourcesName(), lookupKey));
productList.add(ent); productList.add(ent);
} }
@ -296,12 +283,4 @@ public class GenericEntityCollectionProcessor implements EntityCollectionProcess
return entCollection; return entCollection;
} }
private URI createId(String entitySetName, Object id) {
try {
return new URI(entitySetName + "('" + String.valueOf(id) + "')");
} catch (URISyntaxException e) {
throw new ODataRuntimeException("Unable to create id for entity: " + entitySetName, e);
}
}
} }

View File

@ -136,18 +136,8 @@ public class GenericEntityProcessor implements EntityProcessor
// add the lookups from the database. // add the lookups from the database.
while (resultSet.next()) while (resultSet.next())
{ {
Entity ent = CommonDataProcessing.getEntityFromRow(resultSet,resource,null);
String lookupKey = resultSet.getString(primaryFieldName);
Entity ent = new Entity();
for (FieldInfo field : fields)
{
String fieldName = field.getFieldName();
Object value = CommonDataProcessing.getFieldValueFromRow(field,resultSet);
ent.addProperty(new Property(null, fieldName, ValueType.PRIMITIVE, value));
}
ent.setId(createId(resource.getResourcesName(), lookupKey));
product = ent; product = ent;
} }

View File

@ -1,15 +1,24 @@
package org.reso.service.data.common; package org.reso.service.data.common;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.ex.ODataRuntimeException;
import org.reso.service.data.GenericEntityCollectionProcessor; import org.reso.service.data.GenericEntityCollectionProcessor;
import org.reso.service.data.meta.FieldInfo; import org.reso.service.data.meta.FieldInfo;
import org.reso.service.data.meta.ResourceInfo;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.net.URI;
import java.net.URISyntaxException;
import java.sql.Connection; import java.sql.Connection;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
public class CommonDataProcessing public class CommonDataProcessing
{ {
@ -34,4 +43,41 @@ public class CommonDataProcessing
return value; return value;
} }
public static Entity getEntityFromRow(ResultSet resultSet, ResourceInfo resource, HashMap<String,Boolean> selectLookup) throws SQLException
{
String primaryFieldName = resource.getPrimaryKeyName();
ArrayList<FieldInfo> fields = resource.getFieldList();
String lookupKey = null;
if (selectLookup!=null && selectLookup.get(primaryFieldName)!=null)
{
lookupKey = resultSet.getString(primaryFieldName);
}
Entity ent = new Entity();
for (FieldInfo field : fields)
{
String fieldName = field.getFieldName();
Object value = null;
if (selectLookup==null || selectLookup.containsKey(fieldName) )
{
value = CommonDataProcessing.getFieldValueFromRow(field, resultSet);
ent.addProperty(new Property(null, fieldName, ValueType.PRIMITIVE, value));
}
}
if (lookupKey!=null)
{
ent.setId(createId(resource.getResourcesName(), lookupKey));
}
return ent;
}
private static URI createId(String entitySetName, Object id) {
try {
return new URI(entitySetName + "('" + String.valueOf(id) + "')");
} catch (URISyntaxException e) {
throw new ODataRuntimeException("Unable to create id for entity: " + entitySetName, e);
}
}
} }

View File

@ -0,0 +1,118 @@
package org.reso.service.data.meta;
import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.Property;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.reso.service.data.common.CommonDataProcessing;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import static org.reso.service.servlet.RESOservlet.resourceLookup;
import static org.reso.service.servlet.RESOservlet.getConnection;
public class EnumFieldInfo extends FieldInfo
{
private String lookupName;
private ArrayList<String> values = new ArrayList<>();
private static final Logger LOG = LoggerFactory.getLogger(EnumFieldInfo.class);
private boolean isCollection = false;
private static String LOOKUP_COLUMN_NAME = "LookupValue";
public EnumFieldInfo(String fieldName, FullQualifiedName type)
{
super(fieldName, type);
}
public void addValue(String value)
{
values.add(value);
}
private void loadValues()
{
ResourceInfo resource = resourceLookup.get("Lookup");
if (resource!=null)
{
Connection connect = getConnection();
String queryString = null;
try
{
Statement statement = connect.createStatement();
HashMap<String,Boolean> selectLookup = new HashMap<>();
selectLookup.put(LOOKUP_COLUMN_NAME, true);
queryString = "Select "+LOOKUP_COLUMN_NAME+" from "+resource.getTableName()+" WHERE LookupName = '"+lookupName+"'";
LOG.debug("Query: "+queryString);
ResultSet resultSet = statement.executeQuery(queryString);
while (resultSet.next())
{
Entity ent = CommonDataProcessing.getEntityFromRow(resultSet, resource, selectLookup);
Property property = ent.getProperty(LOOKUP_COLUMN_NAME);
values.add( property.getValue().toString() );
}
}
catch (Exception e)
{
LOG.info("Query: "+queryString);
LOG.error("Error in finding Lookup values for "+lookupName+": "+e.getMessage());
}
}
}
public ArrayList<String> getValues()
{
if (values.size()==0)
{
loadValues();
}
return values;
}
public void setLookupName(String name) { lookupName=name; }
public FullQualifiedName getType()
{
if (values.size()==0)
{
loadValues();
}
if (values.size()>0)
{
return new FullQualifiedName("org.reso.metadata.enums." + lookupName);
}
LOG.info("No values for lookup: "+lookupName);
return super.getType();
}
/**
* Accessor for lookupName
* @return
*/
public String getLookupName()
{
return lookupName;
}
public boolean isCollection()
{
return isCollection;
}
public void setCollection()
{
isCollection = true;
}
}

View File

@ -77,4 +77,10 @@ public class FieldInfo
{ {
return maxLength; return maxLength;
} }
public boolean isCollection()
{
return false;
}
} }

View File

@ -66,10 +66,11 @@ public class ResourceInfo
ResultSet pkColumns = connect.getMetaData().getPrimaryKeys(null, null, getTableName()); ResultSet pkColumns = connect.getMetaData().getPrimaryKeys(null, null, getTableName());
while(pkColumns.next()) { while(pkColumns.next())
{
String pkColumnName = pkColumns.getString("COLUMN_NAME"); String pkColumnName = pkColumns.getString("COLUMN_NAME");
Integer pkPosition = pkColumns.getInt("KEY_SEQ"); Integer pkPosition = pkColumns.getInt("KEY_SEQ");
LOG.info(""+pkColumnName+" is the "+pkPosition+". column of the primary key of the table "+tableName); LOG.debug(""+pkColumnName+" is the "+pkPosition+". column of the primary key of the table "+tableName);
primaryKey = pkColumnName; primaryKey = pkColumnName;
} }

View File

@ -1,12 +1,15 @@
package org.reso.service.edmprovider; package org.reso.service.edmprovider;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.edm.provider.*; import org.apache.olingo.commons.api.edm.provider.*;
import org.reso.service.data.meta.EnumFieldInfo;
import org.reso.service.data.meta.FieldInfo; import org.reso.service.data.meta.FieldInfo;
import org.reso.service.data.meta.ResourceInfo; import org.reso.service.data.meta.ResourceInfo;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -15,7 +18,7 @@ public class RESOedmProvider extends CsdlAbstractEdmProvider
{ {
private ArrayList<ResourceInfo> resourceList = new ArrayList<ResourceInfo>(); private ArrayList<ResourceInfo> resourceList = new ArrayList<ResourceInfo>();
// Service Namespace // Service Namespace
public static final String NAMESPACE = "RESO.OData.Metadata"; public static final String NAMESPACE = "org.reso.metadata";
// EDM Container // EDM Container
public static final String CONTAINER_NAME = "Container"; public static final String CONTAINER_NAME = "Container";
@ -53,7 +56,7 @@ public class RESOedmProvider extends CsdlAbstractEdmProvider
{ {
String fieldName = field.getFieldName(); String fieldName = field.getFieldName();
CsdlProperty property = new CsdlProperty().setName(fieldName).setType(field.getType()); CsdlProperty property = new CsdlProperty().setName(fieldName).setType(field.getType()).setCollection(field.isCollection());
Integer maxLength = field.getMaxLength(); Integer maxLength = field.getMaxLength();
if (null!=maxLength) if (null!=maxLength)
{ {
@ -157,11 +160,43 @@ public class RESOedmProvider extends CsdlAbstractEdmProvider
CsdlSchema schema = new CsdlSchema(); CsdlSchema schema = new CsdlSchema();
schema.setNamespace(NAMESPACE); schema.setNamespace(NAMESPACE);
CsdlSchema enumSchema = new CsdlSchema();
enumSchema.setNamespace(NAMESPACE+".enums");
// add EntityTypes // add EntityTypes
List<CsdlEntityType> entityTypes = new ArrayList<CsdlEntityType>(); List<CsdlEntityType> entityTypes = new ArrayList<CsdlEntityType>();
for (ResourceInfo defn :resourceList) for (ResourceInfo defn :resourceList)
{ {
ArrayList<FieldInfo> fields = defn.getFieldList();
for (FieldInfo field : fields)
{
if (field instanceof EnumFieldInfo)
{
EnumFieldInfo enumField = (EnumFieldInfo) field;
ArrayList<String> values = enumField.getValues();
if (null!=values && values.size()>0)
{
CsdlEnumType type = new CsdlEnumType();
ArrayList<CsdlEnumMember> csdlMembers = new ArrayList<>();
for (String value: values)
{
csdlMembers.add(new CsdlEnumMember().setName(value));
}
type.setMembers(csdlMembers);
type.setName(enumField.getLookupName());
type.setUnderlyingType(EdmPrimitiveTypeKind.Int64.getFullQualifiedName());
enumSchema.getEnumTypes().add(type);
}
}
}
entityTypes.add(getEntityType(defn)); entityTypes.add(getEntityType(defn));
} }
@ -174,6 +209,22 @@ public class RESOedmProvider extends CsdlAbstractEdmProvider
List<CsdlSchema> schemas = new ArrayList<CsdlSchema>(); List<CsdlSchema> schemas = new ArrayList<CsdlSchema>();
schemas.add(schema); schemas.add(schema);
/**
// Example of how to create enum types.
CsdlEnumType type = new CsdlEnumType();
type.setMembers(Arrays.asList(
new CsdlEnumMember().setName("LOW"),
new CsdlEnumMember().setName("MEDIUM").setValue("1")
));
type.setName("EnumTest");
type.setUnderlyingType(EdmPrimitiveTypeKind.Int64.getFullQualifiedName());
enumSchema.getEnumTypes().add(type);
/**/
schemas.add(enumSchema);
return schemas; return schemas;
} }

View File

@ -24,6 +24,7 @@ import java.lang.reflect.Constructor;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.*; import javax.servlet.http.*;
@ -33,11 +34,18 @@ public class RESOservlet extends HttpServlet
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(RESOservlet.class); private static final Logger LOG = LoggerFactory.getLogger(RESOservlet.class);
private Connection connect = null; private static Connection connect = null;
private Validator validator = null; private Validator validator = null;
private OData odata = null; private OData odata = null;
ODataHttpHandler handler = null; ODataHttpHandler handler = null;
public static HashMap<String,ResourceInfo> resourceLookup = new HashMap<>();
public static Connection getConnection()
{
return connect;
}
@Override public void init() throws ServletException @Override public void init() throws ServletException
{ {
@ -97,6 +105,7 @@ public class RESOservlet extends HttpServlet
ctor.setAccessible(true); ctor.setAccessible(true);
ResourceInfo resource = (ResourceInfo)ctor.newInstance(); ResourceInfo resource = (ResourceInfo)ctor.newInstance();
resources.add(resource); resources.add(resource);
resourceLookup.put(resource.getResourceName(), resource);
resource.findPrimaryKey(this.connect); resource.findPrimaryKey(this.connect);
} }