/*
* 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.stanbol.entityhub.core.model;
import org.apache.stanbol.entityhub.servicesapi.defaults.NamespaceEnum;
import org.apache.stanbol.entityhub.servicesapi.model.Entity;
import org.apache.stanbol.entityhub.servicesapi.model.Reference;
import org.apache.stanbol.entityhub.servicesapi.model.Representation;
import org.apache.stanbol.entityhub.servicesapi.model.rdf.RdfResourceEnum;
/**
* Implementation of the Entity interface that also enforces the required
* relations between {@link Entity#getRepresentation() representation} and
* {@link Entity#getMetadata() metadata}.
*
* @author Rupert Westenthaler
*
*/
public class EntityImpl implements Entity{
//private static final Logger log = LoggerFactory.getLogger(EntityImpl.class);
private final Representation representation;
private final String site;
private final Representation metadata;
/**
* Creates a new Entity for the parsed site, representation and metadata.<p>
* This Constructor checks for {@link RdfResourceEnum#hasMetadata} relations
* in the {@link Entity#getRepresentation() representation} as well as
* {@link RdfResourceEnum#aboutRepresentation} relations in the
* {@link Entity#getMetadata() metadata}. <p>
* If such are present, the IDs of the parsed representation and metadata
* are validated against those. If they are not present this values are
* initialised based on the IDs of the parsed representation and metadata.<p>
* In case <code>null</code> is parsed as metadata, than a new
* representation is created with the default ID (the ID of the represnetation
* <code>+ ".meta"</code>.
* @param siteId the site (MUST NOT be <code>null</code> nor empty)
* @param representation the representation(MUST NOT be <code>null</code> nor empty)
* @param metadata the metadata (MAY BE <code>null</code>)
* @throws IllegalArgumentException In case <ul>
* <li> <code>null</code> is parsed for any parameter other than the metadata
* <li> the siteId is empty
* <li> the id of the representation is not the same as the aboutness of the
* metadata
* <li> the id of the metadata is not the same as the id referenced by the
* representation
* </ul>
*/
public EntityImpl(String siteId,Representation representation,Representation metadata) throws IllegalArgumentException {
super();
if(representation == null){
throw new IllegalArgumentException("NULL value ist not allowed for the Representation");
}
if(siteId == null || siteId.isEmpty()){
throw new IllegalStateException("Parsed SiteId MUST NOT be NULL nor empty!");
}
this.site = siteId;
this.representation = representation;
Reference representationRef;
if(metadata != null){
if(representation.getId().equals(metadata.getId())){
throw new IllegalArgumentException("The ID of the Representation and " +
"the Metadata MUST NOT BE the same!");
}
representationRef = metadata.getFirstReference(
RdfResourceEnum.aboutRepresentation.getUri());
if(representationRef != null && !representationRef.getReference().equals(
representation.getId())){
throw new IllegalArgumentException(String.format(
"The parsed Metadata are not about the representation of the" +
"Entity to be created (metadata aboutness=%s, representation=%s).",
representationRef.getReference(),representation.getId()));
}
this.metadata = metadata;
} else { //init new metadata
//This is typically used if no metadata are persisted for an entity
//(e.g. for entities of a remote site).
//However the created and initialised metadata can be persisted
//afterwards.
//The usage of a specific Representation implementation here is not
//an issue because Yards need to support storage of any
//Representation implementation!
String metadataId = representation.getId()+".meta";
this.metadata = InMemoryValueFactory.getInstance().createRepresentation(metadataId);
representationRef = null;
}
//init the link from the metadata to the representation
if(representationRef == null){
this.metadata.setReference(RdfResourceEnum.aboutRepresentation.getUri(), representation.getId());
}
//add the rdf:type for Metadata
this.metadata.addReference(NamespaceEnum.rdf+"type", RdfResourceEnum.Metadata.getUri());
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(", id=");
sb.append(getId());
sb.append(", site=");
sb.append(getSite());
sb.append(", representation=");
sb.append(getRepresentation());
sb.append(", metadata=");
sb.append(getMetadata());
return sb.toString();
}
@Override
public final String getSite() {
return site;
}
@Override
public final String getId() {
return representation.getId();
}
@Override
public final Representation getRepresentation() {
return representation;
}
@Override
public final Representation getMetadata(){
return metadata;
}
@Override
public int hashCode() {
return representation.hashCode();
}
@Override
public boolean equals(Object o) {
return o instanceof Entity &&
representation.equals(((Entity)o).getRepresentation()) &&
site.equals(((Entity)o).getSite()) &&
metadata.equals(((Entity)o).getMetadata());
}
}