| /* |
| * 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.rya.api.resolver.impl; |
| |
| import static org.apache.rya.api.RdfCloudTripleStoreConstants.TYPE_DELIM_BYTE; |
| import static org.apache.rya.api.RdfCloudTripleStoreConstants.TYPE_DELIM_BYTES; |
| |
| import java.nio.charset.StandardCharsets; |
| |
| import org.apache.rya.api.domain.RyaRange; |
| import org.apache.rya.api.domain.RyaType; |
| import org.apache.rya.api.resolver.RyaTypeResolver; |
| import org.apache.rya.api.resolver.RyaTypeResolverException; |
| import org.calrissian.mango.types.LexiTypeEncoders; |
| import org.calrissian.mango.types.TypeEncoder; |
| import org.eclipse.rdf4j.model.IRI; |
| import org.eclipse.rdf4j.model.vocabulary.XMLSchema; |
| |
| import com.google.common.primitives.Bytes; |
| |
| /** |
| * Date: 7/16/12 |
| * Time: 12:42 PM |
| */ |
| public class RyaTypeResolverImpl implements RyaTypeResolver { |
| public static final int PLAIN_LITERAL_MARKER = 3; |
| public static final TypeEncoder<String, String> STRING_TYPE_ENCODER = LexiTypeEncoders |
| .stringEncoder(); |
| |
| protected byte markerByte; |
| protected IRI dataType; |
| protected byte[] markerBytes; |
| |
| public RyaTypeResolverImpl() { |
| this((byte) PLAIN_LITERAL_MARKER, XMLSchema.STRING); |
| } |
| |
| public RyaTypeResolverImpl(final byte markerByte, final IRI dataType) { |
| setMarkerByte(markerByte); |
| setRyaDataType(dataType); |
| } |
| |
| public void setMarkerByte(final byte markerByte) { |
| this.markerByte = markerByte; |
| this.markerBytes = new byte[]{markerByte}; |
| } |
| |
| @Override |
| public byte getMarkerByte() { |
| return markerByte; |
| } |
| |
| @Override |
| public RyaRange transformRange(final RyaRange ryaRange) throws RyaTypeResolverException { |
| return ryaRange; |
| } |
| |
| @Override |
| public byte[] serialize(final RyaType ryaType) throws RyaTypeResolverException { |
| final byte[][] bytes = serializeType(ryaType); |
| return Bytes.concat(bytes[0], bytes[1]); |
| } |
| |
| @Override |
| public byte[][] serializeType(final RyaType ryaType) throws RyaTypeResolverException { |
| final byte[] bytes = serializeData(ryaType.getData()).getBytes(StandardCharsets.UTF_8); |
| return new byte[][]{bytes, Bytes.concat(TYPE_DELIM_BYTES, markerBytes)}; |
| } |
| |
| @Override |
| public IRI getRyaDataType() { |
| return dataType; |
| } |
| |
| public void setRyaDataType(final IRI dataType) { |
| this.dataType = dataType; |
| } |
| |
| @Override |
| public RyaType newInstance() { |
| return new RyaType(); |
| } |
| |
| @Override |
| public boolean deserializable(final byte[] bytes) { |
| return bytes != null && bytes.length >= 2 && bytes[bytes.length - 1] == getMarkerByte() && bytes[bytes.length - 2] == TYPE_DELIM_BYTE; |
| } |
| |
| protected String serializeData(final String data) throws RyaTypeResolverException { |
| return STRING_TYPE_ENCODER.encode(data); |
| } |
| |
| @Override |
| public RyaType deserialize(final byte[] bytes) throws RyaTypeResolverException { |
| if (!deserializable(bytes)) { |
| throw new RyaTypeResolverException("Bytes not deserializable"); |
| } |
| final RyaType rt = newInstance(); |
| rt.setDataType(getRyaDataType()); |
| final String data = new String(bytes, 0, bytes.length - 2, StandardCharsets.UTF_8); |
| rt.setData(deserializeData(data)); |
| return rt; |
| } |
| |
| protected String deserializeData(final String data) throws RyaTypeResolverException { |
| return STRING_TYPE_ENCODER.decode(data); |
| } |
| } |