Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
922e306
Implement ContentType YAML parser #11240 (#11248)
anatol-sialitski Aug 21, 2025
ae268dc
Load Content Types from YML #11288 (#11289)
anatol-sialitski Aug 25, 2025
163300a
Improving InputType creation from YML #11302
anatol-sialitski Aug 27, 2025
aa64040
Support CustomSelector in YAML #11310 (#11311)
anatol-sialitski Aug 28, 2025
6c4df34
Support HtmlArea in YAML #11312
anatol-sialitski Aug 28, 2025
1165c21
Support TextArea in YAML #11314
anatol-sialitski Aug 28, 2025
7a5b9c6
Support `Time`, `Date` and `DateTime` in YAML #11317
anatol-sialitski Aug 29, 2025
37173d7
Support CheckBox and ComboBox in YAML #11319
anatol-sialitski Aug 29, 2025
626c4dc
Support AttachmentUploader in YAML #11320
anatol-sialitski Sep 1, 2025
e545c2c
Support `ImageSelector` and `MediaSelector` in YAML #11335
anatol-sialitski Sep 1, 2025
00a8079
Support `ContentTypeFilter` in YAML #11322
anatol-sialitski Sep 1, 2025
1e29796
Support `Tag` in YAML #11324
anatol-sialitski Sep 1, 2025
5e577fc
Support `Long` in YAML #11323
anatol-sialitski Sep 1, 2025
1347fc1
Support `GeoPoint` in YAML #11321
anatol-sialitski Sep 1, 2025
d9c741f
Support `ApiDescriptor` using YAML #11341
anatol-sialitski Sep 2, 2025
ec75d8b
Support `AdminToolDescriptor` using YAML #11343 (#11344)
anatol-sialitski Sep 3, 2025
212c51c
Support `WidgetDescriptor` using YAML #11345 (#11351)
anatol-sialitski Sep 3, 2025
9c0a297
Support `IdproviderDescriptor` using YAML #11346 (#11352)
anatol-sialitski Sep 4, 2025
a7def97
Support `ServiceDescriptor` using YAML #11347
anatol-sialitski Sep 4, 2025
f57466d
Support `TaskDescriptor` using YAML #11348
anatol-sialitski Sep 4, 2025
1d7c337
Support `WebappDescriptor` using YAML #11349 (#11355)
anatol-sialitski Sep 4, 2025
50639dd
Support `ApplicationDescriptor` using YAML #11350
anatol-sialitski Sep 4, 2025
ef840e9
Support `SiteDescriptor` using YAML #11358 (#11363)
anatol-sialitski Sep 8, 2025
e41a880
Move content part `from core-schema` to `core-content` #11366 (#11367)
anatol-sialitski Sep 8, 2025
fbb335c
Support `LayoutDescriptor` using YAML #11359 (#11370)
anatol-sialitski Sep 9, 2025
373d224
Support `PageDescriptor` using YAML #11360
anatol-sialitski Sep 9, 2025
23d9d4d
Support `PartDescriptor` using YAML #11361
anatol-sialitski Sep 9, 2025
090e4ac
Support `MacroDescriptor` using YAML #11362
anatol-sialitski Sep 9, 2025
5bdd62c
Support `StyleDescriptor` using YAML #11357 (#11375)
anatol-sialitski Sep 10, 2025
e8ff8e1
Support `Mixin` using YAML #11372
anatol-sialitski Sep 10, 2025
d51f759
Support `X-Data` using YAML #11373
anatol-sialitski Sep 10, 2025
d37b25e
Rebase master on persisted schema
anatol-sialitski Oct 2, 2025
1a48fb7
Rebase master onto persisted schema
anatol-sialitski Oct 9, 2025
68d9987
Fix and merge master into persisted-schema-poc
anatol-sialitski Oct 9, 2025
9ace390
ContentType remove properties #11462
anatol-sialitski Oct 9, 2025
0abc3ff
Improve occurrences in YML #11465
anatol-sialitski Oct 10, 2025
80a26e7
Split DateTime input into two #11417 (#11469)
anatol-sialitski Oct 13, 2025
f386325
Mixin for CMS Form #11377
anatol-sialitski Oct 16, 2025
c76e523
Rebase master to persisted-schema-poc
anatol-sialitski Oct 17, 2025
aff2c05
Move InputType default to config #11418 (#11488)
anatol-sialitski Oct 20, 2025
f6ffc35
Replace InputTypeConfig with GenericValue #11495 (#11500)
anatol-sialitski Oct 27, 2025
22254d6
Merge branch 'master' into persisted-schema-poc
anatol-sialitski Oct 27, 2025
d5997f8
Merge master into persisted-schema
anatol-sialitski Oct 27, 2025
74d093e
Merge branch 'master' into persisted-schema
anatol-sialitski Oct 28, 2025
fc05e5e
Rename widgets to admin extensions #11491 (#11506)
anatol-sialitski Oct 28, 2025
3ef4a8f
Rename x-data to mixin #11493 (#11508)
anatol-sialitski Oct 30, 2025
b595fe9
Merge branch 'master' into persisted-schema
anatol-sialitski Oct 30, 2025
14259bb
Rename x-data to mixin #11493
anatol-sialitski Oct 30, 2025
4886683
Save changes
anatol-sialitski Nov 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ jackson-dataformat-smile = { module = "com.fasterxml.jackson.dataformat:jackson-
jackson-dataformat-cbor = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", version.ref = "jackson" }
jackson-dataformat-yaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", version.ref = "jackson" }

snakeyaml = { module = "org.yaml:snakeyaml", version = "2.4" }

tika-core = { module = "org.apache.tika:tika-core", version.ref = "tika" }
tika-bundlestandard = { module = "org.apache.tika:tika-bundle-standard", version.ref = "tika" }
tika-parser-apple = { module = "org.apache.tika:tika-parser-apple-module", version.ref = "tika" }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.enonic.xp.admin.widget;
package com.enonic.xp.admin.extension;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
Expand All @@ -13,12 +12,12 @@
import com.enonic.xp.descriptor.Descriptor;
import com.enonic.xp.descriptor.DescriptorKey;
import com.enonic.xp.icon.Icon;
import com.enonic.xp.security.PrincipalKey;
import com.enonic.xp.schema.LocalizedText;
import com.enonic.xp.security.PrincipalKeys;
import com.enonic.xp.security.RoleKeys;

@PublicApi
public final class WidgetDescriptor
public final class AdminExtensionDescriptor
extends Descriptor
{
private final String displayName;
Expand All @@ -37,7 +36,7 @@ public final class WidgetDescriptor

private final ImmutableMap<String, String> config;

private WidgetDescriptor( final Builder builder )
private AdminExtensionDescriptor( final Builder builder )
{
super( builder.key );
this.displayName = builder.displayName;
Expand All @@ -46,15 +45,10 @@ private WidgetDescriptor( final Builder builder )
this.descriptionI18nKey = builder.descriptionI18nKey;
this.icon = builder.icon;
this.interfaces = ImmutableSet.copyOf( builder.interfaces );
this.allowedPrincipals = builder.allowedPrincipals == null ? null : PrincipalKeys.from( builder.allowedPrincipals );
this.allowedPrincipals = builder.allowedPrincipals;
this.config = ImmutableMap.copyOf( builder.config );
}

public String getKeyString()
{
return getKey().toString();
}

public String getDisplayName()
{
return displayName;
Expand Down Expand Up @@ -97,16 +91,16 @@ public PrincipalKeys getAllowedPrincipals()

public boolean isAccessAllowed( final PrincipalKeys principalKeys )
{
return allowedPrincipals == null || principalKeys.contains( RoleKeys.ADMIN ) || principalKeys.stream().
anyMatch( allowedPrincipals::contains );
return allowedPrincipals == null || principalKeys.contains( RoleKeys.ADMIN ) ||
principalKeys.stream().anyMatch( allowedPrincipals::contains );
}

public Map<String, String> getConfig()
{
return config;
}

public static WidgetDescriptor.Builder create()
public static AdminExtensionDescriptor.Builder create()
{
return new Builder();
}
Expand All @@ -127,7 +121,7 @@ public static final class Builder

public final Set<String> interfaces = new TreeSet<>();

private Collection<PrincipalKey> allowedPrincipals;
private PrincipalKeys allowedPrincipals;

public final Map<String, String> config = new HashMap<>();

Expand All @@ -147,6 +141,13 @@ public Builder displayName( final String displayName )
return this;
}

public Builder displayName( final LocalizedText text )
{
this.displayName = text.text();
this.displayNameI18nKey = text.i18n();
return this;
}

public Builder displayNameI18nKey( final String displayNameI18nKey )
{
this.displayNameI18nKey = displayNameI18nKey;
Expand All @@ -165,6 +166,13 @@ public Builder descriptionI18nKey( final String descriptionI18nKey )
return this;
}

public Builder description( final LocalizedText text )
{
this.description = text.text();
this.descriptionI18nKey = text.i18n();
return this;
}

public Builder setIcon( final Icon icon )
{
this.icon = icon;
Expand All @@ -177,7 +185,13 @@ public Builder addInterface( final String interfaceName )
return this;
}

public Builder setAllowedPrincipals( final Collection<PrincipalKey> allowedPrincipals )
public Builder addInterfaces( final Iterable<String> interfaceNames )
{
interfaceNames.forEach( this::addInterface );
return this;
}

public Builder allowedPrincipals( final PrincipalKeys allowedPrincipals )
{
this.allowedPrincipals = allowedPrincipals;
return this;
Expand All @@ -189,9 +203,9 @@ public Builder addProperty( final String key, final String value )
return this;
}

public WidgetDescriptor build()
public AdminExtensionDescriptor build()
{
return new WidgetDescriptor( this );
return new AdminExtensionDescriptor( this );
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.enonic.xp.admin.extension;

import com.enonic.xp.annotation.PublicApi;
import com.enonic.xp.app.ApplicationKey;
import com.enonic.xp.descriptor.Descriptors;
import com.enonic.xp.descriptor.DescriptorKey;

@PublicApi
public interface AdminExtensionDescriptorService
{
Descriptors<AdminExtensionDescriptor> getByInterfaces( String... interfaceName );

Descriptors<AdminExtensionDescriptor> getByApplication( ApplicationKey applicationKey );

AdminExtensionDescriptor getByKey( DescriptorKey descriptorKey );
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.enonic.xp.descriptor.DescriptorKey;
import com.enonic.xp.descriptor.DescriptorKeys;
import com.enonic.xp.resource.ResourceKey;
import com.enonic.xp.schema.LocalizedText;
import com.enonic.xp.security.PrincipalKey;
import com.enonic.xp.security.PrincipalKeys;
import com.enonic.xp.security.RoleKeys;
Expand Down Expand Up @@ -107,7 +108,7 @@ public DescriptorKeys getApiMounts()

public static ResourceKey toResourceKey( final DescriptorKey key )
{
return ResourceKey.from( key.getApplicationKey(), "admin/tools/" + key.getName() + "/" + key.getName() + ".xml" );
return ResourceKey.from( key.getApplicationKey(), "admin/tools/" + key.getName() + "/" + key.getName() + ".yml" );
}

public static ResourceKey toIconResourceKey( final DescriptorKey key )
Expand Down Expand Up @@ -161,6 +162,13 @@ public Builder displayNameI18nKey( final String displayNameI18nKey )
return this;
}

public Builder displayName( final LocalizedText text )
{
this.displayName = text.text();
this.displayNameI18nKey = text.i18n();
return this;
}

public Builder description( final String description )
{
this.description = description;
Expand All @@ -173,6 +181,19 @@ public Builder descriptionI18nKey( final String descriptionI18nKey )
return this;
}

public Builder description( final LocalizedText text )
{
this.description = text.text();
this.descriptionI18nKey = text.i18n();
return this;
}

public Builder addAllowedPrincipals( final PrincipalKeys allowedPrincipals )
{
this.allowedPrincipals.addAll( allowedPrincipals );
return this;
}

public Builder addAllowedPrincipals( final PrincipalKey allowedPrincipal )
{
this.allowedPrincipals.add( allowedPrincipal );
Expand All @@ -191,6 +212,12 @@ public Builder addInterface( final String interfaceName )
return this;
}

public Builder addInterfaces( final Iterable<String> interfaceNames )
{
this.interfaces.addAll( interfaceNames );
return this;
}

public AdminToolDescriptor build()
{
return new AdminToolDescriptor( this );
Expand Down

This file was deleted.

1 change: 1 addition & 0 deletions modules/admin/admin-impl/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ dependencies {
implementation project( ':portal:portal-api' )
implementation project( ':jaxrs:jaxrs-api' )
implementation project( ':core:core-internal' )
implementation project( ':core:core-schema' )

testImplementation( testFixtures( project(":core:core-api") ) )
testImplementation( testFixtures( project(":core:core-app") ) )
Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,43 @@
package com.enonic.xp.admin.impl.widget;
package com.enonic.xp.admin.impl.extension;

import java.time.Instant;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

import com.enonic.xp.admin.widget.WidgetDescriptor;
import com.enonic.xp.admin.extension.AdminExtensionDescriptor;
import com.enonic.xp.app.ApplicationKey;
import com.enonic.xp.descriptor.DescriptorKey;
import com.enonic.xp.descriptor.DescriptorKeyLocator;
import com.enonic.xp.descriptor.DescriptorKeys;
import com.enonic.xp.descriptor.DescriptorLoader;
import com.enonic.xp.icon.Icon;
import com.enonic.xp.descriptor.DescriptorKey;
import com.enonic.xp.resource.Resource;
import com.enonic.xp.resource.ResourceKey;
import com.enonic.xp.resource.ResourceService;

@Component(immediate = true)
public final class WidgetDescriptorLoader
implements DescriptorLoader<WidgetDescriptor>
public final class AdminExtensionDescriptorLoader
implements DescriptorLoader<AdminExtensionDescriptor>
{
private static final String PATH = "/admin/widgets";
private static final String PATH = "/admin/extensions";

private final ResourceService resourceService;

private final DescriptorKeyLocator descriptorKeyLocator;

@Activate
public WidgetDescriptorLoader( @Reference final ResourceService resourceService )
public AdminExtensionDescriptorLoader( @Reference final ResourceService resourceService )
{
this.resourceService = resourceService;
this.descriptorKeyLocator = new DescriptorKeyLocator( this.resourceService, PATH, false );
}

@Override
public Class<WidgetDescriptor> getType()
public Class<AdminExtensionDescriptor> getType()
{
return WidgetDescriptor.class;
return AdminExtensionDescriptor.class;
}

@Override
Expand All @@ -49,43 +49,30 @@ public DescriptorKeys find( final ApplicationKey key )
@Override
public ResourceKey toResource( final DescriptorKey key )
{
return ResourceKey.from( key.getApplicationKey(), PATH + "/" + key.getName() + "/" + key.getName() + ".xml" );
return ResourceKey.from( key.getApplicationKey(), PATH + "/" + key.getName() + "/" + key.getName() + ".yml" );
}

@Override
public WidgetDescriptor load( final DescriptorKey key, final Resource resource )
public AdminExtensionDescriptor load( final DescriptorKey key, final Resource resource )
{
final WidgetDescriptor.Builder builder = WidgetDescriptor.create();
builder.key( key );

final String descriptorXml = resource.readString();
parseXml( key.getApplicationKey(), builder, descriptorXml );
final Icon icon = loadIcon( key );
builder.setIcon( icon );
return builder.build();
return YmlAdminExtensionDescriptorParser.parse( resource.readString(), key.getApplicationKey() )
.key( key )
.setIcon( loadIcon( key ) )
.build();
}

@Override
public WidgetDescriptor createDefault( final DescriptorKey key )
public AdminExtensionDescriptor createDefault( final DescriptorKey key )
{
return WidgetDescriptor.create().key( key ).displayName( key.getName() ).build();
return AdminExtensionDescriptor.create().key( key ).displayName( key.getName() ).build();
}

@Override
public WidgetDescriptor postProcess( final WidgetDescriptor descriptor )
public AdminExtensionDescriptor postProcess( final AdminExtensionDescriptor descriptor )
{
return descriptor;
}

private void parseXml( final ApplicationKey applicationKey, final WidgetDescriptor.Builder builder, final String xml )
{
final XmlWidgetDescriptorParser parser = new XmlWidgetDescriptorParser();
parser.builder( builder );
parser.currentApplication( applicationKey );
parser.source( xml );
parser.parse();
}

private Icon loadIcon( final DescriptorKey key )
{
final String iconPath = PATH + "/" + key.getName() + "/" + key.getName() + ".svg";
Expand Down
Loading