blob: 87b6e4fba3c10db9e2a2d214592f5643b2800377 [file] [log] [blame]
package org.apache.rya.reasoning.mr;
/*
* 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.
*/
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import org.apache.commons.io.serialization.ValidatingObjectInputStream;
import org.apache.hadoop.io.Writable;
import org.apache.rya.reasoning.OwlClass;
import org.apache.rya.reasoning.OwlProperty;
import org.apache.rya.reasoning.Schema;
public class SchemaWritable extends Schema implements Writable {
@Override
public void write(DataOutput out) throws IOException {
ArrayList<OwlProperty> propList = new ArrayList<>(properties.values());
ArrayList<OwlClass> classList = new ArrayList<>(classes.values());
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(bytes);
stream.writeObject(propList);
stream.writeObject(classList);
byte[] arr = bytes.toByteArray();
stream.close();
out.writeInt(arr.length);
out.write(arr);
}
@Override
public void readFields(DataInput in) throws IOException {
int size = in.readInt();
if (size < 1)
throw new Error("De-serializtion failed, count is less than one.");
byte[] bytes = new byte[size];
in.readFully(bytes);
// ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(bytes));
try (final ByteArrayInputStream bais = new ByteArrayInputStream(bytes); //
final ValidatingObjectInputStream vois = new ValidatingObjectInputStream(bais)
// this is how you find classes that you missed in the vois.accept() list, below.
// { @Override protected void invalidClassNameFound(String className) throws java.io.InvalidClassException {
// System.out.println("vois.accept(" + className + ".class, ");};};
) {
// this is a (hopefully) complete list of classes involved in a Schema to be serialized.
// if a useful class is missing, throws an InvalidClassException.
vois.accept(java.util.ArrayList.class, //
org.apache.rya.reasoning.OwlProperty.class, //
java.util.HashSet.class, //
org.apache.rya.reasoning.OwlClass.class, //
org.eclipse.rdf4j.model.impl.SimpleIRI.class, //
org.eclipse.rdf4j.model.impl.SimpleBNode.class);
try {
Iterable<?> propList = (Iterable<?>) vois.readObject();
Iterable<?> classList = (Iterable<?>) vois.readObject();
for (Object p : propList) {
OwlProperty prop = (OwlProperty) p;
properties.put(prop.getURI(), prop);
}
for (Object c : classList) {
OwlClass owlClass = (OwlClass) c;
classes.put(owlClass.getURI(), owlClass);
}
}
catch (ClassNotFoundException e) {
throw new Error("While reading a schema object.");
}
}
}
}