use of com.enonic.xp.content.ExtraData in project xp by enonic.
the class ExtraDataSerializer method toData.
@Override
public void toData(final ExtraDatas extraDatas, final PropertySet parent) {
final PropertySet metaSet = parent.addSet(EXTRA_DATA);
for (final ExtraData extraData : extraDatas) {
final String xDataApplicationPrefix = extraData.getApplicationPrefix();
PropertySet xDataApplication = metaSet.getSet(xDataApplicationPrefix);
if (xDataApplication == null) {
xDataApplication = metaSet.addSet(xDataApplicationPrefix);
}
xDataApplication.addSet(extraData.getName().getLocalName(), extraData.getData().getRoot().copy(metaSet.getTree()));
}
}
use of com.enonic.xp.content.ExtraData in project xp by enonic.
the class ImageContentProcessor method processUpdate.
@Override
public ProcessUpdateResult processUpdate(final ProcessUpdateParams params) {
final CreateAttachments createAttachments = params.getCreateAttachments();
final MediaInfo mediaInfo = params.getMediaInfo();
final CreateAttachment sourceAttachment = createAttachments == null ? null : createAttachments.first();
final ContentEditor editor;
if (mediaInfo != null) {
editor = editable -> {
final Map<XDataName, ExtraData> extraDatas = editable.extraDatas.stream().collect(Collectors.toMap(ExtraData::getName, o -> o));
final XDatas contentXDatas = getXDatas(params.getContentType().getName());
extractMetadata(mediaInfo, contentXDatas, sourceAttachment).forEach(extraData -> extraDatas.put(extraData.getName(), extraData));
editable.extraDatas = ExtraDatas.create().addAll(extraDatas.values()).build();
};
} else {
editor = editable -> {
if (!params.getContentType().getName().isDescendantOfMedia()) {
return;
}
editable.extraDatas = updateImageMetadata(editable);
};
}
return new ProcessUpdateResult(createAttachments, editor);
}
use of com.enonic.xp.content.ExtraData in project xp by enonic.
the class ImageContentProcessor method extractMetadata.
private ExtraDatas extractMetadata(final MediaInfo mediaInfo, final XDatas xDatas, final CreateAttachment sourceAttachment) {
final ExtraDatas.Builder extradatasBuilder = ExtraDatas.create();
final Map<XDataName, ExtraData> metadataMap = new HashMap<>();
final ExtraData geoData = extractGeoLocation(mediaInfo, xDatas);
if (geoData != null) {
metadataMap.put(MediaInfo.GPS_INFO_METADATA_NAME, geoData);
extradatasBuilder.add(geoData);
}
for (Map.Entry<String, Collection<String>> entry : mediaInfo.getMetadata().asMap().entrySet()) {
for (XData xData : xDatas) {
final String formItemName = getConformityName(entry.getKey());
final FormItem formItem = xData.getForm().getFormItems().getItemByName(formItemName);
if (formItem == null) {
continue;
}
ExtraData extraData = metadataMap.get(xData.getName());
if (extraData == null) {
extraData = new ExtraData(xData.getName(), new PropertyTree());
metadataMap.put(xData.getName(), extraData);
extradatasBuilder.add(extraData);
}
if (FormItemType.INPUT.equals(formItem.getType())) {
Input input = (Input) formItem;
if (InputTypeName.DATE_TIME.equals(input.getInputType())) {
extraData.getData().addLocalDateTime(formItemName, ValueTypes.LOCAL_DATE_TIME.convert(entry.getValue().toArray()[0]));
} else if (InputTypeName.LONG.equals(input.getInputType())) {
final Long[] longValues = entry.getValue().stream().map(Long::parseLong).toArray(Long[]::new);
extraData.getData().addLongs(formItemName, longValues);
} else {
extraData.getData().addStrings(formItemName, entry.getValue());
}
}
}
}
fillComputedFormItems(metadataMap.values(), mediaInfo, sourceAttachment);
return extradatasBuilder.build();
}
use of com.enonic.xp.content.ExtraData in project xp by enonic.
the class ImageContentProcessor method extractGeoLocation.
private ExtraData extractGeoLocation(final MediaInfo mediaInfo, final XDatas xDatas) {
final ImmutableMultimap<String, String> mediaItems = mediaInfo.getMetadata();
final Double geoLat = parseDouble(mediaItems.get(GEO_LATITUDE).stream().findFirst().orElse(null));
final Double geoLong = parseDouble(mediaItems.get(GEO_LONGITUDE).stream().findFirst().orElse(null));
if (geoLat == null || geoLong == null) {
return null;
}
final XData geoMixin = xDatas.getXData(MediaInfo.GPS_INFO_METADATA_NAME);
if (geoMixin == null) {
return null;
}
final ExtraData extraData = new ExtraData(geoMixin.getName(), new PropertyTree());
final FormItem formItem = geoMixin.getForm().getFormItems().getItemByName(MediaInfo.GPS_INFO_GEO_POINT);
if (FormItemType.INPUT.equals(formItem.getType())) {
final Input input = (Input) formItem;
if (InputTypeName.GEO_POINT.equals(input.getInputType())) {
final GeoPoint geoPoint = new GeoPoint(geoLat, geoLong);
extraData.getData().addGeoPoint(formItem.getName(), ValueTypes.GEO_POINT.convert(geoPoint));
}
}
return extraData;
}
use of com.enonic.xp.content.ExtraData in project xp by enonic.
the class ExtraDataValidator method validate.
@Override
public void validate(final ContentValidatorParams params, final ValidationErrors.Builder validationErrorsBuilder) {
for (final ExtraData extraData : params.getExtraDatas()) {
final XDataName name = extraData.getName();
final XData xData = this.xDataService.getByName(name);
if (xData == null) {
LOG.warn("Mixin not found: '" + name);
continue;
}
final Form mixinForm = xData.getForm();
if (extraData.getData().getRoot().getPropertySize() > 0) {
OccurrenceValidator.validate(mixinForm, extraData.getData().getRoot(), validationErrorsBuilder);
}
}
}
Aggregations