blob: 2ea250abac19af359811936116d19a746d395e30 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.empire.samples.db.advanced.records;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.StringWriter;
import java.time.LocalDate;
import org.apache.empire.db.generic.TRecord;
import org.apache.empire.samples.db.advanced.SampleContext;
import org.apache.empire.samples.db.advanced.db.CarSalesDB;
import org.apache.empire.samples.db.advanced.db.CarSalesDB.EngineType;
import org.apache.empire.xml.XMLWriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
public class ModelRecord extends TRecord<SampleContext, CarSalesDB.Model>
{
private static final Logger log = LoggerFactory.getLogger(ModelRecord.class);
private static final long serialVersionUID = 1L;
private BrandRecord brand = null; // Lazy initialization
public ModelRecord(SampleContext context)
{
super(context, context.getDatabase().MODEL);
}
/**
* Insert a new Model
* @param brand
* @param modelName
* @param configName
* @param trim
* @param engineType
* @param enginePower
* @param basePrice
* @param firstSale
*/
public void insert(BrandRecord brand, String modelName, String configName, String trim
, EngineType engineType, int enginePower, double basePrice, LocalDate firstSale)
{
// T = RowSet (Table/View)
create();
set(T.WMI , brand);
set(T.NAME , modelName);
set(T.SPECIFICATION , configName);
set(T.TRIM , trim);
set(T.ENGINE_TYPE , engineType);
set(T.ENGINE_POWER , enginePower);
set(T.BASE_PRICE , basePrice);
set(T.FIRST_SALE , firstSale);
update();
}
/**
* Returns the Model's brand
* @return
*/
public BrandRecord getBrand()
{
if (brand==null) {
brand = new BrandRecord(CTX);
brand.read(get(T.WMI));
}
return brand;
}
@Override
public void update()
{
if (isModified())
{ // Record was modified
// Clear and reset MODEL_BINARY and MODEL_XML
set(T.MODEL_XML, null);
set(T.MODEL_BINARY, null);
// Reset
set(T.MODEL_XML, getModelXml());
set(T.MODEL_BINARY, getModelBinary());
}
super.update();
}
/**
* Generates the Model-XML when Record is modified
* Only used to demonstrate the use of the CLOB-DataType
* @return the XML String
*/
private String getModelXml()
{
Document modelDoc = this.getXmlDocument();
StringWriter writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, "utf-8");
xmlWriter.print(modelDoc);
return writer.toString();
}
/**
* Serializes the Model-fields when Record is modified
* Only used to demonstrate the use of the BLOB-DataType
* @return the binary fields info
*/
private byte[] getModelBinary()
{
try
{ // All fields, but without MODEL_BINARY
Object[] fields = this.getFields();
fields[getFieldIndex(T.MODEL_BINARY)]=null;
// Serialize the record fields
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(fields);
return baos.toByteArray();
}
catch (IOException e)
{
log.error("Unable to serialize the record fields", e);
return null;
}
}
}