CompactStringEntityReferenceSerializer.java
/*
* Copyright (C) 2003-2010 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.wiki.service.wysiwyg;
import javax.inject.Inject;
import javax.inject.Named;
import org.xwiki.component.annotation.Component;
import org.xwiki.model.EntityType;
import org.xwiki.model.internal.reference.DefaultStringEntityReferenceSerializer;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.EntityReferenceValueProvider;
@Component("compact")
public class CompactStringEntityReferenceSerializer extends DefaultStringEntityReferenceSerializer {
@Inject
@Named("current")
private EntityReferenceValueProvider provider;
/**
* {@inheritDoc}
*
* @see org.xwiki.model.internal.reference.DefaultStringEntityReferenceSerializer#serializeEntityReference(org.xwiki.model.reference.EntityReference, java.lang.StringBuilder, boolean, java.lang.Object[])
*/
@Override
protected void serializeEntityReference(EntityReference currentReference, StringBuilder representation,
boolean isLastReference, Object... parameters)
{
boolean shouldPrint = false;
// Only serialize if:
// - the current entity reference has a different value than the passed reference
// - the entity type being serialized is not the last type of the chain
// In addition an entity reference isn't printed only if all parent references are not printed either,
// otherwise print it. For example "wiki:page" isn't allowed for a Document Reference.
if (isLastReference || representation.length() > 0) {
shouldPrint = true;
} else {
String defaultName = resolveDefaultValue(currentReference.getType(), parameters);
if (defaultName == null || !defaultName.equals(currentReference.getName())) {
shouldPrint = true;
}
}
if (shouldPrint) {
super.serializeEntityReference(currentReference, representation, isLastReference);
}
}
protected String resolveDefaultValue(EntityType type, Object... parameters)
{
String resolvedDefaultValue = null;
if (parameters.length > 0 && parameters[0] instanceof EntityReference) {
// Try to extract the type from the passed parameter.
EntityReference referenceParameter = (EntityReference) parameters[0];
EntityReference extractedReference = referenceParameter.extractReference(type);
if (extractedReference != null) {
resolvedDefaultValue = extractedReference.getName();
}
}
if (resolvedDefaultValue == null) {
resolvedDefaultValue = this.provider.getDefaultValue(type);
}
return resolvedDefaultValue;
}
}