diff --git a/licket-common/src/main/java/org/licket/core/optional/ElseConsumer.java b/licket-common/src/main/java/org/licket/core/optional/ElseConsumer.java new file mode 100644 index 0000000..0a7937b --- /dev/null +++ b/licket-common/src/main/java/org/licket/core/optional/ElseConsumer.java @@ -0,0 +1,10 @@ +package org.licket.core.optional; + +/** + * @author lukaszgrabski + */ +@FunctionalInterface +public interface ElseConsumer { + + void doElse() throws Throwable; +} diff --git a/licket-common/src/main/java/org/licket/core/optional/OptionalExt.java b/licket-common/src/main/java/org/licket/core/optional/OptionalExt.java new file mode 100644 index 0000000..d36cc4b --- /dev/null +++ b/licket-common/src/main/java/org/licket/core/optional/OptionalExt.java @@ -0,0 +1,34 @@ +package org.licket.core.optional; + +import java.util.Optional; +import java.util.function.Consumer; + +/** + * @author lukaszgrabski + */ +public class OptionalExt { + + private Consumer elseConsumer; + + public static OptionalExt forOptional(Optional optional) { + return new OptionalExt(optional); + } + + private final Optional optional; + + public OptionalExt(Optional optional) { + this.optional = optional; + } + + public OptionalExt ifPresent(Consumer valueConsumer) { + optional.ifPresent(valueConsumer); + return this; + } + + public void orElse(ElseConsumer elseConsumer) throws Throwable { + if (optional.isPresent()) { + return; + } + elseConsumer.doElse(); + } +} diff --git a/licket-demo/src/main/java/org/licket/demo/licket/LicketConfiguration.java b/licket-demo/src/main/java/org/licket/demo/licket/LicketConfiguration.java index 0f94fc9..725a75c 100644 --- a/licket-demo/src/main/java/org/licket/demo/licket/LicketConfiguration.java +++ b/licket-demo/src/main/java/org/licket/demo/licket/LicketConfiguration.java @@ -1,6 +1,5 @@ package org.licket.demo.licket; -import org.licket.core.model.LicketComponentModel; import org.licket.core.resource.Resource; import org.licket.demo.resource.ApplicationCssResource; import org.licket.demo.view.AddContactForm; @@ -19,53 +18,54 @@ import org.springframework.util.IdGenerator; import org.springframework.util.JdkIdGenerator; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentModelProperty; import static org.licket.semantic.component.modal.ModalSettingsBuilder.builder; @Configuration @Import(SemanticUIPluginConfiguration.class) public class LicketConfiguration { - @LicketRootContainer - public ContactsAppRoot root() { - return new ContactsAppRoot("contacts-page"); - } + @LicketRootContainer + public ContactsAppRoot root() { + return new ContactsAppRoot("contacts-page"); + } - @LicketComponent - public ContactsPanel contactsPanel() { - return new ContactsPanel("contacts-panel"); - } + @LicketComponent + public ContactsPanel contactsPanel() { + return new ContactsPanel("contacts-panel"); + } - @LicketComponent - public ContactsList contactsList() { - return new ContactsList("contact", new LicketComponentModel("contacts")); - } + @LicketComponent + public ContactsList contactsList() { + return new ContactsList("contact", fromComponentModelProperty("contacts")); + } - @LicketComponent - public AddContactForm addContactForm() { - return new AddContactForm("new-contact-form"); - } + @LicketComponent + public AddContactForm addContactForm() { + return new AddContactForm("new-contact-form"); + } - @LicketComponent - public ViewContactPanel viewContactPanel() { - return new ViewContactPanel("view-contact-panel"); - } + @LicketComponent + public ViewContactPanel viewContactPanel() { + return new ViewContactPanel("view-contact-panel"); + } - private ModalSettings modalDialogSettings() { - return builder().showActions().build(); - } + private ModalSettings modalDialogSettings() { + return builder().showActions().build(); + } - @LicketComponent - public AddContactPanel addContactPanel() { - return new AddContactPanel("add-contact-panel", modalDialogSettings()); - } + @LicketComponent + public AddContactPanel addContactPanel() { + return new AddContactPanel("add-contact-panel", modalDialogSettings()); + } - @Bean - public IdGenerator idGenerator() { - return new JdkIdGenerator(); - } + @Bean + public IdGenerator idGenerator() { + return new JdkIdGenerator(); + } - @Bean - public Resource applicationCssResource() { - return new ApplicationCssResource(); - } + @Bean + public Resource applicationCssResource() { + return new ApplicationCssResource(); + } } diff --git a/licket-demo/src/main/java/org/licket/demo/view/AddContactForm.java b/licket-demo/src/main/java/org/licket/demo/view/AddContactForm.java index ee36417..7dbaed3 100644 --- a/licket-demo/src/main/java/org/licket/demo/view/AddContactForm.java +++ b/licket-demo/src/main/java/org/licket/demo/view/AddContactForm.java @@ -17,8 +17,8 @@ import java.util.function.BiConsumer; import static org.licket.core.model.LicketComponentModel.emptyComponentModel; -import static org.licket.core.model.LicketComponentModel.ofString; import static org.licket.core.view.LicketComponentView.internalTemplateView; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentModelProperty; /** * @author activey @@ -50,7 +50,7 @@ public final void onContactAdded(BiConsumer ca protected void onInitializeContainer() { add(new LicketInput("name")); add(new LicketInput("description")); - add(new AbstractLicketList("email", ofString("emails")) { + add(new AbstractLicketList("email", fromComponentModelProperty("emails")) { @Override protected void onInitializeContainer() { diff --git a/licket-demo/src/main/java/org/licket/demo/view/ContactsAppRoot.java b/licket-demo/src/main/java/org/licket/demo/view/ContactsAppRoot.java index a115c27..127657f 100644 --- a/licket-demo/src/main/java/org/licket/demo/view/ContactsAppRoot.java +++ b/licket-demo/src/main/java/org/licket/demo/view/ContactsAppRoot.java @@ -45,7 +45,6 @@ protected void onInitializeContainer() { @Override protected void onBeforeClick(ComponentFunctionCallback componentFunctionCallback) { dimmer.api(componentFunctionCallback).show(this); - } protected void onClick(Void modelObject) { @@ -56,7 +55,6 @@ protected void onClick(Void modelObject) { protected void onAfterClick(ComponentActionCallback componentActionCallback) { componentActionCallback.reload(contactsPanel); dimmer.api(componentActionCallback).hide(this); - } }); add(new AbstractLicketLink("add-contact") { diff --git a/licket-demo/src/main/java/org/licket/demo/view/ContactsList.java b/licket-demo/src/main/java/org/licket/demo/view/ContactsList.java index 9d7135a..d0542e1 100644 --- a/licket-demo/src/main/java/org/licket/demo/view/ContactsList.java +++ b/licket-demo/src/main/java/org/licket/demo/view/ContactsList.java @@ -1,7 +1,7 @@ package org.licket.demo.view; -import org.licket.core.model.LicketComponentModel; import org.licket.core.view.LicketLabel; +import org.licket.core.view.hippo.ComponentModelProperty; import org.licket.core.view.list.AbstractLicketList; import org.licket.core.view.media.LicketImage; import org.licket.core.view.mount.MountedComponentLink; @@ -11,29 +11,29 @@ import java.util.Optional; import static java.util.Optional.of; -import static org.licket.core.view.mount.params.MountingParamValueDecorator.fromParentModel; +import static org.licket.core.view.mount.params.MountingParamValueDecorator.fromParentModelProperty; public class ContactsList extends AbstractLicketList { - public ContactsList(String id, LicketComponentModel enclosingComponentPropertyModel) { - super(id, enclosingComponentPropertyModel); - } + public ContactsList(String id, ComponentModelProperty componentModelProperty) { + super(id, componentModelProperty); + } - @Override - protected void onInitializeContainer() { - add(new LicketImage("pictureUrl")); - add(new LicketLabel("name")); - add(new LicketLabel("description")); - add(new MountedComponentLink("view-contact", ViewContactPanel.class) { - @Override - protected void aggregateParams(MountingParamsAggregator paramsAggregator) { - paramsAggregator.name("id").value(fromParentModel("id")); - } - }); - } + @Override + protected void onInitializeContainer() { + add(new LicketImage("pictureUrl")); + add(new LicketLabel("name")); + add(new LicketLabel("description")); + add(new MountedComponentLink("view-contact", ViewContactPanel.class) { + @Override + protected void aggregateParams(MountingParamsAggregator paramsAggregator) { + paramsAggregator.name("id").value(fromParentModelProperty("id")); + } + }); + } - @Override - protected Optional keyPropertyName() { - return of("id"); - } + @Override + protected Optional keyPropertyName() { + return of("id"); + } } diff --git a/licket-demo/src/main/java/org/licket/demo/view/ContactsPanel.java b/licket-demo/src/main/java/org/licket/demo/view/ContactsPanel.java index 13f188b..149720c 100644 --- a/licket-demo/src/main/java/org/licket/demo/view/ContactsPanel.java +++ b/licket-demo/src/main/java/org/licket/demo/view/ContactsPanel.java @@ -14,28 +14,27 @@ */ public class ContactsPanel extends AbstractLicketMultiContainer { - @Autowired - private ContactsList contactsList; + @Autowired + private ContactsList contactsList; - @Autowired - private ContactsService contactsService; + @Autowired + private ContactsService contactsService; - public ContactsPanel(String id) { - super(id, Contacts.class, emptyComponentModel(), internalTemplateView()); - } + public ContactsPanel(String id) { + super(id, Contacts.class, emptyComponentModel(), internalTemplateView()); + } - @Override - protected void onInitializeContainer() { - add(contactsList); + @Override + protected void onInitializeContainer() { + add(contactsList); + readContacts(); + } - readContacts(); - } + private void readContacts() { + setComponentModelObject(fromIterable(contactsService.getAllContacts())); + } - private void readContacts() { - setComponentModelObject(fromIterable(contactsService.getAllContacts())); - } - - public void reloadList() { - readContacts(); - } + public void reloadList() { + readContacts(); + } } diff --git a/licket-demo/src/main/java/org/licket/demo/view/ViewContactPanel.java b/licket-demo/src/main/java/org/licket/demo/view/ViewContactPanel.java index c1c1039..2cf33a7 100644 --- a/licket-demo/src/main/java/org/licket/demo/view/ViewContactPanel.java +++ b/licket-demo/src/main/java/org/licket/demo/view/ViewContactPanel.java @@ -17,9 +17,9 @@ import java.util.Optional; import static org.licket.core.model.LicketComponentModel.ofModelObject; -import static org.licket.core.model.LicketComponentModel.ofString; import static org.licket.core.view.LicketComponentView.fromComponentClass; import static org.licket.core.view.LicketComponentView.internalTemplateView; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentModelProperty; /** * @author lukaszgrabski @@ -46,7 +46,7 @@ protected void onInitializeContainer() { protected void onInitializeContainer() { add(new LicketLabel("name")); add(new LicketLabel("description")); - add(new AbstractLicketList("email", ofString("emails")) { + add(new AbstractLicketList("email", fromComponentModelProperty("emails")) { @Override protected void onInitializeContainer() { diff --git a/licket-demo/src/main/java/org/licket/demo/view/modal/AddContactFormModalSection.java b/licket-demo/src/main/java/org/licket/demo/view/modal/AddContactFormModalSection.java index 743623f..48aa59d 100644 --- a/licket-demo/src/main/java/org/licket/demo/view/modal/AddContactFormModalSection.java +++ b/licket-demo/src/main/java/org/licket/demo/view/modal/AddContactFormModalSection.java @@ -11,8 +11,7 @@ public class AddContactFormModalSection extends AbstractLicketMonoContainer { public AddContactFormModalSection(String id) { - super(id, Void.class, emptyComponentModel(), - fromComponentClass(AddContactFormModalSection.class)); + super(id, Void.class, emptyComponentModel(), fromComponentClass(AddContactFormModalSection.class)); } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AbstractAstNodeBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AbstractAstNodeBuilder.java index a5d4ed4..422f71c 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AbstractAstNodeBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AbstractAstNodeBuilder.java @@ -7,5 +7,5 @@ */ public abstract class AbstractAstNodeBuilder { - public abstract T build(); + public abstract T build(); } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayElementGetBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayElementGetBuilder.java index 1189111..fcf8790 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayElementGetBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayElementGetBuilder.java @@ -9,40 +9,41 @@ */ public class ArrayElementGetBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder element; - private AbstractAstNodeBuilder target; - - private ArrayElementGetBuilder() {} - - public static ArrayElementGetBuilder arrayElementGet() { - return new ArrayElementGetBuilder(); - } - - public ArrayElementGetBuilder element(StringLiteralBuilder stringLiteral) { - this.element = stringLiteral; - return this; - } - - public ArrayElementGetBuilder element(String element) { - this.element = stringLiteral(element); - return this; - } - - public ArrayElementGetBuilder target(PropertyNameBuilder propertyName) { - this.target = propertyName; - return this; - } - - public ArrayElementGetBuilder target(AbstractAstNodeBuilder propertyName) { - this.target = propertyName; - return this; - } - - @Override - public ElementGet build() { - ElementGet elementGet = new ElementGet(); - elementGet.setElement(element.build()); - elementGet.setTarget(target.build()); - return elementGet; - } + private AbstractAstNodeBuilder element; + private AbstractAstNodeBuilder target; + + private ArrayElementGetBuilder() { + } + + public static ArrayElementGetBuilder arrayElementGet() { + return new ArrayElementGetBuilder(); + } + + public ArrayElementGetBuilder element(StringLiteralBuilder stringLiteral) { + this.element = stringLiteral; + return this; + } + + public ArrayElementGetBuilder element(String element) { + this.element = stringLiteral(element); + return this; + } + + public ArrayElementGetBuilder target(PropertyNameBuilder propertyName) { + this.target = propertyName; + return this; + } + + public ArrayElementGetBuilder target(AbstractAstNodeBuilder propertyName) { + this.target = propertyName; + return this; + } + + @Override + public ElementGet build() { + ElementGet elementGet = new ElementGet(); + elementGet.setElement(element.build()); + elementGet.setTarget(target.build()); + return elementGet; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayLiteralBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayLiteralBuilder.java index 1052049..d2b7303 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayLiteralBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ArrayLiteralBuilder.java @@ -1,8 +1,6 @@ package org.licket.framework.hippo; import org.mozilla.javascript.ast.ArrayLiteral; -import org.mozilla.javascript.ast.FunctionNode; -import org.mozilla.javascript.ast.PropertyGet; import java.util.LinkedList; import java.util.List; @@ -12,47 +10,44 @@ */ public class ArrayLiteralBuilder extends AbstractAstNodeBuilder { - private List elements = new LinkedList<>(); - - private ArrayLiteralBuilder() {} - - public static ArrayLiteralBuilder arrayLiteral() { - return new ArrayLiteralBuilder(); - } - - public ArrayLiteralBuilder element(ObjectLiteralBuilder objectLiteral) { - elements.add(objectLiteral); - return this; - } - - public ArrayLiteralBuilder element(NameBuilder name) { - elements.add(name); - return this; - } - - public ArrayLiteralBuilder element(PropertyNameBuilder propertyGet) { - elements.add(propertyGet); - return this; - } - - public ArrayLiteralBuilder element(FunctionNodeBuilder functionNode) { - elements.add(functionNode); - return this; - } - - public ArrayLiteralBuilder element(StringLiteralBuilder stringLiteralBuilder) { - elements.add(stringLiteralBuilder); - return this; - } - - @Override - public ArrayLiteral build() { - ArrayLiteral arrayLiteral = new ArrayLiteral(); - elements.forEach(element -> arrayLiteral.addElement(element.build())); - return arrayLiteral; - } - - public final int elementsSize() { - return elements.size(); - } + private List elements = new LinkedList<>(); + + private ArrayLiteralBuilder() { + } + + public static ArrayLiteralBuilder arrayLiteral() { + return new ArrayLiteralBuilder(); + } + + public ArrayLiteralBuilder element(ObjectLiteralBuilder objectLiteral) { + elements.add(objectLiteral); + return this; + } + + public ArrayLiteralBuilder element(NameBuilder name) { + elements.add(name); + return this; + } + + public ArrayLiteralBuilder element(PropertyNameBuilder propertyGet) { + elements.add(propertyGet); + return this; + } + + public ArrayLiteralBuilder element(FunctionNodeBuilder functionNode) { + elements.add(functionNode); + return this; + } + + public ArrayLiteralBuilder element(StringLiteralBuilder stringLiteralBuilder) { + elements.add(stringLiteralBuilder); + return this; + } + + @Override + public ArrayLiteral build() { + ArrayLiteral arrayLiteral = new ArrayLiteral(); + elements.forEach(element -> arrayLiteral.addElement(element.build())); + return arrayLiteral; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AssignmentBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AssignmentBuilder.java index 2ccc885..06c8a2c 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AssignmentBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/AssignmentBuilder.java @@ -9,36 +9,37 @@ */ public class AssignmentBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder left; - private AbstractAstNodeBuilder right; - - private AssignmentBuilder() {} - - public static AssignmentBuilder assignment() { - return new AssignmentBuilder(); - } - - public AssignmentBuilder left(NameBuilder nameBuilder) { - this.left = nameBuilder; - return this; - } - - public AssignmentBuilder left(PropertyNameBuilder propertyNameBuilder) { - this.left = propertyNameBuilder; - return this; - } - - public AssignmentBuilder right(AbstractAstNodeBuilder nodeBuilder) { - this.right = nodeBuilder; - return this; - } - - @Override - public Assignment build() { - Assignment assignment = new Assignment(); - assignment.setLeft(left.build()); - assignment.setRight(right.build()); - assignment.setOperator(ASSIGN); - return assignment; - } + private AbstractAstNodeBuilder left; + private AbstractAstNodeBuilder right; + + private AssignmentBuilder() { + } + + public static AssignmentBuilder assignment() { + return new AssignmentBuilder(); + } + + public AssignmentBuilder left(NameBuilder nameBuilder) { + this.left = nameBuilder; + return this; + } + + public AssignmentBuilder left(PropertyNameBuilder propertyNameBuilder) { + this.left = propertyNameBuilder; + return this; + } + + public AssignmentBuilder right(AbstractAstNodeBuilder nodeBuilder) { + this.right = nodeBuilder; + return this; + } + + @Override + public Assignment build() { + Assignment assignment = new Assignment(); + assignment.setLeft(left.build()); + assignment.setRight(right.build()); + assignment.setOperator(ASSIGN); + return assignment; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/BlockBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/BlockBuilder.java index e5a04d9..7ea6271 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/BlockBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/BlockBuilder.java @@ -11,58 +11,59 @@ */ public class BlockBuilder extends AbstractAstNodeBuilder { - private List statements = new LinkedList<>(); + private List statements = new LinkedList<>(); - private BlockBuilder() {} + private BlockBuilder() { + } - public static BlockBuilder block() { - return new BlockBuilder(); - } + public static BlockBuilder block() { + return new BlockBuilder(); + } - public BlockBuilder prependStatement(AbstractAstNodeBuilder statementBuilder) { - statements.add(0, statementBuilder); - return this; - } + public BlockBuilder prependStatement(AbstractAstNodeBuilder statementBuilder) { + statements.add(0, statementBuilder); + return this; + } - public BlockBuilder appendStatement(ReturnStatementBuilder statementBuilder) { - statements.add(statementBuilder); - return this; - } + public BlockBuilder appendStatement(ReturnStatementBuilder statementBuilder) { + statements.add(statementBuilder); + return this; + } - public BlockBuilder appendStatement(AbstractAstNodeBuilder statementBuilder) { - statements.add(statementBuilder); - return this; - } + public BlockBuilder appendStatement(AbstractAstNodeBuilder statementBuilder) { + statements.add(statementBuilder); + return this; + } - public BlockBuilder prependStatement(FunctionCallBuilder functionCallBuilder) { - statements.add(0, functionCallBuilder); - return this; - } + public BlockBuilder prependStatement(FunctionCallBuilder functionCallBuilder) { + statements.add(0, functionCallBuilder); + return this; + } - public BlockBuilder appendStatement(FunctionCallBuilder functionCallBuilder) { - statements.add(functionCallBuilder); - return this; - } + public BlockBuilder appendStatement(FunctionCallBuilder functionCallBuilder) { + statements.add(functionCallBuilder); + return this; + } - public BlockBuilder prependStatement(AssignmentBuilder assignment) { - statements.add(0, assignment); - return this; - } + public BlockBuilder prependStatement(AssignmentBuilder assignment) { + statements.add(0, assignment); + return this; + } - public BlockBuilder appendStatement(AssignmentBuilder assignment) { - statements.add(assignment); - return this; - } + public BlockBuilder appendStatement(AssignmentBuilder assignment) { + statements.add(assignment); + return this; + } - public BlockBuilder appendStatement(IfStatementBuilder ifStatement) { - statements.add(ifStatement); - return this; - } + public BlockBuilder appendStatement(IfStatementBuilder ifStatement) { + statements.add(ifStatement); + return this; + } - @Override - public Block build() { - Block block = new Block(); - statements.forEach(statement -> block.addStatement(statement.build())); - return block; - } + @Override + public Block build() { + Block block = new Block(); + statements.forEach(statement -> block.addStatement(statement.build())); + return block; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ConcatenateExpression.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ConcatenateExpression.java new file mode 100644 index 0000000..46d2b09 --- /dev/null +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ConcatenateExpression.java @@ -0,0 +1,40 @@ +package org.licket.framework.hippo; + +import org.mozilla.javascript.ast.InfixExpression; + +import static org.mozilla.javascript.Token.ADD; + +/** + * @author activey + */ +public class ConcatenateExpression extends AbstractAstNodeBuilder { + + private AbstractAstNodeBuilder left; + private AbstractAstNodeBuilder right; + + private ConcatenateExpression() { + } + + public static ConcatenateExpression concatenateExpression() { + return new ConcatenateExpression(); + } + + public ConcatenateExpression left(StringLiteralBuilder stringLiteralBuilder) { + this.left = stringLiteralBuilder; + return this; + } + + public ConcatenateExpression right(AbstractAstNodeBuilder nodeBuilder) { + this.right = nodeBuilder; + return this; + } + + @Override + public InfixExpression build() { + InfixExpression expression = new InfixExpression(); + expression.setLeft(left.build()); + expression.setRight(right.build()); + expression.setOperator(ADD); + return expression; + } +} diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/EqualCheckExpressionBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/EqualCheckExpressionBuilder.java index 2937d3f..e844bb0 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/EqualCheckExpressionBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/EqualCheckExpressionBuilder.java @@ -8,46 +8,68 @@ */ public class EqualCheckExpressionBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder left; - private AbstractAstNodeBuilder right; - - public static EqualCheckExpressionBuilder equalCheckExpression() { - return new EqualCheckExpressionBuilder(); - } - - private EqualCheckExpressionBuilder() {} - - public EqualCheckExpressionBuilder left(PropertyNameBuilder left) { - this.left = left; - return this; - } - - public EqualCheckExpressionBuilder left(NameBuilder left) { - this.left = left; - return this; - } - - public EqualCheckExpressionBuilder right(StringLiteralBuilder right) { - this.right = right; - return this; - } - - public EqualCheckExpressionBuilder right(PropertyNameBuilder right) { - this.right = right; - return this; - } - - public EqualCheckExpressionBuilder right(KeywordLiteralBuilder right) { - this.right = right; - return this; - } - - @Override - public InfixExpression build() { - InfixExpression infixExpression = new InfixExpression(); - infixExpression.setLeft(left.build()); - infixExpression.setRight(right.build()); - infixExpression.setOperator(Token.EQ); - return infixExpression; - } + private AbstractAstNodeBuilder left; + private AbstractAstNodeBuilder right; + private int operator = Token.EQ; + + private EqualCheckExpressionBuilder() { + } + + public static EqualCheckExpressionBuilder equalCheckExpression() { + return new EqualCheckExpressionBuilder(); + } + + public EqualCheckExpressionBuilder left(PropertyNameBuilder left) { + this.left = left; + return this; + } + + public EqualCheckExpressionBuilder left(FunctionCallBuilder left) { + this.left = left; + return this; + } + + public EqualCheckExpressionBuilder left(NameBuilder left) { + this.left = left; + return this; + } + + public EqualCheckExpressionBuilder left(ArrayElementGetBuilder left) { + this.left = left; + return this; + } + + public EqualCheckExpressionBuilder right(StringLiteralBuilder right) { + this.right = right; + return this; + } + + public EqualCheckExpressionBuilder right(NameBuilder right) { + this.right = right; + return this; + } + + public EqualCheckExpressionBuilder right(PropertyNameBuilder right) { + this.right = right; + return this; + } + + public EqualCheckExpressionBuilder right(KeywordLiteralBuilder right) { + this.right = right; + return this; + } + + public EqualCheckExpressionBuilder negative() { + this.operator = Token.NE; + return this; + } + + @Override + public InfixExpression build() { + InfixExpression infixExpression = new InfixExpression(); + infixExpression.setLeft(left.build()); + infixExpression.setRight(right.build()); + infixExpression.setOperator(operator); + return infixExpression; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ExpressionStatementBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ExpressionStatementBuilder.java index a748a83..f40f77c 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ExpressionStatementBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ExpressionStatementBuilder.java @@ -7,36 +7,36 @@ */ public class ExpressionStatementBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder expr; - - private ExpressionStatementBuilder(AbstractAstNodeBuilder expr) { - this.expr = expr; - } - - public static ExpressionStatementBuilder expressionStatement(VariableDeclarationBuilder variableDeclaration) { - return new ExpressionStatementBuilder(variableDeclaration); - } - - public static ExpressionStatementBuilder expressionStatement(FunctionCallBuilder functionCallBuilder) { - return new ExpressionStatementBuilder(functionCallBuilder); - } - - public static ExpressionStatementBuilder expressionStatement(AssignmentBuilder assignmentBuilder) { - return new ExpressionStatementBuilder(assignmentBuilder); - } - - public static ExpressionStatementBuilder expressionStatement(IfStatementBuilder ifStatementBuilder) { - return new ExpressionStatementBuilder(ifStatementBuilder); - } - - public static ExpressionStatementBuilder expressionStatement(ReturnStatementBuilder returnStatement) { - return new ExpressionStatementBuilder(returnStatement); - } - - @Override - public ExpressionStatement build() { - ExpressionStatement expressionStatement = new ExpressionStatement(); - expressionStatement.setExpression(expr.build()); - return expressionStatement; - } + private AbstractAstNodeBuilder expr; + + private ExpressionStatementBuilder(AbstractAstNodeBuilder expr) { + this.expr = expr; + } + + public static ExpressionStatementBuilder expressionStatement(VariableDeclarationBuilder variableDeclaration) { + return new ExpressionStatementBuilder(variableDeclaration); + } + + public static ExpressionStatementBuilder expressionStatement(FunctionCallBuilder functionCallBuilder) { + return new ExpressionStatementBuilder(functionCallBuilder); + } + + public static ExpressionStatementBuilder expressionStatement(AssignmentBuilder assignmentBuilder) { + return new ExpressionStatementBuilder(assignmentBuilder); + } + + public static ExpressionStatementBuilder expressionStatement(IfStatementBuilder ifStatementBuilder) { + return new ExpressionStatementBuilder(ifStatementBuilder); + } + + public static ExpressionStatementBuilder expressionStatement(ReturnStatementBuilder returnStatement) { + return new ExpressionStatementBuilder(returnStatement); + } + + @Override + public ExpressionStatement build() { + ExpressionStatement expressionStatement = new ExpressionStatement(); + expressionStatement.setExpression(expr.build()); + return expressionStatement; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionCallBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionCallBuilder.java index f5552d4..9a2260d 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionCallBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionCallBuilder.java @@ -11,80 +11,86 @@ */ public class FunctionCallBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder target; - private List arguments = new ArrayList(); - - private FunctionCallBuilder() {} - - public static FunctionCallBuilder functionCall() { - return new FunctionCallBuilder(); - } - - public FunctionCallBuilder target(ParenthesizedExpressionBuilder parenthesizedExpressionBuilder) { - this.target = parenthesizedExpressionBuilder; - return this; - } - - public FunctionCallBuilder target(PropertyNameBuilder propertyNameBuilder) { - this.target = propertyNameBuilder; - return this; - } - - public FunctionCallBuilder target(NameBuilder nameBuilder) { - this.target = nameBuilder; - return this; - } - - public FunctionCallBuilder argument(AbstractAstNodeBuilder objectLiteral) { - arguments.add(objectLiteral); - return this; - } - - public FunctionCallBuilder argument(NameBuilder nameBuilder) { - arguments.add(nameBuilder); - return this; - } - - public FunctionCallBuilder argument(FunctionNodeBuilder functionNodeBuilder) { - arguments.add(functionNodeBuilder); - return this; - } - - public FunctionCallBuilder argument(FunctionCallBuilder functionCallBuilder) { - arguments.add(functionCallBuilder); - return this; - } - - public FunctionCallBuilder argument(StringLiteralBuilder stringLiteralBuilder) { - arguments.add(stringLiteralBuilder); - return this; - } - - public FunctionCallBuilder argument(PropertyNameBuilder propertyNameBuilder) { - arguments.add(propertyNameBuilder); - return this; - } - - public FunctionCallBuilder argument(OrExpressionBuilder orExpressionBuilder) { - arguments.add(orExpressionBuilder); - return this; - } - - public FunctionCallBuilder argument(ArrayElementGetBuilder arrayElementGetBuilder) { - arguments.add(arrayElementGetBuilder); - return this; - } - - public FunctionCallBuilder argument(KeywordLiteralBuilder keywordLiteralBuilder) { - arguments.add(keywordLiteralBuilder); - return this; - } - - @Override - public FunctionCall build() { - FunctionCall functionCall = new FunctionCall(); - functionCall.setTarget(target.build()); - arguments.forEach(argument -> functionCall.addArgument(argument.build())); - return functionCall; - } + private AbstractAstNodeBuilder target; + private List arguments = new ArrayList(); + + private FunctionCallBuilder() { + } + + public static FunctionCallBuilder functionCall() { + return new FunctionCallBuilder(); + } + + public FunctionCallBuilder target(ParenthesizedExpressionBuilder parenthesizedExpressionBuilder) { + this.target = parenthesizedExpressionBuilder; + return this; + } + + public FunctionCallBuilder target(PropertyNameBuilder propertyNameBuilder) { + this.target = propertyNameBuilder; + return this; + } + + public FunctionCallBuilder target(NameBuilder nameBuilder) { + this.target = nameBuilder; + return this; + } + + public FunctionCallBuilder argument(AbstractAstNodeBuilder objectLiteral) { + arguments.add(objectLiteral); + return this; + } + + public FunctionCallBuilder argument(NameBuilder nameBuilder) { + arguments.add(nameBuilder); + return this; + } + + public FunctionCallBuilder argument(FunctionNodeBuilder functionNodeBuilder) { + arguments.add(functionNodeBuilder); + return this; + } + + public FunctionCallBuilder argument(FunctionCallBuilder functionCallBuilder) { + arguments.add(functionCallBuilder); + return this; + } + + public FunctionCallBuilder argument(StringLiteralBuilder stringLiteralBuilder) { + arguments.add(stringLiteralBuilder); + return this; + } + + public FunctionCallBuilder argument(PropertyNameBuilder propertyNameBuilder) { + arguments.add(propertyNameBuilder); + return this; + } + + public FunctionCallBuilder argument(OrExpressionBuilder orExpressionBuilder) { + arguments.add(orExpressionBuilder); + return this; + } + + public FunctionCallBuilder argument(ArrayElementGetBuilder arrayElementGetBuilder) { + arguments.add(arrayElementGetBuilder); + return this; + } + + public FunctionCallBuilder argument(KeywordLiteralBuilder keywordLiteralBuilder) { + arguments.add(keywordLiteralBuilder); + return this; + } + + public FunctionCallBuilder argument(ConcatenateExpression infixExpressionBuilder) { + arguments.add(infixExpressionBuilder); + return this; + } + + @Override + public FunctionCall build() { + FunctionCall functionCall = new FunctionCall(); + functionCall.setTarget(target.build()); + arguments.forEach(argument -> functionCall.addArgument(argument.build())); + return functionCall; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionNodeBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionNodeBuilder.java index e219960..483a622 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionNodeBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/FunctionNodeBuilder.java @@ -12,30 +12,31 @@ */ public class FunctionNodeBuilder extends AbstractAstNodeBuilder { - private List paramBuilders = new ArrayList(); - private BlockBuilder blockBuilder = block(); - - private FunctionNodeBuilder() {} - - public static FunctionNodeBuilder functionNode() { - return new FunctionNodeBuilder(); - } - - public FunctionNodeBuilder param(NameBuilder paramNameBuilder) { - paramBuilders.add(paramNameBuilder); - return this; - } - - public FunctionNodeBuilder body(BlockBuilder blockBuilder) { - this.blockBuilder = blockBuilder; - return this; - } - - @Override - public FunctionNode build() { - FunctionNode functionNode = new FunctionNode(); - paramBuilders.forEach(paramBuilder -> functionNode.addParam(paramBuilder.build())); - functionNode.setBody(blockBuilder.build()); - return functionNode; - } + private List paramBuilders = new ArrayList(); + private BlockBuilder blockBuilder = block(); + + private FunctionNodeBuilder() { + } + + public static FunctionNodeBuilder functionNode() { + return new FunctionNodeBuilder(); + } + + public FunctionNodeBuilder param(NameBuilder paramNameBuilder) { + paramBuilders.add(paramNameBuilder); + return this; + } + + public FunctionNodeBuilder body(BlockBuilder blockBuilder) { + this.blockBuilder = blockBuilder; + return this; + } + + @Override + public FunctionNode build() { + FunctionNode functionNode = new FunctionNode(); + paramBuilders.forEach(paramBuilder -> functionNode.addParam(paramBuilder.build())); + functionNode.setBody(blockBuilder.build()); + return functionNode; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/IfStatementBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/IfStatementBuilder.java index 0aa26a0..be44281 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/IfStatementBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/IfStatementBuilder.java @@ -8,48 +8,49 @@ */ public class IfStatementBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder condition; - private AbstractAstNodeBuilder thenStatement; - - public static IfStatementBuilder ifStatement() { - return new IfStatementBuilder(); - } - - private IfStatementBuilder() {} - - public IfStatementBuilder condition(EqualCheckExpressionBuilder condition) { - this.condition = condition; - return this; - } - - public IfStatementBuilder condition(NotEqualCheckExpressionBuilder condition) { - this.condition = condition; - return this; - } - - public IfStatementBuilder then(AssignmentBuilder then) { - this.thenStatement = then; - return this; - } - - public IfStatementBuilder then(ReturnStatementBuilder then) { - this.thenStatement = then; - return this; - } - - public IfStatementBuilder then(BlockBuilder then) { - this.thenStatement = then; - return this; - } - - @Override - public IfStatement build() { - IfStatement ifStatement = new IfStatement(); - ifStatement.setCondition(condition.build()); - - AstNode thenNode = thenStatement.build(); + private AbstractAstNodeBuilder condition; + private AbstractAstNodeBuilder thenStatement; + + private IfStatementBuilder() { + } + + public static IfStatementBuilder ifStatement() { + return new IfStatementBuilder(); + } + + public IfStatementBuilder condition(EqualCheckExpressionBuilder condition) { + this.condition = condition; + return this; + } + + public IfStatementBuilder condition(NotEqualCheckExpressionBuilder condition) { + this.condition = condition; + return this; + } + + public IfStatementBuilder then(AssignmentBuilder then) { + this.thenStatement = then; + return this; + } + + public IfStatementBuilder then(ReturnStatementBuilder then) { + this.thenStatement = then; + return this; + } + + public IfStatementBuilder then(BlockBuilder then) { + this.thenStatement = then; + return this; + } + + @Override + public IfStatement build() { + IfStatement ifStatement = new IfStatement(); + ifStatement.setCondition(condition.build()); + + AstNode thenNode = thenStatement.build(); // thenNode.setType(Token.BLOCK); - ifStatement.setThenPart(thenNode); - return ifStatement; - } + ifStatement.setThenPart(thenNode); + return ifStatement; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/KeywordLiteralBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/KeywordLiteralBuilder.java index 0705361..6794e39 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/KeywordLiteralBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/KeywordLiteralBuilder.java @@ -8,28 +8,28 @@ */ public class KeywordLiteralBuilder extends AbstractAstNodeBuilder { - private int tokenValue; - - private KeywordLiteralBuilder(int tokenValue) { - this.tokenValue = tokenValue; - } - - public static KeywordLiteralBuilder thisLiteral() { - return new KeywordLiteralBuilder(Token.THIS); - } - - public static KeywordLiteralBuilder trueLiteral() { - return new KeywordLiteralBuilder(Token.TRUE); - } - - public static KeywordLiteralBuilder falseLiteral() { - return new KeywordLiteralBuilder(Token.FALSE); - } - - @Override - public KeywordLiteral build() { - KeywordLiteral keywordLiteral = new KeywordLiteral(); - keywordLiteral.setType(tokenValue); - return keywordLiteral; - } + private int tokenValue; + + private KeywordLiteralBuilder(int tokenValue) { + this.tokenValue = tokenValue; + } + + public static KeywordLiteralBuilder thisLiteral() { + return new KeywordLiteralBuilder(Token.THIS); + } + + public static KeywordLiteralBuilder trueLiteral() { + return new KeywordLiteralBuilder(Token.TRUE); + } + + public static KeywordLiteralBuilder falseLiteral() { + return new KeywordLiteralBuilder(Token.FALSE); + } + + @Override + public KeywordLiteral build() { + KeywordLiteral keywordLiteral = new KeywordLiteral(); + keywordLiteral.setType(tokenValue); + return keywordLiteral; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NameBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NameBuilder.java index da7ed3b..8a496de 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NameBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NameBuilder.java @@ -7,20 +7,20 @@ */ public class NameBuilder extends AbstractAstNodeBuilder { - private String identifier; + private String identifier; - private NameBuilder(String identifier) { - this.identifier = identifier; - } + private NameBuilder(String identifier) { + this.identifier = identifier; + } - public static NameBuilder name(String identifier) { - return new NameBuilder(identifier); - } + public static NameBuilder name(String identifier) { + return new NameBuilder(identifier); + } - @Override - public Name build() { - Name name = new Name(); - name.setIdentifier(identifier); - return name; - } + @Override + public Name build() { + Name name = new Name(); + name.setIdentifier(identifier); + return name; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NewExpressionBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NewExpressionBuilder.java index 7e2d27d..49ceeb0 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NewExpressionBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NewExpressionBuilder.java @@ -1,54 +1,60 @@ package org.licket.framework.hippo; +import org.mozilla.javascript.ast.NewExpression; + import java.util.LinkedList; import java.util.List; -import org.mozilla.javascript.ast.NewExpression; - /** * @author activey */ public class NewExpressionBuilder extends AbstractAstNodeBuilder { - private List> arguments = new LinkedList<>(); - private AbstractAstNodeBuilder target; - - private NewExpressionBuilder() {} - - public static NewExpressionBuilder newExpression() { - return new NewExpressionBuilder(); - } - - public NewExpressionBuilder target(PropertyNameBuilder property) { - this.target = property; - return this; - } - - public NewExpressionBuilder target(NameBuilder name) { - this.target = name; - return this; - } - - public NewExpressionBuilder argument(NameBuilder name) { - arguments.add(name); - return this; - } - - public NewExpressionBuilder argument(ObjectLiteralBuilder objectLiteral) { - arguments.add(objectLiteral); - return this; - } - - public NewExpressionBuilder argument(PropertyNameBuilder propertyBuilder) { - arguments.add(propertyBuilder); - return this; - } - - @Override - public NewExpression build() { - NewExpression newExpression = new NewExpression(); - newExpression.setTarget(target.build()); - arguments.forEach(argument -> newExpression.addArgument(argument.build())); - return newExpression; - } + private List> arguments = new LinkedList<>(); + private AbstractAstNodeBuilder target; + + private NewExpressionBuilder() { + } + + public static NewExpressionBuilder newExpression() { + return new NewExpressionBuilder(); + } + + public NewExpressionBuilder target(PropertyNameBuilder property) { + this.target = property; + return this; + } + + public NewExpressionBuilder target(NameBuilder name) { + this.target = name; + return this; + } + + public NewExpressionBuilder argument(NameBuilder name) { + arguments.add(name); + return this; + } + + public NewExpressionBuilder argument(ObjectLiteralBuilder objectLiteral) { + arguments.add(objectLiteral); + return this; + } + + public NewExpressionBuilder argument(PropertyNameBuilder propertyBuilder) { + arguments.add(propertyBuilder); + return this; + } + + public NewExpressionBuilder argument(StringLiteralBuilder stringLiteralBuilder) { + arguments.add(stringLiteralBuilder); + return this; + } + + @Override + public NewExpression build() { + NewExpression newExpression = new NewExpression(); + newExpression.setTarget(target.build()); + arguments.forEach(argument -> newExpression.addArgument(argument.build())); + return newExpression; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NotEqualCheckExpressionBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NotEqualCheckExpressionBuilder.java index 76e321d..43699b2 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NotEqualCheckExpressionBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/NotEqualCheckExpressionBuilder.java @@ -8,46 +8,47 @@ */ public class NotEqualCheckExpressionBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder left; - private AbstractAstNodeBuilder right; - - public static NotEqualCheckExpressionBuilder notEqualCheckExpression() { - return new NotEqualCheckExpressionBuilder(); - } - - private NotEqualCheckExpressionBuilder() {} - - public NotEqualCheckExpressionBuilder left(PropertyNameBuilder left) { - this.left = left; - return this; - } - - public NotEqualCheckExpressionBuilder left(NameBuilder left) { - this.left = left; - return this; - } - - public NotEqualCheckExpressionBuilder right(StringLiteralBuilder right) { - this.right = right; - return this; - } - - public NotEqualCheckExpressionBuilder right(PropertyNameBuilder right) { - this.right = right; - return this; - } - - public NotEqualCheckExpressionBuilder right(KeywordLiteralBuilder right) { - this.right = right; - return this; - } - - @Override - public InfixExpression build() { - InfixExpression infixExpression = new InfixExpression(); - infixExpression.setLeft(left.build()); - infixExpression.setRight(right.build()); - infixExpression.setOperator(Token.NE); - return infixExpression; - } + private AbstractAstNodeBuilder left; + private AbstractAstNodeBuilder right; + + private NotEqualCheckExpressionBuilder() { + } + + public static NotEqualCheckExpressionBuilder notEqualCheckExpression() { + return new NotEqualCheckExpressionBuilder(); + } + + public NotEqualCheckExpressionBuilder left(PropertyNameBuilder left) { + this.left = left; + return this; + } + + public NotEqualCheckExpressionBuilder left(NameBuilder left) { + this.left = left; + return this; + } + + public NotEqualCheckExpressionBuilder right(StringLiteralBuilder right) { + this.right = right; + return this; + } + + public NotEqualCheckExpressionBuilder right(PropertyNameBuilder right) { + this.right = right; + return this; + } + + public NotEqualCheckExpressionBuilder right(KeywordLiteralBuilder right) { + this.right = right; + return this; + } + + @Override + public InfixExpression build() { + InfixExpression infixExpression = new InfixExpression(); + infixExpression.setLeft(left.build()); + infixExpression.setRight(right.build()); + infixExpression.setOperator(Token.NE); + return infixExpression; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectLiteralBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectLiteralBuilder.java index 68c4f39..0b74fb8 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectLiteralBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectLiteralBuilder.java @@ -1,6 +1,5 @@ package org.licket.framework.hippo; -import org.mozilla.javascript.ast.ArrayLiteral; import org.mozilla.javascript.ast.ObjectLiteral; import java.util.ArrayList; @@ -11,31 +10,32 @@ */ public class ObjectLiteralBuilder extends AbstractAstNodeBuilder { - private List properties = new ArrayList(); - private ObjectLiteral objectLiteral; + private List properties = new ArrayList(); + private ObjectLiteral objectLiteral; - private ObjectLiteralBuilder() {} + private ObjectLiteralBuilder() { + } - public static ObjectLiteralBuilder objectLiteral() { - return new ObjectLiteralBuilder(); - } + public static ObjectLiteralBuilder objectLiteral() { + return new ObjectLiteralBuilder(); + } - public ObjectLiteralBuilder objectProperty(ObjectPropertyBuilder objectProperty) { - properties.add(objectProperty); - return this; - } + public ObjectLiteralBuilder objectProperty(ObjectPropertyBuilder objectProperty) { + properties.add(objectProperty); + return this; + } - public ObjectLiteralBuilder fromObjectLiteral(ObjectLiteral objectLiteral) { - this.objectLiteral = objectLiteral; - return this; - } + public ObjectLiteralBuilder fromObjectLiteral(ObjectLiteral objectLiteral) { + this.objectLiteral = objectLiteral; + return this; + } - @Override - public ObjectLiteral build() { - if (objectLiteral == null) { - objectLiteral = new ObjectLiteral(); - } - properties.forEach(property -> objectLiteral.addElement(property.build())); - return objectLiteral; + @Override + public ObjectLiteral build() { + if (objectLiteral == null) { + objectLiteral = new ObjectLiteral(); } + properties.forEach(property -> objectLiteral.addElement(property.build())); + return objectLiteral; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectPropertyBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectPropertyBuilder.java index ea250d2..e5954eb 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectPropertyBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ObjectPropertyBuilder.java @@ -1,7 +1,6 @@ package org.licket.framework.hippo; -import org.mozilla.javascript.ast.ArrayLiteral; -import org.mozilla.javascript.ast.FunctionNode; +import org.mozilla.javascript.ast.InfixExpression; import org.mozilla.javascript.ast.ObjectProperty; /** @@ -9,71 +8,77 @@ */ public class ObjectPropertyBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder name; - - private AbstractAstNodeBuilder value; - - private ObjectPropertyBuilder() {} - - public static ObjectPropertyBuilder propertyBuilder() { - return new ObjectPropertyBuilder(); - } - - public ObjectPropertyBuilder name(NameBuilder name) { - this.name = name; - return this; - } - - public ObjectPropertyBuilder name(String name) { - this.name = NameBuilder.name(name); - return this; - } - - public ObjectPropertyBuilder name(StringLiteralBuilder stringLiteral) { - this.name = stringLiteral; - return this; - } - - public ObjectPropertyBuilder arrayValue(ArrayLiteralBuilder arrayLiteralBuilder) { - this.value = arrayLiteralBuilder; - return this; - } - - public ObjectPropertyBuilder value(NameBuilder name) { - this.value = name; - return this; - } - - public ObjectPropertyBuilder value(PropertyNameBuilder propertyGetBuilder) { - this.value = propertyGetBuilder; - return this; - } - - public ObjectPropertyBuilder value(StringLiteralBuilder literalBuilder) { - this.value = literalBuilder; - return this; - } - - public ObjectPropertyBuilder value(AbstractAstNodeBuilder functionNode) { - this.value = functionNode; - return this; - } - - public ObjectPropertyBuilder value(ObjectLiteralBuilder objectLiteral) { - this.value = objectLiteral; - return this; - } - - public ObjectPropertyBuilder value(ArrayLiteralBuilder props) { - this.value = props; - return this; - } - - @Override - public ObjectProperty build() { - ObjectProperty objectProperty = new ObjectProperty(); - objectProperty.setLeft(name.build()); - objectProperty.setRight(value.build()); - return objectProperty; - } + private AbstractAstNodeBuilder name; + + private AbstractAstNodeBuilder value; + + private ObjectPropertyBuilder() { + } + + public static ObjectPropertyBuilder propertyBuilder() { + return new ObjectPropertyBuilder(); + } + + public ObjectPropertyBuilder name(NameBuilder name) { + this.name = name; + return this; + } + + public ObjectPropertyBuilder name(String name) { + this.name = NameBuilder.name(name); + return this; + } + + public ObjectPropertyBuilder name(StringLiteralBuilder stringLiteral) { + this.name = stringLiteral; + return this; + } + + public ObjectPropertyBuilder arrayValue(ArrayLiteralBuilder arrayLiteralBuilder) { + this.value = arrayLiteralBuilder; + return this; + } + + public ObjectPropertyBuilder value(NameBuilder name) { + this.value = name; + return this; + } + + public ObjectPropertyBuilder value(PropertyNameBuilder propertyGetBuilder) { + this.value = propertyGetBuilder; + return this; + } + + public ObjectPropertyBuilder value(StringLiteralBuilder literalBuilder) { + this.value = literalBuilder; + return this; + } + + public ObjectPropertyBuilder value(FunctionNodeBuilder functionNode) { + this.value = functionNode; + return this; + } + + public ObjectPropertyBuilder value(ObjectLiteralBuilder objectLiteral) { + this.value = objectLiteral; + return this; + } + + public ObjectPropertyBuilder value(ArrayLiteralBuilder props) { + this.value = props; + return this; + } + + public ObjectPropertyBuilder value(AbstractAstNodeBuilder expressionBuilder) { + this.value = expressionBuilder; + return this; + } + + @Override + public ObjectProperty build() { + ObjectProperty objectProperty = new ObjectProperty(); + objectProperty.setLeft(name.build()); + objectProperty.setRight(value.build()); + return objectProperty; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/OrExpressionBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/OrExpressionBuilder.java index 4b3ec6c..fe660de 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/OrExpressionBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/OrExpressionBuilder.java @@ -9,31 +9,32 @@ */ public class OrExpressionBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder left; - private AbstractAstNodeBuilder right; - - private OrExpressionBuilder() {} - - public static OrExpressionBuilder orExpression() { - return new OrExpressionBuilder(); - } - - public OrExpressionBuilder left(PropertyNameBuilder propertyNameBuilder) { - this.left = propertyNameBuilder; - return this; - } - - public OrExpressionBuilder right(ParenthesizedExpressionBuilder expressionBuilder) { - this.right = expressionBuilder; - return this; - } - - @Override - public InfixExpression build() { - InfixExpression expression = new InfixExpression(); - expression.setOperator(OR); - expression.setLeft(left.build()); - expression.setRight(right.build()); - return expression; - } + private AbstractAstNodeBuilder left; + private AbstractAstNodeBuilder right; + + private OrExpressionBuilder() { + } + + public static OrExpressionBuilder orExpression() { + return new OrExpressionBuilder(); + } + + public OrExpressionBuilder left(PropertyNameBuilder propertyNameBuilder) { + this.left = propertyNameBuilder; + return this; + } + + public OrExpressionBuilder right(ParenthesizedExpressionBuilder expressionBuilder) { + this.right = expressionBuilder; + return this; + } + + @Override + public InfixExpression build() { + InfixExpression expression = new InfixExpression(); + expression.setOperator(OR); + expression.setLeft(left.build()); + expression.setRight(right.build()); + return expression; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ParenthesizedExpressionBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ParenthesizedExpressionBuilder.java index 3774723..0ec2fee 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ParenthesizedExpressionBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ParenthesizedExpressionBuilder.java @@ -7,24 +7,24 @@ */ public class ParenthesizedExpressionBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder nodeBuilder; + private AbstractAstNodeBuilder nodeBuilder; - private ParenthesizedExpressionBuilder(AbstractAstNodeBuilder nodeBuilder) { - this.nodeBuilder = nodeBuilder; - } + private ParenthesizedExpressionBuilder(AbstractAstNodeBuilder nodeBuilder) { + this.nodeBuilder = nodeBuilder; + } - public static ParenthesizedExpressionBuilder parenthesizedExpression(FunctionNodeBuilder functionNodeBuilder) { - return new ParenthesizedExpressionBuilder(functionNodeBuilder); - } + public static ParenthesizedExpressionBuilder parenthesizedExpression(FunctionNodeBuilder functionNodeBuilder) { + return new ParenthesizedExpressionBuilder(functionNodeBuilder); + } - public static ParenthesizedExpressionBuilder parenthesizedAssignment(AssignmentBuilder assignmentBuilder) { - return new ParenthesizedExpressionBuilder(assignmentBuilder); - } + public static ParenthesizedExpressionBuilder parenthesizedAssignment(AssignmentBuilder assignmentBuilder) { + return new ParenthesizedExpressionBuilder(assignmentBuilder); + } - @Override - public ParenthesizedExpression build() { - ParenthesizedExpression expression = new ParenthesizedExpression(); - expression.setExpression(nodeBuilder.build()); - return expression; - } + @Override + public ParenthesizedExpression build() { + ParenthesizedExpression expression = new ParenthesizedExpression(); + expression.setExpression(nodeBuilder.build()); + return expression; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/PropertyNameBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/PropertyNameBuilder.java index 06dee27..aebd0f5 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/PropertyNameBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/PropertyNameBuilder.java @@ -9,35 +9,35 @@ */ public class PropertyNameBuilder extends AbstractAstNodeBuilder { - private final AbstractAstNodeBuilder left; - private NameBuilder right; - - private PropertyNameBuilder(AbstractAstNodeBuilder left, NameBuilder right) { - this.left = left; - this.right = right; - } - - public static PropertyNameBuilder property(AbstractAstNodeBuilder astNode, NameBuilder right) { - return new PropertyNameBuilder(astNode, right); - } - - public static PropertyNameBuilder property(AbstractAstNodeBuilder astNode, String right) { - return new PropertyNameBuilder(astNode, name(right)); - } - - public static PropertyNameBuilder property(String left, String right) { - return new PropertyNameBuilder(name(left), name(right)); - } - - public PropertyNameBuilder right(NameBuilder astNode) { - this.right = astNode; - return this; - } - - public PropertyGet build() { - PropertyGet propertyGet = new PropertyGet(); - propertyGet.setTarget(left.build()); - propertyGet.setProperty(right.build()); - return propertyGet; - } + private final AbstractAstNodeBuilder left; + private NameBuilder right; + + public PropertyNameBuilder(AbstractAstNodeBuilder left, NameBuilder right) { + this.left = left; + this.right = right; + } + + public static PropertyNameBuilder property(AbstractAstNodeBuilder astNode, NameBuilder right) { + return new PropertyNameBuilder(astNode, right); + } + + public static PropertyNameBuilder property(AbstractAstNodeBuilder astNode, String right) { + return new PropertyNameBuilder(astNode, name(right)); + } + + public static PropertyNameBuilder property(String left, String right) { + return new PropertyNameBuilder(name(left), name(right)); + } + + public PropertyNameBuilder right(NameBuilder astNode) { + this.right = astNode; + return this; + } + + public PropertyGet build() { + PropertyGet propertyGet = new PropertyGet(); + propertyGet.setTarget(left.build()); + propertyGet.setProperty(right.build()); + return propertyGet; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ReturnStatementBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ReturnStatementBuilder.java index 44c1fe5..1582aeb 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ReturnStatementBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/ReturnStatementBuilder.java @@ -8,35 +8,36 @@ */ public class ReturnStatementBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder returnValue; - - private ReturnStatementBuilder() {} - - public static ReturnStatementBuilder returnStatement() { - return new ReturnStatementBuilder(); - } - - public ReturnStatementBuilder returnValue(ObjectLiteralBuilder objectLiteral) { - this.returnValue = objectLiteral; - return this; - } - - public ReturnStatementBuilder returnValue(FunctionCallBuilder functionCall) { - this.returnValue = functionCall; - return this; - } - - public ReturnStatementBuilder returnValue(NameBuilder name) { - this.returnValue = name; - return this; - } - - @Override - public ReturnStatement build() { - ReturnStatement returnStatement = new ReturnStatement(); - if (returnValue != null) { - returnStatement.setReturnValue(returnValue.build()); - } - return returnStatement; + private AbstractAstNodeBuilder returnValue; + + private ReturnStatementBuilder() { + } + + public static ReturnStatementBuilder returnStatement() { + return new ReturnStatementBuilder(); + } + + public ReturnStatementBuilder returnValue(ObjectLiteralBuilder objectLiteral) { + this.returnValue = objectLiteral; + return this; + } + + public ReturnStatementBuilder returnValue(FunctionCallBuilder functionCall) { + this.returnValue = functionCall; + return this; + } + + public ReturnStatementBuilder returnValue(NameBuilder name) { + this.returnValue = name; + return this; + } + + @Override + public ReturnStatement build() { + ReturnStatement returnStatement = new ReturnStatement(); + if (returnValue != null) { + returnStatement.setReturnValue(returnValue.build()); } + return returnStatement; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/StringLiteralBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/StringLiteralBuilder.java index eba4211..ab2856b 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/StringLiteralBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/StringLiteralBuilder.java @@ -7,21 +7,27 @@ */ public class StringLiteralBuilder extends AbstractAstNodeBuilder { - private String value; + private String value; + private char quoteChar = '"'; - private StringLiteralBuilder(String value) { - this.value = value; - } + private StringLiteralBuilder(String value) { + this.value = value; + } - public static StringLiteralBuilder stringLiteral(String value) { - return new StringLiteralBuilder(value); - } + public static StringLiteralBuilder stringLiteral(String value) { + return new StringLiteralBuilder(value); + } - @Override - public StringLiteral build() { - StringLiteral stringLiteral = new StringLiteral(); - stringLiteral.setValue(value); - stringLiteral.setQuoteCharacter('"'); - return stringLiteral; - } + public StringLiteralBuilder quoteChar(char quoteChar) { + this.quoteChar = quoteChar; + return this; + } + + @Override + public StringLiteral build() { + StringLiteral stringLiteral = new StringLiteral(); + stringLiteral.setQuoteCharacter(quoteChar); + stringLiteral.setValue(value); + return stringLiteral; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableDeclarationBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableDeclarationBuilder.java index 9882a90..0f8288f 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableDeclarationBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableDeclarationBuilder.java @@ -10,23 +10,24 @@ */ public class VariableDeclarationBuilder extends AbstractAstNodeBuilder { - private List variableInitializers = new ArrayList<>(); - - private VariableDeclarationBuilder() {} - - public static VariableDeclarationBuilder variableDeclaration() { - return new VariableDeclarationBuilder(); - } - - public VariableDeclarationBuilder variable(VariableInitializerBuilder variableInitializer) { - variableInitializers.add(variableInitializer); - return this; - } - - @Override - public VariableDeclaration build() { - VariableDeclaration variableDeclaration = new VariableDeclaration(); - variableInitializers.forEach(variable -> variableDeclaration.addVariable(variable.build())); - return variableDeclaration; - } + private List variableInitializers = new ArrayList<>(); + + private VariableDeclarationBuilder() { + } + + public static VariableDeclarationBuilder variableDeclaration() { + return new VariableDeclarationBuilder(); + } + + public VariableDeclarationBuilder variable(VariableInitializerBuilder variableInitializer) { + variableInitializers.add(variableInitializer); + return this; + } + + @Override + public VariableDeclaration build() { + VariableDeclaration variableDeclaration = new VariableDeclaration(); + variableInitializers.forEach(variable -> variableDeclaration.addVariable(variable.build())); + return variableDeclaration; + } } diff --git a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableInitializerBuilder.java b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableInitializerBuilder.java index df78986..9c3b2f7 100644 --- a/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableInitializerBuilder.java +++ b/licket-framework-hippo/src/main/java/org/licket/framework/hippo/VariableInitializerBuilder.java @@ -7,30 +7,31 @@ */ public class VariableInitializerBuilder extends AbstractAstNodeBuilder { - private AbstractAstNodeBuilder target; - private AbstractAstNodeBuilder initializer; - - private VariableInitializerBuilder() {} - - public static VariableInitializerBuilder variableInitializer() { - return new VariableInitializerBuilder(); - } - - public VariableInitializerBuilder target(NameBuilder name) { - this.target = name; - return this; - } - - public VariableInitializerBuilder initializer(AbstractAstNodeBuilder initializer) { - this.initializer = initializer; - return this; - } - - @Override - public VariableInitializer build() { - VariableInitializer variableInitializer = new VariableInitializer(); - variableInitializer.setTarget(target.build()); - variableInitializer.setInitializer(initializer.build()); - return variableInitializer; - } + private AbstractAstNodeBuilder target; + private AbstractAstNodeBuilder initializer; + + private VariableInitializerBuilder() { + } + + public static VariableInitializerBuilder variableInitializer() { + return new VariableInitializerBuilder(); + } + + public VariableInitializerBuilder target(NameBuilder name) { + this.target = name; + return this; + } + + public VariableInitializerBuilder initializer(AbstractAstNodeBuilder initializer) { + this.initializer = initializer; + return this; + } + + @Override + public VariableInitializer build() { + VariableInitializer variableInitializer = new VariableInitializer(); + variableInitializer.setTarget(target.build()); + variableInitializer.setInitializer(initializer.build()); + return variableInitializer; + } } diff --git a/licket-framework-hippo/src/test/java/org/licket/framework/hippo/Testing.java b/licket-framework-hippo/src/test/java/org/licket/framework/hippo/Testing.java index b00cf58..856599f 100644 --- a/licket-framework-hippo/src/test/java/org/licket/framework/hippo/Testing.java +++ b/licket-framework-hippo/src/test/java/org/licket/framework/hippo/Testing.java @@ -53,7 +53,7 @@ public void test2() { @Test public void test() throws IOException { AstRoot astRoot = new Parser().parse( - new InputStreamReader(Test.class.getClassLoader().getResourceAsStream("TestSomething.js")), "test.js", 0); + new InputStreamReader(Test.class.getClassLoader().getResourceAsStream("TestConcatenate.js")), "test.js", 0); astRoot.forEach(visitor()); } diff --git a/licket-framework-hippo/src/test/resources/TestConcatenate.js b/licket-framework-hippo/src/test/resources/TestConcatenate.js new file mode 100644 index 0000000..f33900e --- /dev/null +++ b/licket-framework-hippo/src/test/resources/TestConcatenate.js @@ -0,0 +1 @@ +this.$parent.model.status === 'failed' \ No newline at end of file diff --git a/licket-framework-surface/src/main/java/org/licket/surface/SurfaceContext.java b/licket-framework-surface/src/main/java/org/licket/surface/SurfaceContext.java index 7d2f372..0038aba 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/SurfaceContext.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/SurfaceContext.java @@ -1,62 +1,61 @@ package org.licket.surface; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - import org.licket.core.id.CompositeId; import org.licket.surface.tag.ElementFactories; import org.licket.xml.Builder; import org.licket.xml.ParsingException; import org.licket.xml.dom.Document; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + import static org.licket.surface.SurfaceProcessingException.contentParsingException; import static org.licket.surface.SurfaceProcessingException.ioException; /** - * * @author activey */ public class SurfaceContext { - private final ElementFactories elementFactories; - private final CompositeId parentSurfaceContextRootId; - private boolean skipComments; - - public SurfaceContext(ElementFactories elementFactories, CompositeId parentSurfaceContextRootId) { - this.elementFactories = elementFactories; - this.parentSurfaceContextRootId = parentSurfaceContextRootId; + private final ElementFactories elementFactories; + private final CompositeId parentSurfaceContextRootId; + private boolean skipComments; + + public SurfaceContext(ElementFactories elementFactories, CompositeId parentSurfaceContextRootId) { + this.elementFactories = elementFactories; + this.parentSurfaceContextRootId = parentSurfaceContextRootId; + } + + public final void processTemplateContent(InputStream templateContent, OutputStream output) { + try { + Document document = processTemplateContent(templateContent); + document.toXML(output); + } catch (ParsingException e) { + throw contentParsingException(e); + } catch (IOException ie) { + throw ioException(ie); } - - public final void processTemplateContent(InputStream templateContent, OutputStream output) { - try { - Document document = processTemplateContent(templateContent); - document.toXML(output); - } catch (ParsingException e) { - throw contentParsingException(e); - } catch (IOException ie) { - throw ioException(ie); - } + } + + public final Document processTemplateContent(InputStream templateContent) { + try { + Builder builder = new Builder(new SurfaceNodeFactory(this, elementFactories)); + return builder.build(templateContent); + } catch (ParsingException e) { + throw contentParsingException(e); } + } - public final Document processTemplateContent(InputStream templateContent) { - try { - Builder builder = new Builder(new SurfaceNodeFactory(this, elementFactories)); - return builder.build(templateContent); - } catch (ParsingException e) { - throw contentParsingException(e); - } - } + public final boolean isSubContext() { + return parentSurfaceContextRootId != null; + } - public final boolean isSubContext() { - return parentSurfaceContextRootId != null; - } + public final boolean isSkipComments() { + return skipComments; + } - public final boolean isSkipComments() { - return skipComments; - } - - public final CompositeId getParentSurfaceContextRootId() { - return parentSurfaceContextRootId; - } + public final CompositeId getParentSurfaceContextRootId() { + return parentSurfaceContextRootId; + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/SurfaceNodeFactory.java b/licket-framework-surface/src/main/java/org/licket/surface/SurfaceNodeFactory.java index 2855066..019eae4 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/SurfaceNodeFactory.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/SurfaceNodeFactory.java @@ -1,6 +1,5 @@ package org.licket.surface; -import java.util.Optional; import org.licket.surface.attribute.BaseAttribute; import org.licket.surface.element.SurfaceElement; import org.licket.surface.tag.ElementFactories; @@ -11,74 +10,76 @@ import org.licket.xml.dom.NodeFactory; import org.licket.xml.dom.Nodes; +import java.util.Optional; + public class SurfaceNodeFactory extends NodeFactory { - private final SurfaceContext surfaceContext; - private ElementFactories elementFactories; - private SurfaceElement currentElement; + private final SurfaceContext surfaceContext; + private ElementFactories elementFactories; + private SurfaceElement currentElement; - public SurfaceNodeFactory(SurfaceContext surfaceContext, ElementFactories elementFactories) { - this.surfaceContext = surfaceContext; - this.elementFactories = elementFactories; - } + public SurfaceNodeFactory(SurfaceContext surfaceContext, ElementFactories elementFactories) { + this.surfaceContext = surfaceContext; + this.elementFactories = elementFactories; + } - @Override - public Element startMakingElement(String localName, String namespace) { - Optional elementFactoryOptional = elementFactories.getElementFactoryByNamespace(namespace); - if (!elementFactoryOptional.isPresent()) { - currentElement = new SurfaceElement(localName, namespace); - currentElement.start(); - return currentElement; - } - Optional elementOptional = elementFactoryOptional.get().createElement(localName); - if (elementOptional.isPresent()) { - currentElement = elementOptional.get(); - } else { - currentElement = elementFactoryOptional.get().createDefaultElement(localName); - } - currentElement.start(); - return currentElement; + @Override + public Element startMakingElement(String localName, String namespace) { + Optional elementFactoryOptional = elementFactories.getElementFactoryByNamespace(namespace); + if (!elementFactoryOptional.isPresent()) { + currentElement = new SurfaceElement(localName, namespace); + currentElement.start(); + return currentElement; } + Optional elementOptional = elementFactoryOptional.get().createElement(localName); + if (elementOptional.isPresent()) { + currentElement = elementOptional.get(); + } else { + currentElement = elementFactoryOptional.get().createDefaultElement(localName); + } + currentElement.start(); + return currentElement; + } - @Override - public Nodes makeComment(String data) { - if (surfaceContext.isSkipComments()) { - return new Nodes(); - } - return super.makeComment(data); + @Override + public Nodes makeComment(String data) { + if (surfaceContext.isSkipComments()) { + return new Nodes(); } + return super.makeComment(data); + } - @Override - public Nodes makeDocType(String rootElementName, String publicID, String systemID) { - if (surfaceContext.isSkipComments()) { - return new Nodes(); - } - return super.makeDocType(rootElementName, publicID, systemID); + @Override + public Nodes makeDocType(String rootElementName, String publicID, String systemID) { + if (surfaceContext.isSkipComments()) { + return new Nodes(); } + return super.makeDocType(rootElementName, publicID, systemID); + } - @Override - public Attribute makeAttribute(String name, String namespace, String value, Type type) { - Optional elementFactoryOptional = elementFactories.getElementFactoryByNamespace(namespace); - Attribute xmlAttribute = new Attribute(name, namespace, value); - if (!elementFactoryOptional.isPresent()) { - return xmlAttribute; - } - Optional attributeOptional = elementFactoryOptional.get() + @Override + public Attribute makeAttribute(String name, String namespace, String value, Type type) { + Optional elementFactoryOptional = elementFactories.getElementFactoryByNamespace(namespace); + Attribute xmlAttribute = new Attribute(name, namespace, value); + if (!elementFactoryOptional.isPresent()) { + return xmlAttribute; + } + Optional attributeOptional = elementFactoryOptional.get() .createAttribute(xmlAttribute.getLocalName()); - if (attributeOptional.isPresent()) { - BaseAttribute attribute = attributeOptional.get(); - attribute.setValue(value); - attribute.start(currentElement); + if (attributeOptional.isPresent()) { + BaseAttribute attribute = attributeOptional.get(); + attribute.setValue(value); + attribute.start(currentElement); - return attribute; - } - return xmlAttribute; + return attribute; } + return xmlAttribute; + } - @Override - public Element finishMakingElement(Element element) { - SurfaceElement finishingElement = (SurfaceElement) element; - finishingElement.finish(surfaceContext); - return finishingElement; - } + @Override + public Element finishMakingElement(Element element) { + SurfaceElement finishingElement = (SurfaceElement) element; + finishingElement.finish(surfaceContext); + return finishingElement; + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/SurfaceProcessingException.java b/licket-framework-surface/src/main/java/org/licket/surface/SurfaceProcessingException.java index 603da57..0ed4fde 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/SurfaceProcessingException.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/SurfaceProcessingException.java @@ -9,15 +9,15 @@ */ public class SurfaceProcessingException extends RuntimeException { - private SurfaceProcessingException(Throwable cause) { - super(cause); - } + private SurfaceProcessingException(Throwable cause) { + super(cause); + } - public static SurfaceProcessingException contentParsingException(ParsingException parsingException) { - return new SurfaceProcessingException(parsingException); - } + public static SurfaceProcessingException contentParsingException(ParsingException parsingException) { + return new SurfaceProcessingException(parsingException); + } - public static SurfaceProcessingException ioException(IOException ioException) { - return new SurfaceProcessingException(ioException); - } + public static SurfaceProcessingException ioException(IOException ioException) { + return new SurfaceProcessingException(ioException); + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/attribute/AttributeProvider.java b/licket-framework-surface/src/main/java/org/licket/surface/attribute/AttributeProvider.java index 9654a10..4427d5d 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/attribute/AttributeProvider.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/attribute/AttributeProvider.java @@ -5,21 +5,21 @@ */ public interface AttributeProvider { - String getLocalName(); + static AttributeProvider empty(String localName) { + return new AttributeProvider() { + @Override + public String getLocalName() { + return localName; + } - BaseAttribute provideAttribute(); + @Override + public BaseAttribute provideAttribute() { + return null; + } + }; + } - static AttributeProvider empty(String localName) { - return new AttributeProvider() { - @Override - public String getLocalName() { - return localName; - } + String getLocalName(); - @Override - public BaseAttribute provideAttribute() { - return null; - } - }; - } + BaseAttribute provideAttribute(); } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/attribute/BaseAttribute.java b/licket-framework-surface/src/main/java/org/licket/surface/attribute/BaseAttribute.java index 3a26fe6..80f4e9b 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/attribute/BaseAttribute.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/attribute/BaseAttribute.java @@ -8,21 +8,22 @@ */ public class BaseAttribute extends Attribute { - public BaseAttribute(String localName, String namespace) { - super(localName, namespace); - } + public BaseAttribute(String localName, String namespace) { + super(localName, namespace); + } - public BaseAttribute(String prefix, String localName, String namespace, Type type) { - super(prefix, localName, namespace, type); - } + public BaseAttribute(String prefix, String localName, String namespace, Type type) { + super(prefix, localName, namespace, type); + } - public BaseAttribute(String prefix, String localName, String namespace) { - super(prefix, localName, namespace); - } + public BaseAttribute(String prefix, String localName, String namespace) { + super(prefix, localName, namespace); + } - public final void start(SurfaceElement relatedElement) { - onStart(relatedElement); - } + public final void start(SurfaceElement relatedElement) { + onStart(relatedElement); + } - protected void onStart(SurfaceElement relatedElement) {} + protected void onStart(SurfaceElement relatedElement) { + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/element/ElementProvider.java b/licket-framework-surface/src/main/java/org/licket/surface/element/ElementProvider.java index 6159d50..f4c8064 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/element/ElementProvider.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/element/ElementProvider.java @@ -5,21 +5,21 @@ */ public interface ElementProvider { - String getLocalName(); + static ElementProvider empty(String localName) { + return new ElementProvider() { + @Override + public String getLocalName() { + return localName; + } - SurfaceElement provideElement(); + @Override + public SurfaceElement provideElement() { + return null; + } + }; + } - static ElementProvider empty(String localName) { - return new ElementProvider() { - @Override - public String getLocalName() { - return localName; - } + String getLocalName(); - @Override - public SurfaceElement provideElement() { - return null; - } - }; - } + SurfaceElement provideElement(); } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/element/ElementTraverser.java b/licket-framework-surface/src/main/java/org/licket/surface/element/ElementTraverser.java index dfe0dc5..ffa2419 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/element/ElementTraverser.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/element/ElementTraverser.java @@ -5,9 +5,9 @@ */ public interface ElementTraverser { - static ElementTraverser withComponentIdSet() { - return element -> element.isComponentIdSet(); - } + static ElementTraverser withComponentIdSet() { + return element -> element.isComponentIdSet(); + } - boolean elementMatch(SurfaceElement element); + boolean elementMatch(SurfaceElement element); } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/element/SurfaceElement.java b/licket-framework-surface/src/main/java/org/licket/surface/element/SurfaceElement.java index 77e9a65..a97504d 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/element/SurfaceElement.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/element/SurfaceElement.java @@ -1,96 +1,100 @@ package org.licket.surface.element; -import static java.util.Optional.empty; -import static java.util.Optional.of; -import static org.licket.core.id.CompositeId.fromStringValue; -import static org.licket.core.id.CompositeId.fromStringValueWithAdditionalParts; -import static org.licket.surface.element.ElementTraverser.withComponentIdSet; -import java.util.Optional; import org.licket.core.id.CompositeId; import org.licket.surface.SurfaceContext; import org.licket.surface.attribute.BaseAttribute; import org.licket.xml.dom.Element; import org.licket.xml.dom.Node; +import java.util.Optional; + +import static java.util.Optional.empty; +import static java.util.Optional.of; +import static org.licket.core.id.CompositeId.fromStringValue; +import static org.licket.core.id.CompositeId.fromStringValueWithAdditionalParts; +import static org.licket.surface.element.ElementTraverser.withComponentIdSet; + /** * @author activey */ public class SurfaceElement extends Element { - private String componentId; + private String componentId; - public SurfaceElement(String name, String namespace) { - super(name, namespace); - } + public SurfaceElement(String name, String namespace) { + super(name, namespace); + } - public final void finish(SurfaceContext surfaceContext) { - onFinish(surfaceContext); - } + public final void finish(SurfaceContext surfaceContext) { + onFinish(surfaceContext); + } - protected void onFinish(SurfaceContext surfaceContext) {} + protected void onFinish(SurfaceContext surfaceContext) { + } - public final BaseAttribute addAttribute(String attributeName, String attributeValue) { - BaseAttribute newAttribute = new BaseAttribute(attributeName, getNamespace()); - newAttribute.setValue(attributeValue); - addAttribute(newAttribute); - return newAttribute; - } + public final BaseAttribute addAttribute(String attributeName, String attributeValue) { + BaseAttribute newAttribute = new BaseAttribute(attributeName, getNamespace()); + newAttribute.setValue(attributeValue); + addAttribute(newAttribute); + return newAttribute; + } - public final void start() { - onStart(); - } + public final void start() { + onStart(); + } - protected void onStart() {} + protected void onStart() { + } - public final void addChildElement(Element surfaceElement) { - super.appendChildElement(surfaceElement); - } + public final void addChildElement(Element surfaceElement) { + super.appendChildElement(surfaceElement); + } - protected Optional traverseUp(ElementTraverser elementTraverser) { - SurfaceElement parent = getParentElement(); - if (parent == null) { - return empty(); - } - if (elementTraverser.elementMatch(parent)) { - return of(parent); - } - return parent.traverseUp(elementTraverser); + protected Optional traverseUp(ElementTraverser elementTraverser) { + SurfaceElement parent = getParentElement(); + if (parent == null) { + return empty(); } - - public final boolean isComponentIdSet() { - return componentId != null; + if (elementTraverser.elementMatch(parent)) { + return of(parent); } + return parent.traverseUp(elementTraverser); + } - public String getComponentId() { - return componentId; - } + public final boolean isComponentIdSet() { + return componentId != null; + } - public final void setComponentId(String componentId) { - this.componentId = componentId; - } + public String getComponentId() { + return componentId; + } - public final CompositeId getComponentCompositeId() { - if (!isComponentIdSet()) { - return null; - } - Optional parentOptional = traverseUp(withComponentIdSet()); - if (!parentOptional.isPresent()) { - return fromStringValue(componentId); - } - return fromStringValueWithAdditionalParts(parentOptional.get().getComponentCompositeId().getValue(), - componentId); - } + public final void setComponentId(String componentId) { + this.componentId = componentId; + } - protected SurfaceElement getParentElement() { - Node parentNode = getParent(); - if (parentNode instanceof SurfaceElement) { - return (SurfaceElement) parentNode; - } - return null; + public final CompositeId getComponentCompositeId() { + if (!isComponentIdSet()) { + return null; } + Optional parentOptional = traverseUp(withComponentIdSet()); + if (!parentOptional.isPresent()) { + return fromStringValue(componentId); + } + return fromStringValueWithAdditionalParts(parentOptional.get().getComponentCompositeId().getValue(), + componentId); + } - @Override - protected boolean writeEmpty() { - return true; + protected SurfaceElement getParentElement() { + Node parentNode = getParent(); + if (parentNode instanceof SurfaceElement) { + return (SurfaceElement) parentNode; } + return null; + } + + @Override + protected boolean writeEmpty() { + return true; + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/tag/AbstractElementFactory.java b/licket-framework-surface/src/main/java/org/licket/surface/tag/AbstractElementFactory.java index 27f060d..fa0daef 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/tag/AbstractElementFactory.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/tag/AbstractElementFactory.java @@ -1,49 +1,51 @@ package org.licket.surface.tag; +import org.licket.surface.attribute.AttributeProvider; +import org.licket.surface.attribute.BaseAttribute; +import org.licket.surface.element.ElementProvider; +import org.licket.surface.element.SurfaceElement; + +import java.util.Map; +import java.util.Optional; + import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Maps.newHashMap; import static java.util.Optional.ofNullable; import static org.licket.surface.element.ElementProvider.empty; -import java.util.Map; -import java.util.Optional; -import org.licket.surface.attribute.AttributeProvider; -import org.licket.surface.attribute.BaseAttribute; -import org.licket.surface.element.SurfaceElement; -import org.licket.surface.element.ElementProvider; /** * @author activey */ public abstract class AbstractElementFactory implements ElementFactory { - // TODO make it prettier ... - private Map elements = newHashMap(); - private Map attributes = newHashMap(); - private String namespace; + // TODO make it prettier ... + private Map elements = newHashMap(); + private Map attributes = newHashMap(); + private String namespace; - public AbstractElementFactory(String namespace) { - this.namespace = checkNotNull(namespace); - } + public AbstractElementFactory(String namespace) { + this.namespace = checkNotNull(namespace); + } - @Override - public final Optional createElement(String name) { - return ofNullable(ofNullable(elements.get(name)).orElse(empty(name)).provideElement()); - } + @Override + public final Optional createElement(String name) { + return ofNullable(ofNullable(elements.get(name)).orElse(empty(name)).provideElement()); + } - public final Optional createAttribute(String name) { - return ofNullable(ofNullable(attributes.get(name)).orElse(AttributeProvider.empty(name)).provideAttribute()); - } + public final Optional createAttribute(String name) { + return ofNullable(ofNullable(attributes.get(name)).orElse(AttributeProvider.empty(name)).provideAttribute()); + } - public void element(ElementProvider elementProvider) { - elements.put(elementProvider.getLocalName(), elementProvider); - } + public void element(ElementProvider elementProvider) { + elements.put(elementProvider.getLocalName(), elementProvider); + } - public void attribute(AttributeProvider attributeProvider) { - attributes.put(attributeProvider.getLocalName(), attributeProvider); - } + public void attribute(AttributeProvider attributeProvider) { + attributes.put(attributeProvider.getLocalName(), attributeProvider); + } - @Override - public final boolean matchesNamespace(String namespace) { - return this.namespace.equals(namespace); - } + @Override + public final boolean matchesNamespace(String namespace) { + return this.namespace.equals(namespace); + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactories.java b/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactories.java index 148af00..a0d1b7b 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactories.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactories.java @@ -9,9 +9,9 @@ */ public interface ElementFactories { - static ElementFactories serviceLoaderFactories() { - return new ServiceLoaderElementFactories(); - } + static ElementFactories serviceLoaderFactories() { + return new ServiceLoaderElementFactories(); + } - Optional getElementFactoryByNamespace(String namespace); + Optional getElementFactoryByNamespace(String namespace); } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactory.java b/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactory.java index 5c0891a..0944763 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactory.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactory.java @@ -10,11 +10,11 @@ */ public interface ElementFactory { - SurfaceElement createDefaultElement(String name); + SurfaceElement createDefaultElement(String name); - Optional createElement(String name); + Optional createElement(String name); - Optional createAttribute(String name); + Optional createAttribute(String name); - boolean matchesNamespace(String namespace); + boolean matchesNamespace(String namespace); } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactoryLoader.java b/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactoryLoader.java index a9ada01..39a71a9 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactoryLoader.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/tag/ElementFactoryLoader.java @@ -7,7 +7,7 @@ */ public class ElementFactoryLoader { - public static ServiceLoader loader() { - return ServiceLoader.load(ElementFactory.class); - } + public static ServiceLoader loader() { + return ServiceLoader.load(ElementFactory.class); + } } diff --git a/licket-framework-surface/src/main/java/org/licket/surface/tag/factories/ServiceLoaderElementFactories.java b/licket-framework-surface/src/main/java/org/licket/surface/tag/factories/ServiceLoaderElementFactories.java index 0f2ca42..8b7f16e 100644 --- a/licket-framework-surface/src/main/java/org/licket/surface/tag/factories/ServiceLoaderElementFactories.java +++ b/licket-framework-surface/src/main/java/org/licket/surface/tag/factories/ServiceLoaderElementFactories.java @@ -14,18 +14,18 @@ */ public class ServiceLoaderElementFactories implements ElementFactories { - private ServiceLoader loader; + private ServiceLoader loader; - public ServiceLoaderElementFactories() { - loadFactories(); - } + public ServiceLoaderElementFactories() { + loadFactories(); + } - private void loadFactories() { - loader = loader(); - } + private void loadFactories() { + loader = loader(); + } - @Override - public Optional getElementFactoryByNamespace(String namespace) { - return stream(loader.spliterator(), true).filter(factory -> factory.matchesNamespace(namespace)).findFirst(); - } + @Override + public Optional getElementFactoryByNamespace(String namespace) { + return stream(loader.spliterator(), true).filter(factory -> factory.matchesNamespace(namespace)).findFirst(); + } } diff --git a/licket-framework/pom.xml b/licket-framework/pom.xml index 8b0c863..6693be3 100644 --- a/licket-framework/pom.xml +++ b/licket-framework/pom.xml @@ -8,7 +8,6 @@ 0.0.1-SNAPSHOT 4.0.0 - licket-framework @@ -21,6 +20,11 @@ commons-beanutils 1.9.2 + + org.antlr + ST4 + 4.0.8 + org.springframework @@ -30,10 +34,16 @@ org.springframework spring-context + com.fasterxml.jackson.core jackson-databind + + io.jsonwebtoken + jjwt + 0.7.0 + org.jooq diff --git a/licket-framework/src/main/java/org/licket/core/DefaultLicketApplication.java b/licket-framework/src/main/java/org/licket/core/DefaultLicketApplication.java index 5690cff..bc61c6a 100644 --- a/licket-framework/src/main/java/org/licket/core/DefaultLicketApplication.java +++ b/licket-framework/src/main/java/org/licket/core/DefaultLicketApplication.java @@ -17,80 +17,80 @@ import static com.google.common.collect.Lists.newArrayList; import static org.licket.core.id.CompositeId.fromStringValue; -public class DefaultLicketApplication implements LicketApplication, Serializable { +public class DefaultLicketApplication implements LicketApplication, Serializable { - private final String name; + private final String name; - @Autowired - @Qualifier("root") - private LicketComponentContainer rootContainer; + @Autowired + @Qualifier("root") + private LicketComponentContainer rootContainer; - @Autowired - private List> allDeclaredComponents = newArrayList(); + @Autowired + private List> allDeclaredComponents = newArrayList(); - @Autowired - private List plugins = newArrayList(); + @Autowired + private List plugins = newArrayList(); - public DefaultLicketApplication(String name) { - this.name = name; - } - - @Override - public String getName() { - return name; - } - - @Override - public LicketComponentContainer rootComponentContainer() { - return rootContainer; - } + public DefaultLicketApplication(String name) { + this.name = name; + } - @Override - public Optional> findComponent(CompositeId compositeId) { - checkNotNull(rootContainer, "Can not find component definition annotated with @LicketRootContainer"); - Optional> licketComponentOptional = findComponent(rootContainer, compositeId); - if (licketComponentOptional.isPresent()) { - return licketComponentOptional; - } - - // looking in declared components, TODO include only those with @LicketMountPoint? - for (LicketComponent rootElement : allDeclaredComponents) { - if (rootElement.getCompositeId().equals(compositeId)) { - return Optional.of(rootElement); - } - licketComponentOptional = findComponent(rootElement, compositeId); - if (licketComponentOptional.isPresent()) { - return licketComponentOptional; - } - } - return Optional.empty(); - } + @Override + public String getName() { + return name; + } - private Optional> findComponent(LicketComponent rootElement, CompositeId compositeId) { - if (compositeId.current().equals(rootElement.getId())) { - compositeId.forward(); - ComponentChildLocator locator = new ComponentChildLocator(rootElement); - return locator.findByCompositeId(compositeId); - } - return Optional.empty(); - } + @Override + public LicketComponentContainer rootComponentContainer() { + return rootContainer; + } - @Override - public Optional> findComponent(String compositeIdValue) { - return findComponent(fromStringValue(compositeIdValue)); + @Override + public Optional> findComponent(CompositeId compositeId) { + checkNotNull(rootContainer, "Can not find component definition annotated with @LicketRootContainer"); + Optional> licketComponentOptional = findComponent(rootContainer, compositeId); + if (licketComponentOptional.isPresent()) { + return licketComponentOptional; } - @Override - public void traverseDown(Predicate> componentVisitor) { - allDeclaredComponents.forEach(mountedContainer -> { - if (componentVisitor.test(mountedContainer)) { - mountedContainer.traverseDown(componentVisitor); - } - }); + // looking in declared components, TODO include only those with @LicketMountPoint? + for (LicketComponent rootElement : allDeclaredComponents) { + if (rootElement.getCompositeId().equals(compositeId)) { + return Optional.of(rootElement); + } + licketComponentOptional = findComponent(rootElement, compositeId); + if (licketComponentOptional.isPresent()) { + return licketComponentOptional; + } } - - @Override - public final Iterable plugins() { - return plugins; + return Optional.empty(); + } + + private Optional> findComponent(LicketComponent rootElement, CompositeId compositeId) { + if (compositeId.current().equals(rootElement.getId())) { + compositeId.forward(); + ComponentChildLocator locator = new ComponentChildLocator(rootElement); + return locator.findByCompositeId(compositeId); } + return Optional.empty(); + } + + @Override + public Optional> findComponent(String compositeIdValue) { + return findComponent(fromStringValue(compositeIdValue)); + } + + @Override + public void traverseDown(Predicate> componentVisitor) { + allDeclaredComponents.forEach(mountedContainer -> { + if (componentVisitor.test(mountedContainer)) { + mountedContainer.traverseDown(componentVisitor); + } + }); + } + + @Override + public final Iterable plugins() { + return plugins; + } } diff --git a/licket-framework/src/main/java/org/licket/core/LicketApplication.java b/licket-framework/src/main/java/org/licket/core/LicketApplication.java index d6674f9..cfc0580 100644 --- a/licket-framework/src/main/java/org/licket/core/LicketApplication.java +++ b/licket-framework/src/main/java/org/licket/core/LicketApplication.java @@ -13,15 +13,15 @@ */ public interface LicketApplication { - String getName(); + String getName(); - LicketComponentContainer rootComponentContainer(); + LicketComponentContainer rootComponentContainer(); - Optional> findComponent(CompositeId compositeId); + Optional> findComponent(CompositeId compositeId); - Optional> findComponent(String compositeIdValue); + Optional> findComponent(String compositeIdValue); - void traverseDown(Predicate> componentVisitor); + void traverseDown(Predicate> componentVisitor); - Iterable plugins(); + Iterable plugins(); } diff --git a/licket-framework/src/main/java/org/licket/core/LicketApplicationLoadingException.java b/licket-framework/src/main/java/org/licket/core/LicketApplicationLoadingException.java index a19435d..e2f3b2a 100644 --- a/licket-framework/src/main/java/org/licket/core/LicketApplicationLoadingException.java +++ b/licket-framework/src/main/java/org/licket/core/LicketApplicationLoadingException.java @@ -5,19 +5,19 @@ */ public class LicketApplicationLoadingException extends RuntimeException { - public LicketApplicationLoadingException(String message) { - super(message); - } + public LicketApplicationLoadingException(String message) { + super(message); + } - public LicketApplicationLoadingException(String message, Throwable cause) { - super(message, cause); - } + public LicketApplicationLoadingException(String message, Throwable cause) { + super(message, cause); + } - public LicketApplicationLoadingException(Throwable cause) { - super(cause); - } + public LicketApplicationLoadingException(Throwable cause) { + super(cause); + } - public static LicketApplicationLoadingException missingConstructorError() { - return new LicketApplicationLoadingException("Unable to find page clazz with two parameters!"); - } + public static LicketApplicationLoadingException missingConstructorError() { + return new LicketApplicationLoadingException("Unable to find page clazz with two parameters!"); + } } diff --git a/licket-framework/src/main/java/org/licket/core/LicketUrls.java b/licket-framework/src/main/java/org/licket/core/LicketUrls.java new file mode 100644 index 0000000..5027026 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/LicketUrls.java @@ -0,0 +1,13 @@ +package org.licket.core; + +/** + * @author activey + */ +public class LicketUrls { + + public static final String CONTEXT_RESOURCES = "/licket/resource"; + public static final String CONTEXT_FORM = "/licket/form"; + public static final String CONTEXT_ACTION_LINK = "/licket/link"; + public static final String CONTEXT_COMPONENT = "/licket/component"; + public static final String CONTEXT_DEBUG = "/licket/debug"; +} diff --git a/licket-framework/src/main/java/org/licket/core/model/ComponentIdModel.java b/licket-framework/src/main/java/org/licket/core/model/ComponentIdModel.java deleted file mode 100644 index 9891eed..0000000 --- a/licket-framework/src/main/java/org/licket/core/model/ComponentIdModel.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.licket.core.model; - -/** - * @author activey - */ -public class ComponentIdModel extends LicketComponentModel { - - public ComponentIdModel(String componentId) { - super(componentId); - } -} diff --git a/licket-framework/src/main/java/org/licket/core/model/LicketComponentModel.java b/licket-framework/src/main/java/org/licket/core/model/LicketComponentModel.java index 5f8f8b9..faa102d 100644 --- a/licket-framework/src/main/java/org/licket/core/model/LicketComponentModel.java +++ b/licket-framework/src/main/java/org/licket/core/model/LicketComponentModel.java @@ -16,64 +16,64 @@ */ public class LicketComponentModel { - private static final Logger LOGGER = LoggerFactory.getLogger(LicketComponentModel.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LicketComponentModel.class); - private T modelObject; - private Supplier modelObjectSupplier; - private LicketComponentModelPatch modelPatch; + private T modelObject; + private Supplier modelObjectSupplier; + private LicketComponentModelPatch modelPatch; - public LicketComponentModel(T modelObject) { - this(of(modelObject)); - } + public LicketComponentModel(T modelObject) { + this(of(modelObject)); + } - public LicketComponentModel(Supplier modelObjectSupplier) { - this.modelObjectSupplier = modelObjectSupplier; - } + public LicketComponentModel(Supplier modelObjectSupplier) { + this.modelObjectSupplier = modelObjectSupplier; + } - public static LicketComponentModel ofString(String stringValue) { - return new LicketComponentModel<>(stringValue); - } + public static LicketComponentModel ofString(String stringValue) { + return new LicketComponentModel<>(stringValue); + } - public static LicketComponentModel emptyComponentModel() { - return new LicketComponentModel<>(() -> null); - } + public static LicketComponentModel emptyComponentModel() { + return new LicketComponentModel<>(() -> null); + } - public static LicketComponentModel ofModelObject(T modelObject) { - return new LicketComponentModel<>(modelObject); - } + public static LicketComponentModel ofModelObject(T modelObject) { + return new LicketComponentModel<>(modelObject); + } - public T get() { - if (modelObject == null) { - modelObject = modelObjectSupplier.get(); - } - return modelObject; + public T get() { + if (modelObject == null) { + modelObject = modelObjectSupplier.get(); } + return modelObject; + } - public void patch(Consumer contactConsumer) { - T contact = get(); - - ObjectMapper mapper = new ObjectMapper(); - try { - TreeNode node = mapper.valueToTree(contact); - T copy = mapper.treeToValue(node, (Class) contact.getClass()); - contactConsumer.accept(copy); + public void patch(Consumer contactConsumer) { + T contact = get(); - set(copy); - } catch (JsonProcessingException e) { - LOGGER.error("An error occurred while patching model of component.", e); - } - } + ObjectMapper mapper = new ObjectMapper(); + try { + TreeNode node = mapper.valueToTree(contact); + T copy = mapper.treeToValue(node, (Class) contact.getClass()); + contactConsumer.accept(copy); - public LicketComponentModelPatch getPatch() { - return modelPatch; + set(copy); + } catch (JsonProcessingException e) { + LOGGER.error("An error occurred while patching model of component.", e); } + } - public void set(T modelObject) { - // computing model object patch - if (this.modelObject != null && modelObject != null) { - this.modelPatch = new LicketComponentModelPatch<>(this.modelObject, modelObject); - } + public LicketComponentModelPatch getPatch() { + return modelPatch; + } - this.modelObject = modelObject; + public void set(T modelObject) { + // computing model object patch + if (this.modelObject != null && modelObject != null) { + this.modelPatch = new LicketComponentModelPatch<>(this.modelObject, modelObject); } + + this.modelObject = modelObject; + } } diff --git a/licket-framework/src/main/java/org/licket/core/model/LicketComponentModelPatch.java b/licket-framework/src/main/java/org/licket/core/model/LicketComponentModelPatch.java index 3ab81e3..8192e52 100644 --- a/licket-framework/src/main/java/org/licket/core/model/LicketComponentModelPatch.java +++ b/licket-framework/src/main/java/org/licket/core/model/LicketComponentModelPatch.java @@ -10,8 +10,8 @@ */ public final class LicketComponentModelPatch { - private ObjectMapper objectMapper = new ObjectMapper(); private final JsonNode jsonPatch; + private ObjectMapper objectMapper = new ObjectMapper(); public LicketComponentModelPatch(T oldValue, T newValue) { jsonPatch = asJson(objectMapper.valueToTree(oldValue), objectMapper.valueToTree(newValue)); diff --git a/licket-framework/src/main/java/org/licket/core/model/LicketListModel.java b/licket-framework/src/main/java/org/licket/core/model/LicketListModel.java deleted file mode 100644 index d2d8f01..0000000 --- a/licket-framework/src/main/java/org/licket/core/model/LicketListModel.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.licket.core.model; - -import java.util.function.Supplier; - -/** - * @author activey - */ -public class LicketListModel extends LicketComponentModel> { - - public LicketListModel(Iterable modelObject) { - super(modelObject); - } - - public LicketListModel(Supplier> modelObjectSupplier) { - super(modelObjectSupplier); - } - - public static LicketListModel fromSupplier(Supplier> listModelSupplier) { - return new LicketListModel(listModelSupplier); - } -} diff --git a/licket-framework/src/main/java/org/licket/core/module/VuePluginsConfiguration.java b/licket-framework/src/main/java/org/licket/core/module/VuePluginsConfiguration.java index 44677c1..a24c679 100644 --- a/licket-framework/src/main/java/org/licket/core/module/VuePluginsConfiguration.java +++ b/licket-framework/src/main/java/org/licket/core/module/VuePluginsConfiguration.java @@ -13,4 +13,5 @@ ResourcePluginConfiguration.class, ApplicationModulePluginConfiguration.class }) -public class VuePluginsConfiguration {} +public class VuePluginsConfiguration { +} diff --git a/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePlugin.java b/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePlugin.java index eb029f6..ffeacfc 100644 --- a/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePlugin.java +++ b/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePlugin.java @@ -1,31 +1,29 @@ package org.licket.core.module.application; -import static java.util.Arrays.stream; -import static org.licket.framework.hippo.NameBuilder.name; -import static org.licket.framework.hippo.PropertyNameBuilder.property; import org.licket.core.view.hippo.vue.VuePlugin; -import org.licket.core.view.hippo.vue.extend.VueClass; import org.licket.framework.hippo.PropertyNameBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; import java.util.function.Consumer; +import static org.licket.framework.hippo.NameBuilder.name; +import static org.licket.framework.hippo.PropertyNameBuilder.property; + /** * @author activey */ public class ApplicationModulePlugin implements VuePlugin { - private VueClass[] moduleServices; - - public ApplicationModulePlugin(VueClass... moduleServices) { - this.moduleServices = moduleServices; - } + @Autowired + private List moduleServices; - @Override - public PropertyNameBuilder vueName() { - return property(name("app"), name("AppModule")); - } + @Override + public PropertyNameBuilder vueName() { + return property(name("app"), name("AppModule")); + } - public void forEachService(Consumer serviceConsumer) { - stream(moduleServices).forEach(serviceConsumer); - } + public void forEachService(Consumer serviceConsumer) { + moduleServices.stream().forEach(serviceConsumer); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePluginConfiguration.java b/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePluginConfiguration.java index c76de14..a080848 100644 --- a/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePluginConfiguration.java +++ b/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModulePluginConfiguration.java @@ -16,30 +16,32 @@ @Configuration public class ApplicationModulePluginConfiguration { - @Bean - public VuePlugin applicationModulePlugin(@Autowired HttpCommunicationService httpCommunicationService) { - return new ApplicationModulePlugin(communicationService(httpCommunicationService), modelReloader()); - } - - @Bean - public LicketRemote communicationService(@Autowired HttpCommunicationService httpService) { - return new LicketRemote(httpService); - } - - @Bean - public LicketComponentModelReloader modelReloader() { - return new LicketComponentModelReloader(); - } - - @Bean - @Order(1) - public HeadParticipatingResource applicationEventHubResource() { - return new ApplicationEventHubResource(); - } - - @Bean - @Order(2) - public HeadParticipatingResource applicationModulePluginResource() { - return new ApplicationModulePluginResource(); - } + @Bean + public VuePlugin applicationModulePlugin(@Autowired HttpCommunicationService httpCommunicationService) { + return new ApplicationModulePlugin(); + } + + @Bean + public LicketRemote licketRemote(@Autowired HttpCommunicationService httpService) { + return new LicketRemote(httpService); + } + + @Bean + public LicketComponentModelReloader modelReloader() { + return new LicketComponentModelReloader(); + } + + + @Bean + @Order(1) + public HeadParticipatingResource applicationEventHubResource() { + return new ApplicationEventHubResource(); + } + + @Bean + @Order(2) + public HeadParticipatingResource applicationModulePluginResource() { + return new ApplicationModulePluginResource(); + } + } diff --git a/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModuleService.java b/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModuleService.java new file mode 100644 index 0000000..e4259c4 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/module/application/ApplicationModuleService.java @@ -0,0 +1,9 @@ +package org.licket.core.module.application; + +import org.licket.core.view.hippo.vue.extend.VueClass; + +/** + * @author lukaszgrabski + */ +public interface ApplicationModuleService extends VueClass { +} diff --git a/licket-framework/src/main/java/org/licket/core/module/application/LicketComponentModelReloader.java b/licket-framework/src/main/java/org/licket/core/module/application/LicketComponentModelReloader.java index 389082a..64ddbb6 100644 --- a/licket-framework/src/main/java/org/licket/core/module/application/LicketComponentModelReloader.java +++ b/licket-framework/src/main/java/org/licket/core/module/application/LicketComponentModelReloader.java @@ -1,5 +1,15 @@ package org.licket.core.module.application; +import org.licket.core.view.LicketComponent; +import org.licket.core.view.hippo.vue.annotation.Name; +import org.licket.core.view.hippo.vue.annotation.VueComponentFunction; +import org.licket.framework.hippo.BlockBuilder; +import org.licket.framework.hippo.FunctionCallBuilder; +import org.licket.framework.hippo.NameBuilder; +import org.licket.framework.hippo.ObjectLiteralBuilder; +import org.licket.framework.hippo.PropertyNameBuilder; +import org.licket.framework.hippo.StringLiteralBuilder; + import static org.licket.framework.hippo.ArrayElementGetBuilder.arrayElementGet; import static org.licket.framework.hippo.BlockBuilder.block; import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; @@ -9,112 +19,105 @@ import static org.licket.framework.hippo.KeywordLiteralBuilder.thisLiteral; import static org.licket.framework.hippo.KeywordLiteralBuilder.trueLiteral; import static org.licket.framework.hippo.NameBuilder.name; -import static org.licket.framework.hippo.NewExpressionBuilder.newExpression; import static org.licket.framework.hippo.ObjectLiteralBuilder.objectLiteral; import static org.licket.framework.hippo.ObjectPropertyBuilder.propertyBuilder; import static org.licket.framework.hippo.PropertyNameBuilder.property; import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; -import org.licket.core.view.LicketComponent; -import org.licket.core.view.hippo.vue.annotation.VueComponentFunction; -import org.licket.core.view.hippo.vue.annotation.Name; -import org.licket.core.view.hippo.vue.extend.VueClass; -import org.licket.framework.hippo.*; - /** * @author grabslu */ -public class LicketComponentModelReloader implements VueClass { +public class LicketComponentModelReloader implements ApplicationModuleService { - @Name("eventHub") - private PropertyNameBuilder eventHub = property("app", "ApplicationEventHub"); + @Name("eventHub") + private PropertyNameBuilder eventHub = property("app", "ApplicationEventHub"); - public static NameBuilder serviceName() { - return name("$licketModelReloader"); + public static NameBuilder serviceName() { + return name("$licketModelReloader"); + } + + public static FunctionCallBuilder callReloadComponent(LicketComponent component, boolean patch) { + if (patch) { + return functionCall().target(property(property(thisLiteral(), LicketComponentModelReloader.serviceName()), name("notifyModelPatched"))) + .argument(stringLiteral(component.getCompositeId().getValue())) + .argument(arrayElementGet() + .target(property(property("response", "body"), name("patch"))) + .element(stringLiteral(component.getCompositeId().getValue()))); } + return functionCall().target(property(property(thisLiteral(), LicketComponentModelReloader.serviceName()), name("notifyModelChanged"))) + .argument(stringLiteral(component.getCompositeId().getValue())) + .argument(arrayElementGet() + .target(property(property("response", "body"), name("model"))) + .element(stringLiteral(component.getCompositeId().getValue()))); + } - @VueComponentFunction - public void listenForModelChange(@Name("changeListener") NameBuilder changeListener, BlockBuilder body) { - body.appendStatement(expressionStatement(functionCall() - .target(property(name("eventHub"), name("$on"))) - .argument(modelChangedEvent()) - .argument(functionNode() - .param(name("changedModelData")) - .body(block().appendStatement(expressionStatement( - functionCall() - .target(changeListener) - .argument(name("changedModelData")) - .argument(falseLiteral()) - )))))); + @VueComponentFunction + public void listenForModelChange(@Name("changeListener") NameBuilder changeListener, BlockBuilder body) { + body.appendStatement(expressionStatement(functionCall() + .target(property(name("eventHub"), name("$on"))) + .argument(modelChangedEvent()) + .argument(functionNode() + .param(name("changedModelData")) + .body(block().appendStatement(expressionStatement( + functionCall() + .target(changeListener) + .argument(name("changedModelData")) + .argument(falseLiteral()) + )))))); - body.appendStatement(expressionStatement(functionCall() - .target(property(name("eventHub"), name("$on"))) - .argument(modelPatchedEvent()) - .argument(functionNode() - .param(name("changedModelData")) - .body(block().appendStatement(expressionStatement( - functionCall() - .target(changeListener) - .argument(name("changedModelData")) - .argument(trueLiteral()) - )))))); - } + body.appendStatement(expressionStatement(functionCall() + .target(property(name("eventHub"), name("$on"))) + .argument(modelPatchedEvent()) + .argument(functionNode() + .param(name("changedModelData")) + .body(block().appendStatement(expressionStatement( + functionCall() + .target(changeListener) + .argument(name("changedModelData")) + .argument(trueLiteral()) + )))))); + } - @VueComponentFunction - public void notifyModelChanged(@Name("compositeId") NameBuilder compositeId, - @Name("changedModelData") NameBuilder changedModelData, BlockBuilder body) { - body.appendStatement(expressionStatement( + @VueComponentFunction + public void notifyModelChanged(@Name("compositeId") NameBuilder compositeId, + @Name("changedModelData") NameBuilder changedModelData, BlockBuilder body) { + body.appendStatement(expressionStatement( functionCall().target(property(name("eventHub"), name("$emit"))) - .argument(modelChangedEvent()) - .argument(changedModelEventData(compositeId, changedModelData)))); - } + .argument(modelChangedEvent()) + .argument(changedModelEventData(compositeId, changedModelData)))); + } - private StringLiteralBuilder modelChangedEvent() { - return stringLiteral("component-model-changed"); - } + private StringLiteralBuilder modelChangedEvent() { + return stringLiteral("component-model-changed"); + } - private ObjectLiteralBuilder changedModelEventData(NameBuilder compositeId, NameBuilder changedModelData) { - return objectLiteral() - .objectProperty(propertyBuilder().name("compositeId").value(compositeId)) - .objectProperty(propertyBuilder().name("model").value(changedModelData)); - } - - @VueComponentFunction - public void notifyModelPatched(@Name("compositeId") NameBuilder compositeId, - @Name("patchedModelData") NameBuilder patchedModelData, BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall().target(property(name("eventHub"), name("$emit"))) - .argument(modelPatchedEvent()) - .argument(patchedModelEventData(compositeId, patchedModelData)))); - } + private ObjectLiteralBuilder changedModelEventData(NameBuilder compositeId, NameBuilder changedModelData) { + return objectLiteral() + .objectProperty(propertyBuilder().name("compositeId").value(compositeId)) + .objectProperty(propertyBuilder().name("model").value(changedModelData)); + } - private StringLiteralBuilder modelPatchedEvent() { - return stringLiteral("component-model-patched"); - } + @VueComponentFunction + public void notifyModelPatched(@Name("compositeId") NameBuilder compositeId, + @Name("patchedModelData") NameBuilder patchedModelData, BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall().target(property(name("eventHub"), name("$emit"))) + .argument(modelPatchedEvent()) + .argument(patchedModelEventData(compositeId, patchedModelData)))); + } - private ObjectLiteralBuilder patchedModelEventData(NameBuilder compositeId, NameBuilder patchedModelData) { - return objectLiteral() - .objectProperty(propertyBuilder().name("compositeId").value(compositeId)) - .objectProperty(propertyBuilder().name("patch").value(patchedModelData)); - } + private StringLiteralBuilder modelPatchedEvent() { + return stringLiteral("component-model-patched"); + } - @Override - public NameBuilder vueName() { - return LicketComponentModelReloader.serviceName(); - } + private ObjectLiteralBuilder patchedModelEventData(NameBuilder compositeId, NameBuilder patchedModelData) { + return objectLiteral() + .objectProperty(propertyBuilder().name("compositeId").value(compositeId)) + .objectProperty(propertyBuilder().name("patch").value(patchedModelData)); + } - public static FunctionCallBuilder callReloadComponent(LicketComponent component, boolean patch) { - if (patch) { - return functionCall().target(property(property(thisLiteral(), LicketComponentModelReloader.serviceName()), name("notifyModelPatched"))) - .argument(stringLiteral(component.getCompositeId().getValue())) - .argument(arrayElementGet() - .target(property(property("response", "body"), name("patch"))) - .element(stringLiteral(component.getCompositeId().getValue()))); - } - return functionCall().target(property(property(thisLiteral(), LicketComponentModelReloader.serviceName()), name("notifyModelChanged"))) - .argument(stringLiteral(component.getCompositeId().getValue())) - .argument(arrayElementGet() - .target(property(property("response", "body"), name("model"))) - .element(stringLiteral(component.getCompositeId().getValue()))); - } + @Override + public NameBuilder vueName() { + return LicketComponentModelReloader.serviceName(); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/application/LicketRemote.java b/licket-framework/src/main/java/org/licket/core/module/application/LicketRemote.java index 04a4c73..330fb9f 100644 --- a/licket-framework/src/main/java/org/licket/core/module/application/LicketRemote.java +++ b/licket-framework/src/main/java/org/licket/core/module/application/LicketRemote.java @@ -3,7 +3,6 @@ import org.licket.core.module.resource.HttpCommunicationService; import org.licket.core.view.hippo.vue.annotation.Name; import org.licket.core.view.hippo.vue.annotation.VueComponentFunction; -import org.licket.core.view.hippo.vue.extend.VueClass; import org.licket.framework.hippo.BlockBuilder; import org.licket.framework.hippo.FunctionCallBuilder; import org.licket.framework.hippo.FunctionNodeBuilder; @@ -21,62 +20,62 @@ /** * @author grabslu */ -public class LicketRemote implements VueClass { +public class LicketRemote implements ApplicationModuleService { - @Name("http") - private final HttpCommunicationService httpCommunicationService; + @Name("http") + private final HttpCommunicationService httpCommunicationService; - public static NameBuilder serviceName() { - return name("$licketRemoteService"); - } - - public LicketRemote(HttpCommunicationService httpCommunicationService) { - this.httpCommunicationService = checkNotNull(httpCommunicationService, + public LicketRemote(HttpCommunicationService httpCommunicationService) { + this.httpCommunicationService = checkNotNull(httpCommunicationService, "Http communication service reference must not be null!"); - } + } - @VueComponentFunction - public void submitForm(@Name("formComponentCompositeId") NameBuilder formComponentCompositeId, - @Name("formData") NameBuilder formData, - @Name("responseListener") NameBuilder responseListener, BlockBuilder body) { - body.appendStatement(expressionStatement(httpCommunicationService - .callHttpPostWithData("`/licket/form/submit/${formComponentCompositeId}`", formData, responseListener))); - } + public static NameBuilder serviceName() { + return name("$licketRemoteService"); + } - @VueComponentFunction - public void handleActionLinkClick(@Name("linkComponentCompositeId") NameBuilder linkComponentCompositeId, - @Name("modelData") NameBuilder modelData, - @Name("responseListener") NameBuilder responseListener, BlockBuilder body) { - body.appendStatement(expressionStatement(httpCommunicationService - .callHttpPostWithData("`/licket/link/click/${linkComponentCompositeId}`", modelData, responseListener))); - } + public static FunctionCallBuilder callSubmitForm(String formId, PropertyNameBuilder callbackFunction) { + return functionCall() + .target(property(property(thisLiteral(), LicketRemote.serviceName()), name("submitForm"))) + .argument(stringLiteral(formId)) + .argument(property(thisLiteral(), name("model"))) + .argument(callbackFunction); + } - @VueComponentFunction - public void mountComponent(@Name("componentCompositeId") NameBuilder componentCompositeId, - @Name("mountingParams") NameBuilder mountingParams, - @Name("responseListener") NameBuilder responseListener, BlockBuilder body) { - body.appendStatement(expressionStatement(httpCommunicationService - .callHttpPostWithData("`/licket/component/${componentCompositeId}/mount`", mountingParams, responseListener))); - } + public static FunctionCallBuilder callMountComponent(String componentId, FunctionNodeBuilder callbackFunction) { + return functionCall() + .target(property(property(name("vm"), LicketRemote.serviceName()), name("mountComponent"))) + .argument(stringLiteral(componentId)) + .argument(property(name("to"), name("params"))) + .argument(callbackFunction); + } - @Override - public NameBuilder vueName() { - return LicketRemote.serviceName(); - } + @VueComponentFunction + public void submitForm(@Name("formComponentCompositeId") NameBuilder formComponentCompositeId, + @Name("formData") NameBuilder formData, + @Name("responseListener") NameBuilder responseListener, BlockBuilder body) { + body.appendStatement(expressionStatement(httpCommunicationService + .callHttpPostWithData("`/licket/form/submit/${formComponentCompositeId}`", formData, responseListener))); + } + + @VueComponentFunction + public void handleActionLinkClick(@Name("linkComponentCompositeId") NameBuilder linkComponentCompositeId, + @Name("modelData") NameBuilder modelData, + @Name("responseListener") NameBuilder responseListener, BlockBuilder body) { + body.appendStatement(expressionStatement(httpCommunicationService + .callHttpPostWithData("`/licket/link/click/${linkComponentCompositeId}`", modelData, responseListener))); + } - public static FunctionCallBuilder callSubmitForm(String formId, PropertyNameBuilder callbackFunction) { - return functionCall() - .target(property(property(thisLiteral(), LicketRemote.serviceName()), name("submitForm"))) - .argument(stringLiteral(formId)) - .argument(property(thisLiteral(), name("model"))) - .argument(callbackFunction); - } + @VueComponentFunction + public void mountComponent(@Name("componentCompositeId") NameBuilder componentCompositeId, + @Name("mountingParams") NameBuilder mountingParams, + @Name("responseListener") NameBuilder responseListener, BlockBuilder body) { + body.appendStatement(expressionStatement(httpCommunicationService + .callHttpPostWithData("`/licket/component/${componentCompositeId}/mount`", mountingParams, responseListener))); + } - public static FunctionCallBuilder callMountComponent(String componentId, FunctionNodeBuilder callbackFunction) { - return functionCall() - .target(property(property(name("vm"), LicketRemote.serviceName()), name("mountComponent"))) - .argument(stringLiteral(componentId)) - .argument(property(name("to"), name("params"))) - .argument(callbackFunction); - } + @Override + public NameBuilder vueName() { + return LicketRemote.serviceName(); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationEventHubResource.java b/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationEventHubResource.java index a52b5c1..cceba0a 100644 --- a/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationEventHubResource.java +++ b/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationEventHubResource.java @@ -2,7 +2,7 @@ import org.licket.core.resource.HeadParticipatingResource; import org.licket.core.resource.javascript.AbstractJavascriptDynamicResource; -import org.licket.framework.hippo.*; +import org.licket.framework.hippo.BlockBuilder; import static org.licket.framework.hippo.AssignmentBuilder.assignment; import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; @@ -15,17 +15,17 @@ */ public class ApplicationEventHubResource extends AbstractJavascriptDynamicResource implements HeadParticipatingResource { - @Override - public String getName() { - return "application-event-hub.js"; - } + @Override + public String getName() { + return "application-event-hub.js"; + } - @Override - protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { - scriptBlockBuilder.appendStatement(expressionStatement( - assignment() - .left(property("app", "ApplicationEventHub")) - .right(newExpression().target(name("Vue"))) - )); - } + @Override + protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { + scriptBlockBuilder.appendStatement(expressionStatement( + assignment() + .left(property("app", "ApplicationEventHub")) + .right(newExpression().target(name("Vue"))) + )); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationModulePluginResource.java b/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationModulePluginResource.java index e5bb520..3e4bc62 100644 --- a/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationModulePluginResource.java +++ b/licket-framework/src/main/java/org/licket/core/module/application/resource/ApplicationModulePluginResource.java @@ -27,65 +27,65 @@ */ public class ApplicationModulePluginResource extends AbstractJavascriptDynamicResource implements HeadParticipatingResource { - @Autowired - private ApplicationModulePlugin applicationModulePlugin; + @Autowired + private ApplicationModulePlugin applicationModulePlugin; - @Override - public String getName() { - return "vue-plugin-application-module.js"; - } + @Override + public String getName() { + return "vue-plugin-application-module.js"; + } - @Override - protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { - scriptBlockBuilder.appendStatement( - expressionStatement( - assignment() - .left(applicationModulePlugin.vueName()) - .right(pluginInitializer()) - ) - ); - scriptBlockBuilder.appendStatement( - expressionStatement( - functionCall() - .target(property("Vue", "use")) - .argument(applicationModulePlugin.vueName()) - ) - ); - } + @Override + protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { + scriptBlockBuilder.appendStatement( + expressionStatement( + assignment() + .left(applicationModulePlugin.vueName()) + .right(pluginInitializer()) + ) + ); + scriptBlockBuilder.appendStatement( + expressionStatement( + functionCall() + .target(property("Vue", "use")) + .argument(applicationModulePlugin.vueName()) + ) + ); + } - private FunctionNodeBuilder pluginInitializer() { - return functionNode() - .param(name("Vue")) - .param(name("options")) - .body( - block().appendStatement( - functionCall() - .target(property("Object", "defineProperties")) - .argument(property("Vue", "prototype")) - .argument(services()) - ) - ); - } + private FunctionNodeBuilder pluginInitializer() { + return functionNode() + .param(name("Vue")) + .param(name("options")) + .body( + block().appendStatement( + functionCall() + .target(property("Object", "defineProperties")) + .argument(property("Vue", "prototype")) + .argument(services()) + ) + ); + } - private ObjectLiteralBuilder services() { - ObjectLiteralBuilder services = ObjectLiteralBuilder.objectLiteral(); - applicationModulePlugin.forEachService(service -> services.objectProperty( - propertyBuilder() - .name(service.vueName()) - .value(objectLiteral().objectProperty( - propertyBuilder() - .name("get") - .value(functionNode() - .body( - fromVueClassProperties(service).decorate(block()) - .appendStatement( - returnStatement() - .returnValue(serviceMethods(service))))))) - )); - return services; - } + private ObjectLiteralBuilder services() { + ObjectLiteralBuilder services = ObjectLiteralBuilder.objectLiteral(); + applicationModulePlugin.forEachService(service -> services.objectProperty( + propertyBuilder() + .name(service.vueName()) + .value(objectLiteral().objectProperty( + propertyBuilder() + .name("get") + .value(functionNode() + .body( + fromVueClassProperties(service).decorate(block()) + .appendStatement( + returnStatement() + .returnValue(serviceMethods(service))))))) + )); + return services; + } - private ObjectLiteralBuilder serviceMethods(VueClass service) { - return VueExtendMethodsDecorator.fromClass(service).decorate(objectLiteral()); - } + private ObjectLiteralBuilder serviceMethods(VueClass service) { + return VueExtendMethodsDecorator.fromClass(service).decorate(objectLiteral()); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/resource/HttpCommunicationService.java b/licket-framework/src/main/java/org/licket/core/module/resource/HttpCommunicationService.java index 5d044ff..8a998d0 100644 --- a/licket-framework/src/main/java/org/licket/core/module/resource/HttpCommunicationService.java +++ b/licket-framework/src/main/java/org/licket/core/module/resource/HttpCommunicationService.java @@ -1,6 +1,6 @@ package org.licket.core.module.resource; -import org.licket.core.view.hippo.vue.extend.VueClass; +import org.licket.core.module.application.ApplicationModuleService; import org.licket.framework.hippo.FunctionCallBuilder; import org.licket.framework.hippo.NameBuilder; import org.licket.framework.hippo.PropertyNameBuilder; @@ -12,39 +12,39 @@ /** * @author grabslu */ -public class HttpCommunicationService implements VueClass { - - @Override - public NameBuilder vueName() { - return name("$http"); - } - - public FunctionCallBuilder callHttpPost(String url, NameBuilder responseListener) { - return functionCall() - .target(property(functionCall() - .target(httpPostFunction()) - .argument(name(url)), - responseCallbackFunction())) - .argument(responseListener); - } - - public FunctionCallBuilder callHttpPostWithData(String url, NameBuilder data, NameBuilder responseListener) { - return functionCall() - .target(property(functionCall() - .target(httpPostFunction()) - .argument(name(url)) - .argument(data), - responseCallbackFunction())) - .argument(responseListener); - } - - private PropertyNameBuilder httpPostFunction() { - // cant use vueName() here ;/ - return property(property("Vue", "http"), name("post")); - } - - private NameBuilder responseCallbackFunction() { - return name("then"); - } +public class HttpCommunicationService implements ApplicationModuleService { + + @Override + public NameBuilder vueName() { + return name("$http"); + } + + public FunctionCallBuilder callHttpPost(String url, NameBuilder responseListener) { + return functionCall() + .target(property(functionCall() + .target(httpPostFunction()) + .argument(name(url)), + responseCallbackFunction())) + .argument(responseListener); + } + + public FunctionCallBuilder callHttpPostWithData(String url, NameBuilder data, NameBuilder responseListener) { + return functionCall() + .target(property(functionCall() + .target(httpPostFunction()) + .argument(name(url)) + .argument(data), + responseCallbackFunction())) + .argument(responseListener); + } + + private PropertyNameBuilder httpPostFunction() { + // cant use vueName() here ;/ + return property(property("Vue", "http"), name("post")); + } + + private NameBuilder responseCallbackFunction() { + return name("then"); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginConfiguration.java b/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginConfiguration.java index 57f60e2..c669317 100644 --- a/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginConfiguration.java +++ b/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginConfiguration.java @@ -10,13 +10,13 @@ @Configuration public class ResourcePluginConfiguration { - @Bean - public HeadParticipatingResource resourcePluginResource() { - return new ResourcePluginResource(); - } + @Bean + public HeadParticipatingResource resourcePluginResource() { + return new ResourcePluginResource(); + } - @Bean - public HttpCommunicationService httpCommunicationService() { - return new HttpCommunicationService(); - } + @Bean + public HttpCommunicationService httpCommunicationService() { + return new HttpCommunicationService(); + } } diff --git a/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginResource.java b/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginResource.java index 62fa5b6..fa62fbe 100644 --- a/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginResource.java +++ b/licket-framework/src/main/java/org/licket/core/module/resource/ResourcePluginResource.java @@ -8,7 +8,7 @@ */ public class ResourcePluginResource extends JavascriptStaticResource implements HeadParticipatingResource { - public ResourcePluginResource() { - super("vue-resource.js", "vue-resource/dist/vue-resource.js"); - } + public ResourcePluginResource() { + super("vue-resource.js", "vue-resource/dist/vue-resource.js"); + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/AbstractClasspathResource.java b/licket-framework/src/main/java/org/licket/core/resource/AbstractClasspathResource.java index 1a0c587..63917d1 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/AbstractClasspathResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/AbstractClasspathResource.java @@ -7,21 +7,21 @@ */ public abstract class AbstractClasspathResource implements Resource { - private final String classpathLocation; - private final String mimetype; + private final String classpathLocation; + private final String mimetype; - public AbstractClasspathResource(String classpathLocation, String mimetype) { - this.classpathLocation = classpathLocation; - this.mimetype = mimetype; - } + public AbstractClasspathResource(String classpathLocation, String mimetype) { + this.classpathLocation = classpathLocation; + this.mimetype = mimetype; + } - @Override - public final InputStream getStream() { - return AbstractClasspathResource.class.getClassLoader().getResourceAsStream(classpathLocation); - } + @Override + public final InputStream getStream() { + return AbstractClasspathResource.class.getClassLoader().getResourceAsStream(classpathLocation); + } - @Override - public final String getMimeType() { - return mimetype; - } + @Override + public final String getMimeType() { + return mimetype; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/ByteArrayResource.java b/licket-framework/src/main/java/org/licket/core/resource/ByteArrayResource.java index 0b823ae..12a8d4d 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/ByteArrayResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/ByteArrayResource.java @@ -8,28 +8,28 @@ */ public class ByteArrayResource implements Resource { - private final String name; - private final String mimetype; - private byte[] byteArray; + private final String name; + private final String mimetype; + private byte[] byteArray; - public ByteArrayResource(String name, String mimetype, byte[] byteArray) { - this.name = name; - this.mimetype = mimetype; - this.byteArray = byteArray; - } + public ByteArrayResource(String name, String mimetype, byte[] byteArray) { + this.name = name; + this.mimetype = mimetype; + this.byteArray = byteArray; + } - @Override - public InputStream getStream() { - return new ByteArrayInputStream(byteArray); - } + @Override + public InputStream getStream() { + return new ByteArrayInputStream(byteArray); + } - @Override - public String getMimeType() { - return mimetype; - } + @Override + public String getMimeType() { + return mimetype; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/InputStreamResource.java b/licket-framework/src/main/java/org/licket/core/resource/InputStreamResource.java deleted file mode 100644 index 5e52b97..0000000 --- a/licket-framework/src/main/java/org/licket/core/resource/InputStreamResource.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.licket.core.resource; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -/** - * @author activey - */ -public class InputStreamResource implements Resource { - - private final String name; - private final String mimetype; - private InputStream inputStream; - - public InputStreamResource(String name, String mimetype, InputStream inputStream) { - this.name = name; - this.mimetype = mimetype; - this.inputStream = inputStream; - } - - @Override - public InputStream getStream() { - return inputStream; - } - - @Override - public String getMimeType() { - return mimetype; - } - - @Override - public String getName() { - return name; - } -} diff --git a/licket-framework/src/main/java/org/licket/core/resource/ProxyResource.java b/licket-framework/src/main/java/org/licket/core/resource/ProxyResource.java deleted file mode 100644 index 0a1c83e..0000000 --- a/licket-framework/src/main/java/org/licket/core/resource/ProxyResource.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.licket.core.resource; - -import java.io.InputStream; - -/** - * @author activey - */ -public class ProxyResource implements Resource { - - private Resource proxied; - private String name; - - public ProxyResource(Resource proxied, String name) { - this.proxied = proxied; - this.name = name; - } - - @Override - public InputStream getStream() { - return proxied.getStream(); - } - - @Override - public String getMimeType() { - return proxied.getMimeType(); - } - - @Override - public String getName() { - return name; - } -} diff --git a/licket-framework/src/main/java/org/licket/core/resource/Resource.java b/licket-framework/src/main/java/org/licket/core/resource/Resource.java index 959ad0b..d28c27f 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/Resource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/Resource.java @@ -7,5 +7,5 @@ */ public interface Resource extends ResourceHeader { - InputStream getStream(); + InputStream getStream(); } diff --git a/licket-framework/src/main/java/org/licket/core/resource/ResourceStorage.java b/licket-framework/src/main/java/org/licket/core/resource/ResourceStorage.java index 605703e..d6b8f72 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/ResourceStorage.java +++ b/licket-framework/src/main/java/org/licket/core/resource/ResourceStorage.java @@ -7,19 +7,19 @@ * @author activey */ public interface ResourceStorage { - boolean hasResource(String name, String mimetype); + boolean hasResource(String name, String mimetype); - void putResource(Resource resource); + void putResource(Resource resource); - Optional getResource(String name); + Optional getResource(String name); - Stream getHeadJavascriptResources(); + Stream getHeadJavascriptResources(); - Stream getFootJavascriptResources(); + Stream getFootJavascriptResources(); - Stream getStylesheetResources(); + Stream getStylesheetResources(); - Stream getAllResources(); + Stream getAllResources(); - String getResourceUrl(Resource resource); + String getResourceUrl(Resource resource); } diff --git a/licket-framework/src/main/java/org/licket/core/resource/css/StylesheetResource.java b/licket-framework/src/main/java/org/licket/core/resource/css/StylesheetResource.java index 8f34f3c..394e524 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/css/StylesheetResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/css/StylesheetResource.java @@ -1,5 +1,6 @@ package org.licket.core.resource.css; +import com.google.common.net.MediaType; import org.licket.core.resource.AbstractClasspathResource; /** @@ -7,16 +8,15 @@ */ public class StylesheetResource extends AbstractClasspathResource { - public static final String CSS_MIMETYPE = "text/css"; - private String name; + private String name; - public StylesheetResource(String name, String classpathLocation) { - super(classpathLocation, CSS_MIMETYPE); - this.name = name; - } + public StylesheetResource(String name, String classpathLocation) { + super(classpathLocation, MediaType.CSS_UTF_8.toString()); + this.name = name; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/font/TtfFontResource.java b/licket-framework/src/main/java/org/licket/core/resource/font/TtfFontResource.java index b07b8b3..c08625a 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/font/TtfFontResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/font/TtfFontResource.java @@ -7,16 +7,16 @@ */ public class TtfFontResource extends AbstractClasspathResource { - public static final String FONT_MIMETYPE = "application/x-font-ttf"; - private String name; + public static final String FONT_MIMETYPE = "application/x-font-ttf"; + private String name; - public TtfFontResource(String name, String classpathLocation) { - super(classpathLocation, FONT_MIMETYPE); - this.name = name; - } + public TtfFontResource(String name, String classpathLocation) { + super(classpathLocation, FONT_MIMETYPE); + this.name = name; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/font/Woff2FontResource.java b/licket-framework/src/main/java/org/licket/core/resource/font/Woff2FontResource.java index 86994f1..8d7d3b5 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/font/Woff2FontResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/font/Woff2FontResource.java @@ -7,16 +7,16 @@ */ public class Woff2FontResource extends AbstractClasspathResource { - public static final String FONT_MIMETYPE = "application/font-woff2"; - private String name; + public static final String FONT_MIMETYPE = "application/font-woff2"; + private String name; - public Woff2FontResource(String name, String classpathLocation) { - super(classpathLocation, FONT_MIMETYPE); - this.name = name; - } + public Woff2FontResource(String name, String classpathLocation) { + super(classpathLocation, FONT_MIMETYPE); + this.name = name; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/font/WoffFontResource.java b/licket-framework/src/main/java/org/licket/core/resource/font/WoffFontResource.java index 9c4bb56..61df6ab 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/font/WoffFontResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/font/WoffFontResource.java @@ -7,16 +7,16 @@ */ public class WoffFontResource extends AbstractClasspathResource { - public static final String FONT_MIMETYPE = "application/font-woff2"; - private String name; + public static final String FONT_MIMETYPE = "application/font-woff2"; + private String name; - public WoffFontResource(String name, String classpathLocation) { - super(classpathLocation, FONT_MIMETYPE); - this.name = name; - } + public WoffFontResource(String name, String classpathLocation) { + super(classpathLocation, FONT_MIMETYPE); + this.name = name; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/html/HtmlResource.java b/licket-framework/src/main/java/org/licket/core/resource/html/HtmlResource.java index ef3993d..464e47c 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/html/HtmlResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/html/HtmlResource.java @@ -7,16 +7,16 @@ */ public class HtmlResource extends AbstractClasspathResource { - public static final String HTML_MIMETYPE = "text/html"; - private final String name; + public static final String HTML_MIMETYPE = "text/html"; + private final String name; - public HtmlResource(String name, String classpathLocation) { - super(classpathLocation, HTML_MIMETYPE); - this.name = name; - } + public HtmlResource(String name, String classpathLocation) { + super(classpathLocation, HTML_MIMETYPE); + this.name = name; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/image/ImageResource.java b/licket-framework/src/main/java/org/licket/core/resource/image/ImageResource.java deleted file mode 100644 index 3e7831c..0000000 --- a/licket-framework/src/main/java/org/licket/core/resource/image/ImageResource.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.licket.core.resource.image; - -import org.licket.core.resource.AbstractClasspathResource; - -/** - * @author activey - */ -public class ImageResource extends AbstractClasspathResource { - - public ImageResource(String classpathLocation, ImageType imageType) { - super(classpathLocation, imageType.getMimetype()); - } - - @Override - public String getName() { - return null; - } -} diff --git a/licket-framework/src/main/java/org/licket/core/resource/image/ImageType.java b/licket-framework/src/main/java/org/licket/core/resource/image/ImageType.java deleted file mode 100644 index a1679b7..0000000 --- a/licket-framework/src/main/java/org/licket/core/resource/image/ImageType.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.licket.core.resource.image; - -/** - * @author activey - */ -public enum ImageType { - - JPEG("image/jpeg"); - - private final String mimetype; - - ImageType(String mimetype) { - this.mimetype = mimetype; - } - - public String getMimetype() { - return mimetype; - } -} diff --git a/licket-framework/src/main/java/org/licket/core/resource/javascript/AbstractJavascriptDynamicResource.java b/licket-framework/src/main/java/org/licket/core/resource/javascript/AbstractJavascriptDynamicResource.java index 73eabbe..5057745 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/javascript/AbstractJavascriptDynamicResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/javascript/AbstractJavascriptDynamicResource.java @@ -9,7 +9,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import static org.licket.core.resource.javascript.JavascriptStaticResource.JAVASCRIPT_MIMETYPE; +import static com.google.common.net.MediaType.JAVASCRIPT_UTF_8; import static org.licket.framework.hippo.AssignmentBuilder.assignment; import static org.licket.framework.hippo.BlockBuilder.block; import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; @@ -26,32 +26,33 @@ */ public abstract class AbstractJavascriptDynamicResource implements Resource { - public final InputStream getStream() { - BlockBuilder scriptBlockBuilder = block(); - buildJavascriptTree(scriptBlockBuilder); - - ExpressionStatement expressionStatement = ExpressionStatementBuilder.expressionStatement( - functionCall() - .target(parenthesizedExpression(functionNode() - .param(name("app")) - .body(scriptBlockBuilder))) - .argument(orExpression() - .left(windowAppProperty()) - .right(parenthesizedAssignment(assignment() - .left(windowAppProperty()) - .right(objectLiteral())))) - ).build(); - return new ByteArrayInputStream(expressionStatement.toSource(4).getBytes()); - } - - protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) {} - - @Override - public final String getMimeType() { - return JAVASCRIPT_MIMETYPE; - } - - private PropertyNameBuilder windowAppProperty() { - return property(name("window"), name("app")); - } + public final InputStream getStream() { + BlockBuilder scriptBlockBuilder = block(); + buildJavascriptTree(scriptBlockBuilder); + + ExpressionStatement expressionStatement = ExpressionStatementBuilder.expressionStatement( + functionCall() + .target(parenthesizedExpression(functionNode() + .param(name("app")) + .body(scriptBlockBuilder))) + .argument(orExpression() + .left(windowAppProperty()) + .right(parenthesizedAssignment(assignment() + .left(windowAppProperty()) + .right(objectLiteral())))) + ).build(); + return new ByteArrayInputStream(expressionStatement.toSource(4).getBytes()); + } + + protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { + } + + @Override + public final String getMimeType() { + return JAVASCRIPT_UTF_8.toString(); + } + + private PropertyNameBuilder windowAppProperty() { + return property(name("window"), name("app")); + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptStaticResource.java b/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptStaticResource.java index 58ee87c..bf6a651 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptStaticResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptStaticResource.java @@ -2,21 +2,22 @@ import org.licket.core.resource.AbstractClasspathResource; +import static com.google.common.net.MediaType.JAVASCRIPT_UTF_8; + /** * @author activey */ public class JavascriptStaticResource extends AbstractClasspathResource { - public static final String JAVASCRIPT_MIMETYPE = "application/javascript"; - private final String name; + private final String name; - public JavascriptStaticResource(String name, String classpathLocation) { - super(classpathLocation, JAVASCRIPT_MIMETYPE); - this.name = name; - } + public JavascriptStaticResource(String name, String classpathLocation) { + super(classpathLocation, JAVASCRIPT_UTF_8.toString()); + this.name = name; + } - @Override - public String getName() { - return name; - } + @Override + public String getName() { + return name; + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptTemplateResource.java b/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptTemplateResource.java new file mode 100644 index 0000000..a58cdd1 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/resource/javascript/JavascriptTemplateResource.java @@ -0,0 +1,64 @@ +package org.licket.core.resource.javascript; + +import com.google.common.io.CharStreams; +import org.licket.core.resource.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.stringtemplate.v4.ST; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Map; + +import static com.google.common.collect.Maps.newHashMap; +import static com.google.common.net.MediaType.JAVASCRIPT_UTF_8; + +/** + * @author lukaszgrabski + */ +public class JavascriptTemplateResource implements Resource { + + private final static Logger LOGGER = LoggerFactory.getLogger(JavascriptTemplateResource.class); + + private final String name; + private final String templateClasspathLocation; + + public JavascriptTemplateResource(String name, String templateClasspathLocation) { + this.name = name; + this.templateClasspathLocation = templateClasspathLocation; + } + + @Override + public String getMimeType() { + return JAVASCRIPT_UTF_8.toString(); + } + + @Override + public String getName() { + return name; + } + + @Override + public InputStream getStream() { + InputStream templateStream = JavascriptTemplateResource.class.getClassLoader().getResourceAsStream(templateClasspathLocation); + if (templateStream == null) { + LOGGER.error("Unable to locate ClassPath resource: {}", templateClasspathLocation); + return null; + } + try { + ST stringTemplate = new ST(CharStreams.toString(new InputStreamReader(templateStream))); + Map parameters = newHashMap(); + collectTemplateVariables(parameters); + parameters.entrySet().forEach(entry -> stringTemplate.add(entry.getKey(), entry.getValue())); + return new ByteArrayInputStream(stringTemplate.render().getBytes()); + } catch (IOException e) { + LOGGER.error("Unable to process template.", e); + } + return null; + } + + protected void collectTemplateVariables(Map templateVariables) { + } +} diff --git a/licket-framework/src/main/java/org/licket/core/resource/javascript/MergedJavascriptStaticResource.java b/licket-framework/src/main/java/org/licket/core/resource/javascript/MergedJavascriptStaticResource.java deleted file mode 100644 index 8ce1d38..0000000 --- a/licket-framework/src/main/java/org/licket/core/resource/javascript/MergedJavascriptStaticResource.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.licket.core.resource.javascript; - -import static com.google.common.collect.FluentIterable.from; -import static com.google.common.collect.Lists.newArrayList; -import static java.lang.String.format; -import static java.util.Collections.enumeration; -import static org.licket.core.resource.javascript.JavascriptStaticResource.JAVASCRIPT_MIMETYPE; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.SequenceInputStream; -import org.licket.core.resource.Resource; - -/** - * @author activey - */ -public class MergedJavascriptStaticResource implements Resource { - - private String name; - private JavascriptStaticResource[] resources; - - public MergedJavascriptStaticResource(String name, JavascriptStaticResource... resources) { - this.name = name; - this.resources = resources; - } - - @Override - public InputStream getStream() { - return new SequenceInputStream(enumeration(from(newArrayList(resources)) - .transform(javascriptStaticResource -> new SequenceInputStream( - scriptHeaderStream(javascriptStaticResource.getName()), javascriptStaticResource.getStream())) - .toList())); - } - - private InputStream scriptHeaderStream(String name) { - return new ByteArrayInputStream(format("\n/* ----- including %s ----- */\n", name).getBytes()); - } - - @Override - public String getMimeType() { - return JAVASCRIPT_MIMETYPE; - } - - @Override - public String getName() { - return name; - } -} diff --git a/licket-framework/src/main/java/org/licket/core/resource/vue/VueLibraryResource.java b/licket-framework/src/main/java/org/licket/core/resource/vue/VueLibraryResource.java index d61962a..5713bf7 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/vue/VueLibraryResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/vue/VueLibraryResource.java @@ -8,7 +8,7 @@ */ public class VueLibraryResource extends JavascriptStaticResource implements HeadParticipatingResource { - public VueLibraryResource() { - super("vue.js", "vue/dist/vue.js"); - } + public VueLibraryResource() { + super("vue.js", "vue/dist/vue.js"); + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/vue/VueRouterLibraryResource.java b/licket-framework/src/main/java/org/licket/core/resource/vue/VueRouterLibraryResource.java index 38e57e7..5231dbe 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/vue/VueRouterLibraryResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/vue/VueRouterLibraryResource.java @@ -8,7 +8,7 @@ */ public class VueRouterLibraryResource extends JavascriptStaticResource implements HeadParticipatingResource { - public VueRouterLibraryResource() { - super("vue-router.js", "vue-router/dist/vue-router.js"); - } + public VueRouterLibraryResource() { + super("vue-router.js", "vue-router/dist/vue-router.js"); + } } diff --git a/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueGlobalInitializationResource.java b/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueGlobalInitializationResource.java index d1c315f..80278b0 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueGlobalInitializationResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueGlobalInitializationResource.java @@ -37,11 +37,11 @@ protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { } scriptBlockBuilder.appendStatement( - expressionStatement(functionCall() - .target(property("Vue", "component")) - // TODO its not really unique ... - .argument(stringLiteral(licketComponent.getCompositeId().getNormalizedValue())) - .argument(componentPropertiesDecorator.decorate(licketComponent, objectLiteral())))); + expressionStatement(functionCall() + .target(property("Vue", "component")) + // TODO its not really unique ... + .argument(stringLiteral(licketComponent.getCompositeId().getNormalizedValue())) + .argument(componentPropertiesDecorator.decorate(licketComponent, objectLiteral())))); return true; }); } diff --git a/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueInstanceInitializerResource.java b/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueInstanceInitializerResource.java index f6b97da..7bf24e6 100644 --- a/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueInstanceInitializerResource.java +++ b/licket-framework/src/main/java/org/licket/core/resource/vue/boot/VueInstanceInitializerResource.java @@ -12,12 +12,8 @@ import org.licket.framework.hippo.ObjectLiteralBuilder; import org.licket.framework.hippo.PropertyNameBuilder; import org.licket.framework.hippo.StringLiteralBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import java.lang.reflect.Modifier; - import static java.lang.String.format; import static org.licket.framework.hippo.ArrayLiteralBuilder.arrayLiteral; import static org.licket.framework.hippo.AssignmentBuilder.assignment; @@ -35,38 +31,34 @@ */ public class VueInstanceInitializerResource extends AbstractJavascriptDynamicResource implements FootParticipatingResource { - private static final Logger LOGGER = LoggerFactory.getLogger(VueInstanceInitializerResource.class); - - @Autowired - private LicketApplication application; - - @Autowired - private MountedComponents mountedComponents; + @Autowired + private LicketApplication application; - @Autowired - private VueComponentPropertiesDecorator componentPropertiesDecorator; + @Autowired + private MountedComponents mountedComponents; - @Override - public String getName() { - return "Licket.application.js"; - } + @Autowired + private VueComponentPropertiesDecorator componentPropertiesDecorator; - @Override - protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { - registerMountPoints(); + @Override + public String getName() { + return "Licket.application.js"; + } - // initializing VueRouter instance - PropertyNameBuilder appRouter = property("app", "router"); - scriptBlockBuilder.appendStatement( - expressionStatement(assignment() - .left(appRouter) - .right(newExpression() - .target(name("VueRouter")) - .argument(vueRoutesDefinitions()))) - ); + @Override + protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { + // initializing VueRouter instance + PropertyNameBuilder appRouter = property("app", "router"); + scriptBlockBuilder.appendStatement( + expressionStatement(assignment() + .left(appRouter) + .right(newExpression() + .target(name("VueRouter")) + .argument(vueRoutesDefinitions()))) + ); - // initializing Vue instance - scriptBlockBuilder.appendStatement( + // initializing Vue instance + scriptBlockBuilder.appendStatement( expressionStatement(assignment() .left(property(name("app"), name("instance"))) .right(newExpression() @@ -74,72 +66,48 @@ protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { .argument(objectLiteral().objectProperty( propertyBuilder().name("router").value(appRouter) )))) - ); - // mounting Vue instance - scriptBlockBuilder.appendStatement( - expressionStatement( + ); + // mounting Vue instance + scriptBlockBuilder.appendStatement( + expressionStatement( functionCall() - .target(property(property("app", "instance"), "$mount")) - .argument(applicationRootId())) - ); - } - - private ObjectLiteralBuilder vueRoutesDefinitions() { - return objectLiteral() - .objectProperty(propertyBuilder().name("routes").arrayValue(componentsTree())); - } - - private ArrayLiteralBuilder componentsTree() { - ArrayLiteralBuilder components = arrayLiteral(); - - // will mount root container to "/" - application.traverseDown(mountedContainer -> { - LicketMountPoint mountPoint = mountedContainer.getClass().getAnnotation(LicketMountPoint.class); - if (mountPoint == null) { - return false; - } - addComponentMountPoint(components, mountedContainer); - return false; - }); - return components; - } - - private void addComponentMountPoint(ArrayLiteralBuilder components, LicketComponent licketComponent) { - components.element(objectLiteral() - .objectProperty(propertyBuilder().name("path").value(stringLiteral(mountedComponents.mountedComponent(licketComponent.getClass()).path()))) - .objectProperty(propertyBuilder().name("name").value(stringLiteral(licketComponent.getClass().getName()))) - .objectProperty(propertyBuilder().name("component").value( + .target(property(property("app", "instance"), "$mount")) + .argument(applicationRootId())) + ); + } + + private StringLiteralBuilder applicationRootId() { + return stringLiteral(format("#%s", application.rootComponentContainer().getId())); + } + + private ObjectLiteralBuilder vueRoutesDefinitions() { + return objectLiteral() + .objectProperty(propertyBuilder().name("routes").arrayValue(componentsTree())); + } + + private ArrayLiteralBuilder componentsTree() { + ArrayLiteralBuilder components = arrayLiteral(); + + // will mount root container to "/" + application.traverseDown(mountedContainer -> { + LicketMountPoint mountPoint = mountedContainer.getClass().getAnnotation(LicketMountPoint.class); + if (mountPoint == null) { + return false; + } + addComponentMountPoint(components, mountedContainer); + return false; + }); + return components; + } + + private void addComponentMountPoint(ArrayLiteralBuilder components, LicketComponent licketComponent) { + components.element(objectLiteral() + .objectProperty(propertyBuilder().name("path").value(stringLiteral(mountedComponents.mountedComponent(licketComponent.getClass()).path()))) + .objectProperty(propertyBuilder().name("name").value(stringLiteral(licketComponent.getClass().getName()))) + .objectProperty(propertyBuilder().name("component").value( componentPropertiesDecorator.decorate(licketComponent, objectLiteral())) - ) - ); - } - - private StringLiteralBuilder applicationRootId() { - return stringLiteral(format("#%s", application.rootComponentContainer().getId())); - } - - private void registerMountPoints() { - application.traverseDown(mountedContainer -> { - LicketMountPoint mountPoint = mountedContainer.getClass().getAnnotation(LicketMountPoint.class); - if (mountPoint == null) { - return false; - } - // iterating trough components annotated with @LicketMountPoint - registerComponentMountPoint(mountedContainer, mountPoint.value()); - return false; - }); - } - - private void registerComponentMountPoint(LicketComponent licketComponent, String mountPoint) { - if (isComponentAbstract(licketComponent)) { - LOGGER.warn("Currently not supported to mount abstract component like this one: {}.", licketComponent.getCompositeId().getValue()); - return; - } - // registering mounted component - mountedComponents.setMountedLink(licketComponent.getClass(), mountPoint); - } + ) + ); + } - private boolean isComponentAbstract(LicketComponent licketComponent) { - return Modifier.isAbstract(licketComponent.getClass().getModifiers()); - } } \ No newline at end of file diff --git a/licket-framework/src/main/java/org/licket/core/view/AbstractLicketComponent.java b/licket-framework/src/main/java/org/licket/core/view/AbstractLicketComponent.java index e79fbc1..39787bf 100644 --- a/licket-framework/src/main/java/org/licket/core/view/AbstractLicketComponent.java +++ b/licket-framework/src/main/java/org/licket/core/view/AbstractLicketComponent.java @@ -7,7 +7,6 @@ import org.licket.core.view.api.DefaultLicketComponentAPI; import org.licket.core.view.hippo.vue.annotation.Name; import org.licket.core.view.hippo.vue.annotation.VueComponentFunction; -import org.licket.core.view.hippo.vue.extend.OnVueBeforeRouteEnterDecorator; import org.licket.core.view.mount.params.MountingParams; import org.licket.core.view.render.ComponentRenderingContext; import org.licket.framework.hippo.BlockBuilder; @@ -32,230 +31,231 @@ import static org.licket.core.view.hippo.vue.annotation.VueComponentFunctionPredicate.MOUNTED_ONLY; import static org.licket.framework.hippo.ArrayElementGetBuilder.arrayElementGet; import static org.licket.framework.hippo.AssignmentBuilder.assignment; -import static org.licket.framework.hippo.BlockBuilder.block; -import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; -import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; -import static org.licket.framework.hippo.IfStatementBuilder.ifStatement; import static org.licket.framework.hippo.KeywordLiteralBuilder.thisLiteral; import static org.licket.framework.hippo.NameBuilder.name; import static org.licket.framework.hippo.PropertyNameBuilder.property; -import static org.licket.framework.hippo.ReturnStatementBuilder.returnStatement; import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; public abstract class AbstractLicketComponent implements LicketComponent { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractLicketComponent.class); - - private String id; - private Class modelClass; - private LicketComponentModel componentModel; - private LicketComponentView view; - private LicketComponent parent; - private boolean initialized; - private boolean custom; - - public AbstractLicketComponent(String id, Class modelClass) { - this(id, modelClass, emptyComponentModel(), noView()); - } - - public AbstractLicketComponent(String id, Class modelClass, LicketComponentModel componentModel) { - this(id, modelClass, componentModel, noView()); - } - - public AbstractLicketComponent(String id, Class modelClass, LicketComponentModel componentModel, - LicketComponentView view) { - this.id = checkNotNull(id, "Component ID can not be null!"); - this.modelClass = checkNotNull(modelClass, "Model class can not be null!"); - this.componentModel = checkNotNull(componentModel, + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractLicketComponent.class); + + private String id; + private Class modelClass; + private LicketComponentModel componentModel; + private LicketComponentView view; + private LicketComponent parent; + private boolean initialized; + private boolean custom; + + public AbstractLicketComponent(String id, Class modelClass) { + this(id, modelClass, emptyComponentModel(), noView()); + } + + public AbstractLicketComponent(String id, Class modelClass, LicketComponentModel componentModel) { + this(id, modelClass, componentModel, noView()); + } + + public AbstractLicketComponent(String id, Class modelClass, LicketComponentModel componentModel, + LicketComponentView view) { + this.id = checkNotNull(id, "Component ID can not be null!"); + this.modelClass = checkNotNull(modelClass, "Model class can not be null!"); + this.componentModel = checkNotNull(componentModel, "Component model can not be null! Use emptyComponentModel() instead."); - this.view = checkNotNull(view, "Component view can not be null!"); - } - - @PostConstruct - public final void initialize() { - if (initialized) { - LOGGER.warn("Component is already initialized: {}", getCompositeId().getValue()); - return; - } - LOGGER.debug("Initializing component: {}", getCompositeId().getValue()); - onInitialize(); - this.initialized = true; - } - - protected void onInitialize() {} - - @Override - public final LicketComponentModel getComponentModel() { - return componentModel; - } - - @Override - public final Class getComponentModelClass() { - return modelClass; - } - - @Override - public final void setComponentModelObject(T componentModelObject) { - componentModel.set(componentModelObject); - } - - @Override - public final String getId() { - return id; - } - - public final CompositeId getCompositeId() { - Optional> parentOptional = traverseUp(component -> true); - if (!parentOptional.isPresent()) { - return fromStringValue(id); - } - return fromStringValueWithAdditionalParts(parentOptional.get().getCompositeId().getValue(), id); + this.view = checkNotNull(view, "Component view can not be null!"); + } + + @PostConstruct + public final void initialize() { + if (initialized) { + LOGGER.warn("Component is already initialized: {}", getCompositeId().getValue()); + return; } - - public final LicketComponent getParent() { - return parent; + LOGGER.debug("Initializing component: {}", getCompositeId().getValue()); + onInitialize(); + this.initialized = true; + } + + protected void onInitialize() { + } + + @Override + public final LicketComponentModel getComponentModel() { + return componentModel; + } + + @Override + public final Class getComponentModelClass() { + return modelClass; + } + + @Override + public final void setComponentModelObject(T componentModelObject) { + componentModel.set(componentModelObject); + } + + @Override + public final String getId() { + return id; + } + + public final CompositeId getCompositeId() { + Optional> parentOptional = traverseUp(component -> true); + if (!parentOptional.isPresent()) { + return fromStringValue(id); } + return fromStringValueWithAdditionalParts(parentOptional.get().getCompositeId().getValue(), id); + } - @Override - public final void setParent(LicketComponent parent) { - this.parent = parent; - } + public final LicketComponent getParent() { + return parent; + } - public final Optional> traverseUp(Predicate> componentTraverser) { - if (parent == null) { - return empty(); - } - if (componentTraverser.test(parent)) { - return of(parent); - } - return parent.traverseUp(componentTraverser); - } + @Override + public final void setParent(LicketComponent parent) { + this.parent = parent; + } - @Override - public NameBuilder vueName() { - return name(getCompositeId().getNormalizedValue()); + public final Optional> traverseUp(Predicate> componentTraverser) { + if (parent == null) { + return empty(); } - - @Override - public final LicketComponentView getView() { - return view; + if (componentTraverser.test(parent)) { + return of(parent); } - - public final void render(ComponentRenderingContext renderingContext) { - LOGGER.debug("Rendering component: {}", getCompositeId().getValue()); - onBeforeRender(renderingContext); - doRender(renderingContext); + return parent.traverseUp(componentTraverser); + } + + @Override + public NameBuilder vueName() { + return name(getCompositeId().getNormalizedValue()); + } + + @Override + public final LicketComponentView getView() { + return view; + } + + public final void render(ComponentRenderingContext renderingContext) { + LOGGER.debug("Rendering component: {}", getCompositeId().getValue()); + onBeforeRender(renderingContext); + doRender(renderingContext); + } + + protected void onBeforeRender(ComponentRenderingContext renderingContext) { + } + + private void doRender(ComponentRenderingContext renderingContext) { + if (!getView().hasTemplate()) { + LOGGER.trace("No separate view for component component: [{}], using original element content.", getCompositeId().getValue()); + return; } + renderingContext.onSurfaceElement(element -> { + generateComponentTemplate(renderingContext, element); - protected void onBeforeRender(ComponentRenderingContext renderingContext) {} - - private void doRender(ComponentRenderingContext renderingContext) { - if (!getView().hasTemplate()) { - LOGGER.trace("No separate view for component component: [{}], using original element content.", getCompositeId().getValue()); - return; - } - renderingContext.onSurfaceElement(element -> { - generateComponentTemplate(renderingContext, element); - - Optional elementOptional = overrideComponentElement(element, renderingContext); - if (elementOptional.isPresent()) { - element.replaceWith(elementOptional.get()); - element.detach(); - return; - } - generateComponentTag(element); - }); - } - - private void generateComponentTemplate(ComponentRenderingContext renderingContext, SurfaceElement element) { - try { - if (getView().isTemplateExternal()) { - renderingContext.compileComponentTemplateResource(this); - return; - } - renderingContext - .addResource(new ByteArrayResource(getCompositeId().getValue(), "text/html", element.toBytes())); - } catch (XMLStreamException e) { - LOGGER.error("An error occurred while rendering component.", e); - } - } - - protected Optional overrideComponentElement(SurfaceElement surfaceElement, ComponentRenderingContext renderingContext) { - // when overriding it to override component rendering and providing - return Optional.empty(); - } - - private void generateComponentTag(SurfaceElement element) { - SurfaceElement componentElement = new SurfaceElement(getCompositeId().getNormalizedValue(), element.getNamespace()); - setRefAttribute(componentElement); - - element.replaceWith(componentElement); + Optional elementOptional = overrideComponentElement(element, renderingContext); + if (elementOptional.isPresent()) { + element.replaceWith(elementOptional.get()); element.detach(); + return; + } + generateComponentTag(element); + }); + } + + private void generateComponentTemplate(ComponentRenderingContext renderingContext, SurfaceElement element) { + try { + if (getView().isTemplateExternal()) { + renderingContext.compileComponentTemplateResource(this); + return; + } + renderingContext + .addResource(new ByteArrayResource(getCompositeId().getValue(), "text/html", element.toBytes())); + } catch (XMLStreamException e) { + LOGGER.error("An error occurred while rendering component.", e); } - - private void setRefAttribute(SurfaceElement element) { - element.addAttribute("ref", getId()); - } - - public AbstractLicketComponentAPI api(ComponentFunctionCallback componentFunctionCallback) { - return new DefaultLicketComponentAPI(this, componentFunctionCallback); - } - - @Override - public final boolean isCustom() { - return custom; - } - - public void setCustom(boolean custom) { - this.custom = custom; - } - - @SuppressWarnings("unused") - public final void mountComponent(MountingParams mountingParams, ComponentActionCallback componentActionCallback) { - onComponentMounted(mountingParams); - onAfterComponentMounted(componentActionCallback); - } - - @VueComponentFunction(predicates = MOUNTED_ONLY) - public final void afterMount(@Name("response") NameBuilder response, BlockBuilder functionBody) { - // setting current form model directly without event emitter - functionBody - .appendStatement( - expressionStatement(assignment().left(property(thisLiteral(), name("model"))) - .right(arrayElementGet() - .target( - property(property(response, "body"), "model")) - .element(stringLiteral(getCompositeId().getValue()))))); - // gathering all others - ComponentActionCallback componentActionCallback = new ComponentActionCallback(); - - // invoking post action callback - onAfterComponentMounted(componentActionCallback); - - // sending reload request for gathered components - componentActionCallback.forEachToBeReloaded((component, patch) -> functionBody.appendStatement(expressionStatement(callReloadComponent(component, patch)))); - - // invoking javascript calls - componentActionCallback.forEachCall(call -> functionBody.appendStatement( - expressionStatement(call) - )); - } - - @VueComponentFunction(predicates = MOUNTED_ONLY) - public final void beforeMount(BlockBuilder functionBody) { - ComponentFunctionCallback componentFunctionCallback = new ComponentFunctionCallback(); - onBeforeComponentMounted(componentFunctionCallback); - componentFunctionCallback.forEachCall(functionCall -> functionBody.appendStatement(expressionStatement(functionCall))); - } - /** - * Override to be able to update component model upon mounting params entity - * - * @param componentMountingParams - */ - protected void onComponentMounted(MountingParams componentMountingParams) {} - - protected void onAfterComponentMounted(ComponentActionCallback componentActionCallback) {} - - protected void onBeforeComponentMounted(ComponentFunctionCallback componentFunctionCallback) {} + } + + protected Optional overrideComponentElement(SurfaceElement surfaceElement, ComponentRenderingContext renderingContext) { + // when overriding it to override component rendering and providing + return Optional.empty(); + } + + private void generateComponentTag(SurfaceElement element) { + SurfaceElement componentElement = new SurfaceElement(getCompositeId().getNormalizedValue(), element.getNamespace()); + setRefAttribute(componentElement); + + element.replaceWith(componentElement); + element.detach(); + } + + private void setRefAttribute(SurfaceElement element) { + element.addAttribute("ref", getId()); + } + + public AbstractLicketComponentAPI api(ComponentFunctionCallback componentFunctionCallback) { + return new DefaultLicketComponentAPI(this, componentFunctionCallback); + } + + @Override + public final boolean isCustom() { + return custom; + } + + public void setCustom(boolean custom) { + this.custom = custom; + } + + @SuppressWarnings("unused") + public final void mountComponent(MountingParams mountingParams, ComponentActionCallback componentActionCallback) { + onComponentMounted(mountingParams); + onAfterComponentMounted(componentActionCallback); + } + + @VueComponentFunction(predicates = MOUNTED_ONLY) + public final void afterMount(@Name("response") NameBuilder response, BlockBuilder functionBody) { + // setting current form model directly without event emitter + functionBody + .appendStatement( + expressionStatement(assignment().left(property(thisLiteral(), name("model"))) + .right(arrayElementGet() + .target( + property(property(response, "body"), "model")) + .element(stringLiteral(getCompositeId().getValue()))))); + // gathering all others + ComponentActionCallback componentActionCallback = new ComponentActionCallback(); + + // invoking post action callback + onAfterComponentMounted(componentActionCallback); + + // sending reload request for gathered components + componentActionCallback.forEachToBeReloaded((component, patch) -> functionBody.appendStatement(expressionStatement(callReloadComponent(component, patch)))); + + // invoking javascript calls + componentActionCallback.forEachCall(call -> functionBody.appendStatement( + expressionStatement(call) + )); + } + + @VueComponentFunction(predicates = MOUNTED_ONLY) + public final void beforeMount(BlockBuilder functionBody) { + ComponentFunctionCallback componentFunctionCallback = new ComponentFunctionCallback(); + onBeforeComponentMounted(componentFunctionCallback); + componentFunctionCallback.forEachCall(functionCall -> functionBody.appendStatement(expressionStatement(functionCall))); + } + + /** + * Override to be able to update component model upon mounting params entity + * + * @param componentMountingParams + */ + protected void onComponentMounted(MountingParams componentMountingParams) { + } + + protected void onAfterComponentMounted(ComponentActionCallback componentActionCallback) { + } + + protected void onBeforeComponentMounted(ComponentFunctionCallback componentFunctionCallback) { + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/AbstractReloadableLicketComponent.java b/licket-framework/src/main/java/org/licket/core/view/AbstractReloadableLicketComponent.java index dcfe4c7..2d2729d 100644 --- a/licket-framework/src/main/java/org/licket/core/view/AbstractReloadableLicketComponent.java +++ b/licket-framework/src/main/java/org/licket/core/view/AbstractReloadableLicketComponent.java @@ -6,14 +6,10 @@ import org.licket.core.view.hippo.vue.annotation.OnVueCreated; import org.licket.core.view.hippo.vue.annotation.VueComponentFunction; import org.licket.framework.hippo.BlockBuilder; -import org.licket.framework.hippo.EqualCheckExpressionBuilder; import org.licket.framework.hippo.FunctionCallBuilder; import org.licket.framework.hippo.NameBuilder; -import org.licket.framework.hippo.NotEqualCheckExpressionBuilder; import org.licket.framework.hippo.ObjectLiteralBuilder; -import org.licket.framework.hippo.ReturnStatementBuilder; -import static com.google.common.base.Preconditions.checkNotNull; import static org.licket.framework.hippo.AssignmentBuilder.assignment; import static org.licket.framework.hippo.BlockBuilder.block; import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; @@ -33,63 +29,63 @@ */ public abstract class AbstractReloadableLicketComponent extends AbstractLicketComponent { - @Name("model") - private ObjectLiteralBuilder modelProperty; - - public AbstractReloadableLicketComponent(String id, Class modelClass) { - super(id, modelClass); - } + @Name("model") + private ObjectLiteralBuilder modelProperty; - public AbstractReloadableLicketComponent(String id, Class modelClass, LicketComponentModel componentModel) { - super(id, modelClass, componentModel); - } + public AbstractReloadableLicketComponent(String id, Class modelClass) { + super(id, modelClass); + } - public AbstractReloadableLicketComponent(String id, Class modelClass, LicketComponentModel componentModel, LicketComponentView view) { - super(id, modelClass, componentModel, view); - } + public AbstractReloadableLicketComponent(String id, Class modelClass, LicketComponentModel componentModel) { + super(id, modelClass, componentModel); + } - @VueComponentFunction - public final void handleModelChanged(@Name("changedModelData") NameBuilder changedModelData, @Name("patch") NameBuilder patch, BlockBuilder functionBody) { - functionBody.appendStatement( - expressionStatement( - ifStatement() - .condition(notEqualCheckExpression() - .left(property(changedModelData, name("compositeId"))) - .right(stringLiteral(getCompositeId().getValue()))) - .then( - returnStatement() - )) - ); + public AbstractReloadableLicketComponent(String id, Class modelClass, LicketComponentModel componentModel, LicketComponentView view) { + super(id, modelClass, componentModel, view); + } - functionBody.appendStatement(ifStatement() - .condition(equalCheckExpression() - .left(patch) - .right(trueLiteral()) - ) - .then(block() - .appendStatement(expressionStatement(applyPatchFunction(changedModelData))) - .appendStatement(returnStatement()))); + @VueComponentFunction + public final void handleModelChanged(@Name("changedModelData") NameBuilder changedModelData, @Name("patch") NameBuilder patch, BlockBuilder functionBody) { + functionBody.appendStatement( + expressionStatement( + ifStatement() + .condition(notEqualCheckExpression() + .left(property(changedModelData, name("compositeId"))) + .right(stringLiteral(getCompositeId().getValue()))) + .then( + returnStatement() + )) + ); - functionBody.appendStatement( - expressionStatement(assignment() - .left(property(name("this"), name("model"))) - .right(property(changedModelData, name("model")))) - ); - } + functionBody.appendStatement(ifStatement() + .condition(equalCheckExpression() + .left(patch) + .right(trueLiteral()) + ) + .then(block() + .appendStatement(expressionStatement(applyPatchFunction(changedModelData))) + .appendStatement(returnStatement()))); - private FunctionCallBuilder applyPatchFunction(NameBuilder changedModelData) { - return functionCall() - .target(property("jsonpatch", "applyPatch")) - .argument(property(thisLiteral(), name("model"))) - .argument(property(changedModelData, name("patch"))); - } + functionBody.appendStatement( + expressionStatement(assignment() + .left(property(name("this"), name("model"))) + .right(property(changedModelData, name("model")))) + ); + } - @OnVueCreated - public final void onVueCreated(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(property(property(thisLiteral(), LicketComponentModelReloader.serviceName()), name("listenForModelChange"))) - .argument(property(thisLiteral(), name("handleModelChanged"))) - )); - } + private FunctionCallBuilder applyPatchFunction(NameBuilder changedModelData) { + return functionCall() + .target(property("jsonpatch", "applyPatch")) + .argument(property(thisLiteral(), name("model"))) + .argument(property(changedModelData, name("patch"))); + } + + @OnVueCreated + public final void onVueCreated(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(property(property(thisLiteral(), LicketComponentModelReloader.serviceName()), name("listenForModelChange"))) + .argument(property(thisLiteral(), name("handleModelChanged"))) + )); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/ComponentChildLocator.java b/licket-framework/src/main/java/org/licket/core/view/ComponentChildLocator.java index 6aeb165..504a700 100644 --- a/licket-framework/src/main/java/org/licket/core/view/ComponentChildLocator.java +++ b/licket-framework/src/main/java/org/licket/core/view/ComponentChildLocator.java @@ -12,41 +12,41 @@ */ public class ComponentChildLocator { - private LicketComponent startingComponent; + private LicketComponent startingComponent; - public ComponentChildLocator(LicketComponent startingComponent) { - this.startingComponent = startingComponent; + public ComponentChildLocator(LicketComponent startingComponent) { + this.startingComponent = startingComponent; + } + + public final Optional> findByCompositeId(CompositeId compositeId) { + ChildrenTraverse traverse = new ChildrenTraverse(compositeId); + startingComponent.traverseDown(traverse); + return traverse.getFound(); + } + + private class ChildrenTraverse implements Predicate> { + + private CompositeId compositeId; + private LicketComponent found; + + public ChildrenTraverse(CompositeId compositeId) { + this.compositeId = compositeId; } - public final Optional> findByCompositeId(CompositeId compositeId) { - ChildrenTraverse traverse = new ChildrenTraverse(compositeId); - startingComponent.traverseDown(traverse); - return traverse.getFound(); + public Optional> getFound() { + return ofNullable(found); } - private class ChildrenTraverse implements Predicate> { - - private CompositeId compositeId; - private LicketComponent found; - - public ChildrenTraverse(CompositeId compositeId) { - this.compositeId = compositeId; - } - - public Optional> getFound() { - return ofNullable(found); - } - - @Override - public boolean test(LicketComponent component) { - if (compositeId.hasMore() && compositeId.current().equals(component.getId())) { - compositeId.forward(); - return true; - } - if (compositeId.current().equals(component.getId())) { - this.found = component; - } - return false; - } + @Override + public boolean test(LicketComponent component) { + if (compositeId.hasMore() && compositeId.current().equals(component.getId())) { + compositeId.forward(); + return true; + } + if (compositeId.current().equals(component.getId())) { + this.found = component; + } + return false; } + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/ComponentFunctionCallback.java b/licket-framework/src/main/java/org/licket/core/view/ComponentFunctionCallback.java index 5419f48..7abd574 100644 --- a/licket-framework/src/main/java/org/licket/core/view/ComponentFunctionCallback.java +++ b/licket-framework/src/main/java/org/licket/core/view/ComponentFunctionCallback.java @@ -1,58 +1,37 @@ package org.licket.core.view; -import org.licket.core.view.LicketComponent; +import org.licket.core.view.mount.MountedComponentNavigation; import org.licket.core.view.mount.params.MountingParamsAggregator; import org.licket.framework.hippo.FunctionCallBuilder; -import org.licket.framework.hippo.ObjectLiteralBuilder; -import org.licket.framework.hippo.ObjectPropertyBuilder; import java.util.List; import java.util.function.Consumer; import static com.google.common.collect.Lists.newArrayList; -import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; -import static org.licket.framework.hippo.ObjectLiteralBuilder.objectLiteral; -import static org.licket.framework.hippo.ObjectPropertyBuilder.propertyBuilder; import static org.licket.framework.hippo.PropertyNameBuilder.property; -import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; /** * @author activey */ public class ComponentFunctionCallback { - private List functionCalls = newArrayList(); - - public final void call(FunctionCallBuilder functionCallBuilder) { - functionCalls.add(functionCallBuilder); - } - - public final void navigateToMounted(Class> componentClass) { - navigateToMounted(componentClass, paramsAggregator -> {}); - } - - public final void navigateToMounted(Class> componentClass, Consumer params) { - call(functionCall() - .target(property(property("this", "$router"), "push")) - .argument(objectLiteral() - .objectProperty(propertyBuilder().name("name").value(stringLiteral(componentClass.getName()))) - .objectProperty(propertyBuilder().name("params").value(mountingParams(params))))); - } - - private ObjectLiteralBuilder mountingParams(Consumer params) { - MountingParamsAggregator paramsAggregator = new MountingParamsAggregator(); - params.accept(paramsAggregator); - - ObjectLiteralBuilder paramsLiteral = objectLiteral(); - paramsAggregator.forEach(param -> { - ObjectPropertyBuilder propertyBuilder = propertyBuilder().name(param.getName()); - param.getValue().decorateProperty(propertyBuilder); - paramsLiteral.objectProperty(propertyBuilder); - }); - return paramsLiteral; - } - - public final void forEachCall(Consumer functionCallConsumer) { - functionCalls.forEach(functionCallConsumer); - } + private MountedComponentNavigation mountedComponentNavigation = new MountedComponentNavigation(); + private List functionCalls = newArrayList(); + + public final void call(FunctionCallBuilder functionCallBuilder) { + functionCalls.add(functionCallBuilder); + } + + public final void navigateToMounted(Class> componentClass) { + call(mountedComponentNavigation.navigateToMounted(componentClass, property("this", "$router"), paramsAggregator -> { + })); + } + + public final void navigateToMounted(Class> componentClass, Consumer params) { + call(mountedComponentNavigation.navigateToMounted(componentClass, property("this", "$router"), params)); + } + + public final void forEachCall(Consumer functionCallConsumer) { + functionCalls.forEach(functionCallConsumer); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/LicketComponent.java b/licket-framework/src/main/java/org/licket/core/view/LicketComponent.java index bf4a438..880614f 100644 --- a/licket-framework/src/main/java/org/licket/core/view/LicketComponent.java +++ b/licket-framework/src/main/java/org/licket/core/view/LicketComponent.java @@ -13,34 +13,35 @@ */ public interface LicketComponent extends VueClass { - LicketComponentView getView(); + LicketComponentView getView(); - String getId(); + String getId(); - CompositeId getCompositeId(); + CompositeId getCompositeId(); - Class getComponentModelClass(); + Class getComponentModelClass(); - LicketComponentModel getComponentModel(); + LicketComponentModel getComponentModel(); - void setComponentModelObject(TYPE componentModelObject); + void setComponentModelObject(TYPE componentModelObject); - void setParent(LicketComponent parent); + void setParent(LicketComponent parent); - void initialize(); + void initialize(); - void render(ComponentRenderingContext renderingContext); + void render(ComponentRenderingContext renderingContext); - Optional> traverseUp(Predicate> componentTraverser); + Optional> traverseUp(Predicate> componentTraverser); - // maybe it would make sense to have some components more complicated inner structure? - default void traverseDown(Predicate> componentConsumer) {} + // maybe it would make sense to have some components more complicated inner structure? + default void traverseDown(Predicate> componentConsumer) { + } - default boolean isCustom() { - return false; - } + default boolean isCustom() { + return false; + } - default boolean isStateful() { - return true; - } + default boolean isStateful() { + return true; + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/LicketComponentView.java b/licket-framework/src/main/java/org/licket/core/view/LicketComponentView.java index 78490ec..e58f8b2 100644 --- a/licket-framework/src/main/java/org/licket/core/view/LicketComponentView.java +++ b/licket-framework/src/main/java/org/licket/core/view/LicketComponentView.java @@ -1,6 +1,5 @@ package org.licket.core.view; -import java.io.InputStream; import org.licket.core.resource.Resource; import org.licket.core.resource.html.HtmlResource; @@ -9,82 +8,84 @@ */ public interface LicketComponentView { - static LicketComponentView fromComponentClass(Class> componentClass) { - return fromClassPathResource(componentClass.getSimpleName(), + static LicketComponentView fromComponentClass(Class> componentClass) { + return fromClassPathResource(componentClass.getSimpleName(), componentClass.getName().replaceAll("\\.", "/").concat(".html")); - } + } - static LicketComponentView fromClassPathResource(String name, String resourcePath) { - return new ExternalComponentView(new HtmlResource(name, resourcePath)); - } + static LicketComponentView fromClassPathResource(String name, String resourcePath) { + return new ExternalComponentView(new HtmlResource(name, resourcePath)); + } - static LicketComponentView internalTemplateView() { - return new InternalComponentView(); - } + static LicketComponentView internalTemplateView() { + return new InternalComponentView(); + } - static LicketComponentView noView() { return new NoTemplateComponentView(); } + static LicketComponentView noView() { + return new NoTemplateComponentView(); + } - Resource viewResource(); + Resource viewResource(); - boolean hasTemplate(); + boolean hasTemplate(); - boolean isTemplateExternal(); + boolean isTemplateExternal(); - class NoTemplateComponentView implements LicketComponentView { + class NoTemplateComponentView implements LicketComponentView { - @Override - public Resource viewResource() { - return null; - } + @Override + public Resource viewResource() { + return null; + } - @Override - public boolean hasTemplate() { - return false; - } + @Override + public boolean hasTemplate() { + return false; + } - @Override - public boolean isTemplateExternal() { - return false; - } + @Override + public boolean isTemplateExternal() { + return false; } + } - class InternalComponentView implements LicketComponentView { + class InternalComponentView implements LicketComponentView { - @Override - public Resource viewResource() { - return null; - } + @Override + public Resource viewResource() { + return null; + } - @Override - public boolean hasTemplate() { - return true; - } + @Override + public boolean hasTemplate() { + return true; + } - @Override - public boolean isTemplateExternal() { - return false; - } + @Override + public boolean isTemplateExternal() { + return false; } + } - class ExternalComponentView implements LicketComponentView { + class ExternalComponentView implements LicketComponentView { - private Resource componentViewResource; + private Resource componentViewResource; - public ExternalComponentView(Resource componentViewResource) { - this.componentViewResource = componentViewResource; - } + public ExternalComponentView(Resource componentViewResource) { + this.componentViewResource = componentViewResource; + } - public final Resource viewResource() { - return componentViewResource; - } + public final Resource viewResource() { + return componentViewResource; + } - public boolean hasTemplate() { - return true; - } + public boolean hasTemplate() { + return true; + } - @Override - public boolean isTemplateExternal() { - return true; - } + @Override + public boolean isTemplateExternal() { + return true; } + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/LicketLabel.java b/licket-framework/src/main/java/org/licket/core/view/LicketLabel.java index cf116c4..0ac92a5 100644 --- a/licket-framework/src/main/java/org/licket/core/view/LicketLabel.java +++ b/licket-framework/src/main/java/org/licket/core/view/LicketLabel.java @@ -1,57 +1,38 @@ package org.licket.core.view; -import static java.lang.String.format; - -import org.licket.core.model.ComponentIdModel; -import org.licket.core.model.LicketComponentModel; -import org.licket.core.view.container.AbstractLicketMultiContainer; +import org.licket.core.view.hippo.ComponentModelProperty; import org.licket.core.view.render.ComponentRenderingContext; import org.licket.xml.dom.Text; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Optional; - -public class LicketLabel extends AbstractLicketComponent { - - private static final Logger LOGGER = LoggerFactory.getLogger(LicketLabel.class); - - public LicketLabel(String id) { - this(id, new ComponentIdModel(id)); - } - - /** - * - * @param id Label component id, unique on given tree level (or at least should be ;P) - * @param labelModel Label placeholder model. Keep that in very mind: this model, typed on String, is intended to be - * used as a placeholder generator for hippo one-way binding as placeholder is generated upon this schema: - * - * - * {{%s}}.format(componentModel.get()) - * - * - * Thats it no other logic behind. - */ - public LicketLabel(String id, LicketComponentModel labelModel) { - super(id, String.class, labelModel); - } - - @Override - protected void onBeforeRender(ComponentRenderingContext renderingContext) { - LOGGER.trace("Rendering LicketLabel: [{}]", getId()); - renderingContext.onSurfaceElement(element -> { - // clearing out whole label content - element.removeChildren(); - // setting up label value template - element.appendChildElement(new Text(placeholder())); - }); - } - - private String placeholder() { - Optional> parent = traverseUp(component -> component instanceof AbstractLicketMultiContainer); - if (parent != null) { - return format("{{model.%s}}", getComponentModel().get()); - } - return format("{{%s}}", getComponentModel().get()); - } +import static java.lang.String.format; +import static org.licket.core.model.LicketComponentModel.ofModelObject; + +public class LicketLabel extends AbstractLicketComponent { + + private static final Logger LOGGER = LoggerFactory.getLogger(LicketLabel.class); + + public LicketLabel(String id) { + this(id, ComponentModelProperty.fromComponentModelProperty(id)); + } + + public LicketLabel(String id, ComponentModelProperty modelLabelProperty) { + super(id, ComponentModelProperty.class, ofModelObject(modelLabelProperty)); + } + + @Override + protected final void onBeforeRender(ComponentRenderingContext renderingContext) { + LOGGER.trace("Rendering LicketLabel: [{}]", getId()); + onBeforeLabelRender(renderingContext); + renderingContext.onSurfaceElement(element -> { + // clearing out whole label content + element.removeChildren(); + // setting up label value template + element.appendChildElement(new Text(format("{{%s}}", getComponentModel().get().builder().build().toSource()))); + }); + } + + protected void onBeforeLabelRender(ComponentRenderingContext renderingContext) { + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/LicketStaticLabel.java b/licket-framework/src/main/java/org/licket/core/view/LicketStaticLabel.java index 2b73f5b..1eafe43 100644 --- a/licket-framework/src/main/java/org/licket/core/view/LicketStaticLabel.java +++ b/licket-framework/src/main/java/org/licket/core/view/LicketStaticLabel.java @@ -8,20 +8,20 @@ public class LicketStaticLabel extends AbstractLicketComponent { - private static final Logger LOGGER = LoggerFactory.getLogger(LicketStaticLabel.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LicketStaticLabel.class); - public LicketStaticLabel(String id, LicketComponentModel labelModel) { - super(id, String.class, labelModel); - } + public LicketStaticLabel(String id, LicketComponentModel labelModel) { + super(id, String.class, labelModel); + } - @Override - protected void onBeforeRender(ComponentRenderingContext renderingContext) { - LOGGER.trace("Rendering LicketStaticLabel: [{}]", getId()); - renderingContext.onSurfaceElement(element -> { - // clearing out whole label content - element.removeChildren(); - // setting up label value template - element.appendChildElement(new Text(getComponentModel().get())); - }); - } + @Override + protected void onBeforeRender(ComponentRenderingContext renderingContext) { + LOGGER.trace("Rendering LicketStaticLabel: [{}]", getId()); + renderingContext.onSurfaceElement(element -> { + // clearing out whole label content + element.removeChildren(); + // setting up label value template + element.appendChildElement(new Text(getComponentModel().get())); + }); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/LicketUrls.java b/licket-framework/src/main/java/org/licket/core/view/LicketUrls.java deleted file mode 100644 index 9a7f72f..0000000 --- a/licket-framework/src/main/java/org/licket/core/view/LicketUrls.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.licket.core.view; - -import static java.lang.String.format; - -/** - * @author activey - */ -public class LicketUrls { - - public static final String CONTEXT_RESOURCES = "/licket/resource"; - public static final String CONTEXT_FORM = "/licket/form"; - public static final String CONTEXT_ACTION_LINK = "/licket/link"; - public static final String CONTEXT_COMPONENT = "/licket/component"; - public static final String CONTEXT_DEBUG = "/licket/debug"; - - public static String componentViewUrl(LicketComponent licketComponent) { - return CONTEXT_COMPONENT + format("/%s/view", licketComponent.getCompositeId().getValue()); - } -} diff --git a/licket-framework/src/main/java/org/licket/core/view/api/AbstractLicketComponentAPI.java b/licket-framework/src/main/java/org/licket/core/view/api/AbstractLicketComponentAPI.java index f49f65d..4f05b24 100644 --- a/licket-framework/src/main/java/org/licket/core/view/api/AbstractLicketComponentAPI.java +++ b/licket-framework/src/main/java/org/licket/core/view/api/AbstractLicketComponentAPI.java @@ -1,13 +1,18 @@ package org.licket.core.view.api; -import org.licket.core.view.LicketComponent; import org.licket.core.view.ComponentFunctionCallback; +import org.licket.core.view.LicketComponent; +import org.licket.core.view.hippo.ComponentModelProperty; +import org.licket.core.view.mount.MountedComponentNavigation; + +import static org.licket.framework.hippo.PropertyNameBuilder.property; /** * @author lukaszgrabski */ public abstract class AbstractLicketComponentAPI { + private MountedComponentNavigation mountedComponentNavigation = new MountedComponentNavigation(); private LicketComponent licketComponent; private ComponentFunctionCallback functionCallback; @@ -23,4 +28,16 @@ protected LicketComponent component() { protected ComponentFunctionCallback functionCallback() { return functionCallback; } + + public void navigateTo(ComponentModelProperty componentMountedPath) { + functionCallback.call(mountedComponentNavigation.navigateToPath(componentMountedPath, property("this", "$router"))); + } + + public void hide() { + + } + + public void show() { + + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/api/DefaultLicketComponentAPI.java b/licket-framework/src/main/java/org/licket/core/view/api/DefaultLicketComponentAPI.java index 1b732d6..e520590 100644 --- a/licket-framework/src/main/java/org/licket/core/view/api/DefaultLicketComponentAPI.java +++ b/licket-framework/src/main/java/org/licket/core/view/api/DefaultLicketComponentAPI.java @@ -1,7 +1,7 @@ package org.licket.core.view.api; -import org.licket.core.view.LicketComponent; import org.licket.core.view.ComponentFunctionCallback; +import org.licket.core.view.LicketComponent; /** * @author lukaszgrabski diff --git a/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMonoContainer.java b/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMonoContainer.java index dbf40b0..ef173bb 100644 --- a/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMonoContainer.java +++ b/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMonoContainer.java @@ -4,6 +4,7 @@ import org.licket.core.view.AbstractReloadableLicketComponent; import org.licket.core.view.LicketComponent; import org.licket.core.view.LicketComponentView; +import org.licket.core.view.render.ComponentRenderingContext; import java.util.function.Predicate; @@ -12,44 +13,53 @@ */ public abstract class AbstractLicketMonoContainer extends AbstractReloadableLicketComponent implements LicketComponentContainer { - private LicketComponent child; + private LicketComponent child; - public AbstractLicketMonoContainer(String id, Class modelClass) { - super(id, modelClass); - } + public AbstractLicketMonoContainer(String id, Class modelClass) { + super(id, modelClass); + } - public AbstractLicketMonoContainer(String id, Class modelClass, LicketComponentModel componentModel) { - super(id, modelClass, componentModel); - } + public AbstractLicketMonoContainer(String id, Class modelClass, LicketComponentModel componentModel) { + super(id, modelClass, componentModel); + } - public AbstractLicketMonoContainer(String id, Class modelClass, LicketComponentModel componentModel, - LicketComponentView view) { - super(id, modelClass, componentModel, view); - } + public AbstractLicketMonoContainer(String id, Class modelClass, LicketComponentModel componentModel, + LicketComponentView view) { + super(id, modelClass, componentModel, view); + } - public final void add(LicketComponent child) { - this.child = child; - child.setParent(this); - } + public final void add(LicketComponent child) { + this.child = child; + child.setParent(this); + } - @Override - protected final void onInitialize() { - onInitializeContainer(); - if (child == null) { - return; - } - child.initialize(); + @Override + protected final void onInitialize() { + onInitializeContainer(); + if (child == null) { + return; } + child.initialize(); + } - protected void onInitializeContainer() {} + protected void onInitializeContainer() { + } - @Override - public void traverseDown(Predicate> componentConsumer) { - if (child == null) { - return; - } - if (componentConsumer.test(child)) { - child.traverseDown(componentConsumer); - } + @Override + public void traverseDown(Predicate> componentConsumer) { + if (child == null) { + return; } + if (componentConsumer.test(child)) { + child.traverseDown(componentConsumer); + } + } + + @Override + protected final void onBeforeRender(ComponentRenderingContext renderingContext) { + onRenderContainer(renderingContext); + } + + protected void onRenderContainer(ComponentRenderingContext renderingContext) { + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMultiContainer.java b/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMultiContainer.java index 7b6eda2..074b7ca 100644 --- a/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMultiContainer.java +++ b/licket-framework/src/main/java/org/licket/core/view/container/AbstractLicketMultiContainer.java @@ -1,7 +1,6 @@ package org.licket.core.view.container; import org.licket.core.model.LicketComponentModel; -import org.licket.core.module.application.LicketComponentModelReloader; import org.licket.core.view.AbstractReloadableLicketComponent; import org.licket.core.view.LicketComponent; import org.licket.core.view.LicketComponentView; @@ -19,51 +18,53 @@ */ public abstract class AbstractLicketMultiContainer extends AbstractReloadableLicketComponent implements LicketComponentContainer { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractLicketMultiContainer.class); - private List> items = newArrayList(); + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractLicketMultiContainer.class); + private List> items = newArrayList(); - public AbstractLicketMultiContainer(String id, Class modelClass) { - super(id, modelClass); - } + public AbstractLicketMultiContainer(String id, Class modelClass) { + super(id, modelClass); + } - public AbstractLicketMultiContainer(String id, Class modelClass, LicketComponentModel componentModel) { - super(id, modelClass, componentModel); - } + public AbstractLicketMultiContainer(String id, Class modelClass, LicketComponentModel componentModel) { + super(id, modelClass, componentModel); + } - public AbstractLicketMultiContainer(String id, Class modelClass, LicketComponentModel componentModel, - LicketComponentView view) { - super(id, modelClass, componentModel, view); - } + public AbstractLicketMultiContainer(String id, Class modelClass, LicketComponentModel componentModel, + LicketComponentView view) { + super(id, modelClass, componentModel, view); + } - @Override - protected final void onBeforeRender(ComponentRenderingContext renderingContext) { - onRenderContainer(renderingContext); - } + @Override + protected final void onBeforeRender(ComponentRenderingContext renderingContext) { + onBeforeRenderContainer(renderingContext); + } - protected void onRenderContainer(ComponentRenderingContext renderingContext) {} + protected void onBeforeRenderContainer(ComponentRenderingContext renderingContext) { + } - public final void add(LicketComponent licketComponent) { - if (items.contains(licketComponent)) { - LOGGER.trace("Licket component [{}] already used as a leaf!", licketComponent.getCompositeId().getValue()); - return; - } - licketComponent.setParent(this); - items.add(licketComponent); + public final void add(LicketComponent licketComponent) { + if (items.contains(licketComponent)) { + LOGGER.trace("Licket component [{}] already used as a leaf!", licketComponent.getCompositeId().getValue()); + return; } + licketComponent.setParent(this); + items.add(licketComponent); + } - @Override - protected final void onInitialize() { - onInitializeContainer(); - items.forEach(LicketComponent::initialize); - } + @Override + protected final void onInitialize() { + onInitializeContainer(); + items.forEach(LicketComponent::initialize); + } - protected void onInitializeContainer() {} + protected void onInitializeContainer() { + } - public final void traverseDown(Predicate> componentVisitor) { - items.forEach(item -> { - if (componentVisitor.test(item)) { - item.traverseDown(componentVisitor); - } - }); - } + public final void traverseDown(Predicate> componentVisitor) { + items.forEach(item -> { + if (componentVisitor.test(item)) { + item.traverseDown(componentVisitor); + } + }); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/container/LicketComponentContainer.java b/licket-framework/src/main/java/org/licket/core/view/container/LicketComponentContainer.java index 56ee015..0ef8372 100644 --- a/licket-framework/src/main/java/org/licket/core/view/container/LicketComponentContainer.java +++ b/licket-framework/src/main/java/org/licket/core/view/container/LicketComponentContainer.java @@ -7,5 +7,5 @@ */ public interface LicketComponentContainer extends LicketComponent { - void add(LicketComponent licketComponent); + void add(LicketComponent licketComponent); } diff --git a/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketForm.java b/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketForm.java index 3e665f8..698a7b1 100644 --- a/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketForm.java +++ b/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketForm.java @@ -35,7 +35,7 @@ public AbstractLicketForm(String id, Class modelClass, LicketComponentModel { // TODO check if element is in fact a
, or not necessary? element.addAttribute("v-on:submit", "submitForm"); diff --git a/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketFormAPI.java b/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketFormAPI.java index 0425781..1d720a9 100644 --- a/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketFormAPI.java +++ b/licket-framework/src/main/java/org/licket/core/view/form/AbstractLicketFormAPI.java @@ -1,8 +1,8 @@ package org.licket.core.view.form; +import org.licket.core.view.ComponentFunctionCallback; import org.licket.core.view.LicketComponent; import org.licket.core.view.api.AbstractLicketComponentAPI; -import org.licket.core.view.ComponentFunctionCallback; import static org.licket.core.view.tree.LicketComponentTreeWalkSequence.source; import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; diff --git a/licket-framework/src/main/java/org/licket/core/view/form/LicketInput.java b/licket-framework/src/main/java/org/licket/core/view/form/LicketInput.java index 6cf798f..8ab285b 100644 --- a/licket-framework/src/main/java/org/licket/core/view/form/LicketInput.java +++ b/licket-framework/src/main/java/org/licket/core/view/form/LicketInput.java @@ -1,49 +1,42 @@ package org.licket.core.view.form; -import static java.lang.String.format; -import java.util.Optional; -import org.licket.core.model.ComponentIdModel; -import org.licket.core.model.LicketComponentModel; import org.licket.core.view.AbstractLicketComponent; import org.licket.core.view.LicketComponent; import org.licket.core.view.container.AbstractLicketMultiContainer; +import org.licket.core.view.hippo.ComponentModelProperty; import org.licket.core.view.render.ComponentRenderingContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Optional; + +import static org.licket.core.model.LicketComponentModel.ofModelObject; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentModelProperty; + /** * @author activey */ -public class LicketInput extends AbstractLicketComponent { +public class LicketInput extends AbstractLicketComponent { - private static final Logger LOGGER = LoggerFactory.getLogger(LicketInput.class); + private static final Logger LOGGER = LoggerFactory.getLogger(LicketInput.class); - public LicketInput(String id, LicketComponentModel enclosingComponentPropertyModel) { - super(id, String.class, enclosingComponentPropertyModel); - } + public LicketInput(String id, ComponentModelProperty componentModelProperty) { + super(id, ComponentModelProperty.class, ofModelObject(componentModelProperty)); + } - public LicketInput(String id) { - this(id, new ComponentIdModel(id)); - } + public LicketInput(String id) { + this(id, fromComponentModelProperty(id)); + } - @Override - protected void onBeforeRender(ComponentRenderingContext renderingContext) { - LOGGER.trace("Rendering LicketInput: [{}]", getId()); + @Override + protected void onBeforeRender(ComponentRenderingContext renderingContext) { + LOGGER.trace("Rendering LicketInput: [{}]", getId()); - Optional> parent = traverseUp( + Optional> parent = traverseUp( component -> component instanceof AbstractLicketMultiContainer); - if (!parent.isPresent()) { - return; - } - AbstractLicketMultiContainer parentContainer = (AbstractLicketMultiContainer) parent.get(); - renderingContext.onSurfaceElement(element -> { - // TODO refactor - String firstPart = "model"; - if (!parentContainer.getView().hasTemplate()) { - firstPart = parentContainer.getId(); - } - element.addAttribute("v-model", format("%s.%s", firstPart, getComponentModel().get())); - element.addAttribute("name", getComponentModel().get()); - }); + if (!parent.isPresent()) { + return; } + renderingContext.onSurfaceElement(element -> element.addAttribute("v-model", getComponentModel().get().builder().build().toSource())); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentCallTargetOrigin.java b/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentCallTargetOrigin.java new file mode 100644 index 0000000..d98b580 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentCallTargetOrigin.java @@ -0,0 +1,26 @@ +package org.licket.core.view.hippo; + +import org.licket.framework.hippo.AbstractAstNodeBuilder; + +import static org.licket.framework.hippo.NameBuilder.name; +import static org.licket.framework.hippo.PropertyNameBuilder.property; + +/** + * @author lukaszgrabski + */ +public interface ComponentCallTargetOrigin { + + static ComponentCallTargetOrigin fromAppInstance() { + return () -> property("app", "instance"); + } + + static ComponentCallTargetOrigin fromVm() { + return () -> name("vm"); + } + + static ComponentCallTargetOrigin fromThis() { + return () -> name("this"); + } + + AbstractAstNodeBuilder buildTargetOrigin(); +} diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelDecorator.java index adc6f2d..a189de1 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelDecorator.java @@ -1,56 +1,58 @@ package org.licket.core.view.hippo; -import static com.fasterxml.jackson.core.JsonGenerator.Feature.QUOTE_FIELD_NAMES; -import static java.lang.String.format; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; +import com.fasterxml.jackson.databind.ObjectMapper; import org.licket.core.model.LicketComponentModel; import org.licket.framework.hippo.ObjectLiteralBuilder; import org.mozilla.javascript.Parser; import org.mozilla.javascript.ast.AstRoot; import org.mozilla.javascript.ast.ObjectLiteral; -import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; + +import static com.fasterxml.jackson.core.JsonGenerator.Feature.QUOTE_FIELD_NAMES; +import static java.lang.String.format; /** * @author activey */ public class ComponentModelDecorator { - private LicketComponentModel componentModel; + private LicketComponentModel componentModel; - private ComponentModelDecorator(LicketComponentModel componentModel) { - this.componentModel = componentModel; - } + private ComponentModelDecorator(LicketComponentModel componentModel) { + this.componentModel = componentModel; + } - public static ComponentModelDecorator fromComponentModel(LicketComponentModel componentModel) { - return new ComponentModelDecorator(componentModel); - } + public static ComponentModelDecorator fromComponentModel(LicketComponentModel componentModel) { + return new ComponentModelDecorator(componentModel); + } - private static Reader modelObjectLiteralReader(String modelStringValue) { - return new StringReader(format("model = %s", modelStringValue)); - } + private static Reader modelObjectLiteralReader(String modelStringValue) { + return new StringReader(format("model = %s", modelStringValue)); + } + + public ObjectLiteralBuilder decorate(ObjectLiteralBuilder objectLiteral) throws IOException { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(QUOTE_FIELD_NAMES, false); - public ObjectLiteralBuilder decorate(ObjectLiteralBuilder objectLiteral) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(QUOTE_FIELD_NAMES, false); - - // serialize component model to string json - Object modelValue = componentModel.get(); - if (modelValue == null) { - return objectLiteral; - } - String modelStringValue = mapper.writeValueAsString(modelValue); - - // parse model declaration object literal - AstRoot astRoot = new Parser().parse(modelObjectLiteralReader(modelStringValue), "test.js", 0); - astRoot.visitAll(node -> { - if (node instanceof ObjectLiteral) { - objectLiteral.fromObjectLiteral((ObjectLiteral) node); - return false; - } - return true; - }); - return objectLiteral; + // serialize component model to string json + Object modelValue = componentModel.get(); + if (modelValue == null) { + return objectLiteral; } + String modelStringValue = mapper.writeValueAsString(modelValue); + + // parse model declaration object literal + AstRoot astRoot = new Parser().parse(modelObjectLiteralReader(modelStringValue), "test.js", 0); + astRoot.visitAll(node -> { + if (node instanceof ObjectLiteral) { + objectLiteral.fromObjectLiteral((ObjectLiteral) node); + return false; + } + return true; + }); + return objectLiteral; + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelProperty.java b/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelProperty.java new file mode 100644 index 0000000..708d119 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/ComponentModelProperty.java @@ -0,0 +1,21 @@ +package org.licket.core.view.hippo; + +import org.licket.framework.hippo.PropertyNameBuilder; + +import static org.licket.framework.hippo.PropertyNameBuilder.property; + +/** + * @author lukaszgrabski + */ +public interface ComponentModelProperty { + + static ComponentModelProperty fromComponentParentModelProperty(String parentModelPropertyName) { + return () -> property(property(property("this", "$parent"), "model"), parentModelPropertyName); + } + + static ComponentModelProperty fromComponentModelProperty(String modelPropertyName) { + return () -> property(property("this", "model"), modelPropertyName); + } + + PropertyNameBuilder builder(); +} diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/VuePlugin.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/VuePlugin.java index 3f69dae..85517eb 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/VuePlugin.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/VuePlugin.java @@ -7,5 +7,5 @@ */ public interface VuePlugin { - PropertyNameBuilder vueName(); + PropertyNameBuilder vueName(); } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/LicketMountPoint.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/LicketMountPoint.java index f937379..23c6b3a 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/LicketMountPoint.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/LicketMountPoint.java @@ -1,5 +1,7 @@ package org.licket.core.view.hippo.vue.annotation; +import org.licket.core.view.security.LicketMountPointAccess; + import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -7,6 +9,7 @@ import static java.lang.annotation.ElementType.ANNOTATION_TYPE; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; +import static org.licket.core.view.security.LicketMountPointAccess.PUBLIC; /** * @author lukaszgrabski @@ -18,4 +21,8 @@ public @interface LicketMountPoint { String value(); + + LicketMountPointAccess access() default PUBLIC; + + boolean samePathRouteEnter() default false; } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/Name.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/Name.java index a77cbf6..e7fb60e 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/Name.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/Name.java @@ -1,10 +1,10 @@ package org.licket.core.view.hippo.vue.annotation; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - import java.lang.annotation.Documented; import java.lang.annotation.Retention; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + /** * @author grabslu */ @@ -13,5 +13,5 @@ @SuppressWarnings("unused") public @interface Name { - String value() default ""; + String value() default ""; } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/OnVueMounted.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/OnVueMounted.java index b57ae97..e811628 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/OnVueMounted.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/OnVueMounted.java @@ -1,12 +1,12 @@ package org.licket.core.view.hippo.vue.annotation; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + /** * @author activey */ diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueComponentFunction.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueComponentFunction.java index beeeb2f..60273fb 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueComponentFunction.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueComponentFunction.java @@ -17,7 +17,7 @@ @SuppressWarnings("unused") public @interface VueComponentFunction { - String value() default ""; + String value() default ""; - VueComponentFunctionPredicate[] predicates() default { ANY }; + VueComponentFunctionPredicate[] predicates() default {ANY}; } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendDataProperty.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendDataProperty.java index 68575f4..810fe58 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendDataProperty.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendDataProperty.java @@ -1,11 +1,11 @@ package org.licket.core.view.hippo.vue.annotation; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - import java.lang.annotation.Retention; import java.lang.annotation.Target; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + /** * @author activey */ @@ -13,5 +13,5 @@ @Target(FIELD) public @interface VueExtendDataProperty { - String value() default ""; + String value() default ""; } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendFunction.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendFunction.java index dfb0fe3..c63146d 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendFunction.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/annotation/VueExtendFunction.java @@ -1,12 +1,12 @@ package org.licket.core.view.hippo.vue.annotation; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + /** * @author activey */ @@ -16,5 +16,5 @@ @SuppressWarnings("unused") public @interface VueExtendFunction { - String value() default ""; + String value() default ""; } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/component/VueComponentPropertiesDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/component/VueComponentPropertiesDecorator.java index 2229bb4..872f26e 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/component/VueComponentPropertiesDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/component/VueComponentPropertiesDecorator.java @@ -34,94 +34,94 @@ */ public class VueComponentPropertiesDecorator { - private static final Logger LOGGER = LoggerFactory.getLogger(VueComponentPropertiesDecorator.class); - - @Autowired - private ResourceStorage resourceStorage; - - @Autowired - private OnVueBeforeRouteEnterDecorator routeEnterDecorator; - - public ObjectLiteralBuilder decorate(LicketComponent component, ObjectLiteralBuilder componentObjectBuilder) { - if (component.isStateful()) { - componentObjectBuilder.objectProperty(propertyBuilder().name("data").value(data(component))); - } else { - componentObjectBuilder.objectProperty(propertyBuilder().name("props").value(props())); - } - componentObjectBuilder - .objectProperty(propertyBuilder().name("template").value(template(component))) - .objectProperty(propertyBuilder().name("methods").value(methods(component))) - .objectProperty(propertyBuilder().name("components").value(nestedComponents(component))) - .objectProperty(propertyBuilder().name("created").value(created(component))) - .objectProperty(propertyBuilder().name("mounted").value(mounted(component))); - - // if it is mounted component or root - routeEnterDecorator.decorate(component, componentObjectBuilder); - - return componentObjectBuilder; - } + private static final Logger LOGGER = LoggerFactory.getLogger(VueComponentPropertiesDecorator.class); - private ObjectLiteralBuilder methods(LicketComponent component) { - return VueExtendMethodsDecorator.fromClass(component).decorate(objectLiteral()); - } + @Autowired + private ResourceStorage resourceStorage; - private FunctionNodeBuilder data(LicketComponent component) { - ObjectLiteralBuilder modelData = objectLiteral(); - try { - fromComponentModel(component.getComponentModel()).decorate(modelData); - } catch (IOException e) { - LOGGER.error("An error occurred while generating component model data. Returning empty model.", e); - } - functionNode().body( - block() - ); - return functionNode().body(block().appendStatement(returnStatement() - .returnValue(objectLiteral().objectProperty(propertyBuilder().name("model").value(modelData))))); - } + @Autowired + private OnVueBeforeRouteEnterDecorator routeEnterDecorator; - private ArrayLiteralBuilder props() { - return arrayLiteral().element(StringLiteralBuilder.stringLiteral("model")); + public ObjectLiteralBuilder decorate(LicketComponent component, ObjectLiteralBuilder componentObjectBuilder) { + if (component.isStateful()) { + componentObjectBuilder.objectProperty(propertyBuilder().name("data").value(data(component))); + } else { + componentObjectBuilder.objectProperty(propertyBuilder().name("props").value(props())); } - - private ObjectLiteralBuilder nestedComponents(LicketComponent component) { - ObjectLiteralBuilder nestedComponents = objectLiteral(); - component.traverseDown(nestedComponent -> { - if (nestedComponent.isCustom() || !nestedComponent.getView().hasTemplate() || !nestedComponent.isStateful()) { - return false; - } - ObjectLiteralBuilder nestedComponentObject = objectLiteral(); - decorate(nestedComponent, nestedComponentObject); - nestedComponents.objectProperty( - propertyBuilder() - .name(stringLiteral(nestedComponent.getCompositeId().getNormalizedValue())) - .value(nestedComponentObject)); - - return false; - }); - return nestedComponents; + componentObjectBuilder + .objectProperty(propertyBuilder().name("template").value(template(component))) + .objectProperty(propertyBuilder().name("methods").value(methods(component))) + .objectProperty(propertyBuilder().name("components").value(nestedComponents(component))) + .objectProperty(propertyBuilder().name("created").value(created(component))) + .objectProperty(propertyBuilder().name("mounted").value(mounted(component))); + + // if it is mounted component or root + routeEnterDecorator.decorate(component, componentObjectBuilder); + + return componentObjectBuilder; + } + + private ObjectLiteralBuilder methods(LicketComponent component) { + return VueExtendMethodsDecorator.fromClass(component).decorate(objectLiteral()); + } + + private FunctionNodeBuilder data(LicketComponent component) { + ObjectLiteralBuilder modelData = objectLiteral(); + try { + fromComponentModel(component.getComponentModel()).decorate(modelData); + } catch (IOException e) { + LOGGER.error("An error occurred while generating component model data. Returning empty model.", e); } - - private StringLiteralBuilder template(LicketComponent component) { - Optional componentViewResourceOptional = resourceStorage + functionNode().body( + block() + ); + return functionNode().body(block().appendStatement(returnStatement() + .returnValue(objectLiteral().objectProperty(propertyBuilder().name("model").value(modelData))))); + } + + private ArrayLiteralBuilder props() { + return arrayLiteral().element(StringLiteralBuilder.stringLiteral("model")); + } + + private ObjectLiteralBuilder nestedComponents(LicketComponent component) { + ObjectLiteralBuilder nestedComponents = objectLiteral(); + component.traverseDown(nestedComponent -> { + if (nestedComponent.isCustom() || !nestedComponent.getView().hasTemplate() || !nestedComponent.isStateful()) { + return false; + } + ObjectLiteralBuilder nestedComponentObject = objectLiteral(); + decorate(nestedComponent, nestedComponentObject); + nestedComponents.objectProperty( + propertyBuilder() + .name(stringLiteral(nestedComponent.getCompositeId().getNormalizedValue())) + .value(nestedComponentObject)); + + return false; + }); + return nestedComponents; + } + + private StringLiteralBuilder template(LicketComponent component) { + Optional componentViewResourceOptional = resourceStorage .getResource(component.getCompositeId().getValue()); - if (componentViewResourceOptional.isPresent()) { - try { - return stringLiteral( - CharStreams.toString(new InputStreamReader(componentViewResourceOptional.get().getStream()))); - } catch (IOException e) { - LOGGER.error("An error occurred while serializing component view.", e); - } - } - LOGGER.error("Unable to find template resource for component: {}.", component.getCompositeId().getValue()); - - return stringLiteral(""); + if (componentViewResourceOptional.isPresent()) { + try { + return stringLiteral( + CharStreams.toString(new InputStreamReader(componentViewResourceOptional.get().getStream()))); + } catch (IOException e) { + LOGGER.error("An error occurred while serializing component view.", e); + } } + LOGGER.error("Unable to find template resource for component: {}.", component.getCompositeId().getValue()); - private FunctionNodeBuilder created(LicketComponent component) { - return functionNode().body(OnVueCreatedDecorator.fromVueClass(component).decorate(block())); - } + return stringLiteral(""); + } - private FunctionNodeBuilder mounted(LicketComponent component) { - return functionNode().body(OnVueMountedDecorator.fromVueClass(component).decorate(block())); - } + private FunctionNodeBuilder created(LicketComponent component) { + return functionNode().body(OnVueCreatedDecorator.fromVueClass(component).decorate(block())); + } + + private FunctionNodeBuilder mounted(LicketComponent component) { + return functionNode().body(OnVueMountedDecorator.fromVueClass(component).decorate(block())); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/AbstractCallableVueClass.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/AbstractCallableVueClass.java new file mode 100644 index 0000000..ffc9a52 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/AbstractCallableVueClass.java @@ -0,0 +1,13 @@ +package org.licket.core.view.hippo.vue.extend; + +import org.licket.core.view.ComponentFunctionCallback; + +/** + * @author lukaszgrabski + */ +public abstract class AbstractCallableVueClass implements VueClass { + + public AbstractVueClassCallableAPI api(ComponentFunctionCallback functionCallback) { + return new DefaultVueClassCallableAPI(functionCallback); + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/AbstractVueClassCallableAPI.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/AbstractVueClassCallableAPI.java new file mode 100644 index 0000000..c006cea --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/AbstractVueClassCallableAPI.java @@ -0,0 +1,19 @@ +package org.licket.core.view.hippo.vue.extend; + +import org.licket.core.view.ComponentFunctionCallback; + +/** + * @author lukaszgrabski + */ +public abstract class AbstractVueClassCallableAPI { + + private ComponentFunctionCallback functionCallback; + + public AbstractVueClassCallableAPI(ComponentFunctionCallback functionCallback) { + this.functionCallback = functionCallback; + } + + protected ComponentFunctionCallback functionCallback() { + return functionCallback; + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/DefaultVueClassCallableAPI.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/DefaultVueClassCallableAPI.java new file mode 100644 index 0000000..a827943 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/DefaultVueClassCallableAPI.java @@ -0,0 +1,13 @@ +package org.licket.core.view.hippo.vue.extend; + +import org.licket.core.view.ComponentFunctionCallback; + +/** + * @author lukaszgrabski + */ +public class DefaultVueClassCallableAPI extends AbstractVueClassCallableAPI { + + public DefaultVueClassCallableAPI(ComponentFunctionCallback functionCallback) { + super(functionCallback); + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueBeforeRouteEnterDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueBeforeRouteEnterDecorator.java index 3175740..d844b7e 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueBeforeRouteEnterDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueBeforeRouteEnterDecorator.java @@ -4,11 +4,15 @@ import org.licket.core.module.application.LicketRemote; import org.licket.core.view.LicketComponent; import org.licket.core.view.hippo.vue.annotation.LicketMountPoint; +import org.licket.core.view.mount.MountComponentInterceptor; +import org.licket.framework.hippo.BlockBuilder; import org.licket.framework.hippo.FunctionNodeBuilder; -import org.licket.framework.hippo.KeywordLiteralBuilder; import org.licket.framework.hippo.ObjectLiteralBuilder; import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; + +import static com.google.common.collect.Lists.newArrayList; import static org.licket.framework.hippo.BlockBuilder.block; import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; @@ -31,52 +35,66 @@ public class OnVueBeforeRouteEnterDecorator { @Autowired private LicketApplication application; + @Autowired(required = false) + private List mountComponentInterceptors = newArrayList(); + public final void decorate(LicketComponent licketComponent, ObjectLiteralBuilder objectLiteralBuilder) { LicketMountPoint mountPoint = licketComponent.getClass().getAnnotation(LicketMountPoint.class); if (mountPoint == null) { return; } objectLiteralBuilder.objectProperty( - propertyBuilder().name("beforeRouteEnter").value(beforeRouteEnter(licketComponent)) + propertyBuilder().name("beforeRouteEnter").value(beforeRouteEnter(licketComponent, mountPoint)) ); } - private FunctionNodeBuilder beforeRouteEnter(LicketComponent licketComponent) { + private FunctionNodeBuilder beforeRouteEnter(LicketComponent licketComponent, LicketMountPoint mountPoint) { return functionNode() .param(name("to")) .param(name("from")) .param(name("next")) .body(block() - .appendStatement(ifStatement() - .condition(equalCheckExpression().left(property("from", "path")).right(property("to", "path"))) - .then(block() - .appendStatement(expressionStatement(functionCall().target(name("next")))) - .appendStatement(returnStatement()))) .appendStatement(expressionStatement( functionCall() .target(name("next")) - .argument(nextFunction(licketComponent))))); + .argument(nextFunction(licketComponent, mountPoint))))); } - private FunctionNodeBuilder nextFunction(LicketComponent licketComponent) { + private FunctionNodeBuilder nextFunction(LicketComponent licketComponent, LicketMountPoint mountPoint) { return functionNode() .param(name("vm")) .body( - block() - .appendStatement(expressionStatement( - functionCall().target(property(name("vm"), "beforeMount")) - )) - .appendStatement(licketRemote.callMountComponent( - licketComponent.getCompositeId().getValue(), - functionNode() - .param(name("response")) - .body(block().appendStatement( - functionCall() - .target(property(name("vm"), name("afterMount"))) - .argument(name("response")))) - ) - ) + decorateSamePathRouteEnter(decorateWithInterceptors(block(), mountPoint), mountPoint.samePathRouteEnter()) + .appendStatement(expressionStatement( + functionCall().target(property(name("vm"), "beforeMount")) + )) + .appendStatement(licketRemote.callMountComponent( + licketComponent.getCompositeId().getValue(), + functionNode() + .param(name("response")) + .body(block().appendStatement( + functionCall() + .target(property(name("vm"), name("afterMount"))) + .argument(name("response")))) + ) + ) ); } + + private BlockBuilder decorateWithInterceptors(BlockBuilder blockBuilder, LicketMountPoint mountPoint) { + mountComponentInterceptors.forEach(interceptor -> interceptor.intercept(blockBuilder, mountPoint)); + return blockBuilder; + } + + private BlockBuilder decorateSamePathRouteEnter(BlockBuilder block, boolean samePathRouteEnter) { + if (samePathRouteEnter) { + return block; + } + block.appendStatement(ifStatement() + .condition(equalCheckExpression().left(property("from", "path")).right(property("to", "path"))) + .then(block() + .appendStatement(returnStatement()))); + return block; + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueCreatedDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueCreatedDecorator.java index 9c3406a..2e7b29f 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueCreatedDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueCreatedDecorator.java @@ -1,56 +1,57 @@ package org.licket.core.view.hippo.vue.extend; +import org.licket.core.view.hippo.vue.annotation.OnVueCreated; +import org.licket.framework.hippo.BlockBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Method; +import java.util.Optional; + import static java.lang.reflect.Modifier.isPrivate; import static java.util.Arrays.stream; import static java.util.Optional.empty; import static java.util.Optional.ofNullable; import static org.joor.Reflect.on; -import java.lang.reflect.Method; -import java.util.Optional; - -import org.licket.core.view.hippo.vue.annotation.OnVueCreated; -import org.licket.framework.hippo.BlockBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * @author activey */ public class OnVueCreatedDecorator { - private static final Logger LOGGER = LoggerFactory.getLogger(OnVueCreatedDecorator.class); - private VueClass vueClass; + private static final Logger LOGGER = LoggerFactory.getLogger(OnVueCreatedDecorator.class); + private VueClass vueClass; - private OnVueCreatedDecorator(VueClass vueClass) { - this.vueClass = vueClass; - } + private OnVueCreatedDecorator(VueClass vueClass) { + this.vueClass = vueClass; + } - public static OnVueCreatedDecorator fromVueClass(VueClass vueClass) { - return new OnVueCreatedDecorator(vueClass); - } + public static OnVueCreatedDecorator fromVueClass(VueClass vueClass) { + return new OnVueCreatedDecorator(vueClass); + } - public final BlockBuilder decorate(BlockBuilder constructorBody) { - // analyzing @OnVueCreated annotation - stream(vueClass.getClass().getMethods()) - .forEach(method -> writeClassConstructorBody(constructorBody, method)); - return constructorBody; - } + public final BlockBuilder decorate(BlockBuilder constructorBody) { + // analyzing @OnVueCreated annotation + stream(vueClass.getClass().getMethods()) + .forEach(method -> writeClassConstructorBody(constructorBody, method)); + return constructorBody; + } - private void writeClassConstructorBody(BlockBuilder constructorFunctionBody, Method method) { - Optional onVueCreated = onVueCreatedFunction(method); - if (!onVueCreated.isPresent()) { - return; - } - // TODO rewrite this method... - on(vueClass).call(method.getName(), constructorFunctionBody); + private void writeClassConstructorBody(BlockBuilder constructorFunctionBody, Method method) { + Optional onVueCreated = onVueCreatedFunction(method); + if (!onVueCreated.isPresent()) { + return; } - - private Optional onVueCreatedFunction(Method method) { - OnVueCreated onVueCreatedFunction = method.getAnnotation(OnVueCreated.class); - if (isPrivate(method.getModifiers())) { - LOGGER.warn("Private methods, like {}, are not supported for now.", method.getName()); - return empty(); - } - return ofNullable(onVueCreatedFunction); + // TODO rewrite this method... + on(vueClass).call(method.getName(), constructorFunctionBody); + } + + private Optional onVueCreatedFunction(Method method) { + OnVueCreated onVueCreatedFunction = method.getAnnotation(OnVueCreated.class); + if (isPrivate(method.getModifiers())) { + LOGGER.warn("Private methods, like {}, are not supported for now.", method.getName()); + return empty(); } + return ofNullable(onVueCreatedFunction); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueMountedDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueMountedDecorator.java index bb08d54..8d9b90e 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueMountedDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/OnVueMountedDecorator.java @@ -1,56 +1,56 @@ package org.licket.core.view.hippo.vue.extend; +import org.licket.core.view.hippo.vue.annotation.OnVueMounted; +import org.licket.framework.hippo.BlockBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Method; +import java.util.Optional; + import static java.lang.reflect.Modifier.isPrivate; import static java.util.Arrays.stream; import static java.util.Optional.empty; import static java.util.Optional.ofNullable; import static org.joor.Reflect.on; -import java.lang.reflect.Method; -import java.util.Optional; - -import org.licket.core.view.hippo.vue.annotation.OnVueMounted; -import org.licket.framework.hippo.BlockBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - /** * @author activey */ public class OnVueMountedDecorator { - private static final Logger LOGGER = LoggerFactory.getLogger(OnVueMountedDecorator.class); - private VueClass vueClass; + private static final Logger LOGGER = LoggerFactory.getLogger(OnVueMountedDecorator.class); + private VueClass vueClass; - private OnVueMountedDecorator(VueClass vueClass) { - this.vueClass = vueClass; - } + private OnVueMountedDecorator(VueClass vueClass) { + this.vueClass = vueClass; + } - public static OnVueMountedDecorator fromVueClass(VueClass vueClass) { - return new OnVueMountedDecorator(vueClass); - } + public static OnVueMountedDecorator fromVueClass(VueClass vueClass) { + return new OnVueMountedDecorator(vueClass); + } - public final BlockBuilder decorate(BlockBuilder constructorBody) { - // analyzing @OnVueMounted annotation - stream(vueClass.getClass().getMethods()) - .forEach(method -> writeClassConstructorBody(constructorBody, method)); - return constructorBody; - } + public final BlockBuilder decorate(BlockBuilder constructorBody) { + // analyzing @OnVueMounted annotation + stream(vueClass.getClass().getMethods()) + .forEach(method -> writeClassConstructorBody(constructorBody, method)); + return constructorBody; + } - private void writeClassConstructorBody(BlockBuilder constructorFunctionBody, Method method) { - Optional onVueMounted = onVueMountedFunction(method); - if (!onVueMounted.isPresent()) { - return; - } - // TODO rewrite this method... - on(vueClass).call(method.getName(), constructorFunctionBody); + private void writeClassConstructorBody(BlockBuilder constructorFunctionBody, Method method) { + Optional onVueMounted = onVueMountedFunction(method); + if (!onVueMounted.isPresent()) { + return; } - - private Optional onVueMountedFunction(Method method) { - if (isPrivate(method.getModifiers())) { - LOGGER.warn("Private methods, like {}, are not supported for now.", method.getName()); - return empty(); - } - return ofNullable(method.getAnnotation(OnVueMounted.class)); + // TODO rewrite this method... + on(vueClass).call(method.getName(), constructorFunctionBody); + } + + private Optional onVueMountedFunction(Method method) { + if (isPrivate(method.getModifiers())) { + LOGGER.warn("Private methods, like {}, are not supported for now.", method.getName()); + return empty(); } + return ofNullable(method.getAnnotation(OnVueMounted.class)); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueClass.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueClass.java index a78d144..0f8051b 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueClass.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueClass.java @@ -1,6 +1,5 @@ package org.licket.core.view.hippo.vue.extend; -import org.licket.core.LicketApplication; import org.licket.framework.hippo.NameBuilder; /** @@ -8,6 +7,5 @@ */ public interface VueClass { - NameBuilder vueName(); - + NameBuilder vueName(); } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendConstructionException.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendConstructionException.java index 0d0cdde..89e0df6 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendConstructionException.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendConstructionException.java @@ -7,11 +7,11 @@ */ public class VueExtendConstructionException extends RuntimeException { - public VueExtendConstructionException(String messageTemplate, Object... params) { - super(format(messageTemplate, params)); - } + public VueExtendConstructionException(String messageTemplate, Object... params) { + super(format(messageTemplate, params)); + } - public VueExtendConstructionException(String message, Throwable cause) { - super(message, cause); - } + public VueExtendConstructionException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMemberFunction.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMemberFunction.java index cb26529..d908542 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMemberFunction.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMemberFunction.java @@ -1,18 +1,5 @@ package org.licket.core.view.hippo.vue.extend; -import static com.google.common.base.Objects.firstNonNull; -import static com.google.common.base.Predicates.*; -import static java.util.Arrays.stream; -import static org.apache.commons.lang.StringUtils.trimToNull; -import static org.joor.Reflect.on; -import static org.licket.framework.hippo.BlockBuilder.block; -import static org.licket.framework.hippo.FunctionNodeBuilder.functionNode; -import static org.licket.framework.hippo.NameBuilder.name; - -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.util.function.Consumer; - import com.google.common.base.Predicate; import org.licket.core.consumer.IndexedConsumer; import org.licket.core.view.hippo.vue.annotation.Name; @@ -21,75 +8,87 @@ import org.licket.framework.hippo.FunctionNodeBuilder; import org.licket.framework.hippo.NameBuilder; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.function.Consumer; + +import static com.google.common.base.Objects.firstNonNull; +import static com.google.common.base.Predicates.and; +import static com.google.common.base.Predicates.assignableFrom; +import static java.util.Arrays.stream; +import static org.apache.commons.lang.StringUtils.trimToNull; +import static org.joor.Reflect.on; +import static org.licket.framework.hippo.BlockBuilder.block; +import static org.licket.framework.hippo.FunctionNodeBuilder.functionNode; +import static org.licket.framework.hippo.NameBuilder.name; + /** * @author activey */ public class VueExtendMemberFunction { - private static Predicate isOfType(Class type) { - return parameter -> assignableFrom(type).apply(parameter.getType()); - } - - private static Predicate hasNoAnnotations() { - return parameter -> parameter.getAnnotations().length == 0; - } - - private AbstractAstNodeBuilder[] arguments; - private FunctionNodeBuilder functionNode; - private BlockBuilder body; - - public VueExtendMemberFunction() { - initFunctionNode(); - } - - private void initFunctionNode() { - functionNode = functionNode().body(body = block()); - } - - private Consumer readMethodParameter() { - return new IndexedConsumer() { - - @Override - protected void accept(Parameter parameter, int index) { - if (isArgument(parameter)) { - NameBuilder functionArgument = parameterToArgument(parameter); - functionNode.param(functionArgument); - arguments[index] = functionArgument; - return; - } else if (isBody(parameter)) { - arguments[index] = body; - return; - } - throw new VueExtendConstructionException("Parameter type not supported! %s", parameter.getName()); - } - }; - } - - private NameBuilder parameterToArgument(Parameter parameter) { - Name parameterName = parameter.getAnnotation(Name.class); - if (parameterName == null) { - return name(parameter.getName()); + private AbstractAstNodeBuilder[] arguments; + private FunctionNodeBuilder functionNode; + private BlockBuilder body; + public VueExtendMemberFunction() { + initFunctionNode(); + } + + private static Predicate isOfType(Class type) { + return parameter -> assignableFrom(type).apply(parameter.getType()); + } + + private static Predicate hasNoAnnotations() { + return parameter -> parameter.getAnnotations().length == 0; + } + + private void initFunctionNode() { + functionNode = functionNode().body(body = block()); + } + + private Consumer readMethodParameter() { + return new IndexedConsumer() { + + @Override + protected void accept(Parameter parameter, int index) { + if (isArgument(parameter)) { + NameBuilder functionArgument = parameterToArgument(parameter); + functionNode.param(functionArgument); + arguments[index] = functionArgument; + return; + } else if (isBody(parameter)) { + arguments[index] = body; + return; } - return name(firstNonNull(trimToNull(parameterName.value()), parameter.getName())); - } - - private boolean isArgument(Parameter parameter) { - return isOfType(NameBuilder.class).apply(parameter); - } - - private boolean isBody(Parameter parameter) { - return and(isOfType(BlockBuilder.class), hasNoAnnotations()).apply(parameter); - } - - public FunctionNodeBuilder toFunctionNode(Method method, VueClass vueClass) { - readMethodMetadata(method); - on(vueClass).call(method.getName(), arguments); - - return functionNode; - } - - private void readMethodMetadata(Method method) { - arguments = new AbstractAstNodeBuilder[method.getParameterCount()]; - stream(method.getParameters()).forEach(readMethodParameter()); + throw new VueExtendConstructionException("Parameter type not supported! %s", parameter.getName()); + } + }; + } + + private NameBuilder parameterToArgument(Parameter parameter) { + Name parameterName = parameter.getAnnotation(Name.class); + if (parameterName == null) { + return name(parameter.getName()); } + return name(firstNonNull(trimToNull(parameterName.value()), parameter.getName())); + } + + private boolean isArgument(Parameter parameter) { + return isOfType(NameBuilder.class).apply(parameter); + } + + private boolean isBody(Parameter parameter) { + return and(isOfType(BlockBuilder.class), hasNoAnnotations()).apply(parameter); + } + + public FunctionNodeBuilder toFunctionNode(Method method, VueClass vueClass) { + readMethodMetadata(method); + on(vueClass).call(method.getName(), arguments); + return functionNode; + } + + private void readMethodMetadata(Method method) { + arguments = new AbstractAstNodeBuilder[method.getParameterCount()]; + stream(method.getParameters()).forEach(readMethodParameter()); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMethodsDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMethodsDecorator.java index 458f1c7..a61fca4 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMethodsDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VueExtendMethodsDecorator.java @@ -21,50 +21,50 @@ */ public class VueExtendMethodsDecorator { - private static final Logger LOGGER = LoggerFactory.getLogger(VueExtendMethodsDecorator.class); + private static final Logger LOGGER = LoggerFactory.getLogger(VueExtendMethodsDecorator.class); - private VueClass vueClass; + private VueClass vueClass; - public static VueExtendMethodsDecorator fromClass(VueClass vueClass) { - return new VueExtendMethodsDecorator(vueClass); - } + private VueExtendMethodsDecorator(VueClass vueClass) { + this.vueClass = vueClass; + } - private VueExtendMethodsDecorator(VueClass vueClass) { - this.vueClass = vueClass; - } + public static VueExtendMethodsDecorator fromClass(VueClass vueClass) { + return new VueExtendMethodsDecorator(vueClass); + } + + public ObjectLiteralBuilder decorate(ObjectLiteralBuilder objectLiteral) { + stream(vueClass.getClass().getMethods()).forEach(method -> writeMemberFunctionBody(objectLiteral, method)); + return objectLiteral; + } - public ObjectLiteralBuilder decorate(ObjectLiteralBuilder objectLiteral) { - stream(vueClass.getClass().getMethods()).forEach(method -> writeMemberFunctionBody(objectLiteral, method)); - return objectLiteral; + private void writeMemberFunctionBody(ObjectLiteralBuilder methodsObject, Method method) { + Optional classFunction = getClassFunction(method); + if (!classFunction.isPresent()) { + return; } + // declaring member function + VueExtendMemberFunction memberFunction = new VueExtendMemberFunction(); - private void writeMemberFunctionBody(ObjectLiteralBuilder methodsObject, Method method) { - Optional classFunction = getClassFunction(method); - if (!classFunction.isPresent()) { - return; - } - // declaring member function - VueExtendMemberFunction memberFunction = new VueExtendMemberFunction(); + // appending extend method declaration + methodsObject.objectProperty( + propertyBuilder() + .name(firstNonNull(trimToNull(classFunction.get().value()), method.getName())) + .value(memberFunction.toFunctionNode(method, vueClass))); + } - // appending extend method declaration - methodsObject.objectProperty( - propertyBuilder() - .name(firstNonNull(trimToNull(classFunction.get().value()), method.getName())) - .value(memberFunction.toFunctionNode(method, vueClass))); + private Optional getClassFunction(Method method) { + if (isPrivate(method.getModifiers())) { + LOGGER.warn("Private methods, like {}, are not supported for now.", method.getName()); + return empty(); } - - private Optional getClassFunction(Method method) { - if (isPrivate(method.getModifiers())) { - LOGGER.warn("Private methods, like {}, are not supported for now.", method.getName()); - return empty(); - } - VueComponentFunction classFunction = method.getAnnotation(VueComponentFunction.class); - if (classFunction == null) { - return empty(); - } - if (!stream(classFunction.predicates()).allMatch(vueClassPredicate -> vueClassPredicate.predicate().test(vueClass))) { - return empty(); - } - return ofNullable(classFunction); + VueComponentFunction classFunction = method.getAnnotation(VueComponentFunction.class); + if (classFunction == null) { + return empty(); + } + if (!stream(classFunction.predicates()).allMatch(vueClassPredicate -> vueClassPredicate.predicate().test(vueClass))) { + return empty(); } + return ofNullable(classFunction); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VuePropertiesDecorator.java b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VuePropertiesDecorator.java index 77d5401..1f2bbf5 100644 --- a/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VuePropertiesDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/hippo/vue/extend/VuePropertiesDecorator.java @@ -1,84 +1,82 @@ package org.licket.core.view.hippo.vue.extend; +import org.licket.core.view.hippo.vue.annotation.Name; +import org.licket.framework.hippo.AbstractAstNodeBuilder; +import org.licket.framework.hippo.BlockBuilder; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + import static com.google.common.base.Objects.firstNonNull; import static com.google.common.base.Predicates.assignableFrom; import static com.google.common.base.Predicates.notNull; import static org.apache.commons.beanutils.PropertyUtils.getProperty; import static org.apache.commons.lang.StringUtils.trimToNull; import static org.joor.Reflect.on; -import static org.licket.framework.hippo.AssignmentBuilder.assignment; import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; -import static org.licket.framework.hippo.KeywordLiteralBuilder.thisLiteral; import static org.licket.framework.hippo.NameBuilder.name; import static org.licket.framework.hippo.ObjectLiteralBuilder.objectLiteral; -import static org.licket.framework.hippo.PropertyNameBuilder.property; import static org.licket.framework.hippo.VariableDeclarationBuilder.variableDeclaration; import static org.licket.framework.hippo.VariableInitializerBuilder.variableInitializer; import static org.springframework.util.ReflectionUtils.doWithFields; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; - -import org.licket.core.view.hippo.vue.annotation.Name; -import org.licket.framework.hippo.*; -import org.springframework.util.ReflectionUtils; - /** * @author activey */ public class VuePropertiesDecorator { - private VueClass vueClass; + private VueClass vueClass; - private VuePropertiesDecorator(VueClass vueClass) { - this.vueClass = vueClass; - } + private VuePropertiesDecorator(VueClass vueClass) { + this.vueClass = vueClass; + } - public static VuePropertiesDecorator fromVueClassProperties(VueClass vueClass) { - return new VuePropertiesDecorator(vueClass); - } + public static VuePropertiesDecorator fromVueClassProperties(VueClass vueClass) { + return new VuePropertiesDecorator(vueClass); + } - public BlockBuilder decorate(BlockBuilder block) { - doWithFields(vueClass.getClass(), field -> doOnAccessible(field, accessibleField -> { - AbstractAstNodeBuilder objectProperty = getPropertyAstBuilder(field.getName()); - if (objectProperty == null) { - objectProperty = objectLiteral(); - } - Name customName = accessibleField.getAnnotation(Name.class); - block.appendStatement(expressionStatement( - variableDeclaration().variable( - variableInitializer() - .target(name(firstNonNull(trimToNull(customName.value()), accessibleField.getName()))) - .initializer(objectProperty) - ) - ) - ); - }), field -> notNull().apply(on(field).get()) && isNodeBuilderField(field)); - return block; - } + public BlockBuilder decorate(BlockBuilder block) { + doWithFields(vueClass.getClass(), field -> doOnAccessible(field, accessibleField -> { + AbstractAstNodeBuilder objectProperty = getPropertyAstBuilder(field.getName()); + if (objectProperty == null) { + objectProperty = objectLiteral(); + } + Name customName = accessibleField.getAnnotation(Name.class); + block.appendStatement(expressionStatement( + variableDeclaration().variable( + variableInitializer() + .target(name(firstNonNull(trimToNull(customName.value()), accessibleField.getName()))) + .initializer(objectProperty) + ) + ) + ); + }), field -> notNull().apply(on(field).get()) && isNodeBuilderField(field)); + return block; + } - private boolean isNodeBuilderField(Field field) { - return assignableFrom(AbstractAstNodeBuilder.class).apply(field.getType()); - } + private boolean isNodeBuilderField(Field field) { + return assignableFrom(AbstractAstNodeBuilder.class).apply(field.getType()); + } - private AbstractAstNodeBuilder getPropertyAstBuilder(String propertyName) throws IllegalAccessException { - try { - // TODO do it some better way ... - AbstractAstNodeBuilder fieldValue = on(vueClass).field(propertyName).get(); - if (fieldValue != null) { - return fieldValue; - } - return (AbstractAstNodeBuilder) getProperty(vueClass, propertyName); - } catch (InvocationTargetException | NoSuchMethodException e) { - throw new IllegalArgumentException(e); - } + private AbstractAstNodeBuilder getPropertyAstBuilder(String propertyName) throws IllegalAccessException { + try { + // TODO do it some better way ... + AbstractAstNodeBuilder fieldValue = on(vueClass).field(propertyName).get(); + if (fieldValue != null) { + return fieldValue; + } + return (AbstractAstNodeBuilder) getProperty(vueClass, propertyName); + } catch (InvocationTargetException | NoSuchMethodException e) { + throw new IllegalArgumentException(e); } + } - private void doOnAccessible(Field field, ReflectionUtils.FieldCallback fieldConsumer) - throws IllegalAccessException { - boolean previousAccessible = field.isAccessible(); - field.setAccessible(true); - fieldConsumer.doWith(field); - field.setAccessible(previousAccessible); - } + private void doOnAccessible(Field field, ReflectionUtils.FieldCallback fieldConsumer) + throws IllegalAccessException { + boolean previousAccessible = field.isAccessible(); + field.setAccessible(true); + fieldConsumer.doWith(field); + field.setAccessible(previousAccessible); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketActionLink.java b/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketActionLink.java index 9f98623..9bf0ac2 100644 --- a/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketActionLink.java +++ b/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketActionLink.java @@ -27,70 +27,73 @@ */ public abstract class AbstractLicketActionLink extends AbstractLicketComponent { - public AbstractLicketActionLink(String id, Class modelClass) { - super(id, modelClass, emptyComponentModel(), internalTemplateView()); + public AbstractLicketActionLink(String id, Class modelClass) { + super(id, modelClass, emptyComponentModel(), internalTemplateView()); + } + + @VueComponentFunction + public final void afterClick(@Name("response") NameBuilder response, BlockBuilder functionBody) { + ComponentActionCallback componentActionCallback = new ComponentActionCallback(); + + // invoking post action callback + onAfterClick(componentActionCallback); + + // creating all after-click statements + componentActionCallback.forEachCall(call -> functionBody.appendStatement( + expressionStatement(call) + )); + + // sending reload request for gathered components + componentActionCallback.forEachToBeReloaded((component, patch) -> functionBody.appendStatement(expressionStatement(callReloadComponent(component, patch)))); + } + + @VueComponentFunction + public final void handleClick(BlockBuilder functionBlock) { + ComponentFunctionCallback callback = new ComponentFunctionCallback(); + onBeforeClick(callback); + callback.forEachCall(call -> functionBlock.appendStatement( + expressionStatement(call) + )); + + FunctionCallBuilder functionCall = functionCall() + .target(property(property(thisLiteral(), LicketRemote.serviceName()), name("handleActionLinkClick"))) + .argument(stringLiteral(getCompositeId().getValue())); + decorateActionLinkModel(functionCall); + functionCall.argument(property(thisLiteral(), name("afterClick"))); + functionBlock.appendStatement(expressionStatement(functionCall)); + } + + private void decorateActionLinkModel(FunctionCallBuilder functionCallBuilder) { + if (getComponentModelClass().isAssignableFrom(Void.class)) { + functionCallBuilder.argument(objectLiteral()); + return; } - - @VueComponentFunction - public final void afterClick(@Name("response") NameBuilder response, BlockBuilder functionBody) { - ComponentActionCallback componentActionCallback = new ComponentActionCallback(); - - // invoking post action callback - onAfterClick(componentActionCallback); - - // creating all after-click statements - componentActionCallback.forEachCall(call -> functionBody.appendStatement( - expressionStatement(call) - )); - - // sending reload request for gathered components - componentActionCallback.forEachToBeReloaded((component, patch) -> functionBody.appendStatement(expressionStatement(callReloadComponent(component, patch)))); - } - - @VueComponentFunction - public final void handleClick(BlockBuilder functionBlock) { - ComponentFunctionCallback callback = new ComponentFunctionCallback(); - onBeforeClick(callback); - callback.forEachCall(call -> functionBlock.appendStatement( - expressionStatement(call) - )); - - FunctionCallBuilder functionCall = functionCall() - .target(property(property(thisLiteral(), LicketRemote.serviceName()), name("handleActionLinkClick"))) - .argument(stringLiteral(getCompositeId().getValue())); - decorateActionLinkModel(functionCall); - functionCall.argument(property(thisLiteral(), name("afterClick"))); - functionBlock.appendStatement(expressionStatement(functionCall)); - } - - private void decorateActionLinkModel(FunctionCallBuilder functionCallBuilder) { - if (getComponentModelClass().isAssignableFrom(Void.class)) { - functionCallBuilder.argument(objectLiteral()); - return; - } /* TODO if link model class is different than Void we just read parent component model data and send it over, maybe it should be more sophisticated */ - functionCallBuilder.argument(property(property("this", "$parent"), "model")); - } + functionCallBuilder.argument(property(property("this", "$parent"), "model")); + } - @Override - protected final void onBeforeRender(ComponentRenderingContext renderingContext) { - // basically invokeAction() should handle all the stuff, the rest is done on javascript level - renderingContext + @Override + protected final void onBeforeRender(ComponentRenderingContext renderingContext) { + // basically invokeAction() should handle all the stuff, the rest is done on javascript level + renderingContext .onSurfaceElement(surfaceElement -> surfaceElement.addAttribute("v-on:click", "handleClick")); - } + } - @SuppressWarnings("unused") - public final void invokeAction(T modelObject, ComponentActionCallback componentActionCallback) { - onClick(modelObject); - onAfterClick(componentActionCallback); - } + @SuppressWarnings("unused") + public final void invokeAction(T modelObject, ComponentActionCallback componentActionCallback) { + onClick(modelObject); + onAfterClick(componentActionCallback); + } - protected void onClick(T modelObject) {} + protected void onClick(T modelObject) { + } - protected void onAfterClick(ComponentActionCallback componentActionCallback) {} + protected void onAfterClick(ComponentActionCallback componentActionCallback) { + } - protected void onBeforeClick(ComponentFunctionCallback componentFunctionCallback) {} + protected void onBeforeClick(ComponentFunctionCallback componentFunctionCallback) { + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketLink.java b/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketLink.java index 1706e1e..ce95dad 100644 --- a/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketLink.java +++ b/licket-framework/src/main/java/org/licket/core/view/link/AbstractLicketLink.java @@ -15,25 +15,31 @@ */ public abstract class AbstractLicketLink extends AbstractLicketComponent { - public AbstractLicketLink(String id) { - super(id, Void.class, emptyComponentModel(), internalTemplateView()); - } - - @VueComponentFunction - public final void handleClick(BlockBuilder functionBlock) { - ComponentFunctionCallback callback = new ComponentFunctionCallback(); - onClick(callback); - - callback.forEachCall(call -> functionBlock.appendStatement( - expressionStatement(call) - )); - } - - protected void onClick(ComponentFunctionCallback callback) {} - - @Override - protected void onBeforeRender(ComponentRenderingContext renderingContext) { - renderingContext - .onSurfaceElement(surfaceElement -> surfaceElement.addAttribute("v-on:click", "handleClick")); - } + public AbstractLicketLink(String id) { + super(id, Void.class, emptyComponentModel(), internalTemplateView()); + } + + @VueComponentFunction + public final void handleClick(BlockBuilder functionBlock) { + ComponentFunctionCallback callback = new ComponentFunctionCallback(); + onClick(callback); + + callback.forEachCall(call -> functionBlock.appendStatement( + expressionStatement(call) + )); + } + + protected void onClick(ComponentFunctionCallback callback) { + } + + @Override + protected final void onBeforeRender(ComponentRenderingContext renderingContext) { + renderingContext + .onSurfaceElement(surfaceElement -> surfaceElement.addAttribute("v-on:click", "handleClick")); + onBeforeLinkRender(renderingContext); + } + + protected void onBeforeLinkRender(ComponentRenderingContext renderingContext) { + } + } diff --git a/licket-framework/src/main/java/org/licket/core/view/list/AbstractLicketList.java b/licket-framework/src/main/java/org/licket/core/view/list/AbstractLicketList.java index 45e686f..61e17e5 100644 --- a/licket-framework/src/main/java/org/licket/core/view/list/AbstractLicketList.java +++ b/licket-framework/src/main/java/org/licket/core/view/list/AbstractLicketList.java @@ -1,58 +1,64 @@ package org.licket.core.view.list; +import org.licket.core.view.container.AbstractLicketMultiContainer; +import org.licket.core.view.hippo.ComponentModelProperty; +import org.licket.core.view.render.ComponentRenderingContext; +import org.licket.surface.element.SurfaceElement; + +import java.util.Optional; + import static java.lang.String.format; import static java.util.Optional.empty; +import static org.licket.core.model.LicketComponentModel.ofModelObject; import static org.licket.core.view.LicketComponentView.internalTemplateView; -import java.util.Optional; -import org.licket.core.model.LicketComponentModel; -import org.licket.core.module.application.LicketComponentModelReloader; -import org.licket.core.view.container.AbstractLicketMultiContainer; -import org.licket.core.view.render.ComponentRenderingContext; -import org.licket.surface.element.SurfaceElement; +public abstract class AbstractLicketList extends AbstractLicketMultiContainer { -public abstract class AbstractLicketList extends AbstractLicketMultiContainer { + public AbstractLicketList(String id, ComponentModelProperty componentModelProperty) { + super(id, ComponentModelProperty.class, ofModelObject(componentModelProperty), internalTemplateView()); + // TODO analyze element class provided and check its properties against passed enclosingComponentPropertyModel + } - public AbstractLicketList(String id, LicketComponentModel enclosingComponentPropertyModel) { - super(id, String.class, enclosingComponentPropertyModel, internalTemplateView()); - // TODO analyze element class provided and check its properties against passed enclosingComponentPropertyModel - } + @Override + protected final Optional overrideComponentElement(SurfaceElement surfaceElement, ComponentRenderingContext renderingContext) { + SurfaceElement element = new SurfaceElement(getCompositeId().getNormalizedValue(), surfaceElement.getNamespace()); + setRefAttribute(element); + setForAttribute(element); + setBindAttribute(element); + postProcess(element); + return Optional.of(element); + } - @Override - protected Optional overrideComponentElement(SurfaceElement surfaceElement, ComponentRenderingContext renderingContext) { - SurfaceElement element = new SurfaceElement(getCompositeId().getNormalizedValue(), surfaceElement.getNamespace()); - setRefAttribute(element); - setForAttribute(element); - setBindAttribute(element); - return Optional.of(element); - } + protected void postProcess(SurfaceElement element) { - private void setRefAttribute(SurfaceElement element) { - element.addAttribute("ref", getId()); - } + } - private void setForAttribute(SurfaceElement element) { - // TODO check if enclosing property model has collection defined with name from getComponentModel().get() - element.addAttribute("v-for", format("%s in model.%s", getId(), getComponentModel().get())); + private void setRefAttribute(SurfaceElement element) { + element.addAttribute("ref", getId()); + } - Optional keyPropertyName = keyPropertyName(); - if (!keyPropertyName.isPresent()) { - return; - } - element.addAttribute("v-bind:key", format("%s.%s", getId(), keyPropertyName.get())); - } + private void setForAttribute(SurfaceElement element) { + // TODO check if enclosing property model has collection defined with name from getComponentModel().get() + element.addAttribute("v-for", format("%s in %s", getId(), getComponentModel().get().builder().build().toSource())); - protected Optional keyPropertyName() { - return empty(); + Optional keyPropertyName = keyPropertyName(); + if (!keyPropertyName.isPresent()) { + return; } + element.addAttribute("v-bind:key", format("%s.%s", getId(), keyPropertyName.get())); + } - private void setBindAttribute(SurfaceElement element) { - element.addAttribute("v-bind:model", getId()); - } + protected Optional keyPropertyName() { + return empty(); + } - @Override - public boolean isStateful() { - // list are stateless, so we can't put them into components tree, they have to be global defined - return false; - } + private void setBindAttribute(SurfaceElement element) { + element.addAttribute("v-bind:model", getId()); + } + + @Override + public boolean isStateful() { + // list are stateless, so we can't put them into components tree, they have to be global defined + return false; + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/media/LicketImage.java b/licket-framework/src/main/java/org/licket/core/view/media/LicketImage.java index 6419145..920dffb 100644 --- a/licket-framework/src/main/java/org/licket/core/view/media/LicketImage.java +++ b/licket-framework/src/main/java/org/licket/core/view/media/LicketImage.java @@ -1,36 +1,23 @@ package org.licket.core.view.media; -import org.licket.core.model.ComponentIdModel; import org.licket.core.model.LicketComponentModel; import org.licket.core.view.AbstractLicketComponent; -import org.licket.core.view.LicketComponent; -import org.licket.core.view.container.AbstractLicketMultiContainer; +import org.licket.core.view.hippo.ComponentModelProperty; import org.licket.core.view.render.ComponentRenderingContext; -import java.util.Optional; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentModelProperty; -import static java.lang.String.format; +public class LicketImage extends AbstractLicketComponent { + public LicketImage(String id) { + this(id, fromComponentModelProperty(id)); + } -public class LicketImage extends AbstractLicketComponent { + public LicketImage(String id, ComponentModelProperty componentModelProperty) { + super(id, ComponentModelProperty.class, LicketComponentModel.ofModelObject(componentModelProperty)); + } - public LicketImage(String id) { - this(id, new ComponentIdModel(id)); - } - - public LicketImage(String id, LicketComponentModel imageModel) { - super(id, String.class, imageModel); - } - - @Override - protected void onBeforeRender(ComponentRenderingContext renderingContext) { - renderingContext.onSurfaceElement(element -> element.addAttribute("v-bind:src", placeholder())); - } - - private String placeholder() { - Optional> parent = traverseUp(component -> component instanceof AbstractLicketMultiContainer); - if (parent != null) { - return format("model.%s", getComponentModel().get()); - } - return format("%s", getComponentModel().get()); - } + @Override + protected void onBeforeRender(ComponentRenderingContext renderingContext) { + renderingContext.onSurfaceElement(element -> element.addAttribute("v-bind:src", getComponentModel().get().builder().build().toSource())); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/MountComponentInterceptor.java b/licket-framework/src/main/java/org/licket/core/view/mount/MountComponentInterceptor.java new file mode 100644 index 0000000..aa87844 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/mount/MountComponentInterceptor.java @@ -0,0 +1,11 @@ +package org.licket.core.view.mount; + +import org.licket.core.view.hippo.vue.annotation.LicketMountPoint; +import org.licket.framework.hippo.BlockBuilder; + +/** + * @author lukaszgrabski + */ +public interface MountComponentInterceptor { + void intercept(BlockBuilder blockBuilder, LicketMountPoint mountPoint); +} diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponent.java b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponent.java index 87a70db..d6db8e0 100644 --- a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponent.java +++ b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponent.java @@ -47,8 +47,8 @@ public final String path() { public ObjectLiteralBuilder params() { ObjectLiteralBuilder objectLiteralBuilder = objectLiteral(); pathVariables.forEach(variable -> objectLiteralBuilder.objectProperty( - // TODO dummy implementation for now .. - propertyBuilder().name(variable).value(property(property("this", "model"), name(variable)))) + // TODO dummy implementation for now .. + propertyBuilder().name(variable).value(property(property("this", "model"), name(variable)))) ); return objectLiteralBuilder; } diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentLink.java b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentLink.java index c37005e..133da1b 100644 --- a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentLink.java +++ b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentLink.java @@ -1,8 +1,8 @@ package org.licket.core.view.mount; +import org.licket.core.view.ComponentFunctionCallback; import org.licket.core.view.LicketComponent; import org.licket.core.view.link.AbstractLicketLink; -import org.licket.core.view.ComponentFunctionCallback; import org.licket.core.view.mount.params.MountingParamsAggregator; /** @@ -22,6 +22,7 @@ protected final void onClick(ComponentFunctionCallback componentFunctionCallback // TODO retrieve component instance knowing it's componentClass componentFunctionCallback.navigateToMounted(componentClass, paramsAggregator -> aggregateParams(paramsAggregator)); } + protected void aggregateParams(MountingParamsAggregator paramsAggregator) { // override this to provide mounting parameters } diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentNavigation.java b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentNavigation.java new file mode 100644 index 0000000..132163e --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponentNavigation.java @@ -0,0 +1,65 @@ +package org.licket.core.view.mount; + +import org.licket.core.view.LicketComponent; +import org.licket.core.view.hippo.ComponentModelProperty; +import org.licket.core.view.mount.params.MountingParamsAggregator; +import org.licket.framework.hippo.FunctionCallBuilder; +import org.licket.framework.hippo.NameBuilder; +import org.licket.framework.hippo.ObjectLiteralBuilder; +import org.licket.framework.hippo.ObjectPropertyBuilder; +import org.licket.framework.hippo.PropertyNameBuilder; + +import java.util.function.Consumer; + +import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; +import static org.licket.framework.hippo.ObjectLiteralBuilder.objectLiteral; +import static org.licket.framework.hippo.ObjectPropertyBuilder.propertyBuilder; +import static org.licket.framework.hippo.PropertyNameBuilder.property; +import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; + +/** + * @author lukaszgrabski + */ +public class MountedComponentNavigation { + + private static final String PUSH_FUNCTION = "push"; + + public final FunctionCallBuilder navigateToMounted(Class> componentClass, NameBuilder routerReference, Consumer params) { + return functionCall() + .target(property(routerReference, PUSH_FUNCTION)) + .argument(pushArguments(componentClass, params)); + } + + public final FunctionCallBuilder navigateToMounted(Class> componentClass, PropertyNameBuilder routerReference, Consumer params) { + return functionCall() + .target(property(routerReference, PUSH_FUNCTION)) + .argument(pushArguments(componentClass, params)); + } + + private ObjectLiteralBuilder pushArguments(Class> componentClass, Consumer params) { + return objectLiteral() + .objectProperty(propertyBuilder().name("name").value(stringLiteral(componentClass.getName()))) + .objectProperty(propertyBuilder().name("params").value(mountingParams(params))); + } + + public final FunctionCallBuilder navigateToPath(ComponentModelProperty path, PropertyNameBuilder routerReference) { + return functionCall() + .target(property(routerReference, PUSH_FUNCTION)) + .argument( + objectLiteral().objectProperty(propertyBuilder().name("path").value(path.builder())) + ); + } + + private ObjectLiteralBuilder mountingParams(Consumer params) { + MountingParamsAggregator paramsAggregator = new MountingParamsAggregator(); + params.accept(paramsAggregator); + + ObjectLiteralBuilder paramsLiteral = objectLiteral(); + paramsAggregator.forEach(param -> { + ObjectPropertyBuilder propertyBuilder = propertyBuilder().name(param.getName()); + param.getValue().decorateProperty(propertyBuilder); + paramsLiteral.objectProperty(propertyBuilder); + }); + return paramsLiteral; + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponents.java b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponents.java index 87fb9ac..a19179c 100644 --- a/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponents.java +++ b/licket-framework/src/main/java/org/licket/core/view/mount/MountedComponents.java @@ -11,6 +11,7 @@ public interface MountedComponents { /** * Returns mount point mapping with respect to Vue parametersFormat. Basically it converts /mountedComponent/{variable} format into /mountedComponent/:variable + * * @param licketComponentClass Component class to render mount mountedComponent to * @return String value in format /mountedComponent/:variable */ diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParamValueDecorator.java b/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParamValueDecorator.java index 01f6643..1b44e3e 100644 --- a/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParamValueDecorator.java +++ b/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParamValueDecorator.java @@ -1,22 +1,16 @@ package org.licket.core.view.mount.params; +import org.licket.core.view.hippo.ComponentModelProperty; import org.licket.framework.hippo.AbstractAstNodeBuilder; import org.licket.framework.hippo.ObjectPropertyBuilder; -import static org.licket.framework.hippo.NameBuilder.name; -import static org.licket.framework.hippo.PropertyNameBuilder.property; - /** * @author lukaszgrabski */ public interface MountingParamValueDecorator { - static MountingParamValueDecorator fromParentModel(String parentModelPropertyName) { - return (propertyBuilder) -> propertyBuilder.value(property(property(property("this", "$parent"), "model"), parentModelPropertyName)); - } - - static MountingParamValueDecorator simple(String value) { - return (propertyBuilder) -> propertyBuilder.value(name(value)); + static MountingParamValueDecorator fromParentModelProperty(String parentModelPropertyName) { + return (propertyBuilder) -> propertyBuilder.value(ComponentModelProperty.fromComponentParentModelProperty(parentModelPropertyName).builder()); } AbstractAstNodeBuilder decorateProperty(ObjectPropertyBuilder propertyBuilder); diff --git a/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParams.java b/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParams.java index 6d0b04d..736fdc9 100644 --- a/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParams.java +++ b/licket-framework/src/main/java/org/licket/core/view/mount/params/MountingParams.java @@ -19,4 +19,8 @@ public void newParam(String paramName, String paramValue) { public Optional getString(String paramName) { return ofNullable(mountingParams.get(paramName)); } + + public Optional getLong(String paramName) { + return ofNullable(mountingParams.get(paramName)).map(string -> Long.parseLong(string)); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/redirect/BrowserRedirect.java b/licket-framework/src/main/java/org/licket/core/view/redirect/BrowserRedirect.java new file mode 100644 index 0000000..b731acb --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/redirect/BrowserRedirect.java @@ -0,0 +1,17 @@ +package org.licket.core.view.redirect; + +import org.licket.framework.hippo.AssignmentBuilder; + +import static org.licket.framework.hippo.AssignmentBuilder.assignment; +import static org.licket.framework.hippo.PropertyNameBuilder.property; +import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; + +/** + * @author lukaszgrabski + */ +public class BrowserRedirect { + + public final AssignmentBuilder redirectToInternalUri(String uri) { + return assignment().left(property(property("window", "location"), "href")).right(stringLiteral(uri)); + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/render/ComponentRenderingContext.java b/licket-framework/src/main/java/org/licket/core/view/render/ComponentRenderingContext.java index e12003f..56c7506 100644 --- a/licket-framework/src/main/java/org/licket/core/view/render/ComponentRenderingContext.java +++ b/licket-framework/src/main/java/org/licket/core/view/render/ComponentRenderingContext.java @@ -4,7 +4,6 @@ import org.licket.core.view.LicketComponent; import org.licket.surface.element.SurfaceElement; -import java.io.InputStream; import java.util.function.Consumer; /** @@ -12,9 +11,9 @@ */ public interface ComponentRenderingContext { - void addResource(Resource resource); + void addResource(Resource resource); - void compileComponentTemplateResource(LicketComponent component); + void compileComponentTemplateResource(LicketComponent component); - void onSurfaceElement(Consumer element); + void onSurfaceElement(Consumer element); } diff --git a/licket-framework/src/main/java/org/licket/core/view/security/LicketComponentSecuritySettings.java b/licket-framework/src/main/java/org/licket/core/view/security/LicketComponentSecuritySettings.java new file mode 100644 index 0000000..283f6b7 --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/security/LicketComponentSecuritySettings.java @@ -0,0 +1,11 @@ +package org.licket.core.view.security; + +import org.licket.core.view.LicketComponent; + +/** + * @author lukaszgrabski + */ +public interface LicketComponentSecuritySettings { + + Class> loginPanelComponentClass(); +} diff --git a/licket-framework/src/main/java/org/licket/core/view/security/LicketMountPointAccess.java b/licket-framework/src/main/java/org/licket/core/view/security/LicketMountPointAccess.java new file mode 100644 index 0000000..7b96ccf --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/security/LicketMountPointAccess.java @@ -0,0 +1,14 @@ +package org.licket.core.view.security; + +/** + * @author lukaszgrabski + */ +public enum LicketMountPointAccess { + + PUBLIC, + SECURED; + + public boolean isPublic() { + return this == PUBLIC; + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/style/VueClassBinding.java b/licket-framework/src/main/java/org/licket/core/view/style/VueClassBinding.java new file mode 100644 index 0000000..a7e40df --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/style/VueClassBinding.java @@ -0,0 +1,44 @@ +package org.licket.core.view.style; + +import org.licket.framework.hippo.ObjectLiteralBuilder; +import org.licket.surface.element.SurfaceElement; + +import java.util.Map; + +import static com.google.common.collect.Maps.newHashMap; +import static org.licket.framework.hippo.ObjectPropertyBuilder.propertyBuilder; +import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; + +/** + * @author lukaszgrabski + */ +public class VueClassBinding { + + private final SurfaceElement surfaceElement; + private Map classBindingConditionMap = newHashMap(); + + private VueClassBinding(SurfaceElement surfaceElement) { + this.surfaceElement = surfaceElement; + } + + public static VueClassBinding styleClassBindingFor(SurfaceElement surfaceElement) { + return new VueClassBinding(surfaceElement); + } + + public VueClassBinding conditionalClass(String className, VueClassBindingCondition classBindingCondition) { + classBindingConditionMap.put(className, classBindingCondition); + return this; + } + + public void apply() { + ObjectLiteralBuilder objectLiteralBuilder = ObjectLiteralBuilder.objectLiteral(); + classBindingConditionMap.forEach((className, vueClassBindingCondition) -> { + objectLiteralBuilder.objectProperty( + propertyBuilder() + .name(stringLiteral(className).quoteChar('\'')) + .value(vueClassBindingCondition.expression()) + ); + }); + surfaceElement.addAttribute("v-bind:class", objectLiteralBuilder.build().toSource()); + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/style/VueClassBindingCondition.java b/licket-framework/src/main/java/org/licket/core/view/style/VueClassBindingCondition.java new file mode 100644 index 0000000..0640e7e --- /dev/null +++ b/licket-framework/src/main/java/org/licket/core/view/style/VueClassBindingCondition.java @@ -0,0 +1,36 @@ +package org.licket.core.view.style; + +import org.licket.core.view.hippo.ComponentModelProperty; +import org.licket.framework.hippo.AbstractAstNodeBuilder; +import org.mozilla.javascript.ast.InfixExpression; + +import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; +import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; + +/** + * @author lukaszgrabski + */ +public class VueClassBindingCondition { + + private final ComponentModelProperty componentModelProperty; + private AbstractAstNodeBuilder infixExpression; + + private VueClassBindingCondition(ComponentModelProperty componentModelProperty) { + this.componentModelProperty = componentModelProperty; + } + + public static VueClassBindingCondition when(ComponentModelProperty componentModelProperty) { + return new VueClassBindingCondition(componentModelProperty); + } + + public VueClassBindingCondition eq(String componentModelPropertyValue) { + infixExpression = equalCheckExpression() + .left(componentModelProperty.builder()) + .right(stringLiteral(componentModelPropertyValue).quoteChar('\'')); + return this; + } + + public AbstractAstNodeBuilder expression() { + return infixExpression; + } +} diff --git a/licket-framework/src/main/java/org/licket/core/view/tree/AbstractStep.java b/licket-framework/src/main/java/org/licket/core/view/tree/AbstractStep.java index 4f813e0..457e134 100644 --- a/licket-framework/src/main/java/org/licket/core/view/tree/AbstractStep.java +++ b/licket-framework/src/main/java/org/licket/core/view/tree/AbstractStep.java @@ -7,15 +7,15 @@ */ public abstract class AbstractStep { - private final String componentId; + private final String componentId; - public AbstractStep(String componentId) { - this.componentId = componentId; - } + public AbstractStep(String componentId) { + this.componentId = componentId; + } - public final AbstractAstNodeBuilder decorate(AbstractAstNodeBuilder previousStep) { - return decorate(previousStep, componentId); - } + public final AbstractAstNodeBuilder decorate(AbstractAstNodeBuilder previousStep) { + return decorate(previousStep, componentId); + } - protected abstract AbstractAstNodeBuilder decorate(AbstractAstNodeBuilder step, String componentId); + protected abstract AbstractAstNodeBuilder decorate(AbstractAstNodeBuilder step, String componentId); } diff --git a/licket-framework/src/main/java/org/licket/core/view/tree/LicketComponentTreeWalkSequence.java b/licket-framework/src/main/java/org/licket/core/view/tree/LicketComponentTreeWalkSequence.java index 53192ee..851d93e 100644 --- a/licket-framework/src/main/java/org/licket/core/view/tree/LicketComponentTreeWalkSequence.java +++ b/licket-framework/src/main/java/org/licket/core/view/tree/LicketComponentTreeWalkSequence.java @@ -1,5 +1,6 @@ package org.licket.core.view.tree; +import org.licket.core.id.CompositeId; import org.licket.core.view.LicketComponent; import org.licket.framework.hippo.AbstractAstNodeBuilder; @@ -17,79 +18,93 @@ */ public class LicketComponentTreeWalkSequence { - private final LicketComponent source; - private final LicketComponent target; + private final LicketComponent source; + private final LicketComponent target; - private AbstractAstNodeBuilder rootProperty = property(thisLiteral(), name("$parent")); - private AbstractAstNodeBuilder childProperty = thisLiteral(); + private AbstractAstNodeBuilder rootProperty = property(thisLiteral(), name("$parent")); + private AbstractAstNodeBuilder childProperty = thisLiteral(); - private LicketComponentTreeWalkSequence(LicketComponent source, LicketComponent target) { - this.source = checkNotNull(source, "Source can not be null."); - this.target = checkNotNull(target, "Target can not be null."); - } + private LicketComponentTreeWalkSequence(LicketComponent source, LicketComponent target) { + this.source = checkNotNull(source, "Source can not be null."); + this.target = checkNotNull(target, "Target can not be null."); + } + + public static Builder source(LicketComponent source) { + return new Builder(source); + } - public static Builder source(LicketComponent source) { - return new Builder(source); + public final AbstractAstNodeBuilder generateTreeWalkSequence() { + if (source.equals(target)) { + return thisLiteral(); } + List steps = newLinkedList(); + Optional> commonParent = source.traverseUp(sourceParent -> { + steps.add(new StepUp(sourceParent.getId())); - public final AbstractAstNodeBuilder generateTreeWalkSequence() { - if (source.equals(target)) { - return thisLiteral(); + List stepsDown = newLinkedList(); + stepsDown.add(0, new StepDown(target.getId())); + if (target.traverseUp(targetParent -> { + if (sourceParent.getCompositeId().equals(targetParent.getCompositeId()) + || source.getCompositeId().equals(targetParent.getCompositeId())) { + steps.addAll(stepsDown); + return true; } - List steps = newLinkedList(); - Optional> commonParent = source.traverseUp(sourceParent -> { - steps.add(new StepUp(sourceParent.getId())); - - List stepsDown = newLinkedList(); - stepsDown.add(0, new StepDown(target.getId())); - if (target.traverseUp(targetParent -> { - if (sourceParent.getCompositeId().equals(targetParent.getCompositeId()) - || source.getCompositeId().equals(targetParent.getCompositeId())) { - steps.addAll(stepsDown); - return true; - } - stepsDown.add(0, new StepDown(targetParent.getId())); - return false; - }).isPresent()) { - return true; - } - return false; - }); - if (commonParent.isPresent()) { - steps.stream().skip(1).forEach(step -> rootProperty = step.decorate(rootProperty)); - return rootProperty; + stepsDown.add(0, new StepDown(targetParent.getId())); + return false; + }).isPresent()) { + return true; + } + return false; + }); + if (commonParent.isPresent()) { + steps.stream().skip(1).forEach(step -> rootProperty = step.decorate(rootProperty)); + return rootProperty; + } + // when there is no common parent + List downSteps = newLinkedList(); + source.traverseDown(sourceChild -> { + if (sourceChild.getCompositeId().current().equals(target.getCompositeId().current())) { + if (isChildOnPath(sourceChild.getCompositeId(), target.getCompositeId())) { + downSteps.add(new StepDown(sourceChild.getId())); } - // when there is no common parent - List childSteps = newLinkedList(); - List downSteps = newLinkedList(); - source.traverseDown(sourceChild -> { - downSteps.add(new StepDown(sourceChild.getId())); - if (target.getCompositeId().equals(sourceChild.getCompositeId())) { - childSteps.addAll(downSteps); - return false; - } - return true; - }); - childSteps.forEach(step -> childProperty = step.decorate(childProperty)); - return childProperty; + } + return true; + }); + downSteps.forEach(step -> childProperty = step.decorate(childProperty)); + return childProperty; + } + + private boolean isChildOnPath(CompositeId sourceChild, CompositeId target) { + if (!target.hasMore()) { + return false; + } + sourceChild.forward(); + target.forward(); + if (sourceChild.current().equals(target.current())) { + if (!sourceChild.hasMore() && sourceChild.current().equals(target.current())) { + return true; + } + return isChildOnPath(sourceChild, target); } + return false; + } - public static class Builder { + public static class Builder { - private LicketComponent source; - private LicketComponent target; + private LicketComponent source; + private LicketComponent target; - private Builder(LicketComponent source) { - this.source = source; - } + private Builder(LicketComponent source) { + this.source = source; + } - public final Builder target(LicketComponent target) { - this.target = target; - return this; - } + public final Builder target(LicketComponent target) { + this.target = target; + return this; + } - public final AbstractAstNodeBuilder traverseSequence() { - return new LicketComponentTreeWalkSequence(source, target).generateTreeWalkSequence(); - } + public final AbstractAstNodeBuilder traverseSequence() { + return new LicketComponentTreeWalkSequence(source, target).generateTreeWalkSequence(); } + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/tree/StepDown.java b/licket-framework/src/main/java/org/licket/core/view/tree/StepDown.java index 53ec2db..9ee1e28 100644 --- a/licket-framework/src/main/java/org/licket/core/view/tree/StepDown.java +++ b/licket-framework/src/main/java/org/licket/core/view/tree/StepDown.java @@ -12,12 +12,12 @@ */ public class StepDown extends AbstractStep { - public StepDown(String childId) { - super(childId); - } + public StepDown(String childId) { + super(childId); + } - @Override - protected ArrayElementGetBuilder decorate(AbstractAstNodeBuilder step, String componentId) { - return arrayElementGet().target(property(step, name("$refs"))).element(componentId); - } + @Override + protected ArrayElementGetBuilder decorate(AbstractAstNodeBuilder step, String componentId) { + return arrayElementGet().target(property(step, name("$refs"))).element(componentId); + } } diff --git a/licket-framework/src/main/java/org/licket/core/view/tree/StepUp.java b/licket-framework/src/main/java/org/licket/core/view/tree/StepUp.java index 425d7ed..91de5ea 100644 --- a/licket-framework/src/main/java/org/licket/core/view/tree/StepUp.java +++ b/licket-framework/src/main/java/org/licket/core/view/tree/StepUp.java @@ -10,12 +10,12 @@ */ public class StepUp extends AbstractStep { - public StepUp(String parentId) { - super(parentId); - } + public StepUp(String parentId) { + super(parentId); + } - @Override - protected PropertyNameBuilder decorate(AbstractAstNodeBuilder previousStep, String componentId) { - return PropertyNameBuilder.property(previousStep, name("$parent")); - } + @Override + protected PropertyNameBuilder decorate(AbstractAstNodeBuilder previousStep, String componentId) { + return PropertyNameBuilder.property(previousStep, name("$parent")); + } } diff --git a/licket-framework/src/test/java/org/licket/core/view/tree/LicketComponentTreeWalkSequenceTest.java b/licket-framework/src/test/java/org/licket/core/view/tree/LicketComponentTreeWalkSequenceTest.java index 2283188..daa1122 100644 --- a/licket-framework/src/test/java/org/licket/core/view/tree/LicketComponentTreeWalkSequenceTest.java +++ b/licket-framework/src/test/java/org/licket/core/view/tree/LicketComponentTreeWalkSequenceTest.java @@ -14,76 +14,110 @@ */ public class LicketComponentTreeWalkSequenceTest { - private TestContainer levelA1; - private TestContainer levelA2; - private TestContainer levelA3; - private TestContainer levelA4; - private TestContainer levelA5; - - private TestContainer levelB2; - private TestContainer levelB3; - private TestContainer levelB4; - private TestContainer levelB5; - private TestContainer levelB6; - - @Before - public void before() { - initMocks(this); - - givenComponentTreeStructure(); - } - - @Test - public void shouldGenerateProperSequenceWhenTargetIsChildOfSourceAtAnyLevel() { - // when - AbstractAstNodeBuilder sequence = source(levelA2).target(levelA5).traverseSequence(); - - // then - assertThat(sequence.build().toSource()) + private TestContainer levelA1; + private TestContainer levelA2; + private TestContainer levelA3; + private TestContainer levelA4; + private TestContainer levelA5; + + private TestContainer levelB2; + private TestContainer levelB3; + private TestContainer levelB4; + private TestContainer levelB5; + private TestContainer levelB6; + + private TestContainer levelC2; + private TestContainer levelC3; + private TestContainer levelC4; + private TestContainer levelC5; + private TestContainer levelC6; + + @Before + public void before() { + initMocks(this); + + givenComponentTreeStructure(); + } + + @Test + public void shouldGenerateProperSequenceWhenTargetIsChildOfSourceAtAnyLevel() { + // when + AbstractAstNodeBuilder sequence = source(levelA2).target(levelA5).traverseSequence(); + + // then + assertThat(sequence.build().toSource()) .isEqualTo("this.$parent.$refs[\"levelA3\"].$refs[\"levelA4\"].$refs[\"levelA5\"]"); - // when - sequence = source(levelA5).target(levelB6).traverseSequence(); + // when + sequence = source(levelA5).target(levelB6).traverseSequence(); - // then - assertThat(sequence.build().toSource()).isEqualTo( + // then + assertThat(sequence.build().toSource()).isEqualTo( "this.$parent.$parent.$parent.$parent.$refs[\"levelB2\"].$refs[\"levelB3\"].$refs[\"levelB4\"].$refs[\"levelB5\"].$refs[\"levelB6\"]"); - // when - sequence = source(levelA1).target(levelA5).traverseSequence(); - - // then - assertThat(sequence.build().toSource()).isEqualTo("this.$refs[\"levelA2\"].$refs[\"levelA3\"].$refs[\"levelA4\"].$refs[\"levelA5\"]"); - - // when - sequence = source(levelA2).target(levelB2).traverseSequence(); - - // then - assertThat(sequence.build().toSource()).isEqualTo("this.$parent.$refs[\"levelB2\"]"); - } - - private void givenComponentTreeStructure() { - levelA1 = new TestContainer("levelA1"); - levelA2 = new TestContainer("levelA2"); - levelA3 = new TestContainer("levelA3"); - levelA4 = new TestContainer("levelA4"); - levelA5 = new TestContainer("levelA5"); - - levelB2 = new TestContainer("levelB2"); - levelB3 = new TestContainer("levelB3"); - levelB4 = new TestContainer("levelB4"); - levelB5 = new TestContainer("levelB5"); - levelB6 = new TestContainer("levelB6"); - - levelA1.add(levelA2); - levelA2.add(levelA3); - levelA3.add(levelA4); - levelA4.add(levelA5); - - levelA1.add(levelB2); - levelB2.add(levelB3); - levelB3.add(levelB4); - levelB4.add(levelB5); - levelB5.add(levelB6); - } + // when + sequence = source(levelA1).target(levelA5).traverseSequence(); + + // then + assertThat(sequence.build().toSource()).isEqualTo("this.$refs[\"levelA2\"].$refs[\"levelA3\"].$refs[\"levelA4\"].$refs[\"levelA5\"]"); + + // when + sequence = source(levelA2).target(levelB2).traverseSequence(); + + // then + assertThat(sequence.build().toSource()).isEqualTo("this.$parent.$refs[\"levelB2\"]"); + } + + @Test + public void shouldGenerateProperSequenceWhenTargetIsDirectChildOfSource() { + // when + AbstractAstNodeBuilder sequence = source(levelA1).target(levelB2).traverseSequence(); + + // then + assertThat(sequence.build().toSource()).isEqualTo("this.$refs[\"levelB2\"]"); + + // when + sequence = source(levelA1).target(levelC2).traverseSequence(); + + // then + assertThat(sequence.build().toSource()).isEqualTo("this.$refs[\"levelC2\"]"); + + } + + private void givenComponentTreeStructure() { + levelA1 = new TestContainer("levelA1"); + levelA2 = new TestContainer("levelA2"); + levelA3 = new TestContainer("levelA3"); + levelA4 = new TestContainer("levelA4"); + levelA5 = new TestContainer("levelA5"); + + levelB2 = new TestContainer("levelB2"); + levelB3 = new TestContainer("levelB3"); + levelB4 = new TestContainer("levelB4"); + levelB5 = new TestContainer("levelB5"); + levelB6 = new TestContainer("levelB6"); + + levelC2 = new TestContainer("levelC2"); + levelC3 = new TestContainer("levelC3"); + levelC4 = new TestContainer("levelC4"); + levelC5 = new TestContainer("levelC5"); + levelC6 = new TestContainer("levelC6"); + + levelA1.add(levelA2); + levelA2.add(levelA3); + levelA3.add(levelA4); + levelA4.add(levelA5); + + levelA1.add(levelB2); + levelB2.add(levelB3); + levelB3.add(levelB4); + levelB4.add(levelB5); + levelB5.add(levelB6); + + levelA1.add(levelC2); + levelC2.add(levelC3); + levelC3.add(levelC4); + levelC4.add(levelC5); + levelC5.add(levelC6); + } } diff --git a/licket-module-semanticui/pom.xml b/licket-module-semanticui/pom.xml index a8f8c09..b2ecede 100644 --- a/licket-module-semanticui/pom.xml +++ b/licket-module-semanticui/pom.xml @@ -1,6 +1,6 @@ - licket-parent diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPlugin.java b/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPlugin.java index 99221da..1e074bb 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPlugin.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPlugin.java @@ -8,8 +8,8 @@ */ public class SemanticUIPlugin implements VuePlugin { - @Override - public PropertyNameBuilder vueName() { - return null; - } + @Override + public PropertyNameBuilder vueName() { + return null; + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPluginConfiguration.java b/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPluginConfiguration.java index 8edd405..c352bcd 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPluginConfiguration.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/SemanticUIPluginConfiguration.java @@ -15,52 +15,49 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.Arrays; -import java.util.Collection; - /** * @author activey */ @Configuration public class SemanticUIPluginConfiguration { - @Bean - public VuePlugin semanticPlugin() { - return new SemanticUIPlugin(); - } - - @Bean - public HeadParticipatingResource jqueryResource() { - return new JqueryLibraryResource(); - } - - @Bean - public HeadParticipatingResource semanticLibrary() { - return new SemanticLibraryResource(); - } - - @Bean - public Resource semanticLibraryResource(@Autowired VueLibraryResource vueLibraryResource) { - return new SemanticUILibraryResource(); - } - - @Bean - public HeadParticipatingResource semanticStylesheet() { - return new SemanticStylesheetResource(); - } - - @Bean - public Resource fonts1() { - return new SemanticFonts1Resource(); - } - - @Bean - public Resource fonts2() { - return new SemanticFonts2Resource(); - } - - @Bean - public Resource fonts3() { - return new SemanticFonts3Resource(); - } + @Bean + public VuePlugin semanticPlugin() { + return new SemanticUIPlugin(); + } + + @Bean + public HeadParticipatingResource jqueryResource() { + return new JqueryLibraryResource(); + } + + @Bean + public HeadParticipatingResource semanticLibrary() { + return new SemanticLibraryResource(); + } + + @Bean + public Resource semanticLibraryResource(@Autowired VueLibraryResource vueLibraryResource) { + return new SemanticUILibraryResource(); + } + + @Bean + public HeadParticipatingResource semanticStylesheet() { + return new SemanticStylesheetResource(); + } + + @Bean + public Resource fonts1() { + return new SemanticFonts1Resource(); + } + + @Bean + public Resource fonts2() { + return new SemanticFonts2Resource(); + } + + @Bean + public Resource fonts3() { + return new SemanticFonts3Resource(); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/AbstractSemanticUIDimmer.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/AbstractSemanticUIDimmer.java index ac1ad6d..5e3a036 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/AbstractSemanticUIDimmer.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/AbstractSemanticUIDimmer.java @@ -22,65 +22,66 @@ */ public abstract class AbstractSemanticUIDimmer extends AbstractLicketMultiContainer { - public AbstractSemanticUIDimmer(String id, DimmerSettings dimmerSettings) { - super(id, DimmerSettings.class, ofModelObject(dimmerSettings), fromComponentClass(AbstractSemanticUIDimmer.class)); - } + public AbstractSemanticUIDimmer(String id, DimmerSettings dimmerSettings) { + super(id, DimmerSettings.class, ofModelObject(dimmerSettings), fromComponentClass(AbstractSemanticUIDimmer.class)); + } - @Override - protected final void onInitializeContainer() { - add(new SemanticUIDimmerContainer("dimmer-container", getComponentModel().get()) { - @Override - protected void onInitializeContainer() { - add(new DimmerContent("content-section") { - @Override - protected void onInitializeContainer() { - onInitializeContent(this, "content-block"); - } - }); - } + @Override + protected final void onInitializeContainer() { + add(new SemanticUIDimmerContainer("dimmer-container", getComponentModel().get()) { + @Override + protected void onInitializeContainer() { + add(new DimmerContent("content-section") { + @Override + protected void onInitializeContainer() { + onInitializeContent(this, "content-block"); + } }); - } + } + }); + } - protected void onInitializeContent(DimmerContent dimmerContent, String contentId) {} + protected void onInitializeContent(DimmerContent dimmerContent, String contentId) { + } - @VueComponentFunction - public final void show(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(semanticDimmer()) - .argument(stringLiteral("show")) - )); - } + @VueComponentFunction + public final void show(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticDimmer()) + .argument(stringLiteral("show")) + )); + } - @VueComponentFunction - public final void hide(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(semanticDimmer()) - .argument(stringLiteral("hide")) - )); - } + @VueComponentFunction + public final void hide(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticDimmer()) + .argument(stringLiteral("hide")) + )); + } - @OnVueMounted - public final void initializeDimmer(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(semanticDimmer()) - .argument(objectLiteral()) - )); - } + @OnVueMounted + public final void initializeDimmer(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticDimmer()) + .argument(objectLiteral()) + )); + } - private PropertyNameBuilder semanticDimmer() { - return property( - functionCall() - .target(name("$")) - .argument(property(thisLiteral(), name("$el"))), - name("dimmer") - ); - } + private PropertyNameBuilder semanticDimmer() { + return property( + functionCall() + .target(name("$")) + .argument(property(thisLiteral(), name("$el"))), + name("dimmer") + ); + } - @Override - public SemanticUIDimmerAPI api(ComponentFunctionCallback componentFunctionCallback) { - return new SemanticUIDimmerAPI(this, componentFunctionCallback); - } + @Override + public SemanticUIDimmerAPI api(ComponentFunctionCallback componentFunctionCallback) { + return new SemanticUIDimmerAPI(this, componentFunctionCallback); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/DimmerSettings.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/DimmerSettings.java index db72231..3650585 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/DimmerSettings.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/DimmerSettings.java @@ -7,7 +7,8 @@ public class DimmerSettings { private boolean pageWide; - public DimmerSettings() {} + public DimmerSettings() { + } public DimmerSettings(boolean pageWide) { this.pageWide = pageWide; diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/SemanticUIDimmerContainer.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/SemanticUIDimmerContainer.java index d46bc56..be6a6b1 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/SemanticUIDimmerContainer.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dimmer/SemanticUIDimmerContainer.java @@ -16,7 +16,7 @@ public SemanticUIDimmerContainer(String id, DimmerSettings dimmerSettings) { } @Override - protected void onRenderContainer(ComponentRenderingContext renderingContext) { + protected void onBeforeRenderContainer(ComponentRenderingContext renderingContext) { boolean pageWide = getComponentModel().get().isPageWide(); renderingContext.onSurfaceElement(surfaceElement -> { if (pageWide) { diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dropdown/DropdownSettings.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dropdown/DropdownSettings.java new file mode 100644 index 0000000..04370b0 --- /dev/null +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dropdown/DropdownSettings.java @@ -0,0 +1,26 @@ +package org.licket.semantic.component.dropdown; + +/** + * @author grabslu + */ +public class DropdownSettings { + + private boolean showActions; + private boolean closeable; + + public boolean isShowActions() { + return showActions; + } + + public void setShowActions(boolean showActions) { + this.showActions = showActions; + } + + public boolean isCloseable() { + return closeable; + } + + public void setCloseable(boolean closeable) { + this.closeable = closeable; + } +} diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/dropdown/SemanticDropdownInput.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dropdown/SemanticDropdownInput.java new file mode 100644 index 0000000..20a5548 --- /dev/null +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/dropdown/SemanticDropdownInput.java @@ -0,0 +1,86 @@ +package org.licket.semantic.component.dropdown; + +import org.licket.core.view.LicketLabel; +import org.licket.core.view.container.AbstractLicketMultiContainer; +import org.licket.core.view.form.LicketInput; +import org.licket.core.view.hippo.vue.annotation.OnVueMounted; +import org.licket.core.view.list.AbstractLicketList; +import org.licket.core.view.render.ComponentRenderingContext; +import org.licket.framework.hippo.BlockBuilder; +import org.licket.framework.hippo.PropertyNameBuilder; +import org.licket.surface.element.SurfaceElement; + +import java.util.Optional; + +import static java.lang.String.format; +import static org.licket.core.model.LicketComponentModel.emptyComponentModel; +import static org.licket.core.view.LicketComponentView.fromComponentClass; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentModelProperty; +import static org.licket.core.view.hippo.ComponentModelProperty.fromComponentParentModelProperty; +import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; +import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; +import static org.licket.framework.hippo.KeywordLiteralBuilder.thisLiteral; +import static org.licket.framework.hippo.NameBuilder.name; +import static org.licket.framework.hippo.ObjectLiteralBuilder.objectLiteral; +import static org.licket.framework.hippo.PropertyNameBuilder.property; + +/** + * @author grabslu + */ +public class SemanticDropdownInput extends AbstractLicketMultiContainer { + + private final String valueModelProperty; + private final String dropdownElementsModelProperty; + private final String dropdownValueProperty; + + public SemanticDropdownInput(String id, String valueModelProperty, String dropdownElementsModelProperty, String dropdownValueProperty) { + super(id, DropdownSettings.class, emptyComponentModel(), fromComponentClass(SemanticDropdownInput.class)); + this.valueModelProperty = valueModelProperty; + this.dropdownElementsModelProperty = dropdownElementsModelProperty; + this.dropdownValueProperty = dropdownValueProperty; + } + + protected void onBeforeRenderContainer(ComponentRenderingContext renderingContext) { + renderingContext.onSurfaceElement(surfaceElement -> surfaceElement.addAttribute("class", "ui special search selection dropdown")); + } + + @Override + protected final void onInitializeContainer() { + add(new LicketInput("dropdown_input", fromComponentParentModelProperty(valueModelProperty))); + add(new AbstractLicketList("dropdown_values", fromComponentParentModelProperty(dropdownElementsModelProperty)) { + + @Override + protected void onInitializeContainer() { + add(new LicketLabel("dropdown_value_label", fromComponentModelProperty(dropdownValueProperty))); + } + + @Override + protected Optional keyPropertyName() { + return Optional.of(dropdownValueProperty); + } + + @Override + protected void postProcess(SurfaceElement element) { + element.addAttribute("v-bind:data-value", format("%s.%s", getId(), keyPropertyName().get())); + } + }); + } + + @OnVueMounted + public final void initializeDropdown(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticDropdown()) + .argument(objectLiteral()) + )); + } + + private PropertyNameBuilder semanticDropdown() { + return property( + functionCall() + .target(name("$")) + .argument(property(thisLiteral(), name("$el"))), + name("dropdown") + ); + } +} diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/AbstractSemanticUIModal.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/AbstractSemanticUIModal.java index 191ea7a..0890fb6 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/AbstractSemanticUIModal.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/AbstractSemanticUIModal.java @@ -23,82 +23,85 @@ */ public abstract class AbstractSemanticUIModal extends AbstractLicketMultiContainer { - public AbstractSemanticUIModal(String id, ModalSettings modalSettings) { - super(id, ModalSettings.class, ofModelObject(modalSettings), fromComponentClass(AbstractSemanticUIModal.class)); - } - - @Override - protected final void onInitializeContainer() { - add(new ModalSection("header-section") { - @Override - protected void onInitializeContainer() { - onInitializeHeader(this, "content-block"); - } - }); - - add(new ModalSection("main-section") { - @Override - protected void onInitializeContainer() { - onInitializeBody(this, "content-block"); - } - }); - - add(new ModalSection("actions-section") { - @Override - protected void onInitializeContainer() { - onInitializeActions(this, "content-block"); - } - }); - } - - protected void onInitializeHeader(ModalSection modalSection, String contentId) {} - - protected void onInitializeBody(ModalSection content, String contentId) {} - - protected void onInitializeActions(ModalSection content, String contentId) {} - - protected void onRenderContainer(ComponentRenderingContext renderingContext) { - renderingContext.onSurfaceElement(surfaceElement -> surfaceElement.addAttribute("class", "ui modal")); - } - - @VueComponentFunction - public final void show(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(semanticModal()) - .argument(stringLiteral("show")) - )); - } - - @VueComponentFunction - public final void hide(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(semanticModal()) - .argument(stringLiteral("hide")) - )); - } - - @OnVueMounted - public final void initializeModal(BlockBuilder body) { - body.appendStatement(expressionStatement( - functionCall() - .target(semanticModal()) - .argument(objectLiteral()) - )); - } - - private PropertyNameBuilder semanticModal() { - return property( - functionCall() - .target(name("$")) - .argument(property(thisLiteral(), name("$el"))), - name("modal") - ); - } - - @Override - public SemanticUIModalAPI api(ComponentFunctionCallback componentFunctionCallback) { - return new SemanticUIModalAPI(this, componentFunctionCallback); - } + public AbstractSemanticUIModal(String id, ModalSettings modalSettings) { + super(id, ModalSettings.class, ofModelObject(modalSettings), fromComponentClass(AbstractSemanticUIModal.class)); + } + + @Override + protected final void onInitializeContainer() { + add(new ModalSection("header-section") { + @Override + protected void onInitializeContainer() { + onInitializeHeader(this, "content-block"); + } + }); + + add(new ModalSection("main-section") { + @Override + protected void onInitializeContainer() { + onInitializeBody(this, "content-block"); + } + }); + + add(new ModalSection("actions-section") { + @Override + protected void onInitializeContainer() { + onInitializeActions(this, "content-block"); + } + }); + } + + protected void onInitializeHeader(ModalSection modalSection, String contentId) { + } + + protected void onInitializeBody(ModalSection content, String contentId) { + } + + protected void onInitializeActions(ModalSection content, String contentId) { + } + + protected void onBeforeRenderContainer(ComponentRenderingContext renderingContext) { + renderingContext.onSurfaceElement(surfaceElement -> surfaceElement.addAttribute("class", "ui modal")); + } + + @VueComponentFunction + public final void show(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticModal()) + .argument(stringLiteral("show")) + )); + } + + @VueComponentFunction + public final void hide(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticModal()) + .argument(stringLiteral("hide")) + )); + } + + @OnVueMounted + public final void initializeModal(BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(semanticModal()) + .argument(objectLiteral()) + )); + } + + private PropertyNameBuilder semanticModal() { + return property( + functionCall() + .target(name("$")) + .argument(property(thisLiteral(), name("$el"))), + name("modal") + ); + } + + @Override + public SemanticUIModalAPI api(ComponentFunctionCallback componentFunctionCallback) { + return new SemanticUIModalAPI(this, componentFunctionCallback); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettings.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettings.java index eeac022..36e0df3 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettings.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettings.java @@ -5,22 +5,22 @@ */ public class ModalSettings { - private boolean showActions; - private boolean closeable; + private boolean showActions; + private boolean closeable; - public boolean isShowActions() { - return showActions; - } + public boolean isShowActions() { + return showActions; + } - public void setShowActions(boolean showActions) { - this.showActions = showActions; - } + public void setShowActions(boolean showActions) { + this.showActions = showActions; + } - public boolean isCloseable() { - return closeable; - } + public boolean isCloseable() { + return closeable; + } - public void setCloseable(boolean closeable) { - this.closeable = closeable; - } + public void setCloseable(boolean closeable) { + this.closeable = closeable; + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettingsBuilder.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettingsBuilder.java index dba790f..d0064e0 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettingsBuilder.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/ModalSettingsBuilder.java @@ -5,22 +5,22 @@ */ public class ModalSettingsBuilder { - private final ModalSettings modalSettings; + private final ModalSettings modalSettings; - private ModalSettingsBuilder() { - this.modalSettings = new ModalSettings(); - } + private ModalSettingsBuilder() { + this.modalSettings = new ModalSettings(); + } - public static ModalSettingsBuilder builder() { - return new ModalSettingsBuilder(); - } + public static ModalSettingsBuilder builder() { + return new ModalSettingsBuilder(); + } - public final ModalSettingsBuilder showActions() { - modalSettings.setShowActions(true); - return this; - } + public final ModalSettingsBuilder showActions() { + modalSettings.setShowActions(true); + return this; + } - public final ModalSettings build() { - return modalSettings; - } + public final ModalSettings build() { + return modalSettings; + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/SemanticUIModalAPI.java b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/SemanticUIModalAPI.java index ad080da..0bd505c 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/SemanticUIModalAPI.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/component/modal/SemanticUIModalAPI.java @@ -1,8 +1,8 @@ package org.licket.semantic.component.modal; +import org.licket.core.view.ComponentFunctionCallback; import org.licket.core.view.LicketComponent; import org.licket.core.view.api.AbstractLicketComponentAPI; -import org.licket.core.view.ComponentFunctionCallback; import static org.licket.core.view.tree.LicketComponentTreeWalkSequence.source; import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/JqueryLibraryResource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/JqueryLibraryResource.java index e061fb3..c8a2276 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/JqueryLibraryResource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/JqueryLibraryResource.java @@ -8,7 +8,7 @@ */ public class JqueryLibraryResource extends JavascriptStaticResource implements HeadParticipatingResource { - public JqueryLibraryResource() { - super("jquery.js", "js/jquery-3.1.0.js"); - } + public JqueryLibraryResource() { + super("jquery.js", "js/jquery-3.1.0.js"); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts1Resource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts1Resource.java index 34fabf8..86db957 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts1Resource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts1Resource.java @@ -7,7 +7,7 @@ */ public class SemanticFonts1Resource extends Woff2FontResource { - public SemanticFonts1Resource() { - super("themes/default/assets/fonts/icons.woff2", "css/fonts/icons.woff2"); - } + public SemanticFonts1Resource() { + super("themes/default/assets/fonts/icons.woff2", "css/fonts/icons.woff2"); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts2Resource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts2Resource.java index 0abc1d1..7c0f434 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts2Resource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts2Resource.java @@ -7,7 +7,7 @@ */ public class SemanticFonts2Resource extends Woff2FontResource { - public SemanticFonts2Resource() { - super("themes/default/assets/fonts/icons.woff", "css/fonts/icons.woff"); - } + public SemanticFonts2Resource() { + super("themes/default/assets/fonts/icons.woff", "css/fonts/icons.woff"); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts3Resource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts3Resource.java index b2ffa52..827444e 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts3Resource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticFonts3Resource.java @@ -7,7 +7,7 @@ */ public class SemanticFonts3Resource extends TtfFontResource { - public SemanticFonts3Resource() { - super("themes/default/assets/fonts/icons.ttf", "css/fonts/icons.ttf"); - } + public SemanticFonts3Resource() { + super("themes/default/assets/fonts/icons.ttf", "css/fonts/icons.ttf"); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticLibraryResource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticLibraryResource.java index 0959004..95c4e33 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticLibraryResource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticLibraryResource.java @@ -8,7 +8,7 @@ */ public class SemanticLibraryResource extends JavascriptStaticResource implements HeadParticipatingResource { - public SemanticLibraryResource() { - super("semantic.js", "js/semantic.min.js"); - } + public SemanticLibraryResource() { + super("semantic.js", "js/semantic.min.js"); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticStylesheetResource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticStylesheetResource.java index 74d983e..e1ddb96 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticStylesheetResource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticStylesheetResource.java @@ -8,7 +8,7 @@ */ public class SemanticStylesheetResource extends StylesheetResource implements HeadParticipatingResource { - public SemanticStylesheetResource() { - super("semantic.css", "css/semantic.min.css"); - } + public SemanticStylesheetResource() { + super("semantic.css", "css/semantic.min.css"); + } } diff --git a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticUILibraryResource.java b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticUILibraryResource.java index 6898cb8..5b1b330 100644 --- a/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticUILibraryResource.java +++ b/licket-module-semanticui/src/main/java/org/licket/semantic/resource/SemanticUILibraryResource.java @@ -8,7 +8,7 @@ */ public class SemanticUILibraryResource extends JavascriptStaticResource implements HeadParticipatingResource { - public SemanticUILibraryResource() { - super("vue-semantic.js", "js/vue-semantic.js"); - } + public SemanticUILibraryResource() { + super("vue-semantic.js", "js/vue-semantic.js"); + } } diff --git a/licket-module-semanticui/src/main/resources/org/licket/semantic/component/dropdown/SemanticDropdownInput.html b/licket-module-semanticui/src/main/resources/org/licket/semantic/component/dropdown/SemanticDropdownInput.html new file mode 100644 index 0000000..cf05981 --- /dev/null +++ b/licket-module-semanticui/src/main/resources/org/licket/semantic/component/dropdown/SemanticDropdownInput.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/licket-npm-libraries/package.json b/licket-npm-libraries/package.json index 4c470b1..2710003 100644 --- a/licket-npm-libraries/package.json +++ b/licket-npm-libraries/package.json @@ -6,6 +6,9 @@ "dependencies": { "vue": "2.3.4", "vue-router": "2.6.0", - "vue-resource": "1.0.3" + "vue-resource": "1.0.3", + "vue-cookie": "1.1.4", + "sockjs-client": "1.1.4", + "stompjs": "2.3.3" } } diff --git a/licket-npm-libraries/pom.xml b/licket-npm-libraries/pom.xml index 0edd236..f9beaf0 100644 --- a/licket-npm-libraries/pom.xml +++ b/licket-npm-libraries/pom.xml @@ -51,6 +51,9 @@ vue/dist/vue.js vue-router/dist/vue-router.js vue-resource/dist/vue-resource.js + tiny-cookie/tiny-cookie.js + sockjs-client/dist/sockjs.js + stompjs/lib/stomp.js diff --git a/licket-spring-autoconfigure/pom.xml b/licket-spring-autoconfigure/pom.xml index 4660cb7..5b68d5f 100644 --- a/licket-spring-autoconfigure/pom.xml +++ b/licket-spring-autoconfigure/pom.xml @@ -22,7 +22,6 @@ - org.springframework.boot spring-boot-starter-jetty diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/LicketAutoconfigure.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/LicketAutoconfigure.java index 1f785de..c81dead 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/LicketAutoconfigure.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/LicketAutoconfigure.java @@ -28,23 +28,23 @@ @PropertySource("classpath:/licket.properties") public class LicketAutoconfigure { - @Value("${application.vueName:default}") - private String applicationName; + @Value("${application.vueName:default}") + private String applicationName; - @Bean - @SessionScope - public LicketApplication licketApplication() { - return new DefaultLicketApplication(applicationName); - } + @Bean + @SessionScope + public LicketApplication licketApplication() { + return new DefaultLicketApplication(applicationName); + } - @Bean - @SessionScope - public MountedComponents mountedComponents() { - return new DefaultMountedComponents(); - } + @Bean + @SessionScope + public MountedComponents mountedComponents() { + return new DefaultMountedComponents(); + } - @Bean - public ComponentRenderingContextFactory renderingContextFactory() { - return new ComponentRenderingContextFactory(); - } + @Bean + public ComponentRenderingContextFactory renderingContextFactory() { + return new ComponentRenderingContextFactory(); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/annotation/LicketComponent.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/annotation/LicketComponent.java index f4cc564..9ec940f 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/annotation/LicketComponent.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/annotation/LicketComponent.java @@ -20,9 +20,9 @@ @Bean public @interface LicketComponent { - @AliasFor("value") - String[] name() default {}; + @AliasFor("value") + String[] name() default {}; - @AliasFor("name") - String[] value() default {}; + @AliasFor("name") + String[] value() default {}; } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/mount/DefaultMountedComponents.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/mount/DefaultMountedComponents.java index b4a99b5..fd0d0bb 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/mount/DefaultMountedComponents.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/mount/DefaultMountedComponents.java @@ -13,16 +13,16 @@ */ public class DefaultMountedComponents implements MountedComponents { - private Map, String> mountMap = newHashMap(); + private Map mountMap = newHashMap(); @Override public void setMountedLink(Class componentClass, String mountPoint) { - mountMap.put(componentClass, mountPoint); + mountMap.put(componentClass.getName(), mountPoint); } @Override public MountedComponent mountedComponent(Class licketComponentClass) { - String mountPath = mountMap.get(licketComponentClass); + String mountPath = mountMap.get(licketComponentClass.getName()); if (mountPath == null) { // TODO what then? } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/LicketResourcesConfiguration.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/LicketResourcesConfiguration.java index d5be54a..204572c 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/LicketResourcesConfiguration.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/LicketResourcesConfiguration.java @@ -6,6 +6,7 @@ import org.licket.core.resource.vue.VueRouterLibraryResource; import org.licket.core.resource.vue.boot.VueGlobalInitializationResource; import org.licket.core.resource.vue.boot.VueInstanceInitializerResource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; @@ -17,41 +18,40 @@ @Configuration public class LicketResourcesConfiguration { - @Bean - @SessionScope - public ResourceStorage resourcesStorage() { - return new SpringResourceStorage(); - } - - @Bean - @Order(1) - public VueLibraryResource vueLibraryResource() { - return new VueLibraryResource(); - } - - @Bean - @Order(2) - public VueRouterLibraryResource vueRouterLibraryResource() { - return new VueRouterLibraryResource(); - } - - @Bean - @Order(3) - @SessionScope - public VueGlobalInitializationResource globalInitializationResource() { - return new VueGlobalInitializationResource(); - } - - @Bean - @Order(4) - @SessionScope - public VueInstanceInitializerResource vueApplicationModuleResource() { - return new VueInstanceInitializerResource(); - } - - @Bean - @Order(5) - public FastJsonPatchResource jsonPatchResource() { - return new FastJsonPatchResource(); - } + @Bean + @SessionScope + public ResourceStorage resourcesStorage() { + return new SpringResourceStorage(); + } + + @Bean + @Order(1) + public VueLibraryResource vueLibraryResource(@Autowired ResourceStorage resourceStorage) { + return new VueLibraryResource(); + } + + @Bean + @Order(2) + public VueRouterLibraryResource vueRouterLibraryResource() { + return new VueRouterLibraryResource(); + } + + @Bean + @Order(3) + @SessionScope + public VueGlobalInitializationResource globalInitializationResource() { + return new VueGlobalInitializationResource(); + } + + @Bean + @Order(4) + @SessionScope + public VueInstanceInitializerResource vueApplicationModuleResource() { + return new VueInstanceInitializerResource(); + } + + @Bean + public FastJsonPatchResource jsonPatchResource() { + return new FastJsonPatchResource(); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/SpringResourceStorage.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/SpringResourceStorage.java index 726137b..61871c5 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/SpringResourceStorage.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/resource/SpringResourceStorage.java @@ -16,12 +16,12 @@ import java.util.stream.Stream; import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.net.MediaType.CSS_UTF_8; +import static com.google.common.net.MediaType.JAVASCRIPT_UTF_8; import static java.lang.String.format; import static java.util.Arrays.stream; import static java.util.stream.Stream.concat; -import static org.licket.core.resource.css.StylesheetResource.CSS_MIMETYPE; -import static org.licket.core.resource.javascript.JavascriptStaticResource.JAVASCRIPT_MIMETYPE; -import static org.licket.core.view.LicketUrls.CONTEXT_RESOURCES; +import static org.licket.core.LicketUrls.CONTEXT_RESOURCES; /** * @author activey @@ -76,17 +76,17 @@ public Optional getResource(String name) { @Override public Stream getHeadJavascriptResources() { - return stream(headParticipatingResources).filter(byMimetype(JAVASCRIPT_MIMETYPE)); + return stream(headParticipatingResources).filter(byMimetype(JAVASCRIPT_UTF_8.toString())); } @Override public Stream getFootJavascriptResources() { - return stream(footParticipatingResources).filter(byMimetype(JAVASCRIPT_MIMETYPE)); + return stream(footParticipatingResources).filter(byMimetype(JAVASCRIPT_UTF_8.toString())); } @Override public Stream getStylesheetResources() { - return stream(headParticipatingResources).filter(byMimetype(CSS_MIMETYPE)); + return stream(headParticipatingResources).filter(byMimetype(CSS_UTF_8.toString())); } @Override @@ -96,7 +96,6 @@ public Stream getAllResources() { @Override public String getResourceUrl(Resource resource) { - return format("%s%s/%s", servletContext.getContextPath(), CONTEXT_RESOURCES, - resource.getName()); + return format("%s%s/%s", servletContext.getContextPath(), CONTEXT_RESOURCES, resource.getName()); } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/LicketSurfaceConfiguration.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/LicketSurfaceConfiguration.java index 1bfb64a..03237fb 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/LicketSurfaceConfiguration.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/LicketSurfaceConfiguration.java @@ -14,9 +14,9 @@ @ComponentScan(basePackageClasses = HtmlElementsConfiguration.class) public class LicketSurfaceConfiguration { - @Bean - @RequestScope - public ElementFactories elementFactories() { - return new SpringElementFactories(); - } + @Bean + @RequestScope + public ElementFactories elementFactories() { + return new SpringElementFactories(); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/SpringElementFactories.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/SpringElementFactories.java index 9b53681..66cbf23 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/SpringElementFactories.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/SpringElementFactories.java @@ -12,11 +12,11 @@ */ public class SpringElementFactories implements ElementFactories { - @Autowired - private Collection elementFactories; + @Autowired + private Collection elementFactories; - @Override - public Optional getElementFactoryByNamespace(String namespace) { - return elementFactories.stream().filter(factory -> factory.matchesNamespace(namespace)).findFirst(); - } + @Override + public Optional getElementFactoryByNamespace(String namespace) { + return elementFactories.stream().filter(factory -> factory.matchesNamespace(namespace)).findFirst(); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/BodyElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/BodyElement.java index ec4a298..97891e4 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/BodyElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/BodyElement.java @@ -1,9 +1,5 @@ package org.licket.spring.surface.element.html; -import static com.google.common.collect.Lists.newArrayList; -import static org.licket.spring.surface.element.html.HtmlElementFactory.HTML_NAMESPACE; -import static org.springframework.http.MediaType.TEXT_HTML_VALUE; -import javax.xml.stream.XMLStreamException; import org.licket.core.LicketApplication; import org.licket.core.resource.ByteArrayResource; import org.licket.core.resource.ResourceStorage; @@ -16,60 +12,66 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import javax.xml.stream.XMLStreamException; + +import static com.google.common.collect.Lists.newArrayList; +import static org.licket.spring.surface.element.html.HtmlElementFactory.HTML_NAMESPACE; +import static org.springframework.http.MediaType.TEXT_HTML_VALUE; + /** * @author grabslu */ public class BodyElement extends SurfaceElement { - private static final Logger LOGGER = LoggerFactory.getLogger(BodyElement.class); + private static final Logger LOGGER = LoggerFactory.getLogger(BodyElement.class); - @Autowired - private LicketApplication application; + @Autowired + private LicketApplication application; - @Autowired - private ResourceStorage resourcesStorage; + @Autowired + private ResourceStorage resourcesStorage; - public BodyElement(String name) { - super(name, HTML_NAMESPACE); - } + public BodyElement(String name) { + super(name, HTML_NAMESPACE); + } - @Override - protected void onStart() { - setComponentId(application.rootComponentContainer().getCompositeId().getValue()); - } + @Override + protected void onStart() { + setComponentId(application.rootComponentContainer().getCompositeId().getValue()); + } - @Override - protected void onFinish(SurfaceContext surfaceContext) { - // detaching whole body content into buffer - Nodes bodyNodes = new Nodes(); - newArrayList(children()).forEach(child -> bodyNodes.add(child.detach())); - - try { - resourcesStorage.putResource(new ByteArrayResource(getComponentId(), TEXT_HTML_VALUE, bodyNodes.toBytes())); - appendChildElement(newBody()); - } catch (XMLStreamException e) { - LOGGER.error("An error occurred while processing body element.", e); - return; - } - - resourcesStorage.getFootJavascriptResources().forEach(resource -> { - LOGGER.debug("Using foot JS resource: {}", resource.getName()); - - ScriptElement scriptElement = new ScriptElement(); - scriptElement.setSrc(resourcesStorage.getResourceUrl(resource)); - addChildElement(scriptElement); - }); + @Override + protected void onFinish(SurfaceContext surfaceContext) { + // detaching whole body content into buffer + Nodes bodyNodes = new Nodes(); + newArrayList(children()).forEach(child -> bodyNodes.add(child.detach())); + + try { + resourcesStorage.putResource(new ByteArrayResource(getComponentId(), TEXT_HTML_VALUE, bodyNodes.toBytes())); + appendChildElement(newBody()); + } catch (XMLStreamException e) { + LOGGER.error("An error occurred while processing body element.", e); + return; } - private SurfaceElement newBody() { - RootComponentWrapperElement rootComponentWrapper = new RootComponentWrapperElement(getComponentId()); - RouterViewElement routerView = new RouterViewElement(); + resourcesStorage.getFootJavascriptResources().forEach(resource -> { + LOGGER.debug("Using foot JS resource: {}", resource.getName()); - KeepAliveElement keepAliveElement = new KeepAliveElement(); - keepAliveElement.addChildElement(routerView); + ScriptElement scriptElement = new ScriptElement(); + scriptElement.setSrc(resourcesStorage.getResourceUrl(resource)); + addChildElement(scriptElement); + }); + } - rootComponentWrapper.addChildElement(keepAliveElement); + private SurfaceElement newBody() { + RootComponentWrapperElement rootComponentWrapper = new RootComponentWrapperElement(getComponentId()); + RouterViewElement routerView = new RouterViewElement(); - return rootComponentWrapper; - } + KeepAliveElement keepAliveElement = new KeepAliveElement(); + keepAliveElement.addChildElement(routerView); + + rootComponentWrapper.addChildElement(keepAliveElement); + + return rootComponentWrapper; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HeadElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HeadElement.java index 474dd8d..7a17f8d 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HeadElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HeadElement.java @@ -15,33 +15,33 @@ */ public class HeadElement extends SurfaceElement { - private static final Logger LOGGER = LoggerFactory.getLogger(HeadElement.class); - - @Autowired - private ResourceStorage resourcesStorage; - - public HeadElement(String name) { - super(name, HTML_NAMESPACE); - } - - @Override - protected void onFinish(SurfaceContext surfaceContext) { - resourcesStorage.getHeadJavascriptResources().forEach(resource -> { - LOGGER.debug("Using head JS resource: {}", resource.getName()); - - ScriptElement scriptElement = new ScriptElement(); - scriptElement.setSrc(resourcesStorage.getResourceUrl(resource)); - addChildElement(scriptElement); - }); - - resourcesStorage.getStylesheetResources().forEach(resource -> { - LOGGER.debug("Using head CSS resource: {}", resource.getName()); - - LinkElement linkElement = new LinkElement(); - linkElement.setHref(resourcesStorage.getResourceUrl(resource)); - linkElement.setType(resource.getMimeType()); - linkElement.setRelType(STYLESHEET); - addChildElement(linkElement); - }); - } + private static final Logger LOGGER = LoggerFactory.getLogger(HeadElement.class); + + @Autowired + private ResourceStorage resourcesStorage; + + public HeadElement(String name) { + super(name, HTML_NAMESPACE); + } + + @Override + protected void onFinish(SurfaceContext surfaceContext) { + resourcesStorage.getHeadJavascriptResources().forEach(resource -> { + LOGGER.debug("Using head JS resource: {}", resource.getName()); + + ScriptElement scriptElement = new ScriptElement(); + scriptElement.setSrc(resourcesStorage.getResourceUrl(resource)); + addChildElement(scriptElement); + }); + + resourcesStorage.getStylesheetResources().forEach(resource -> { + LOGGER.debug("Using head CSS resource: {}", resource.getName()); + + LinkElement linkElement = new LinkElement(); + linkElement.setHref(resourcesStorage.getResourceUrl(resource)); + linkElement.setType(resource.getMimeType()); + linkElement.setRelType(STYLESHEET); + addChildElement(linkElement); + }); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementFactory.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementFactory.java index de96122..e62aee4 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementFactory.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementFactory.java @@ -1,8 +1,8 @@ package org.licket.spring.surface.element.html; import org.licket.surface.attribute.AttributeProvider; -import org.licket.surface.element.SurfaceElement; import org.licket.surface.element.ElementProvider; +import org.licket.surface.element.SurfaceElement; import org.licket.surface.tag.AbstractElementFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -17,32 +17,32 @@ */ public class HtmlElementFactory extends AbstractElementFactory { - public static final String HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; + public static final String HTML_NAMESPACE = "http://www.w3.org/1999/xhtml"; - @Autowired(required = false) - private Collection factoryElementsProviders = newArrayList(); + @Autowired(required = false) + private Collection factoryElementsProviders = newArrayList(); - @Autowired(required = false) - private Collection factoryAttributesProviders = newArrayList(); + @Autowired(required = false) + private Collection factoryAttributesProviders = newArrayList(); - @Autowired - @Qualifier("default") - private ElementProvider defaultElement; + @Autowired + @Qualifier("default") + private ElementProvider defaultElement; - public HtmlElementFactory() { - super(HTML_NAMESPACE); - } + public HtmlElementFactory() { + super(HTML_NAMESPACE); + } - @PostConstruct - private void fillFactory() { - factoryElementsProviders.forEach(super::element); - factoryAttributesProviders.forEach(super::attribute); - } + @PostConstruct + private void fillFactory() { + factoryElementsProviders.forEach(super::element); + factoryAttributesProviders.forEach(super::attribute); + } - @Override - public SurfaceElement createDefaultElement(String name) { - SurfaceElement element = defaultElement.provideElement(); - element.setLocalName(name); - return element; - } + @Override + public SurfaceElement createDefaultElement(String name) { + SurfaceElement element = defaultElement.provideElement(); + element.setLocalName(name); + return element; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementsConfiguration.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementsConfiguration.java index f8e3343..8306c7a 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementsConfiguration.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/HtmlElementsConfiguration.java @@ -17,39 +17,39 @@ @Configuration public class HtmlElementsConfiguration { - @Bean - @RequestScope - public ElementFactory elementFactory() { - return new HtmlElementFactory(); - } - - @Bean - @RequestScope - public ElementProvider headElement() { - return provideElement("head", (name) -> new HeadElement(name)); - } - - @Bean - @RequestScope - public ElementProvider inputElement() { - return provideElement("input", (name) -> new InputElement(name)); - } - - @Bean - @RequestScope - public ElementProvider bodyElement() { - return provideElement("body", (name) -> new BodyElement(name)); - } - - @Bean(name = "default") - @RequestScope - public ElementProvider defaultElement() { - return provideElement("default-licket-element", (name) -> new DefaultHtmlElement(name)); - } - - @Bean - @RequestScope - public AttributeProvider idAttribute() { - return provideAttribute("id", (name) -> new IdAttribute(name)); - } + @Bean + @RequestScope + public ElementFactory elementFactory() { + return new HtmlElementFactory(); + } + + @Bean + @RequestScope + public ElementProvider headElement() { + return provideElement("head", (name) -> new HeadElement(name)); + } + + @Bean + @RequestScope + public ElementProvider inputElement() { + return provideElement("input", (name) -> new InputElement(name)); + } + + @Bean + @RequestScope + public ElementProvider bodyElement() { + return provideElement("body", (name) -> new BodyElement(name)); + } + + @Bean(name = "default") + @RequestScope + public ElementProvider defaultElement() { + return provideElement("default-licket-element", (name) -> new DefaultHtmlElement(name)); + } + + @Bean + @RequestScope + public AttributeProvider idAttribute() { + return provideAttribute("id", (name) -> new IdAttribute(name)); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/IdAttribute.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/IdAttribute.java index a854b63..e382420 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/IdAttribute.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/IdAttribute.java @@ -8,12 +8,12 @@ */ public class IdAttribute extends BaseAttribute { - public IdAttribute(String name) { - super(name, ""); - } + public IdAttribute(String name) { + super(name, ""); + } - @Override - protected void onStart(SurfaceElement relatedElement) { - relatedElement.setComponentId(getValue()); - } + @Override + protected void onStart(SurfaceElement relatedElement) { + relatedElement.setComponentId(getValue()); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/KeepAliveElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/KeepAliveElement.java index 6273efe..4062a5b 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/KeepAliveElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/KeepAliveElement.java @@ -5,7 +5,7 @@ */ public class KeepAliveElement extends DefaultHtmlElement { - public KeepAliveElement() { - super("keep-alive"); - } + public KeepAliveElement() { + super("keep-alive"); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/LinkElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/LinkElement.java index c638aef..8581dc1 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/LinkElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/LinkElement.java @@ -9,33 +9,33 @@ */ public class LinkElement extends SurfaceElement { - public LinkElement() { - super("link", HTML_NAMESPACE); - } + public LinkElement() { + super("link", HTML_NAMESPACE); + } - public void setRelType(LinkRelType relType) { - addAttribute("rel", relType.getTypeValue()); - } + public void setRelType(LinkRelType relType) { + addAttribute("rel", relType.getTypeValue()); + } - public void setType(String mimetype) { - addAttribute("type", mimetype); - } + public void setType(String mimetype) { + addAttribute("type", mimetype); + } - public void setHref(String href) { - addAttribute("href", href); - } + public void setHref(String href) { + addAttribute("href", href); + } - public enum LinkRelType { - STYLESHEET("stylesheet"); + public enum LinkRelType { + STYLESHEET("stylesheet"); - private final String typeValue; + private final String typeValue; - LinkRelType(String typeValue) { - this.typeValue = typeValue; - } + LinkRelType(String typeValue) { + this.typeValue = typeValue; + } - public String getTypeValue() { - return typeValue; - } + public String getTypeValue() { + return typeValue; } + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/NodeSupplier.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/NodeSupplier.java index eaa3a98..6ff54de 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/NodeSupplier.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/NodeSupplier.java @@ -7,5 +7,5 @@ */ public interface NodeSupplier { - T get(String name); + T get(String name); } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/ScriptElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/ScriptElement.java index 38a8018..ef3ca97 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/ScriptElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/ScriptElement.java @@ -10,16 +10,16 @@ */ public class ScriptElement extends Element { - public ScriptElement() { - super("script", HTML_NAMESPACE); - } + public ScriptElement() { + super("script", HTML_NAMESPACE); + } - public void setSrc(String src) { - addAttribute(new Attribute("src", getNamespace(), src)); - } + public void setSrc(String src) { + addAttribute(new Attribute("src", getNamespace(), src)); + } - @Override - protected boolean writeEmpty() { - return true; - } + @Override + protected boolean writeEmpty() { + return true; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredAttributeProvider.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredAttributeProvider.java index 34ab364..3db2636 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredAttributeProvider.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredAttributeProvider.java @@ -10,30 +10,28 @@ */ public class SpringAutowiredAttributeProvider implements AttributeProvider { - public static AttributeProvider provideAttribute(String localName, NodeSupplier attributeSupplier) { - return new SpringAutowiredAttributeProvider(localName, attributeSupplier); - } - - @Autowired - private AutowireCapableBeanFactory beanFactory; - - private String localName; - private NodeSupplier attributeSupplier; - - private SpringAutowiredAttributeProvider(String localName, NodeSupplier attributeSupplier) { - this.localName = localName; - this.attributeSupplier = attributeSupplier; - } - - @Override - public final String getLocalName() { - return localName; - } - - @Override - public final BaseAttribute provideAttribute() { - BaseAttribute element = attributeSupplier.get(localName); - beanFactory.autowireBean(element); - return element; - } + @Autowired + private AutowireCapableBeanFactory beanFactory; + private String localName; + private NodeSupplier attributeSupplier; + private SpringAutowiredAttributeProvider(String localName, NodeSupplier attributeSupplier) { + this.localName = localName; + this.attributeSupplier = attributeSupplier; + } + + public static AttributeProvider provideAttribute(String localName, NodeSupplier attributeSupplier) { + return new SpringAutowiredAttributeProvider(localName, attributeSupplier); + } + + @Override + public final String getLocalName() { + return localName; + } + + @Override + public final BaseAttribute provideAttribute() { + BaseAttribute element = attributeSupplier.get(localName); + beanFactory.autowireBean(element); + return element; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredElementProvider.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredElementProvider.java index df5ca5d..69189e8 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredElementProvider.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/SpringAutowiredElementProvider.java @@ -1,7 +1,7 @@ package org.licket.spring.surface.element.html; -import org.licket.surface.element.SurfaceElement; import org.licket.surface.element.ElementProvider; +import org.licket.surface.element.SurfaceElement; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; @@ -10,30 +10,28 @@ */ public class SpringAutowiredElementProvider implements ElementProvider { - public static ElementProvider provideElement(String localName, NodeSupplier elementSupplier) { - return new SpringAutowiredElementProvider(localName, elementSupplier); - } - - @Autowired - private AutowireCapableBeanFactory beanFactory; - - private String localName; - private NodeSupplier nodeSupplier; - - private SpringAutowiredElementProvider(String localName, NodeSupplier nodeSupplier) { - this.localName = localName; - this.nodeSupplier = nodeSupplier; - } - - @Override - public final String getLocalName() { - return localName; - } - - @Override - public final SurfaceElement provideElement() { - SurfaceElement element = nodeSupplier.get(localName); - beanFactory.autowireBean(element); - return element; - } + @Autowired + private AutowireCapableBeanFactory beanFactory; + private String localName; + private NodeSupplier nodeSupplier; + private SpringAutowiredElementProvider(String localName, NodeSupplier nodeSupplier) { + this.localName = localName; + this.nodeSupplier = nodeSupplier; + } + + public static ElementProvider provideElement(String localName, NodeSupplier elementSupplier) { + return new SpringAutowiredElementProvider(localName, elementSupplier); + } + + @Override + public final String getLocalName() { + return localName; + } + + @Override + public final SurfaceElement provideElement() { + SurfaceElement element = nodeSupplier.get(localName); + beanFactory.autowireBean(element); + return element; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/compiler/ComponentTemplateCompiler.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/compiler/ComponentTemplateCompiler.java index b55c918..8c1a3bb 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/compiler/ComponentTemplateCompiler.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/compiler/ComponentTemplateCompiler.java @@ -16,37 +16,37 @@ */ public class ComponentTemplateCompiler { - private static final Logger LOGGER = LoggerFactory.getLogger(ComponentTemplateCompiler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ComponentTemplateCompiler.class); - private Supplier> componentSupplier; + private Supplier> componentSupplier; - public ComponentTemplateCompiler(Supplier> componentSupplier) { - this.componentSupplier = componentSupplier; - } - - public Document compileDocument(SurfaceContext surfaceContext) { - LicketComponent component = componentSupplier.get(); - if (component == null) { - LOGGER.warn("Unable to find component."); - // TODO return empty Document? - } - LicketComponentView componentView = component.getView(); - return surfaceContext.processTemplateContent(componentView.viewResource().getStream()); - } + public ComponentTemplateCompiler(Supplier> componentSupplier) { + this.componentSupplier = componentSupplier; + } - public byte[] compile(SurfaceContext surfaceContext) { - LicketComponent component = componentSupplier.get(); - if (component == null) { - LOGGER.warn("Unable to find component."); - // TODO return empty byte array? - } - LicketComponentView componentView = component.getView(); - return compileComponentTemplate(componentView.viewResource(), surfaceContext).toByteArray(); + public Document compileDocument(SurfaceContext surfaceContext) { + LicketComponent component = componentSupplier.get(); + if (component == null) { + LOGGER.warn("Unable to find component."); + // TODO return empty Document? } - - private ByteArrayOutputStream compileComponentTemplate(Resource componentViewResource, SurfaceContext surfaceContext) { - ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); - surfaceContext.processTemplateContent(componentViewResource.getStream(), byteArrayStream); - return byteArrayStream; + LicketComponentView componentView = component.getView(); + return surfaceContext.processTemplateContent(componentView.viewResource().getStream()); + } + + public byte[] compile(SurfaceContext surfaceContext) { + LicketComponent component = componentSupplier.get(); + if (component == null) { + LOGGER.warn("Unable to find component."); + // TODO return empty byte array? } + LicketComponentView componentView = component.getView(); + return compileComponentTemplate(componentView.viewResource(), surfaceContext).toByteArray(); + } + + private ByteArrayOutputStream compileComponentTemplate(Resource componentViewResource, SurfaceContext surfaceContext) { + ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); + surfaceContext.processTemplateContent(componentViewResource.getStream(), byteArrayStream); + return byteArrayStream; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/form/InputElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/form/InputElement.java index 83512a5..fe497ae 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/form/InputElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/form/InputElement.java @@ -7,16 +7,16 @@ */ public class InputElement extends DefaultHtmlElement { - public InputElement(String name) { - super(name); - } + public InputElement(String name) { + super(name); + } - @Override - protected boolean writeEmpty() { - return false; - } + @Override + protected boolean writeEmpty() { + return false; + } - @Override - protected void onStart() { - } + @Override + protected void onStart() { + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RootComponentWrapperElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RootComponentWrapperElement.java index 3e57395..d4027bf 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RootComponentWrapperElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RootComponentWrapperElement.java @@ -7,8 +7,8 @@ */ public class RootComponentWrapperElement extends DefaultHtmlElement { - public RootComponentWrapperElement(String rootComponentId) { - super("div"); - addAttribute("id", rootComponentId); - } + public RootComponentWrapperElement(String rootComponentId) { + super("div"); + addAttribute("id", rootComponentId); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RouterViewElement.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RouterViewElement.java index 50eb430..3f17059 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RouterViewElement.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/html/router/RouterViewElement.java @@ -7,7 +7,7 @@ */ public class RouterViewElement extends DefaultHtmlElement { - public RouterViewElement() { - super("router-view"); - } + public RouterViewElement() { + super("router-view"); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/render/SpringDrivenComponentRenderingContext.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/render/SpringDrivenComponentRenderingContext.java index 2220623..fae7835 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/render/SpringDrivenComponentRenderingContext.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/surface/element/render/SpringDrivenComponentRenderingContext.java @@ -12,7 +12,6 @@ import org.licket.surface.tag.ElementFactories; import org.springframework.beans.factory.annotation.Autowired; -import java.io.InputStream; import java.util.function.Consumer; import static org.springframework.http.MediaType.TEXT_HTML_VALUE; @@ -22,14 +21,12 @@ */ public class SpringDrivenComponentRenderingContext implements ComponentRenderingContext { + private final SurfaceElement surfaceElement; @Autowired private ResourceStorage resourcesStorage; - @Autowired private ElementFactories surfaceElementFactories; - private final SurfaceElement surfaceElement; - SpringDrivenComponentRenderingContext(SurfaceElement surfaceElement) { this.surfaceElement = surfaceElement; } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ComponentNotFoundException.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ComponentNotFoundException.java index 51ddbd4..467e98e 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ComponentNotFoundException.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ComponentNotFoundException.java @@ -1,7 +1,5 @@ package org.licket.spring.web; -import org.licket.core.view.AbstractLicketComponent; - import static java.lang.String.format; /** @@ -9,26 +7,26 @@ */ public class ComponentNotFoundException extends RuntimeException { - public static ComponentNotFoundException componentNotFound(String compositeId) { - return new ComponentNotFoundException(format("Component not found: [%s]", compositeId)); - } + public ComponentNotFoundException() { + } - public ComponentNotFoundException() { - } + public ComponentNotFoundException(String message) { + super(message); + } - public ComponentNotFoundException(String message) { - super(message); - } + public ComponentNotFoundException(String message, Throwable cause) { + super(message, cause); + } - public ComponentNotFoundException(String message, Throwable cause) { - super(message, cause); - } + public ComponentNotFoundException(Throwable cause) { + super(cause); + } - public ComponentNotFoundException(Throwable cause) { - super(cause); - } + public ComponentNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } - public ComponentNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } + public static ComponentNotFoundException componentNotFound(String compositeId) { + return new ComponentNotFoundException(format("Component not found: [%s]", compositeId)); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ErrorHandler.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ErrorHandler.java index 724d5a3..b45d459 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ErrorHandler.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/ErrorHandler.java @@ -13,15 +13,15 @@ @ControllerAdvice public class ErrorHandler { - private final static Logger LOGGER = LoggerFactory.getLogger(ErrorHandler.class); + private final static Logger LOGGER = LoggerFactory.getLogger(ErrorHandler.class); - @ExceptionHandler(ComponentNotFoundException.class) - public void handleComponentNotFound(ComponentNotFoundException notFound) { - LOGGER.error(getRootCause(notFound).getMessage(), notFound); - } + @ExceptionHandler(ComponentNotFoundException.class) + public void handleComponentNotFound(ComponentNotFoundException notFound) { + LOGGER.error(getRootCause(notFound).getMessage(), notFound); + } - @ExceptionHandler(Throwable.class) - public void handleException(Throwable throwable) { - LOGGER.error(getRootCause(throwable).getMessage(), throwable); - } + @ExceptionHandler(Throwable.class) + public void handleException(Throwable throwable) { + LOGGER.error(getRootCause(throwable).getMessage(), throwable); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketActionLinkController.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketActionLinkController.java index 67512dd..ada78f3 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketActionLinkController.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketActionLinkController.java @@ -1,16 +1,10 @@ package org.licket.spring.web; -import static org.licket.core.id.CompositeId.fromStringValue; -import static org.licket.core.view.LicketUrls.CONTEXT_ACTION_LINK; -import static org.licket.spring.web.ComponentNotFoundException.componentNotFound; -import static org.licket.spring.web.component.ComponentActionHandler.onComponent; -import java.util.Optional; - import com.fasterxml.jackson.databind.JsonNode; import org.licket.core.LicketApplication; -import org.licket.core.view.LicketComponent; -import org.licket.core.view.ComponentActionCallback; import org.licket.core.model.LicketComponentModelGroup; +import org.licket.core.view.ComponentActionCallback; +import org.licket.core.view.LicketComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; @@ -19,28 +13,36 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import java.util.Optional; + +import static org.licket.core.LicketUrls.CONTEXT_ACTION_LINK; +import static org.licket.core.id.CompositeId.fromStringValue; +import static org.licket.spring.web.ComponentNotFoundException.componentNotFound; +import static org.licket.spring.web.component.ComponentActionHandler.onComponent; + @Controller @RequestMapping(CONTEXT_ACTION_LINK) public class LicketActionLinkController { - @Autowired - private LicketApplication licketApplication; - - @Deprecated - @PostMapping(value = "/click/{linkComponentCompositeId}", produces = "application/json") - public @ResponseBody LicketComponentModelGroup invokeComponentAction(@RequestBody JsonNode modelData, - @PathVariable String linkComponentCompositeId) { - Optional> link = licketApplication.findComponent(fromStringValue(linkComponentCompositeId)); - if (!link.isPresent()) { - throw componentNotFound(linkComponentCompositeId); - } - // component callback - ComponentActionCallback componentActionCallback = new ComponentActionCallback(); - - // handling action link click - onComponent(link.get()).tryLinkClick(modelData, componentActionCallback); - - // sending back list of reloaded component models - return new LicketComponentModelGroup().collectModels(componentActionCallback); + @Autowired + private LicketApplication licketApplication; + + @Deprecated + @PostMapping(value = "/click/{linkComponentCompositeId}", produces = "application/json") + public @ResponseBody + LicketComponentModelGroup invokeComponentAction(@RequestBody JsonNode modelData, + @PathVariable String linkComponentCompositeId) { + Optional> link = licketApplication.findComponent(fromStringValue(linkComponentCompositeId)); + if (!link.isPresent()) { + throw componentNotFound(linkComponentCompositeId); } + // component callback + ComponentActionCallback componentActionCallback = new ComponentActionCallback(); + + // handling action link click + onComponent(link.get()).tryLinkClick(modelData, componentActionCallback); + + // sending back list of reloaded component models + return new LicketComponentModelGroup().collectModels(componentActionCallback); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketComponentController.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketComponentController.java index 590c8d6..93bb99d 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketComponentController.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketComponentController.java @@ -5,8 +5,8 @@ import org.licket.core.model.LicketComponentModelGroup; import org.licket.core.resource.Resource; import org.licket.core.resource.ResourceStorage; -import org.licket.core.view.LicketComponent; import org.licket.core.view.ComponentActionCallback; +import org.licket.core.view.LicketComponent; import org.licket.surface.tag.ElementFactories; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; @@ -22,7 +22,7 @@ import java.util.Optional; -import static org.licket.core.view.LicketUrls.CONTEXT_COMPONENT; +import static org.licket.core.LicketUrls.CONTEXT_COMPONENT; import static org.licket.spring.web.ComponentNotFoundException.componentNotFound; import static org.licket.spring.web.component.ComponentActionHandler.onComponent; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @@ -35,48 +35,50 @@ @CrossOrigin(origins = "*") public class LicketComponentController { - @Autowired - private LicketApplication licketApplication; + @Autowired + private LicketApplication licketApplication; - @Autowired - private ElementFactories surfaceElementFactories; + @Autowired + private ElementFactories surfaceElementFactories; - @Autowired - private ResourceStorage resourcesStorage; + @Autowired + private ResourceStorage resourcesStorage; - // @Cacheable("component-view-cache") - @GetMapping(value = "/{compositeId}/view", produces = TEXT_HTML_VALUE) - public @ResponseBody ResponseEntity generateComponentViewCode(@PathVariable String compositeId) { - Optional> component = licketApplication.findComponent(compositeId); - if (!component.isPresent()) { - throw componentNotFound(compositeId); - } - Optional componentViewResourceOptional = resourcesStorage.getResource(compositeId); - if (!componentViewResourceOptional.isPresent()) { - // TODO throw some different exception here - throw componentNotFound(compositeId); - } - return ok().contentType(parseMediaType(componentViewResourceOptional.get().getMimeType())) - .body(new InputStreamResource(componentViewResourceOptional.get().getStream())); + // @Cacheable("component-view-cache") + @GetMapping(value = "/{compositeId}/view", produces = TEXT_HTML_VALUE) + public @ResponseBody + ResponseEntity generateComponentViewCode(@PathVariable String compositeId) { + Optional> component = licketApplication.findComponent(compositeId); + if (!component.isPresent()) { + throw componentNotFound(compositeId); + } + Optional componentViewResourceOptional = resourcesStorage.getResource(compositeId); + if (!componentViewResourceOptional.isPresent()) { + // TODO throw some different exception here + throw componentNotFound(compositeId); } + return ok().contentType(parseMediaType(componentViewResourceOptional.get().getMimeType())) + .body(new InputStreamResource(componentViewResourceOptional.get().getStream())); + } - @PostMapping(value = "/{compositeId}/mount", produces = APPLICATION_JSON_VALUE) - public @ResponseBody LicketComponentModelGroup mountComponent(@RequestBody JsonNode formData, - @PathVariable String compositeId) { - Optional> componentOptional = licketApplication.findComponent(compositeId); - if (!componentOptional.isPresent()) { - throw componentNotFound(compositeId); - } + @PostMapping(value = "/{compositeId}/mount", produces = APPLICATION_JSON_VALUE) + public @ResponseBody + LicketComponentModelGroup mountComponent(@RequestBody JsonNode formData, + @PathVariable String compositeId) { + Optional> componentOptional = licketApplication.findComponent(compositeId); + if (!componentOptional.isPresent()) { + throw componentNotFound(compositeId); + } - // handling mount - ComponentActionCallback componentActionCallback = new ComponentActionCallback(); - onComponent(componentOptional.get()).tryMountComponent(formData, componentActionCallback); + // handling mount + ComponentActionCallback componentActionCallback = new ComponentActionCallback(); + onComponent(componentOptional.get()).tryMountComponent(formData, componentActionCallback); - // refreshing component model after mounting operation - LicketComponentModelGroup modelGroup = new LicketComponentModelGroup(); - modelGroup.addModel(componentOptional.get().getCompositeId().getValue(), componentOptional.get().getComponentModel().get()); + // refreshing component model after mounting operation + LicketComponentModelGroup modelGroup = new LicketComponentModelGroup(); + modelGroup.addModel(componentOptional.get().getCompositeId().getValue(), componentOptional.get().getComponentModel().get()); - // sending back list of reloaded component models - return modelGroup.collectModels(componentActionCallback); - } + // sending back list of reloaded component models + return modelGroup.collectModels(componentActionCallback); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketDebugController.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketDebugController.java index 710571f..6f72d5b 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketDebugController.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketDebugController.java @@ -15,7 +15,7 @@ import static com.google.common.collect.Lists.newArrayList; import static java.util.stream.Collectors.toList; -import static org.licket.core.view.LicketUrls.CONTEXT_DEBUG; +import static org.licket.core.LicketUrls.CONTEXT_DEBUG; /** * @author lukaszgrabski @@ -31,12 +31,14 @@ public class LicketDebugController { private LicketApplication licketApplication; @GetMapping(value = "/resources") - public @ResponseBody List resourceHeaderList() { + public @ResponseBody + List resourceHeaderList() { return resourcesStorage.getAllResources().collect(toList()); } @GetMapping(value = "/components") - public @ResponseBody List components() { + public @ResponseBody + List components() { List components = newArrayList(); licketApplication.traverseDown(licketComponent -> { if (licketComponent.getCompositeId().length() > 1) { diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketFormController.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketFormController.java index 731edfa..b45e1a3 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketFormController.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketFormController.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.databind.JsonNode; import org.licket.core.LicketApplication; import org.licket.core.model.LicketComponentModelGroup; -import org.licket.core.view.LicketComponent; import org.licket.core.view.ComponentActionCallback; +import org.licket.core.view.LicketComponent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; @@ -15,8 +15,8 @@ import java.util.Optional; +import static org.licket.core.LicketUrls.CONTEXT_FORM; import static org.licket.core.id.CompositeId.fromStringValue; -import static org.licket.core.view.LicketUrls.CONTEXT_FORM; import static org.licket.spring.web.ComponentNotFoundException.componentNotFound; import static org.licket.spring.web.component.ComponentActionHandler.onComponent; @@ -24,28 +24,29 @@ @RequestMapping(CONTEXT_FORM) public class LicketFormController { - @Autowired - private LicketApplication licketApplication; + @Autowired + private LicketApplication licketApplication; - @PostMapping(value = "/submit/{formComponentCompositeId}", produces = "application/json") - public @ResponseBody LicketComponentModelGroup submitForm(@RequestBody JsonNode formData, - @PathVariable String formComponentCompositeId) { - Optional> form = licketApplication.findComponent(fromStringValue(formComponentCompositeId)); - if (!form.isPresent()) { - throw componentNotFound(formComponentCompositeId); - } + @PostMapping(value = "/submit/{formComponentCompositeId}", produces = "application/json") + public @ResponseBody + LicketComponentModelGroup submitForm(@RequestBody JsonNode formData, + @PathVariable String formComponentCompositeId) { + Optional> form = licketApplication.findComponent(fromStringValue(formComponentCompositeId)); + if (!form.isPresent()) { + throw componentNotFound(formComponentCompositeId); + } - // component callback - ComponentActionCallback componentActionCallback = new ComponentActionCallback(); + // component callback + ComponentActionCallback componentActionCallback = new ComponentActionCallback(); - // submitting form component - onComponent(form.get()).trySubmitForm(formData, componentActionCallback); + // submitting form component + onComponent(form.get()).trySubmitForm(formData, componentActionCallback); - // refreshing form model after submit - LicketComponentModelGroup modelGroup = new LicketComponentModelGroup(); - modelGroup.addModel(form.get().getCompositeId().getValue(), form.get().getComponentModel().get()); + // refreshing form model after submit + LicketComponentModelGroup modelGroup = new LicketComponentModelGroup(); + modelGroup.addModel(form.get().getCompositeId().getValue(), form.get().getComponentModel().get()); - // sending back list of reloaded component models - return modelGroup.collectModels(componentActionCallback); - } + // sending back list of reloaded component models + return modelGroup.collectModels(componentActionCallback); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketResourceController.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketResourceController.java index 9b1f434..d96f9a4 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketResourceController.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketResourceController.java @@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.Optional; -import static org.licket.core.view.LicketUrls.CONTEXT_RESOURCES; +import static org.licket.core.LicketUrls.CONTEXT_RESOURCES; import static org.springframework.http.MediaType.parseMediaType; import static org.springframework.http.ResponseEntity.ok; import static org.springframework.http.ResponseEntity.status; @@ -28,28 +28,28 @@ @RequestMapping(CONTEXT_RESOURCES) public class LicketResourceController { - @Autowired - private LicketApplication licketApplication; - - @Autowired - private ResourceStorage resourcesStorage; - - @GetMapping(value = "/**") - public ResponseEntity getResource(HttpServletRequest request) { - String path = (String) request.getAttribute( - HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); - String bestMatchPattern = (String ) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); - - AntPathMatcher antPathMatcher = new AntPathMatcher(); - String finalPath = antPathMatcher.extractPathWithinPattern(bestMatchPattern, path); - - Optional resourceOptional = resourcesStorage.getResource(finalPath); - if (!resourceOptional.isPresent()) { - return status(HttpStatus.NOT_FOUND).contentLength(0).body(null); - } - Resource resource = resourceOptional.get(); - return ok() - .contentType(parseMediaType(resource.getMimeType())) - .body(new InputStreamResource(resource.getStream())); + @Autowired + private LicketApplication licketApplication; + + @Autowired + private ResourceStorage resourcesStorage; + + @GetMapping(value = "/**") + public ResponseEntity getResource(HttpServletRequest request) { + String path = (String) request.getAttribute( + HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); + String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); + + AntPathMatcher antPathMatcher = new AntPathMatcher(); + String finalPath = antPathMatcher.extractPathWithinPattern(bestMatchPattern, path); + + Optional resourceOptional = resourcesStorage.getResource(finalPath); + if (!resourceOptional.isPresent()) { + return status(HttpStatus.NOT_FOUND).contentLength(0).body(null); } + Resource resource = resourceOptional.get(); + return ok() + .contentType(parseMediaType(resource.getMimeType())) + .body(new InputStreamResource(resource.getStream())); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketRootController.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketRootController.java index e12e1fd..db84e26 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketRootController.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketRootController.java @@ -1,12 +1,12 @@ package org.licket.spring.web; import org.licket.core.LicketApplication; -import org.licket.core.id.CompositeId; import org.licket.core.resource.ByteArrayResource; import org.licket.core.resource.Resource; import org.licket.core.resource.ResourceStorage; import org.licket.core.view.LicketComponent; import org.licket.core.view.hippo.vue.annotation.LicketMountPoint; +import org.licket.core.view.mount.MountedComponents; import org.licket.spring.surface.element.html.compiler.ComponentTemplateCompiler; import org.licket.surface.SurfaceContext; import org.licket.surface.tag.ElementFactories; @@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.PostConstruct; +import java.lang.reflect.Modifier; import java.util.Optional; import static org.springframework.http.HttpStatus.NOT_FOUND; @@ -47,6 +48,9 @@ public class LicketRootController { @Autowired private ElementFactories surfaceElementFactories; + @Autowired + private MountedComponents mountedComponents; + @PostConstruct private void initialize() { LOGGER.debug("Initializing Licket application: {}.", licketApplication.getName()); @@ -57,36 +61,51 @@ private void initialize() { if (mountPoint == null) { return true; } - ComponentTemplateCompiler templateCompiler = - new ComponentTemplateCompiler(() -> licketComponent); - if (isRootComponent(licketComponent)) { - // compiling root component template - resourcesStorage.putResource(new ByteArrayResource("index.html", TEXT_HTML_VALUE, - templateCompiler.compile(surfaceContext(licketComponent.getCompositeId())))); - return true; - } - resourcesStorage.putResource(new ByteArrayResource(licketComponent.getCompositeId().getValue(), TEXT_HTML_VALUE, - templateCompiler.compile(surfaceContext(licketComponent.getCompositeId())))); + registerComponentMountPoint(licketComponent, mountPoint.value()); + compileComponentViewResource(licketComponent); return true; }); } + private void registerComponentMountPoint(LicketComponent licketComponent, String mountPoint) { + if (isComponentAbstract(licketComponent)) { + LOGGER.warn("Currently not supported to mount abstract component like this one: {}.", licketComponent.getCompositeId().getValue()); + return; + } + // registering mounted component + mountedComponents.setMountedLink(licketComponent.getClass(), mountPoint); + } + + private void compileComponentViewResource(LicketComponent licketComponent) { + ComponentTemplateCompiler templateCompiler = + new ComponentTemplateCompiler(() -> licketComponent); + if (isRootComponent(licketComponent)) { + // compiling root component template + resourcesStorage.putResource(new ByteArrayResource("index.html", TEXT_HTML_VALUE, + templateCompiler.compile(new SurfaceContext(surfaceElementFactories, licketComponent.getCompositeId())))); + return; + } + resourcesStorage.putResource(new ByteArrayResource(licketComponent.getCompositeId().getValue(), TEXT_HTML_VALUE, + templateCompiler.compile(new SurfaceContext(surfaceElementFactories, licketComponent.getCompositeId())))); + } + private boolean isRootComponent(LicketComponent licketComponent) { return licketApplication.rootComponentContainer().getCompositeId().equals(licketComponent.getCompositeId()); } - private SurfaceContext surfaceContext(CompositeId parentCompositeId) { - return new SurfaceContext(surfaceElementFactories, parentCompositeId); + private boolean isComponentAbstract(LicketComponent licketComponent) { + return Modifier.isAbstract(licketComponent.getClass().getModifiers()); } @GetMapping(value = "/index", produces = TEXT_HTML_VALUE) - public @ResponseBody ResponseEntity generateRootHtml() { + public @ResponseBody + ResponseEntity generateRootHtml() { Optional resourceOptional = resourcesStorage.getResource("index.html"); if (!resourceOptional.isPresent()) { return status(NOT_FOUND).contentLength(0).body(null); } Resource resource = resourceOptional.get(); return ok().contentType(parseMediaType(resource.getMimeType())) - .body(new InputStreamResource(resource.getStream())); + .body(new InputStreamResource(resource.getStream())); } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketWebConfiguration.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketWebConfiguration.java index e64be52..04590e7 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketWebConfiguration.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/LicketWebConfiguration.java @@ -11,58 +11,58 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration -@Import(VuePluginsConfiguration.class) +@Import({VuePluginsConfiguration.class}) @EnableCaching public class LicketWebConfiguration extends WebMvcConfigurerAdapter { - @Bean - @SessionScope - public LicketRootController rootController() { - return new LicketRootController(); - } + @Bean + @SessionScope + public LicketRootController rootController() { + return new LicketRootController(); + } - @Bean - @SessionScope - public LicketFormController formControler() { - return new LicketFormController(); - } + @Bean + @SessionScope + public LicketFormController formControler() { + return new LicketFormController(); + } - @Bean - @SessionScope - public LicketActionLinkController actionLinkController() { - return new LicketActionLinkController(); - } + @Bean + @SessionScope + public LicketActionLinkController actionLinkController() { + return new LicketActionLinkController(); + } - @Bean - @SessionScope - public LicketComponentController componentController() { - return new LicketComponentController(); - } + @Bean + @SessionScope + public LicketComponentController componentController() { + return new LicketComponentController(); + } - @Bean - @SessionScope - public LicketResourceController resourceController() { - return new LicketResourceController(); - } + @Bean + @SessionScope + public LicketResourceController resourceController() { + return new LicketResourceController(); + } - @Bean - @SessionScope - public LicketDebugController debugController() { - return new LicketDebugController(); - } + @Bean + @SessionScope + public LicketDebugController debugController() { + return new LicketDebugController(); + } - @Bean - public ErrorHandler errorHandler() { - return new ErrorHandler(); - } + @Bean + public ErrorHandler errorHandler() { + return new ErrorHandler(); + } - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/").setViewName("/index"); - } + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("/index"); + } - @Override - public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { - configurer.enable(); - } + @Override + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/component/ComponentActionHandler.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/component/ComponentActionHandler.java index 3ccd476..c3db5f6 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/component/ComponentActionHandler.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/component/ComponentActionHandler.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.joor.ReflectException; -import org.licket.core.view.LicketComponent; import org.licket.core.view.ComponentActionCallback; +import org.licket.core.view.LicketComponent; import org.licket.core.view.mount.params.MountingParams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,65 +17,64 @@ */ public class ComponentActionHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(ComponentActionHandler.class); + private static final Logger LOGGER = LoggerFactory.getLogger(ComponentActionHandler.class); - private LicketComponent component; + private LicketComponent component; - private ComponentActionHandler(LicketComponent component) { - this.component = component; - } + private ComponentActionHandler(LicketComponent component) { + this.component = component; + } - public static ComponentActionHandler onComponent(LicketComponent component) { - return new ComponentActionHandler(component); - } + public static ComponentActionHandler onComponent(LicketComponent component) { + return new ComponentActionHandler(component); + } - public final void trySubmitForm(JsonNode formData, ComponentActionCallback componentActionCallback) { - try { - LOGGER.trace("Trying to submit form [{}].", component.getCompositeId().getValue()); + public final void trySubmitForm(JsonNode formData, ComponentActionCallback componentActionCallback) { + try { + LOGGER.trace("Trying to submit form [{}].", component.getCompositeId().getValue()); - on(component).call("submitForm", componentModelFromActionRequest(formData), componentActionCallback); - } catch (JsonProcessingException e) { - LOGGER.error("An error occurred while deserializing component model for: {}.", component.getCompositeId().getValue(), e); - } catch (ReflectException reflectException) { - LOGGER.error("An error occurred while setting component model for: {}.", component.getCompositeId().getValue(), - reflectException); - } + on(component).call("submitForm", componentModelFromActionRequest(formData), componentActionCallback); + } catch (JsonProcessingException e) { + LOGGER.error("An error occurred while deserializing component model for: {}.", component.getCompositeId().getValue(), e); + } catch (ReflectException reflectException) { + LOGGER.error("An error occurred while setting component model for: {}.", component.getCompositeId().getValue(), + reflectException); } + } - public final void tryLinkClick(JsonNode modelData, ComponentActionCallback componentActionCallback) { - try { - LOGGER.trace("Trying to handle link click [{}].", component.getCompositeId().getValue()); - // possible only on - on(component).call("invokeAction", componentModelFromActionRequest(modelData), componentActionCallback); - } catch (JsonProcessingException e) { - LOGGER.error("An error occurred while deserializing component model for: {}.", component.getCompositeId().getValue(), e); - } - catch (ReflectException reflectException) { - LOGGER.error("An error occurred while setting component model for: [%s]", component.getCompositeId().getValue(), - reflectException); - } + public final void tryLinkClick(JsonNode modelData, ComponentActionCallback componentActionCallback) { + try { + LOGGER.trace("Trying to handle link click [{}].", component.getCompositeId().getValue()); + // possible only on + on(component).call("invokeAction", componentModelFromActionRequest(modelData), componentActionCallback); + } catch (JsonProcessingException e) { + LOGGER.error("An error occurred while deserializing component model for: {}.", component.getCompositeId().getValue(), e); + } catch (ReflectException reflectException) { + LOGGER.error("An error occurred while setting component model for: [%s]", component.getCompositeId().getValue(), + reflectException); } + } - public final void tryMountComponent(JsonNode componentMountingParams, ComponentActionCallback componentActionCallback) { - try { - LOGGER.trace("Trying to mount component [{}].", component.getCompositeId().getValue()); + public final void tryMountComponent(JsonNode componentMountingParams, ComponentActionCallback componentActionCallback) { + try { + LOGGER.trace("Trying to mount component [{}].", component.getCompositeId().getValue()); - on(component).call("mountComponent", mountingParamsFromActionRequest(componentMountingParams), componentActionCallback); - } catch (JsonProcessingException e) { - LOGGER.error("An error occurred while deserializing component model for: {}.", component.getCompositeId().getValue(), e); - } catch (ReflectException reflectException) { - LOGGER.error("An error occurred while setting component model for: {}.", component.getCompositeId().getValue(), - reflectException); - } + on(component).call("mountComponent", mountingParamsFromActionRequest(componentMountingParams), componentActionCallback); + } catch (JsonProcessingException e) { + LOGGER.error("An error occurred while deserializing component model for: {}.", component.getCompositeId().getValue(), e); + } catch (ReflectException reflectException) { + LOGGER.error("An error occurred while setting component model for: {}.", component.getCompositeId().getValue(), + reflectException); } + } - private Object componentModelFromActionRequest(JsonNode formData) throws JsonProcessingException { - return new ObjectMapper().treeToValue(formData, component.getComponentModelClass()); - } + private Object componentModelFromActionRequest(JsonNode formData) throws JsonProcessingException { + return new ObjectMapper().treeToValue(formData, component.getComponentModelClass()); + } - private MountingParams mountingParamsFromActionRequest(JsonNode mountingParams) throws JsonProcessingException { - MountingParams params = new MountingParams(); - mountingParams.fieldNames().forEachRemaining(fieldName -> params.newParam(fieldName, mountingParams.get(fieldName).textValue())); - return params; - } + private MountingParams mountingParamsFromActionRequest(JsonNode mountingParams) throws JsonProcessingException { + MountingParams params = new MountingParams(); + mountingParams.fieldNames().forEachRemaining(fieldName -> params.newParam(fieldName, mountingParams.get(fieldName).asText())); + return params; + } } diff --git a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/debug/LicketComponentInfo.java b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/debug/LicketComponentInfo.java index c76b633..0d288fc 100644 --- a/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/debug/LicketComponentInfo.java +++ b/licket-spring-autoconfigure/src/main/java/org/licket/spring/web/debug/LicketComponentInfo.java @@ -11,6 +11,9 @@ public class LicketComponentInfo { private List children; + private String id; + private String compositeId; + private String className; public static Function, LicketComponentInfo> fromComponentInstance() { return licketComponent -> { @@ -22,10 +25,6 @@ public static Function, LicketComponentInfo> fromComponentIns }; } - private String id; - private String compositeId; - private String className; - public String getId() { return id; } @@ -50,11 +49,11 @@ public void setClassName(String className) { this.className = className; } - public void setChildren(List children) { - this.children = children; - } - public List getChildren() { return children; } + + public void setChildren(List children) { + this.children = children; + } } diff --git a/licket-spring-security/pom.xml b/licket-spring-security/pom.xml new file mode 100644 index 0000000..0cbe4e0 --- /dev/null +++ b/licket-spring-security/pom.xml @@ -0,0 +1,43 @@ + + + + licket-parent + org.licket + 0.0.1-SNAPSHOT + + 4.0.0 + + licket-spring-security + + + + org.licket + licket-framework + + + com.google.guava + guava + + + org.springframework.security + spring-security-web + + + org.springframework.security + spring-security-config + + + org.springframework.security.oauth + spring-security-oauth2 + + + org.springframework.boot + spring-boot-starter-web + provided + + + + + \ No newline at end of file diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/LicketSecurityAutoconfigure.java b/licket-spring-security/src/main/java/org/licket/spring/security/LicketSecurityAutoconfigure.java new file mode 100644 index 0000000..fa1bd8d --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/LicketSecurityAutoconfigure.java @@ -0,0 +1,50 @@ +package org.licket.spring.security; + +import org.licket.core.LicketApplication; +import org.licket.core.resource.FootParticipatingResource; +import org.licket.core.view.mount.MountComponentInterceptor; +import org.licket.spring.security.interceptor.SecurityComponentInterceptor; +import org.licket.spring.security.resource.LicketComponentSecurityInterceptorResource; +import org.licket.spring.security.resource.TinyCookieResource; +import org.licket.spring.security.vue.LicketComponentSecurity; +import org.licket.spring.security.vue.VueComponentSecurityGuardDecorator; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@ConditionalOnClass(LicketApplication.class) +@Import({WebSecurityConfiguration.class}) +public class LicketSecurityAutoconfigure { + + @Bean + public WebUrls webUrls() { + return new WebUrls(); + } + + @Bean + public LicketComponentSecurity componentSecurity() { + return new LicketComponentSecurity(); + } + + @Bean + public FootParticipatingResource licketComponentSecurityInterceptorResource() { + return new LicketComponentSecurityInterceptorResource(); + } + + @Bean + public VueComponentSecurityGuardDecorator componentSecurityGuardDecorator() { + return new VueComponentSecurityGuardDecorator(); + } + + @Bean + public MountComponentInterceptor securityMountPointInterceptor() { + return new SecurityComponentInterceptor(); + } + + @Bean + public TinyCookieResource vueCookieResource() { + return new TinyCookieResource(); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/WebSecurityConfiguration.java b/licket-spring-security/src/main/java/org/licket/spring/security/WebSecurityConfiguration.java new file mode 100644 index 0000000..1d4004d --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/WebSecurityConfiguration.java @@ -0,0 +1,80 @@ +package org.licket.spring.security; + +import org.licket.spring.security.token.TokenAuthenticationService; +import org.licket.spring.security.token.TokenPassFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Configurable; +import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties; +import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.oauth2.client.OAuth2ClientContext; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter; +import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails; +import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; +import org.springframework.web.context.annotation.SessionScope; + +/** + * @author lukaszgrabski + */ +@EnableWebSecurity +@Configurable +public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { + + @Autowired + private OAuth2ClientContext oauth2ClientContext; + + @Autowired + private AuthorizationCodeResourceDetails authorizationCodeResourceDetails; + + @Autowired + private ResourceServerProperties resourceServerProperties; + + @Autowired + private WebUrls webUrls; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().antMatchers(webUrls.getPublicAntMatchers()).permitAll(); + http + .authorizeRequests() + .anyRequest().fullyAuthenticated() + .and() + .logout() + .logoutSuccessUrl("/") + .permitAll() + .and() + .addFilterAt(oauth2Filter(), BasicAuthenticationFilter.class) + .addFilterBefore(tokenPassFilter(), BasicAuthenticationFilter.class) + .csrf() + .disable(); + } + + @Bean + public TokenAuthenticationService tokenAuthenticationService() { + return new TokenAuthenticationService(); + } + + @Bean + public TokenPassFilter tokenPassFilter() { + return new TokenPassFilter(); + } + + @Bean + @SessionScope + public OAuth2RestTemplate restTemplate() { + return new OAuth2RestTemplate(authorizationCodeResourceDetails, oauth2ClientContext); + } + + private OAuth2ClientAuthenticationProcessingFilter oauth2Filter() { + OAuth2ClientAuthenticationProcessingFilter oAuth2Filter = new OAuth2ClientAuthenticationProcessingFilter( + "/oauth2/gitlab/login"); + oAuth2Filter.setRestTemplate(restTemplate()); + oAuth2Filter.setTokenServices(new UserInfoTokenServices(resourceServerProperties.getUserInfoUri(), + resourceServerProperties.getClientId())); + return oAuth2Filter; + } +} \ No newline at end of file diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/WebUrls.java b/licket-spring-security/src/main/java/org/licket/spring/security/WebUrls.java new file mode 100644 index 0000000..a6a54ae --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/WebUrls.java @@ -0,0 +1,26 @@ +package org.licket.spring.security; + +import org.springframework.stereotype.Component; + +import java.util.List; + +import static com.google.common.collect.Lists.newArrayList; +import static java.util.Arrays.stream; +import static org.licket.core.LicketUrls.CONTEXT_RESOURCES; + +/** + * @author lukaszgrabski + */ +@Component +public class WebUrls { + + private List publicAntMatchers = newArrayList(CONTEXT_RESOURCES + "/**"); + + public void addPublicAntMatchers(String... antMatchers) { + stream(antMatchers).forEach(publicAntMatchers::add); + } + + public String[] getPublicAntMatchers() { + return publicAntMatchers.toArray(new String[0]); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/interceptor/SecurityComponentInterceptor.java b/licket-spring-security/src/main/java/org/licket/spring/security/interceptor/SecurityComponentInterceptor.java new file mode 100644 index 0000000..3d39252 --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/interceptor/SecurityComponentInterceptor.java @@ -0,0 +1,21 @@ +package org.licket.spring.security.interceptor; + +import org.licket.core.view.hippo.vue.annotation.LicketMountPoint; +import org.licket.core.view.mount.MountComponentInterceptor; +import org.licket.framework.hippo.BlockBuilder; +import org.licket.spring.security.vue.VueComponentSecurityGuardDecorator; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author lukaszgrabski + */ +public class SecurityComponentInterceptor implements MountComponentInterceptor { + + @Autowired + private VueComponentSecurityGuardDecorator securityGuardDecorator; + + @Override + public void intercept(BlockBuilder blockBuilder, LicketMountPoint mountPoint) { + securityGuardDecorator.decorate(blockBuilder, mountPoint.access()); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/resource/LicketComponentSecurityInterceptorResource.java b/licket-spring-security/src/main/java/org/licket/spring/security/resource/LicketComponentSecurityInterceptorResource.java new file mode 100644 index 0000000..a568a11 --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/resource/LicketComponentSecurityInterceptorResource.java @@ -0,0 +1,87 @@ +package org.licket.spring.security.resource; + +import org.licket.core.resource.FootParticipatingResource; +import org.licket.core.resource.javascript.AbstractJavascriptDynamicResource; +import org.licket.framework.hippo.BlockBuilder; +import org.licket.framework.hippo.FunctionCallBuilder; +import org.licket.spring.security.vue.LicketComponentSecurity; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.licket.core.view.hippo.ComponentCallTargetOrigin.fromAppInstance; +import static org.licket.framework.hippo.BlockBuilder.block; +import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; +import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; +import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; +import static org.licket.framework.hippo.FunctionNodeBuilder.functionNode; +import static org.licket.framework.hippo.IfStatementBuilder.ifStatement; +import static org.licket.framework.hippo.NameBuilder.name; +import static org.licket.framework.hippo.PropertyNameBuilder.property; +import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; +import static org.licket.framework.hippo.VariableDeclarationBuilder.variableDeclaration; +import static org.licket.framework.hippo.VariableInitializerBuilder.variableInitializer; + +/** + * @author lukaszgrabski + */ +public class LicketComponentSecurityInterceptorResource extends AbstractJavascriptDynamicResource implements FootParticipatingResource { + + @Autowired + private LicketComponentSecurity componentSecurity; + + @Override + public String getName() { + return "Licket.security.interceptor.js"; + } + + @Override + protected void buildJavascriptTree(BlockBuilder scriptBlockBuilder) { + scriptBlockBuilder.appendStatement(expressionStatement( + functionCall() + .target(property(property(property("Vue", "http"), name("interceptors")), name("push"))) + .argument( + functionNode() + .param(name("request")) + .param(name("next")) + .body(handleResponseFunction(writeTokenHeader(block()))) + ) + )); + } + + private BlockBuilder writeTokenHeader(BlockBuilder block) { + block.appendStatement(expressionStatement( + ifStatement() + .condition(equalCheckExpression().left(componentSecurity.callCheckAuthenticated(fromAppInstance())).right(name("true"))) + .then( + block() + .appendStatement(expressionStatement(componentSecurity.callWriteTokenToRequest(fromAppInstance(), name("request")))) + ) + )); + return block; + } + + private BlockBuilder handleResponseFunction(BlockBuilder block) { + block.appendStatement(functionCall().target(name("next")).argument( + functionNode() + .param(name("res")) + .body(block().appendStatement(expressionStatement( + ifStatement() + .condition( + equalCheckExpression() + .left(getHeaderCall()) + .right(name("null")) + .negative()) + .then( + block() + .appendStatement(expressionStatement(variableDeclaration().variable(variableInitializer().target(name("token")).initializer(getHeaderCall())))) + .appendStatement(expressionStatement(componentSecurity.callSetAuthenticationToken(fromAppInstance(), name("token")))) + ) + )))) + ); + + return block; + } + + private FunctionCallBuilder getHeaderCall() { + return functionCall().target(property(property("res", "headers"), "get")).argument(stringLiteral("X-AUTH-TOKEN")); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/resource/TinyCookieResource.java b/licket-spring-security/src/main/java/org/licket/spring/security/resource/TinyCookieResource.java new file mode 100644 index 0000000..d79778c --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/resource/TinyCookieResource.java @@ -0,0 +1,14 @@ +package org.licket.spring.security.resource; + +import org.licket.core.resource.HeadParticipatingResource; +import org.licket.core.resource.javascript.JavascriptStaticResource; + +/** + * @author activey + */ +public class TinyCookieResource extends JavascriptStaticResource implements HeadParticipatingResource { + + public TinyCookieResource() { + super("tony-cookie.js", "tiny-cookie/tiny-cookie.js"); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenAuthenticationFilter.java b/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenAuthenticationFilter.java new file mode 100644 index 0000000..85826c1 --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenAuthenticationFilter.java @@ -0,0 +1,43 @@ +package org.licket.spring.security.token; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author lukaszgrabski + */ +public class TokenAuthenticationFilter extends OncePerRequestFilter { + + private final AuthenticationManager authenticationManager; + + @Autowired + private TokenAuthenticationService tokenAuthenticationService; + + public TokenAuthenticationFilter(AuthenticationManager authenticationManager) { + this.authenticationManager = authenticationManager; + } + + @Override + public void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { +// Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); +// if (authentication == null) { +// authentication = tokenAuthenticationService.getAuthentication(servletRequest); +// if (authentication != null) { +// SecurityContextHolder.getContext().setAuthentication(authentication); +// filterChain.doFilter(servletRequest, servletResponse); +// return; +// } +// filterChain.doFilter(servletRequest, servletResponse); +// return; +// } +// tokenAuthenticationService.addAuthentication(servletResponse, authentication.getName()); +// filterChain.doFilter(servletRequest, servletResponse); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenAuthenticationService.java b/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenAuthenticationService.java new file mode 100644 index 0000000..84201f3 --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenAuthenticationService.java @@ -0,0 +1,78 @@ +package org.licket.spring.security.token; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.provider.OAuth2Authentication; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; + +import static com.google.common.collect.Lists.newArrayList; + +/** + * @author lukaszgrabski + */ +public class TokenAuthenticationService { + + static final long EXPIRATIONTIME = 864_000_000; // 10 days + static final String SECRET = "ThisIsASecret"; + static final String TOKEN_PREFIX = "Bearer"; + static final String HEADER_STRING = "Authorization"; + + public String authenticate(Authentication authentication) { + // setting auth context + SecurityContextHolder + .getContext() + .setAuthentication(authentication); + return Jwts.builder() + .setSubject(authentication.getName()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME)) + .signWith(SignatureAlgorithm.HS512, SECRET) + .compact(); + } + + public void addAuthentication(HttpServletResponse httpServletResponse, String subject) { + String JWT = Jwts.builder() + .setSubject(subject) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME)) + .signWith(SignatureAlgorithm.HS512, SECRET) + .compact(); + httpServletResponse.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT); + } + + public void addAuthentication(HttpServletResponse httpServletResponse, OAuth2Authentication subject) { +// OAuth2AccessToken accessToken = clientContext.getAccessToken(); +// +// String JWT = Jwts.builder() +// .setSubject(subject.getName()) +// .setExpiration(accessToken.getExpiration()) +// .signWith(SignatureAlgorithm.HS512, SECRET) +// .set(subject.getAuthorities()) +// .compact(); +// httpServletResponse.addHeader(HEADER_STRING, TOKEN_PREFIX + " " + JWT); + } + + public Authentication getAuthentication(HttpServletRequest request) { + String token = request.getHeader(HEADER_STRING); + if (token == null) { + return null; + } + try { + String user = Jwts.parser() + .setSigningKey(SECRET) + .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) + .getBody() + .getSubject(); + if (user != null) { + return new UsernamePasswordAuthenticationToken(user, null, newArrayList()); + } + } catch (RuntimeException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenPassFilter.java b/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenPassFilter.java new file mode 100644 index 0000000..3330300 --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/token/TokenPassFilter.java @@ -0,0 +1,80 @@ +package org.licket.spring.security.token; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.client.OAuth2ClientContext; +import org.springframework.security.oauth2.common.OAuth2AccessToken; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.Optional; + +import static java.util.Optional.empty; +import static java.util.Optional.ofNullable; + +/** + * @author lukaszgrabski + */ +public class TokenPassFilter extends OncePerRequestFilter { + + private static final String HEADER_AUTHORIZATION = "Authorization"; + private static final String HEADER_TOKEN = "X-AUTH-TOKEN"; + + @Autowired + private OAuth2ClientContext clientContext; + + @Autowired + private ResourceServerTokenServices tokenServices; + + public void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && (authentication instanceof OAuth2Authentication)) { + OAuth2AccessToken accessToken = clientContext.getAccessToken(); + createTokenCookie(servletResponse, accessToken); + } else { + // checking header + getAuthHeader(servletRequest).ifPresent(tokenHeader -> getBearerValue(tokenHeader).ifPresent(bearer -> { + OAuth2Authentication oAuth2Authentication = tokenServices.loadAuthentication(bearer); + SecurityContextHolder.getContext().setAuthentication(oAuth2Authentication); + })); + // checking cookie + getAuthCookie(servletRequest).ifPresent(tokenCookie -> { + OAuth2Authentication oAuth2Authentication = tokenServices.loadAuthentication(tokenCookie.getValue()); + SecurityContextHolder.getContext().setAuthentication(oAuth2Authentication); + }); + } + filterChain.doFilter(servletRequest, servletResponse); + } + + private Optional getAuthCookie(HttpServletRequest request) { + if (request.getCookies() == null) { + return empty(); + } + return Arrays.stream(request.getCookies()).filter(cookie -> cookie.getName().equals(HEADER_TOKEN)).findFirst(); + } + + private void createTokenCookie(HttpServletResponse response, OAuth2AccessToken accessToken) { + response.addCookie(new Cookie(HEADER_TOKEN, accessToken.getValue())); + } + + private Optional getBearerValue(String tokenHeaderValue) { + String[] headerParts = tokenHeaderValue.split(" "); + if (headerParts.length != 2) { + return Optional.empty(); + } + return Optional.of(headerParts[1]); + } + + private Optional getAuthHeader(HttpServletRequest request) { + return ofNullable(request.getHeader(HEADER_AUTHORIZATION)); + } +} \ No newline at end of file diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/vue/LicketComponentSecurity.java b/licket-spring-security/src/main/java/org/licket/spring/security/vue/LicketComponentSecurity.java new file mode 100644 index 0000000..e0ae688 --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/vue/LicketComponentSecurity.java @@ -0,0 +1,134 @@ +package org.licket.spring.security.vue; + +import org.licket.core.module.application.ApplicationModuleService; +import org.licket.core.view.hippo.ComponentCallTargetOrigin; +import org.licket.core.view.hippo.vue.annotation.Name; +import org.licket.core.view.hippo.vue.annotation.VueComponentFunction; +import org.licket.core.view.hippo.vue.extend.AbstractCallableVueClass; +import org.licket.core.view.redirect.BrowserRedirect; +import org.licket.core.view.security.LicketComponentSecuritySettings; +import org.licket.framework.hippo.BlockBuilder; +import org.licket.framework.hippo.FunctionCallBuilder; +import org.licket.framework.hippo.NameBuilder; +import org.licket.framework.hippo.PropertyNameBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; + +import static org.licket.framework.hippo.ConcatenateExpression.concatenateExpression; +import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; +import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; +import static org.licket.framework.hippo.FunctionCallBuilder.functionCall; +import static org.licket.framework.hippo.IfStatementBuilder.ifStatement; +import static org.licket.framework.hippo.NameBuilder.name; +import static org.licket.framework.hippo.PropertyNameBuilder.property; +import static org.licket.framework.hippo.ReturnStatementBuilder.returnStatement; +import static org.licket.framework.hippo.StringLiteralBuilder.stringLiteral; +import static org.licket.framework.hippo.VariableDeclarationBuilder.variableDeclaration; +import static org.licket.framework.hippo.VariableInitializerBuilder.variableInitializer; + +/** + * @author lukaszgrabski + */ +public class LicketComponentSecurity extends AbstractCallableVueClass implements ApplicationModuleService { + + private static final String AUTHENTICATION_TOKEN_VARIABLE = "authToken"; + private static final String AUTHENTICATION_TOKEN_COOKIE = "X-AUTH-TOKEN"; + + @Autowired + private Optional securitySettings; + + private BrowserRedirect browserRedirect = new BrowserRedirect(); + + public static String serviceName() { + return "$licketComponentSecurity"; + } + + @VueComponentFunction + public void checkAuthenticated(BlockBuilder body) { + NameBuilder authenticationToken = name(AUTHENTICATION_TOKEN_VARIABLE); + body.appendStatement(expressionStatement(variableDeclaration().variable( + variableInitializer() + .target(authenticationToken) + .initializer(functionCall() + .target(property("Cookie", "get")).argument(stringLiteral(AUTHENTICATION_TOKEN_COOKIE))) + ))); + body.appendStatement(expressionStatement( + ifStatement() + .condition(equalCheckExpression().negative().left(authenticationToken).right(name("null"))) + .then(returnStatement().returnValue(name("true"))) + )); + body.appendStatement(expressionStatement(returnStatement().returnValue(name("false")))); + } + + @VueComponentFunction + public void performAuthentication(@Name("router") NameBuilder router, @Name("redirectTo") NameBuilder redirectTo, BlockBuilder body) { + securitySettings.ifPresent(securitySettings -> body.appendStatement(expressionStatement(browserRedirect.redirectToInternalUri("/oauth2/gitlab/login")))); + +// TODO implement it as a different authentication strategy? +// securitySettings.ifPresent(securitySettings -> { +// FunctionCallBuilder routeCall = mountedComponentNavigation.navigateToMounted( +// securitySettings.loginPanelComponentClass(), +// router, +// paramsAggregator -> paramsAggregator +// .name("redirectTo") +// .value(property(propertyBuilder -> propertyBuilder.value(redirectTo))) +// ); +// body.appendStatement(expressionStatement(routeCall)); +// }); + } + + @VueComponentFunction + public void setAuthenticationToken(@Name("token") NameBuilder token, BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(property("Cookie", "set")) + .argument(stringLiteral(AUTHENTICATION_TOKEN_COOKIE)) + .argument(token) + )); + } + + @VueComponentFunction + public void writeTokenToRequest(@Name("request") NameBuilder request, BlockBuilder body) { + body.appendStatement(expressionStatement( + functionCall() + .target(property(property("request", "headers"), name("set"))) + .argument(stringLiteral("Authorization")) + .argument(concatenateExpression().left(stringLiteral("Bearer ")).right( + functionCall() + .target(property("localStorage", "getItem")) + .argument(stringLiteral(AUTHENTICATION_TOKEN_COOKIE)) + )) + + )); + } + + @Override + public NameBuilder vueName() { + return name(LicketComponentSecurity.serviceName()); + } + + public FunctionCallBuilder callCheckAuthenticated(ComponentCallTargetOrigin targetOrigin) { + return functionCall() + .target(property(property(targetOrigin.buildTargetOrigin(), LicketComponentSecurity.serviceName()), name("checkAuthenticated"))); + } + + public FunctionCallBuilder callPerformAuthentication(ComponentCallTargetOrigin targetOrigin, PropertyNameBuilder routerReference) { + return functionCall() + .target(property(property(targetOrigin.buildTargetOrigin(), LicketComponentSecurity.serviceName()), name("performAuthentication"))) + .argument(routerReference) + .argument(property("to", "fullPath")); + } + + public FunctionCallBuilder callWriteTokenToRequest(ComponentCallTargetOrigin targetOrigin, NameBuilder requestReference) { + return functionCall() + .target(property(property(targetOrigin.buildTargetOrigin(), LicketComponentSecurity.serviceName()), name("writeTokenToRequest"))) + .argument(requestReference); + } + + public FunctionCallBuilder callSetAuthenticationToken(ComponentCallTargetOrigin targetOrigin, NameBuilder tokenReference) { + return functionCall() + .target(property(property(targetOrigin.buildTargetOrigin(), LicketComponentSecurity.serviceName()), "setAuthenticationToken")) + .argument(tokenReference); + } +} diff --git a/licket-spring-security/src/main/java/org/licket/spring/security/vue/VueComponentSecurityGuardDecorator.java b/licket-spring-security/src/main/java/org/licket/spring/security/vue/VueComponentSecurityGuardDecorator.java new file mode 100644 index 0000000..727f62d --- /dev/null +++ b/licket-spring-security/src/main/java/org/licket/spring/security/vue/VueComponentSecurityGuardDecorator.java @@ -0,0 +1,41 @@ +package org.licket.spring.security.vue; + +import org.licket.core.view.security.LicketComponentSecuritySettings; +import org.licket.core.view.security.LicketMountPointAccess; +import org.licket.framework.hippo.BlockBuilder; +import org.licket.framework.hippo.NameBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; + +import static org.licket.core.view.hippo.ComponentCallTargetOrigin.fromVm; +import static org.licket.framework.hippo.BlockBuilder.block; +import static org.licket.framework.hippo.EqualCheckExpressionBuilder.equalCheckExpression; +import static org.licket.framework.hippo.ExpressionStatementBuilder.expressionStatement; +import static org.licket.framework.hippo.IfStatementBuilder.ifStatement; +import static org.licket.framework.hippo.PropertyNameBuilder.property; + +/** + * @author lukaszgrabski + */ +public class VueComponentSecurityGuardDecorator { + + @Autowired + private Optional componentSecuritySettings; + + @Autowired + private LicketComponentSecurity componentSecurity; + + public BlockBuilder decorate(BlockBuilder functionBlock, LicketMountPointAccess access) { + if (access.isPublic() || !componentSecuritySettings.isPresent()) { + return functionBlock; + } + return functionBlock.appendStatement(expressionStatement( + ifStatement() + .condition(equalCheckExpression().left(componentSecurity.callCheckAuthenticated(fromVm())).right(NameBuilder.name("false"))) + .then( + block().appendStatement(expressionStatement(componentSecurity.callPerformAuthentication(fromVm(), property("vm", "$router")))) + ) + )); + } +} diff --git a/licket-spring-security/src/main/resources/META-INF/spring.factories b/licket-spring-security/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..98bde50 --- /dev/null +++ b/licket-spring-security/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.licket.spring.security.LicketSecurityAutoconfigure \ No newline at end of file diff --git a/licket-spring-websocket/pom.xml b/licket-spring-websocket/pom.xml new file mode 100644 index 0000000..a85ce16 --- /dev/null +++ b/licket-spring-websocket/pom.xml @@ -0,0 +1,30 @@ + + + + licket-parent + org.licket + 0.0.1-SNAPSHOT + + 4.0.0 + + licket-spring-websocket + + + + org.springframework.boot + spring-boot-starter-websocket + + + + + org.licket + licket-framework + + + org.licket + licket-framework-hippo + + + \ No newline at end of file diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/LicketWebsocketAutoconfigure.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/LicketWebsocketAutoconfigure.java new file mode 100644 index 0000000..a6d36b1 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/LicketWebsocketAutoconfigure.java @@ -0,0 +1,41 @@ +package org.licket.spring.websocket; + +import org.licket.core.LicketApplication; +import org.licket.spring.websocket.config.WebSocketConfig; +import org.licket.spring.websocket.config.WebSocketProperties; +import org.licket.spring.websocket.reload.LicketStompComponentModelReloader; +import org.licket.spring.websocket.resource.LicketStompResource; +import org.licket.spring.websocket.resource.SockJSResource; +import org.licket.spring.websocket.resource.StompResource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@ConditionalOnClass(LicketApplication.class) +@Import({WebSocketConfig.class}) +@EnableConfigurationProperties(WebSocketProperties.class) +public class LicketWebsocketAutoconfigure { + + @Bean + public LicketStompResource licketStompResource() { + return new LicketStompResource(); + } + + @Bean + public SockJSResource sockJsResource() { + return new SockJSResource(); + } + + @Bean + public StompResource stompResource() { + return new StompResource(); + } + + @Bean + public LicketStompComponentModelReloader licketStompComponentReloader() { + return new LicketStompComponentModelReloader(); + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/config/WebSocketConfig.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/config/WebSocketConfig.java new file mode 100644 index 0000000..54c363d --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/config/WebSocketConfig.java @@ -0,0 +1,30 @@ +package org.licket.spring.websocket.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; + +/** + * @author lukaszgrabski + */ +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { + + @Autowired + private WebSocketProperties webSocketProperties; + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + registry.enableSimpleBroker(webSocketProperties.getBrokerPrefix()); + registry.setApplicationDestinationPrefixes(webSocketProperties.getApplicationPrefix()); + } + + @Override + public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) { + stompEndpointRegistry.addEndpoint(webSocketProperties.getEndpoint()).withSockJS(); + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/config/WebSocketProperties.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/config/WebSocketProperties.java new file mode 100644 index 0000000..7bc72f6 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/config/WebSocketProperties.java @@ -0,0 +1,40 @@ +package org.licket.spring.websocket.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author lukaszgrabski + */ +@Configuration +@ConfigurationProperties(prefix = "stomp") +public class WebSocketProperties { + + private String applicationPrefix = "/app"; + private String brokerPrefix = "/topic"; + private String endpoint = "/stomp"; + + public String getApplicationPrefix() { + return applicationPrefix; + } + + public void setApplicationPrefix(String applicationPrefix) { + this.applicationPrefix = applicationPrefix; + } + + public String getBrokerPrefix() { + return brokerPrefix; + } + + public void setBrokerPrefix(String brokerPrefix) { + this.brokerPrefix = brokerPrefix; + } + + public String getEndpoint() { + return endpoint; + } + + public void setEndpoint(String endpoint) { + this.endpoint = endpoint; + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketComponentModel.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketComponentModel.java new file mode 100644 index 0000000..4c4a730 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketComponentModel.java @@ -0,0 +1,35 @@ +package org.licket.spring.websocket.reload; + +/** + * @author lukaszgrabski + */ +public class LicketComponentModel { + + private String compositeId; + private Object model; + + public LicketComponentModel() { + + } + + public LicketComponentModel(String compositeId, Object model) { + this.compositeId = compositeId; + this.model = model; + } + + public String getCompositeId() { + return compositeId; + } + + public void setCompositeId(String compositeId) { + this.compositeId = compositeId; + } + + public Object getModel() { + return model; + } + + public void setModel(Object model) { + this.model = model; + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketComponentPatch.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketComponentPatch.java new file mode 100644 index 0000000..49cc236 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketComponentPatch.java @@ -0,0 +1,37 @@ +package org.licket.spring.websocket.reload; + +import com.fasterxml.jackson.databind.JsonNode; + +/** + * @author lukaszgrabski + */ +public class LicketComponentPatch { + + private String compositeId; + private JsonNode patch; + + public LicketComponentPatch() { + + } + + public LicketComponentPatch(String compositeId, JsonNode patch) { + this.compositeId = compositeId; + this.patch = patch; + } + + public String getCompositeId() { + return compositeId; + } + + public void setCompositeId(String compositeId) { + this.compositeId = compositeId; + } + + public JsonNode getPatch() { + return patch; + } + + public void setPatch(JsonNode patch) { + this.patch = patch; + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketStompComponentModelReloader.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketStompComponentModelReloader.java new file mode 100644 index 0000000..6de2ce5 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/reload/LicketStompComponentModelReloader.java @@ -0,0 +1,33 @@ +package org.licket.spring.websocket.reload; + +import org.licket.core.view.LicketComponent; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.simp.SimpMessagingTemplate; + +import static java.util.Arrays.stream; + +/** + * @author lukaszgrabski + */ +public class LicketStompComponentModelReloader { + + private static final String TOPIC_COMPONENT_PATCH = "/topic/component/patch"; + private static final String TOPIC_COMPONENT_MODEL = "/topic/component/model"; + + @Autowired + private SimpMessagingTemplate messagingTemplate; + + public final void reloadForUser(String userName, LicketComponent... components) { + stream(components).forEach(component -> messagingTemplate.convertAndSendToUser(userName, + TOPIC_COMPONENT_MODEL, + new LicketComponentModel(component.getCompositeId().getValue(), component.getComponentModel().get()) + )); + } + + public final void patchForUser(String userName, LicketComponent... components) { + stream(components).forEach(component -> messagingTemplate.convertAndSendToUser(userName, + TOPIC_COMPONENT_PATCH, + new LicketComponentPatch(component.getCompositeId().getValue(), component.getComponentModel().getPatch().getJsonPatch()) + )); + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/LicketStompResource.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/LicketStompResource.java new file mode 100644 index 0000000..70ba2c9 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/LicketStompResource.java @@ -0,0 +1,26 @@ +package org.licket.spring.websocket.resource; + +import org.licket.core.resource.FootParticipatingResource; +import org.licket.core.resource.javascript.JavascriptTemplateResource; +import org.licket.spring.websocket.config.WebSocketProperties; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Map; + +/** + * @author lukaszgrabski + */ +public class LicketStompResource extends JavascriptTemplateResource implements FootParticipatingResource { + + @Autowired + private WebSocketProperties webSocketProperties; + + public LicketStompResource() { + super("Licket.stomp.js", "js/Licket.stomp.template.js"); + } + + @Override + protected void collectTemplateVariables(Map templateVariables) { + templateVariables.put("stomp_uri", webSocketProperties.getEndpoint()); + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/SockJSResource.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/SockJSResource.java new file mode 100644 index 0000000..c52f763 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/SockJSResource.java @@ -0,0 +1,14 @@ +package org.licket.spring.websocket.resource; + +import org.licket.core.resource.HeadParticipatingResource; +import org.licket.core.resource.javascript.JavascriptStaticResource; + +/** + * @author activey + */ +public class SockJSResource extends JavascriptStaticResource implements HeadParticipatingResource { + + public SockJSResource() { + super("sockjs.js", "sockjs-client/dist/sockjs.js"); + } +} diff --git a/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/StompResource.java b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/StompResource.java new file mode 100644 index 0000000..19bc969 --- /dev/null +++ b/licket-spring-websocket/src/main/java/org/licket/spring/websocket/resource/StompResource.java @@ -0,0 +1,14 @@ +package org.licket.spring.websocket.resource; + +import org.licket.core.resource.HeadParticipatingResource; +import org.licket.core.resource.javascript.JavascriptStaticResource; + +/** + * @author activey + */ +public class StompResource extends JavascriptStaticResource implements HeadParticipatingResource { + + public StompResource() { + super("stomp.js", "stompjs/lib/stomp.js"); + } +} diff --git a/licket-spring-websocket/src/main/resources/META-INF/spring.factories b/licket-spring-websocket/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..ffaf97c --- /dev/null +++ b/licket-spring-websocket/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.licket.spring.websocket.LicketWebsocketAutoconfigure \ No newline at end of file diff --git a/licket-spring-websocket/src/main/resources/js/Licket.stomp.template.js b/licket-spring-websocket/src/main/resources/js/Licket.stomp.template.js new file mode 100644 index 0000000..b983059 --- /dev/null +++ b/licket-spring-websocket/src/main/resources/js/Licket.stomp.template.js @@ -0,0 +1,36 @@ +(function(app) { + + var StompClient = function() { + return { + connected: false, + stompClient: {}, + addTopicListener: function(listener) { + if (this.connected === true) { + this.topicListeners.push(listener); + this.stompClient.subscribe(listener.topic, listener.callbackFunction); + return; + } + this.topicListeners.push(listener); + }, + connect: function() { + var socket = new SockJS(""); + var vm = this; + this.stompClient = Stomp.over(socket); + this.stompClient.connect({}, function(frame) { + vm.stompClient.subscribe("/user/topic/component/patch", function(patch) { + var parsedPatch = JSON.parse(patch.body); + app.instance.$licketModelReloader.notifyModelPatched(parsedPatch.compositeId, parsedPatch.patch); + }); + + vm.stompClient.subscribe("/user/topic/component/model", function(model) { + var parsedModel = JSON.parse(model.body); + app.instance.$licketModelReloader.notifyModelChanged(parsedModel.compositeId, parsedModel.model); + }); + }); + } + } + }; + + app.StompClient = new StompClient(); + app.StompClient.connect(); +})(window.app || (window.app = {})); \ No newline at end of file diff --git a/licket-xml-parser/src/main/java/org/licket/xml/Builder.java b/licket-xml-parser/src/main/java/org/licket/xml/Builder.java index 7609cba..d266a7b 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/Builder.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/Builder.java @@ -21,67 +21,67 @@ */ public class Builder extends DefaultHandler { - private NodeFactory nodeFactory; - private Document document; - private Element currentElement; - private Element rootElement; + private NodeFactory nodeFactory; + private Document document; + private Element currentElement; + private Element rootElement; - public Builder(NodeFactory nodeFactory) { - this.nodeFactory = nodeFactory; - } + public Builder(NodeFactory nodeFactory) { + this.nodeFactory = nodeFactory; + } - @Override - public void startDocument() throws SAXException { - document = nodeFactory.startMakingDocument(); - } + @Override + public void startDocument() throws SAXException { + document = nodeFactory.startMakingDocument(); + } - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - // starting root element - Element newElement = nodeFactory.startMakingElement(localName, uri); - if (currentElement == null) { - rootElement = newElement; - document.setRootElement(rootElement); - } else { - currentElement.appendChildElement(newElement); - } - currentElement = newElement; - addElementAttributes(attributes); + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + // starting root element + Element newElement = nodeFactory.startMakingElement(localName, uri); + if (currentElement == null) { + rootElement = newElement; + document.setRootElement(rootElement); + } else { + currentElement.appendChildElement(newElement); } + currentElement = newElement; + addElementAttributes(attributes); + } - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - nodeFactory.finishMakingElement(currentElement); - currentElement = currentElement.getParent(); - } + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + nodeFactory.finishMakingElement(currentElement); + currentElement = currentElement.getParent(); + } - private void addElementAttributes(Attributes attributes) { - for (int attrIndex = 0; attrIndex < attributes.getLength(); attrIndex++) { - currentElement.addAttribute(nodeFactory.makeAttribute(attributes.getLocalName(attrIndex), attributes.getURI(attrIndex), - attributes.getValue(attrIndex), UNDECLARED)); - } + private void addElementAttributes(Attributes attributes) { + for (int attrIndex = 0; attrIndex < attributes.getLength(); attrIndex++) { + currentElement.addAttribute(nodeFactory.makeAttribute(attributes.getLocalName(attrIndex), attributes.getURI(attrIndex), + attributes.getValue(attrIndex), UNDECLARED)); } + } - @Override - public void characters(char[] ch, int start, int length) throws SAXException { - currentElement.appendChildElement(new Text(new String(ch, start, length))); - } + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + currentElement.appendChildElement(new Text(new String(ch, start, length))); + } - @Override - public void endDocument() throws SAXException { - nodeFactory.finishMakingDocument(document); - } + @Override + public void endDocument() throws SAXException { + nodeFactory.finishMakingDocument(document); + } - public final Document build(InputStream xmlStream) throws ParsingException { - SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); - saxParserFactory.setNamespaceAware(true); + public final Document build(InputStream xmlStream) throws ParsingException { + SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); + saxParserFactory.setNamespaceAware(true); - try { - SAXParser saxParser = saxParserFactory.newSAXParser(); - saxParser.parse(xmlStream, this); - return document; - } catch (ParserConfigurationException | SAXException | IOException e) { - throw new ParsingException(e); - } + try { + SAXParser saxParser = saxParserFactory.newSAXParser(); + saxParser.parse(xmlStream, this); + return document; + } catch (ParserConfigurationException | SAXException | IOException e) { + throw new ParsingException(e); } + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/ParsingException.java b/licket-xml-parser/src/main/java/org/licket/xml/ParsingException.java index feff071..f32f202 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/ParsingException.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/ParsingException.java @@ -5,7 +5,7 @@ */ public class ParsingException extends Exception { - public ParsingException(Throwable throwable) { - super(throwable); - } + public ParsingException(Throwable throwable) { + super(throwable); + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Attribute.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Attribute.java index 6ae420c..e1e81b4 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Attribute.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Attribute.java @@ -10,40 +10,40 @@ */ public class Attribute extends Node { - private String value; - - public Attribute(String prefix, String localName, String namespace, Type type) { - this(prefix, localName, namespace, "", type); - } - - public Attribute(String localName, String namespace, String value) { - this("", localName, namespace, value, UNDECLARED); - } - - public Attribute(String localName, String namespace) { - this("", localName, namespace, UNDECLARED); - } - - public Attribute(String prefix, String localName, String namespace, String value, Type type) { - super(prefix, localName, namespace); - this.value = value; - } - - @Override - public void toXML(XMLStreamWriter writer) throws XMLStreamException { - writer.writeAttribute(getLocalName(), getValue()); - } - - public void setValue(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - - public enum Type { - UNDECLARED, - ID - } + private String value; + + public Attribute(String prefix, String localName, String namespace, Type type) { + this(prefix, localName, namespace, "", type); + } + + public Attribute(String localName, String namespace, String value) { + this("", localName, namespace, value, UNDECLARED); + } + + public Attribute(String localName, String namespace) { + this("", localName, namespace, UNDECLARED); + } + + public Attribute(String prefix, String localName, String namespace, String value, Type type) { + super(prefix, localName, namespace); + this.value = value; + } + + @Override + public void toXML(XMLStreamWriter writer) throws XMLStreamException { + writer.writeAttribute(getLocalName(), getValue()); + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public enum Type { + UNDECLARED, + ID + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Comment.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Comment.java index 047ad48..39c6d81 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Comment.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Comment.java @@ -10,15 +10,15 @@ */ public class Comment extends Element { - private String commentText; + private String commentText; - public Comment(String commentText, String... variables) { - super("", ""); - this.commentText = format(commentText, variables); - } + public Comment(String commentText, String... variables) { + super("", ""); + this.commentText = format(commentText, variables); + } - @Override - public void toXML(XMLStreamWriter writer) throws XMLStreamException { - writer.writeComment(commentText); - } + @Override + public void toXML(XMLStreamWriter writer) throws XMLStreamException { + writer.writeComment(commentText); + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Document.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Document.java index 86e081e..bcb0dc0 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Document.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Document.java @@ -1,42 +1,43 @@ package org.licket.xml.dom; +import org.licket.xml.ParsingException; +import org.licket.xml.writer.PrettyPrintXMLStreamWriter; + +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; -import org.licket.xml.ParsingException; -import org.licket.xml.writer.PrettyPrintXMLStreamWriter; /** * @author grabslu */ public class Document { - private Element rootElement; + private Element rootElement; - public void toXML(OutputStream outputStream) throws ParsingException, IOException { - OutputStreamWriter writer = null; - try { - XMLStreamWriter streamWriter = streamWriter(writer = new OutputStreamWriter(outputStream)); - rootElement.toXML(streamWriter); - } catch (XMLStreamException e) { - throw new ParsingException(e); - } finally { - if (writer != null) { - writer.flush(); - writer.close(); - } - } + public void toXML(OutputStream outputStream) throws ParsingException, IOException { + OutputStreamWriter writer = null; + try { + XMLStreamWriter streamWriter = streamWriter(writer = new OutputStreamWriter(outputStream)); + rootElement.toXML(streamWriter); + } catch (XMLStreamException e) { + throw new ParsingException(e); + } finally { + if (writer != null) { + writer.flush(); + writer.close(); + } } + } - private XMLStreamWriter streamWriter(Writer writer) throws XMLStreamException { - return new PrettyPrintXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(writer)); - } + private XMLStreamWriter streamWriter(Writer writer) throws XMLStreamException { + return new PrettyPrintXMLStreamWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(writer)); + } - public void setRootElement(Element rootElement) { - this.rootElement = rootElement; - } + public void setRootElement(Element rootElement) { + this.rootElement = rootElement; + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Element.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Element.java index ad14fa3..7ad65f1 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Element.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Element.java @@ -1,112 +1,112 @@ package org.licket.xml.dom; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; /** * @author grabslu */ public class Element extends Node { - private Map attributes = new HashMap<>(); - private List children = new LinkedList<>(); + private Map attributes = new HashMap<>(); + private List children = new LinkedList<>(); - public Element(String localName, String namespace) { - this("", localName, namespace); - } + public Element(String localName, String namespace) { + this("", localName, namespace); + } - public Element(String prefix, String localName, String namespace) { - super(prefix, localName, namespace); - } + public Element(String prefix, String localName, String namespace) { + super(prefix, localName, namespace); + } - public void addAttribute(Attribute attribute) { - attributes.put(attribute.getLocalName(), attribute); - } + public void addAttribute(Attribute attribute) { + attributes.put(attribute.getLocalName(), attribute); + } - public Iterable children() { - return children; - } + public Iterable children() { + return children; + } - public Iterable attributes() { - return attributes.values(); - } + public Iterable attributes() { + return attributes.values(); + } - public void appendChildElement(Element childElement) { - childElement.setParent(this); - children.add(childElement); - } + public void appendChildElement(Element childElement) { + childElement.setParent(this); + children.add(childElement); + } - public void replaceChild(Element element, Element replacement) { - for (int childIndex = 0; childIndex < children.size(); childIndex++) { - if (children.get(childIndex).equals(element)) { - children.set(childIndex, replacement); - replacement.setParent(this); - } - } + public void replaceChild(Element element, Element replacement) { + for (int childIndex = 0; childIndex < children.size(); childIndex++) { + if (children.get(childIndex).equals(element)) { + children.set(childIndex, replacement); + replacement.setParent(this); + } } - - public final void replaceWith(Element replacement) { - Element parentElement = getParent(); - if (parentElement == null) { - // overwrite current element attributes and children manually - attributes.clear(); - children.clear(); - - setLocalName(replacement.getLocalName()); - replacement.attributes().forEach(attribute -> addAttribute(attribute)); - replacement.children().forEach(child -> appendChildElement(child)); - return; - } - parentElement.replaceChild(this, replacement); + } + + public final void replaceWith(Element replacement) { + Element parentElement = getParent(); + if (parentElement == null) { + // overwrite current element attributes and children manually + attributes.clear(); + children.clear(); + + setLocalName(replacement.getLocalName()); + replacement.attributes().forEach(attribute -> addAttribute(attribute)); + replacement.children().forEach(child -> appendChildElement(child)); + return; } + parentElement.replaceChild(this, replacement); + } - public Element detach() { - Element parentElement = getParent(); - if (parentElement == null) { - return this; - } - Element detached = parentElement.removeChild(this); + public Element detach() { + Element parentElement = getParent(); + if (parentElement == null) { + return this; + } + Element detached = parentElement.removeChild(this); // setParent(null); - return detached; + return detached; + } + + private Element removeChild(Element childElement) { + for (int childIndex = 0; childIndex < children.size(); childIndex++) { + if (children.get(childIndex).equals(childElement)) { + return children.remove(childIndex); + } } - - private Element removeChild(Element childElement) { - for (int childIndex = 0; childIndex < children.size(); childIndex++) { - if (children.get(childIndex).equals(childElement)) { - return children.remove(childIndex); - } - } - return null; + return null; + } + + @Override + public void toXML(XMLStreamWriter writer) throws XMLStreamException { + if (!writeEmpty() && children.size() == 0) { + writer.writeEmptyElement(getPrefix(), getLocalName(), getNamespace()); + for (Attribute attribute : attributes.values()) { + attribute.toXML(writer); + } + return; } - - @Override - public void toXML(XMLStreamWriter writer) throws XMLStreamException { - if (!writeEmpty() && children.size() == 0) { - writer.writeEmptyElement(getPrefix(), getLocalName(), getNamespace()); - for (Attribute attribute : attributes.values()) { - attribute.toXML(writer); - } - return; - } - writer.writeStartElement(getPrefix(), getLocalName(), getNamespace()); - for (Attribute attribute : attributes.values()) { - attribute.toXML(writer); - } - for (Element element : children) { - element.toXML(writer); - } - writer.writeEndElement(); + writer.writeStartElement(getPrefix(), getLocalName(), getNamespace()); + for (Attribute attribute : attributes.values()) { + attribute.toXML(writer); } - - public void removeChildren() { - children.clear(); + for (Element element : children) { + element.toXML(writer); } + writer.writeEndElement(); + } - protected boolean writeEmpty() { - return false; - } + public void removeChildren() { + children.clear(); + } + + protected boolean writeEmpty() { + return false; + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Node.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Node.java index 8e99622..55aad2b 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Node.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Node.java @@ -10,48 +10,48 @@ */ public abstract class Node { - protected String localName; - private final String namespace; - private final String prefix; - private Element parent; - - public Node(String prefix, String localName, String namespace) { - this.prefix = prefix; - this.localName = localName; - this.namespace = namespace; - } - - public String getPrefix() { - return prefix; - } - - public String getLocalName() { - return localName; - } - - public void setLocalName(String localName) { - this.localName = localName; - } - - public String getNamespace() { - return namespace; - } - - public Element getParent() { - return parent; - } - - public void setParent(Element parent) { - this.parent = parent; - } - - public abstract void toXML(XMLStreamWriter writer) throws XMLStreamException; - - public final byte[] toBytes() throws XMLStreamException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - XMLStreamWriter outputFactory = XMLOutputFactory.newInstance().createXMLStreamWriter(output); - toXML(outputFactory); - outputFactory.flush(); - return output.toByteArray(); - } + private final String namespace; + private final String prefix; + protected String localName; + private Element parent; + + public Node(String prefix, String localName, String namespace) { + this.prefix = prefix; + this.localName = localName; + this.namespace = namespace; + } + + public String getPrefix() { + return prefix; + } + + public String getLocalName() { + return localName; + } + + public void setLocalName(String localName) { + this.localName = localName; + } + + public String getNamespace() { + return namespace; + } + + public Element getParent() { + return parent; + } + + public void setParent(Element parent) { + this.parent = parent; + } + + public abstract void toXML(XMLStreamWriter writer) throws XMLStreamException; + + public final byte[] toBytes() throws XMLStreamException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + XMLStreamWriter outputFactory = XMLOutputFactory.newInstance().createXMLStreamWriter(output); + toXML(outputFactory); + outputFactory.flush(); + return output.toByteArray(); + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/NodeFactory.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/NodeFactory.java index 30cfeec..462d435 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/NodeFactory.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/NodeFactory.java @@ -5,31 +5,31 @@ */ public class NodeFactory { - public Element startMakingElement(String localName, String namespace) { - return new Element(localName, localName); - } + public Element startMakingElement(String localName, String namespace) { + return new Element(localName, localName); + } - public Element finishMakingElement(Element element) { - return null; - } + public Element finishMakingElement(Element element) { + return null; + } - public Document startMakingDocument() { - return new Document(); - } + public Document startMakingDocument() { + return new Document(); + } - public void finishMakingDocument(Document document) { + public void finishMakingDocument(Document document) { - } + } - public Attribute makeAttribute(String name, String namespace, String value, Attribute.Type type) { - return new Attribute("", name, namespace, value, type); - } + public Attribute makeAttribute(String name, String namespace, String value, Attribute.Type type) { + return new Attribute("", name, namespace, value, type); + } - public Nodes makeComment(String data) { - return null; - } + public Nodes makeComment(String data) { + return null; + } - public Nodes makeDocType(String rootElementName, String publicID, String systemID) { - return null; - } + public Nodes makeDocType(String rootElementName, String publicID, String systemID) { + return null; + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Nodes.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Nodes.java index bc337e1..9575d2d 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Nodes.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Nodes.java @@ -10,25 +10,25 @@ */ public class Nodes extends Node { - private List nodes = new LinkedList(); + private List nodes = new LinkedList(); - public Nodes(Node... nodes) { - super("", "", ""); + public Nodes(Node... nodes) { + super("", "", ""); - for (Node node : nodes) { - this.nodes.add(node); - } + for (Node node : nodes) { + this.nodes.add(node); } + } - public Nodes add(Node node) { - nodes.add(node); - return this; - } + public Nodes add(Node node) { + nodes.add(node); + return this; + } - @Override - public void toXML(XMLStreamWriter writer) throws XMLStreamException { - for (Node node : nodes) { - node.toXML(writer); - } + @Override + public void toXML(XMLStreamWriter writer) throws XMLStreamException { + for (Node node : nodes) { + node.toXML(writer); } + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/dom/Text.java b/licket-xml-parser/src/main/java/org/licket/xml/dom/Text.java index f281556..b582a92 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/dom/Text.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/dom/Text.java @@ -8,23 +8,23 @@ */ public class Text extends Element { - private String text; + private String text; - public Text(String text) { - super("", ""); - this.text = text; - } + public Text(String text) { + super("", ""); + this.text = text; + } - public String getText() { - return text; - } + public String getText() { + return text; + } - public void setText(String text) { - this.text = text; - } + public void setText(String text) { + this.text = text; + } - @Override - public void toXML(XMLStreamWriter writer) throws XMLStreamException { - writer.writeCharacters(text); - } + @Override + public void toXML(XMLStreamWriter writer) throws XMLStreamException { + writer.writeCharacters(text); + } } diff --git a/licket-xml-parser/src/main/java/org/licket/xml/writer/PrettyPrintXMLStreamWriter.java b/licket-xml-parser/src/main/java/org/licket/xml/writer/PrettyPrintXMLStreamWriter.java index 41a1130..e31bb50 100644 --- a/licket-xml-parser/src/main/java/org/licket/xml/writer/PrettyPrintXMLStreamWriter.java +++ b/licket-xml-parser/src/main/java/org/licket/xml/writer/PrettyPrintXMLStreamWriter.java @@ -4,226 +4,226 @@ * @author activey */ -import java.util.Stack; import javax.xml.namespace.NamespaceContext; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; +import java.util.Stack; public class PrettyPrintXMLStreamWriter implements XMLStreamWriter { - private static final Object SEEN_NOTHING = new Object(); - private static final Object SEEN_ELEMENT = new Object(); - private static final Object SEEN_DATA = new Object(); - private Object state; - private Stack stateStack; - private String indentStep; - private int depth; - private XMLStreamWriter writer; - - public PrettyPrintXMLStreamWriter(XMLStreamWriter writer) { - this.writer = writer; - this.state = SEEN_NOTHING; - this.stateStack = new Stack(); - this.indentStep = " "; - this.depth = 0; - } - - private void onStartElement() throws XMLStreamException { - this.stateStack.push(SEEN_ELEMENT); - this.state = SEEN_NOTHING; - if (this.depth > 0) { - writer.writeCharacters("\n"); - } - - this.doIndent(); - ++this.depth; - } - - private void onEndElement() throws XMLStreamException { - --this.depth; - if (this.state == SEEN_ELEMENT) { - writer.writeCharacters("\n"); - this.doIndent(); - } - - this.state = this.stateStack.pop(); - } - - private void onEmptyElement() throws XMLStreamException { - this.state = SEEN_ELEMENT; - if (this.depth > 0) { - writer.writeCharacters("\n"); - } - - this.doIndent(); - } - - private void doIndent() throws XMLStreamException { - if (this.depth > 0) { - for (int i = 0; i < this.depth; ++i) { - writer.writeCharacters(this.indentStep); - } - } - - } - - public void writeStartDocument() throws XMLStreamException { - writer.writeStartDocument(); - writer.writeCharacters("\n"); - } - - public void writeStartDocument(String version) throws XMLStreamException { - writer.writeStartDocument(version); - writer.writeCharacters("\n"); - } - - public void writeStartDocument(String encoding, String version) throws XMLStreamException { - writer.writeStartDocument(encoding, version); - writer.writeCharacters("\n"); - } - - public void writeStartElement(String localName) throws XMLStreamException { - this.onStartElement(); - writer.writeStartElement(localName); - } - - public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException { - this.onStartElement(); - writer.writeStartElement(namespaceURI, localName); - } - - public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { - this.onStartElement(); - writer.writeStartElement(prefix, localName, namespaceURI); - } - - public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException { - this.onEmptyElement(); - writer.writeEmptyElement(namespaceURI, localName); - } - - public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { - this.onEmptyElement(); - writer.writeEmptyElement(prefix, localName, namespaceURI); - } - - public void writeEmptyElement(String localName) throws XMLStreamException { - this.onEmptyElement(); - writer.writeEmptyElement(localName); - } - - public void writeEndElement() throws XMLStreamException { - this.onEndElement(); - writer.writeEndElement(); - } - - @Override - public void writeEndDocument() throws XMLStreamException { - writer.writeEndDocument(); - } - - @Override - public void close() throws XMLStreamException { - writer.close(); - } - - @Override - public void flush() throws XMLStreamException { - writer.flush(); - } - - @Override - public void writeAttribute(String localName, String value) throws XMLStreamException { - writer.writeAttribute(localName, value); - } - - @Override - public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException { - writer.writeAttribute(prefix, namespaceURI, localName, value); - } - - @Override - public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException { - writer.writeAttribute(namespaceURI, localName, value); - } - - @Override - public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException { - writer.writeNamespace(prefix, namespaceURI); - } - - @Override - public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException { - writer.writeDefaultNamespace(namespaceURI); - } - - @Override - public void writeComment(String data) throws XMLStreamException { - writer.writeComment(data); - } - - @Override - public void writeProcessingInstruction(String target) throws XMLStreamException { - writer.writeProcessingInstruction(target); - } - - @Override - public void writeProcessingInstruction(String target, String data) throws XMLStreamException { - writer.writeProcessingInstruction(target, data); - } - - public void writeCharacters(String text) throws XMLStreamException { - this.state = SEEN_DATA; - writer.writeCharacters(text); - } - - public void writeCharacters(char[] text, int start, int len) throws XMLStreamException { - this.state = SEEN_DATA; - writer.writeCharacters(text, start, len); - } - - @Override - public String getPrefix(String uri) throws XMLStreamException { - return writer.getPrefix(uri); - } - - @Override - public void setPrefix(String prefix, String uri) throws XMLStreamException { - writer.setPrefix(prefix, uri); - } - - @Override - public void setDefaultNamespace(String uri) throws XMLStreamException { - writer.setDefaultNamespace(uri); - } - - @Override - public void setNamespaceContext(NamespaceContext context) throws XMLStreamException { - writer.setNamespaceContext(context); - } - - @Override - public NamespaceContext getNamespaceContext() { - return writer.getNamespaceContext(); - } - - @Override - public Object getProperty(String name) throws IllegalArgumentException { - return writer.getProperty(name); - } - - public void writeCData(String data) throws XMLStreamException { - this.state = SEEN_DATA; - writer.writeCData(data); - } - - @Override - public void writeDTD(String dtd) throws XMLStreamException { - writer.writeDTD(dtd); - } - - @Override - public void writeEntityRef(String name) throws XMLStreamException { - writer.writeEntityRef(name); - } + private static final Object SEEN_NOTHING = new Object(); + private static final Object SEEN_ELEMENT = new Object(); + private static final Object SEEN_DATA = new Object(); + private Object state; + private Stack stateStack; + private String indentStep; + private int depth; + private XMLStreamWriter writer; + + public PrettyPrintXMLStreamWriter(XMLStreamWriter writer) { + this.writer = writer; + this.state = SEEN_NOTHING; + this.stateStack = new Stack(); + this.indentStep = " "; + this.depth = 0; + } + + private void onStartElement() throws XMLStreamException { + this.stateStack.push(SEEN_ELEMENT); + this.state = SEEN_NOTHING; + if (this.depth > 0) { + writer.writeCharacters("\n"); + } + + this.doIndent(); + ++this.depth; + } + + private void onEndElement() throws XMLStreamException { + --this.depth; + if (this.state == SEEN_ELEMENT) { + writer.writeCharacters("\n"); + this.doIndent(); + } + + this.state = this.stateStack.pop(); + } + + private void onEmptyElement() throws XMLStreamException { + this.state = SEEN_ELEMENT; + if (this.depth > 0) { + writer.writeCharacters("\n"); + } + + this.doIndent(); + } + + private void doIndent() throws XMLStreamException { + if (this.depth > 0) { + for (int i = 0; i < this.depth; ++i) { + writer.writeCharacters(this.indentStep); + } + } + + } + + public void writeStartDocument() throws XMLStreamException { + writer.writeStartDocument(); + writer.writeCharacters("\n"); + } + + public void writeStartDocument(String version) throws XMLStreamException { + writer.writeStartDocument(version); + writer.writeCharacters("\n"); + } + + public void writeStartDocument(String encoding, String version) throws XMLStreamException { + writer.writeStartDocument(encoding, version); + writer.writeCharacters("\n"); + } + + public void writeStartElement(String localName) throws XMLStreamException { + this.onStartElement(); + writer.writeStartElement(localName); + } + + public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException { + this.onStartElement(); + writer.writeStartElement(namespaceURI, localName); + } + + public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { + this.onStartElement(); + writer.writeStartElement(prefix, localName, namespaceURI); + } + + public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException { + this.onEmptyElement(); + writer.writeEmptyElement(namespaceURI, localName); + } + + public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException { + this.onEmptyElement(); + writer.writeEmptyElement(prefix, localName, namespaceURI); + } + + public void writeEmptyElement(String localName) throws XMLStreamException { + this.onEmptyElement(); + writer.writeEmptyElement(localName); + } + + public void writeEndElement() throws XMLStreamException { + this.onEndElement(); + writer.writeEndElement(); + } + + @Override + public void writeEndDocument() throws XMLStreamException { + writer.writeEndDocument(); + } + + @Override + public void close() throws XMLStreamException { + writer.close(); + } + + @Override + public void flush() throws XMLStreamException { + writer.flush(); + } + + @Override + public void writeAttribute(String localName, String value) throws XMLStreamException { + writer.writeAttribute(localName, value); + } + + @Override + public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException { + writer.writeAttribute(prefix, namespaceURI, localName, value); + } + + @Override + public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException { + writer.writeAttribute(namespaceURI, localName, value); + } + + @Override + public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException { + writer.writeNamespace(prefix, namespaceURI); + } + + @Override + public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException { + writer.writeDefaultNamespace(namespaceURI); + } + + @Override + public void writeComment(String data) throws XMLStreamException { + writer.writeComment(data); + } + + @Override + public void writeProcessingInstruction(String target) throws XMLStreamException { + writer.writeProcessingInstruction(target); + } + + @Override + public void writeProcessingInstruction(String target, String data) throws XMLStreamException { + writer.writeProcessingInstruction(target, data); + } + + public void writeCharacters(String text) throws XMLStreamException { + this.state = SEEN_DATA; + writer.writeCharacters(text); + } + + public void writeCharacters(char[] text, int start, int len) throws XMLStreamException { + this.state = SEEN_DATA; + writer.writeCharacters(text, start, len); + } + + @Override + public String getPrefix(String uri) throws XMLStreamException { + return writer.getPrefix(uri); + } + + @Override + public void setPrefix(String prefix, String uri) throws XMLStreamException { + writer.setPrefix(prefix, uri); + } + + @Override + public void setDefaultNamespace(String uri) throws XMLStreamException { + writer.setDefaultNamespace(uri); + } + + @Override + public NamespaceContext getNamespaceContext() { + return writer.getNamespaceContext(); + } + + @Override + public void setNamespaceContext(NamespaceContext context) throws XMLStreamException { + writer.setNamespaceContext(context); + } + + @Override + public Object getProperty(String name) throws IllegalArgumentException { + return writer.getProperty(name); + } + + public void writeCData(String data) throws XMLStreamException { + this.state = SEEN_DATA; + writer.writeCData(data); + } + + @Override + public void writeDTD(String dtd) throws XMLStreamException { + writer.writeDTD(dtd); + } + + @Override + public void writeEntityRef(String name) throws XMLStreamException { + writer.writeEntityRef(name); + } } diff --git a/pom.xml b/pom.xml index 62a093c..9b1ade1 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,12 @@ 4.3.2.RELEASE + 4.2.3.RELEASE + 2.2.1.RELEASE + 1.4.0.RELEASE + 1.4.0.RELEASE + 1.4.0.RELEASE 2.5.0 @@ -64,6 +69,11 @@ spring-boot-starter-jetty ${org.springframework.boot.spring-boot-starter-jetty.version} + + org.springframework.boot + spring-boot-starter-websocket + ${org.springframework.boot.spring-boot-starter-websocket.version} + org.springframework spring-beans @@ -74,12 +84,27 @@ spring-context ${org.springframework.version} + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + org.springframework.security.oauth + spring-security-oauth2 + ${org.springframework.security.oauth2.version} + + com.fasterxml.jackson.core jackson-databind ${com.fasterxml.jackson.core.jackson-databind.version} - com.google.guava guava @@ -166,6 +191,17 @@ licket-npm-libraries ${project.version} + + + org.licket + licket-spring-websocket + ${project.version} + + + org.licket + licket-spring-security + ${project.version} + @@ -179,5 +215,9 @@ licket-framework-hippo licket-npm-libraries licket-module-semanticui + + licket-gitlab-pipelines + licket-spring-websocket + licket-spring-security \ No newline at end of file