blob: 6594364f89b487b5efca2de1f270434409c060d2 [file] [log] [blame]
/*
* Copyright (c) 2009-2011, Rickard Öberg. All Rights Reserved.
* Copyright (c) 2007-2013, Niclas Hedhman. All Rights Reserved.
* Copyright (c) 2014, Paul Merlin. All Rights Reserved.
*
* Licensed 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.zest.spi.entitystore.helpers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.zest.api.common.QualifiedName;
import org.apache.zest.api.entity.EntityDescriptor;
import org.apache.zest.api.entity.EntityReference;
import org.apache.zest.api.util.Classes;
import org.apache.zest.spi.entity.EntityState;
import org.apache.zest.spi.entity.EntityStatus;
import org.apache.zest.spi.entity.ManyAssociationState;
import org.apache.zest.spi.entity.NamedAssociationState;
/**
* Standard implementation of EntityState.
*/
public final class DefaultEntityState
implements EntityState
{
private EntityStatus status;
private String version;
private long lastModified;
private final EntityReference identity;
private final EntityDescriptor entityDescriptor;
private final Map<QualifiedName, Object> properties;
private final Map<QualifiedName, EntityReference> associations;
private final Map<QualifiedName, List<EntityReference>> manyAssociations;
private final Map<QualifiedName, Map<String, EntityReference>> namedAssociations;
public DefaultEntityState( long currentTime,
EntityReference identity,
EntityDescriptor entityDescriptor
)
{
this( "",
currentTime,
identity,
EntityStatus.NEW,
entityDescriptor,
new HashMap<QualifiedName, Object>(),
new HashMap<QualifiedName, EntityReference>(),
new HashMap<QualifiedName, List<EntityReference>>(),
new HashMap<QualifiedName, Map<String, EntityReference>>() );
}
public DefaultEntityState( String version,
long lastModified,
EntityReference identity,
EntityStatus status,
EntityDescriptor entityDescriptor,
Map<QualifiedName, Object> properties,
Map<QualifiedName, EntityReference> associations,
Map<QualifiedName, List<EntityReference>> manyAssociations,
Map<QualifiedName, Map<String, EntityReference>> namedAssociations
)
{
this.version = version;
this.lastModified = lastModified;
this.identity = identity;
this.status = status;
this.entityDescriptor = entityDescriptor;
this.properties = properties;
this.associations = associations;
this.manyAssociations = manyAssociations;
this.namedAssociations = namedAssociations;
}
// EntityState implementation
@Override
public final String version()
{
return version;
}
@Override
public long lastModified()
{
return lastModified;
}
@Override
public EntityReference identity()
{
return identity;
}
@Override
public Object propertyValueOf( QualifiedName stateName )
{
return properties.get( stateName );
}
@Override
public void setPropertyValue( QualifiedName stateName, Object newValue )
{
properties.put( stateName, newValue );
markUpdated();
}
@Override
public EntityReference associationValueOf( QualifiedName stateName )
{
return associations.get( stateName );
}
@Override
public void setAssociationValue( QualifiedName stateName, EntityReference newEntity )
{
associations.put( stateName, newEntity );
markUpdated();
}
@Override
public ManyAssociationState manyAssociationValueOf( QualifiedName stateName )
{
List<EntityReference> manyAssociationState = manyAssociations.get( stateName );
if( manyAssociationState == null )
{
manyAssociationState = new ArrayList<>();
manyAssociations.put( stateName, manyAssociationState );
}
return new DefaultManyAssociationState( this, manyAssociationState );
}
@Override
public NamedAssociationState namedAssociationValueOf( QualifiedName stateName )
{
Map<String, EntityReference> namedAssociationState = namedAssociations.get( stateName );
if( namedAssociationState == null )
{
namedAssociationState = new LinkedHashMap<>();
namedAssociations.put( stateName, namedAssociationState );
}
return new DefaultNamedAssociationState( this, namedAssociationState );
}
public void copyTo( DefaultEntityState entityState )
{
// Copy properties
entityState.properties.clear();
for( Map.Entry<QualifiedName, Object> stateNameStringEntry : properties.entrySet() )
{
entityState.properties.put( stateNameStringEntry.getKey(), stateNameStringEntry.getValue() );
}
// Copy associations
entityState.associations.clear();
for( Map.Entry<QualifiedName, EntityReference> stateNameStringEntry : associations.entrySet() )
{
entityState.associations.put( stateNameStringEntry.getKey(), stateNameStringEntry.getValue() );
}
// Copy many-associations
entityState.manyAssociations.clear();
for( Map.Entry<QualifiedName, List<EntityReference>> stateNameStringEntry : manyAssociations.entrySet() )
{
entityState.manyAssociations.put( stateNameStringEntry.getKey(), stateNameStringEntry.getValue() );
}
// Copy named-associations
entityState.namedAssociations.clear();
for( Map.Entry<QualifiedName, Map<String, EntityReference>> entry : namedAssociations.entrySet() )
{
entityState.namedAssociations.put( entry.getKey(), entry.getValue() );
}
// Set version and timestamp
entityState.version = version;
entityState.lastModified = lastModified;
}
@Override
public void remove()
{
status = EntityStatus.REMOVED;
}
@Override
public EntityStatus status()
{
return status;
}
@Override
public boolean isAssignableTo( Class<?> type )
{
return Classes.exactTypeSpecification( type ).satisfiedBy( entityDescriptor );
}
@Override
public EntityDescriptor entityDescriptor()
{
return entityDescriptor;
}
public Map<QualifiedName, Object> properties()
{
return properties;
}
public Map<QualifiedName, EntityReference> associations()
{
return associations;
}
public Map<QualifiedName, List<EntityReference>> manyAssociations()
{
return manyAssociations;
}
public Map<QualifiedName, Map<String, EntityReference>> namedAssociations()
{
return namedAssociations;
}
@Override
public String toString()
{
return identity + "("
+ properties.size() + " properties, "
+ associations.size() + " associations, "
+ manyAssociations.size() + " many-associations, "
+ namedAssociations.size() + " named-associations)";
}
public void markUpdated()
{
if( status == EntityStatus.LOADED )
{
status = EntityStatus.UPDATED;
}
}
}