Minor code improvements
Signed-off-by: Dominic Schabel dominic.schabel@bosch-si.com
This commit is contained in:
@@ -8,9 +8,12 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.simulator;
|
package org.eclipse.hawkbit.simulator;
|
||||||
|
|
||||||
|
import static java.util.concurrent.Executors.newScheduledThreadPool;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.security.DigestOutputStream;
|
import java.security.DigestOutputStream;
|
||||||
import java.security.KeyManagementException;
|
import java.security.KeyManagementException;
|
||||||
import java.security.KeyStoreException;
|
import java.security.KeyStoreException;
|
||||||
@@ -20,7 +23,6 @@ import java.security.SecureRandom;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -56,9 +58,10 @@ import com.google.common.io.ByteStreams;
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class DeviceSimulatorUpdater {
|
public class DeviceSimulatorUpdater {
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(DeviceSimulatorUpdater.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(DeviceSimulatorUpdater.class);
|
||||||
|
|
||||||
private static final ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(8);
|
private static final ScheduledExecutorService threadPool = newScheduledThreadPool(8);
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SpSenderService spSenderService;
|
private SpSenderService spSenderService;
|
||||||
@@ -118,14 +121,9 @@ public class DeviceSimulatorUpdater {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final class DeviceSimulatorUpdateThread implements Runnable {
|
private static final class DeviceSimulatorUpdateThread implements Runnable {
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final String BUT_GOT_LOG_MESSAGE = " but got: ";
|
private static final String BUT_GOT_LOG_MESSAGE = " but got: ";
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final String DOWNLOAD_LOG_MESSAGE = "Download ";
|
private static final String DOWNLOAD_LOG_MESSAGE = "Download ";
|
||||||
|
|
||||||
private static final int MINIMUM_TOKENLENGTH_FOR_HINT = 6;
|
private static final int MINIMUM_TOKENLENGTH_FOR_HINT = 6;
|
||||||
@@ -279,13 +277,17 @@ public class DeviceSimulatorUpdater {
|
|||||||
|
|
||||||
private static long getOverallRead(final CloseableHttpResponse response, final MessageDigest md)
|
private static long getOverallRead(final CloseableHttpResponse response, final MessageDigest md)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
long overallread;
|
long overallread;
|
||||||
try (final BufferedOutputStream bdos = new BufferedOutputStream(
|
|
||||||
new DigestOutputStream(ByteStreams.nullOutputStream(), md))) {
|
try (final OutputStream os = ByteStreams.nullOutputStream();
|
||||||
|
final BufferedOutputStream bos = new BufferedOutputStream(new DigestOutputStream(os, md))) {
|
||||||
|
|
||||||
try (BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent())) {
|
try (BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent())) {
|
||||||
overallread = ByteStreams.copy(bis, bdos);
|
overallread = ByteStreams.copy(bis, bos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return overallread;
|
return overallread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import java.util.Map;
|
|||||||
* An interface for declaring the name of the field described in the database
|
* An interface for declaring the name of the field described in the database
|
||||||
* which is used as string representation of the field, e.g. for sorting the
|
* which is used as string representation of the field, e.g. for sorting the
|
||||||
* fields over REST.
|
* fields over REST.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface FieldNameProvider {
|
public interface FieldNameProvider {
|
||||||
/**
|
/**
|
||||||
@@ -32,64 +31,18 @@ public interface FieldNameProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains the sub entity the given field.
|
* Contains the sub entity the given field.
|
||||||
*
|
*
|
||||||
* @param propertyField
|
* @param propertyField
|
||||||
* the given field
|
* the given field
|
||||||
* @return <true> contains <false> contains not
|
* @return <true> contains <false> contains not
|
||||||
*/
|
*/
|
||||||
default boolean containsSubEntityAttribute(final String propertyField) {
|
default boolean containsSubEntityAttribute(final String propertyField) {
|
||||||
return FieldNameProvider.containsSubEntityAttribute(propertyField, getSubEntityAttributes());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
final List<String> subEntityAttributes = getSubEntityAttributes();
|
||||||
*
|
if (subEntityAttributes.contains(propertyField)) {
|
||||||
* @return all sub entities attributes.
|
|
||||||
*/
|
|
||||||
default List<String> getSubEntityAttributes() {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the database column for the key
|
|
||||||
*
|
|
||||||
* @return key fieldname
|
|
||||||
*/
|
|
||||||
default String getKeyFieldName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* the database column for the value
|
|
||||||
*
|
|
||||||
* @return key fieldname
|
|
||||||
*/
|
|
||||||
default String getValueFieldName() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Is the entity field a {@link Map}.
|
|
||||||
*
|
|
||||||
* @return <true> is a map <false> is not a map
|
|
||||||
*/
|
|
||||||
default boolean isMap() {
|
|
||||||
return getKeyFieldName() != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a sub attribute exists.
|
|
||||||
*
|
|
||||||
* @param propertyField
|
|
||||||
* the sub property field.
|
|
||||||
* @param subEntityAttribues
|
|
||||||
* the list of available properties
|
|
||||||
* @return <true> property exists <false> not exists
|
|
||||||
*/
|
|
||||||
static boolean containsSubEntityAttribute(final String propertyField, final List<String> subEntityAttribues) {
|
|
||||||
if (subEntityAttribues.contains(propertyField)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
for (final String attribute : subEntityAttribues) {
|
for (final String attribute : subEntityAttributes) {
|
||||||
final String[] graph = attribute.split("\\" + SUB_ATTRIBUTE_SEPERATOR);
|
final String[] graph = attribute.split("\\" + SUB_ATTRIBUTE_SEPERATOR);
|
||||||
|
|
||||||
for (final String subAttribute : graph) {
|
for (final String subAttribute : graph) {
|
||||||
@@ -102,4 +55,38 @@ public interface FieldNameProvider {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return all sub entities attributes.
|
||||||
|
*/
|
||||||
|
default List<String> getSubEntityAttributes() {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the database column for the key
|
||||||
|
*
|
||||||
|
* @return key fieldname
|
||||||
|
*/
|
||||||
|
default String getKeyFieldName() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the database column for the value
|
||||||
|
*
|
||||||
|
* @return key fieldname
|
||||||
|
*/
|
||||||
|
default String getValueFieldName() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is the entity field a {@link Map}.
|
||||||
|
*
|
||||||
|
* @return <true> is a map <false> is not a map
|
||||||
|
*/
|
||||||
|
default boolean isMap() {
|
||||||
|
return getKeyFieldName() != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,9 @@ import java.util.Map;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link Map} with attributes of SP Target.
|
* {@link Map} with attributes of SP Target.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class MgmtTargetAttributes extends HashMap<String, String> {
|
public class MgmtTargetAttributes extends HashMap<String, String> {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,18 +20,18 @@ import org.eclipse.hawkbit.repository.model.TenantAwareBaseEntity;
|
|||||||
public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extends AbstractBaseEntityEvent<E> {
|
public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extends AbstractBaseEntityEvent<E> {
|
||||||
|
|
||||||
private static final long serialVersionUID = -3671601415138242311L;
|
private static final long serialVersionUID = -3671601415138242311L;
|
||||||
private final transient Map<String, Values> changeSet;
|
private final transient Map<String, PropertyChange> changeSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize base entity and property changed with old and new value.
|
* Initialize base entity and property changed with old and new value.
|
||||||
*
|
*
|
||||||
* @param baseEntity
|
* @param baseEntity
|
||||||
* entity changed
|
* entity changed
|
||||||
* @param changeSetValues
|
* @param changeSetValues
|
||||||
* details of properties changed and old value and new value of
|
* details of properties changed and old value and new value of
|
||||||
* the changed properties
|
* the changed properties
|
||||||
*/
|
*/
|
||||||
public AbstractPropertyChangeEvent(final E baseEntity, final Map<String, Values> changeSetValues) {
|
public AbstractPropertyChangeEvent(final E baseEntity, final Map<String, PropertyChange> changeSetValues) {
|
||||||
super(baseEntity);
|
super(baseEntity);
|
||||||
this.changeSet = changeSetValues;
|
this.changeSet = changeSetValues;
|
||||||
}
|
}
|
||||||
@@ -39,27 +39,27 @@ public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extend
|
|||||||
/**
|
/**
|
||||||
* @return the changeSet
|
* @return the changeSet
|
||||||
*/
|
*/
|
||||||
public Map<String, Values> getChangeSet() {
|
public Map<String, PropertyChange> getChangeSet() {
|
||||||
return changeSet;
|
return changeSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Carries old value and new value of a property .
|
* Carries old value and new value of a property .
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class Values {
|
public static class PropertyChange {
|
||||||
|
|
||||||
private final Object oldValue;
|
private final Object oldValue;
|
||||||
private final Object newValue;
|
private final Object newValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize old value and new changes value of property.
|
* Initialize old value and new changes value of property.
|
||||||
*
|
*
|
||||||
* @param oldValue
|
* @param oldValue
|
||||||
* old value before change
|
* old value before change
|
||||||
* @param newValue
|
* @param newValue
|
||||||
* new value after change
|
* new value after change
|
||||||
*/
|
*/
|
||||||
public Values(final Object oldValue, final Object newValue) {
|
public PropertyChange(final Object oldValue, final Object newValue) {
|
||||||
super();
|
super();
|
||||||
this.oldValue = oldValue;
|
this.oldValue = oldValue;
|
||||||
this.newValue = newValue;
|
this.newValue = newValue;
|
||||||
@@ -78,6 +78,5 @@ public class AbstractPropertyChangeEvent<E extends TenantAwareBaseEntity> extend
|
|||||||
public Object getNewValue() {
|
public Object getNewValue() {
|
||||||
return newValue;
|
return newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,7 @@ public class ActionPropertyChangeEvent extends AbstractPropertyChangeEvent<Actio
|
|||||||
* @param action
|
* @param action
|
||||||
* @param changeSetValues
|
* @param changeSetValues
|
||||||
*/
|
*/
|
||||||
public ActionPropertyChangeEvent(final Action action,
|
public ActionPropertyChangeEvent(final Action action, final Map<String, PropertyChange> changeSetValues) {
|
||||||
final Map<String, AbstractPropertyChangeEvent<Action>.Values> changeSetValues) {
|
|
||||||
super(action, changeSetValues);
|
super(action, changeSetValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ public class RolloutGroupPropertyChangeEvent extends AbstractPropertyChangeEvent
|
|||||||
private static final long serialVersionUID = 4026477044419472686L;
|
private static final long serialVersionUID = 4026477044419472686L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param rolloutGroup
|
* @param rolloutGroup
|
||||||
* @param changeSetValues
|
* @param changeSetValues
|
||||||
*/
|
*/
|
||||||
public RolloutGroupPropertyChangeEvent(final RolloutGroup rolloutGroup,
|
public RolloutGroupPropertyChangeEvent(final RolloutGroup rolloutGroup,
|
||||||
final Map<String, AbstractPropertyChangeEvent<RolloutGroup>.Values> changeSetValues) {
|
final Map<String, PropertyChange> changeSetValues) {
|
||||||
super(rolloutGroup, changeSetValues);
|
super(rolloutGroup, changeSetValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,11 @@ public class RolloutPropertyChangeEvent extends AbstractPropertyChangeEvent<Roll
|
|||||||
private static final long serialVersionUID = 1056221355466373514L;
|
private static final long serialVersionUID = 1056221355466373514L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param rollout
|
* @param rollout
|
||||||
* @param changeSetValues
|
* @param changeSetValues
|
||||||
*/
|
*/
|
||||||
public RolloutPropertyChangeEvent(final Rollout rollout,
|
public RolloutPropertyChangeEvent(final Rollout rollout, final Map<String, PropertyChange> changeSetValues) {
|
||||||
final Map<String, AbstractPropertyChangeEvent<Rollout>.Values> changeSetValues) {
|
|
||||||
super(rollout, changeSetValues);
|
super(rollout, changeSetValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,16 +12,9 @@ import java.io.Serializable;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* An abstract report series.
|
* An abstract report series.
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class AbstractReportSeries implements Serializable {
|
public class AbstractReportSeries implements Serializable {
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|||||||
@@ -14,13 +14,11 @@ import java.util.List;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple list report series which just contains a list of values of a report.
|
* A simple list report series which just contains a list of values of a report.
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ListReportSeries extends AbstractReportSeries {
|
public class ListReportSeries extends AbstractReportSeries {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final List<Number> data = new ArrayList<>();
|
private final List<Number> data = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,8 +48,8 @@ public class ListReportSeries extends AbstractReportSeries {
|
|||||||
* @param values
|
* @param values
|
||||||
*/
|
*/
|
||||||
private void setData(final Number... values) {
|
private void setData(final Number... values) {
|
||||||
this.data.clear();
|
data.clear();
|
||||||
Collections.addAll(this.data, values);
|
Collections.addAll(data, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ import org.springframework.data.domain.Pageable;
|
|||||||
import org.springframework.data.domain.Slice;
|
import org.springframework.data.domain.Slice;
|
||||||
import org.springframework.data.jpa.domain.Specification;
|
import org.springframework.data.jpa.domain.Specification;
|
||||||
import org.springframework.data.jpa.repository.Modifying;
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.transaction.annotation.Isolation;
|
import org.springframework.transaction.annotation.Isolation;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@@ -599,11 +598,16 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<Action> findActionsByTarget(final String rsqlParam, final Target target, final Pageable pageable) {
|
public Page<Action> findActionsByTarget(final String rsqlParam, final Target target, final Pageable pageable) {
|
||||||
final Specification<JpaAction> specification = RSQLUtility.parse(rsqlParam, ActionFields.class);
|
|
||||||
|
|
||||||
return convertAcPage(actionRepository.findAll((Specification<JpaAction>) (root, query, cb) -> cb
|
final Specification<JpaAction> byTargetSpec = createSpecificationFor(target, rsqlParam);
|
||||||
.and(specification.toPredicate(root, query, cb), cb.equal(root.get(JpaAction_.target), target)),
|
final Page<JpaAction> actions = actionRepository.findAll(byTargetSpec, pageable);
|
||||||
pageable), pageable);
|
return convertAcPage(actions, pageable);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Specification<JpaAction> createSpecificationFor(final Target target, final String rsqlParam) {
|
||||||
|
final Specification<JpaAction> spec = RSQLUtility.parse(rsqlParam, ActionFields.class);
|
||||||
|
return (root, query, cb) -> cb.and(spec.toPredicate(root, query, cb),
|
||||||
|
cb.equal(root.get(JpaAction_.target), target));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Page<Action> convertAcPage(final Page<JpaAction> findAll, final Pageable pageable) {
|
private static Page<Action> convertAcPage(final Page<JpaAction> findAll, final Pageable pageable) {
|
||||||
@@ -642,10 +646,7 @@ public class JpaDeploymentManagement implements DeploymentManagement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long countActionsByTarget(final String rsqlParam, final Target target) {
|
public Long countActionsByTarget(final String rsqlParam, final Target target) {
|
||||||
final Specification<JpaAction> spec = RSQLUtility.parse(rsqlParam, ActionFields.class);
|
return actionRepository.count(createSpecificationFor(target, rsqlParam));
|
||||||
|
|
||||||
return actionRepository.count((root, query, cb) -> cb.and(spec.toPredicate(root, query, cb),
|
|
||||||
cb.equal(root.get(JpaAction_.target), target)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -599,7 +599,7 @@ public class JpaRolloutManagement implements RolloutManagement {
|
|||||||
/**
|
/**
|
||||||
* Get count of targets in different status in rollout.
|
* Get count of targets in different status in rollout.
|
||||||
*
|
*
|
||||||
* @param page
|
* @param pageable
|
||||||
* the page request to sort and limit the result
|
* the page request to sort and limit the result
|
||||||
* @return a list of rollouts with details of targets count for different
|
* @return a list of rollouts with details of targets count for different
|
||||||
* statuses
|
* statuses
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import org.springframework.data.domain.Pageable;
|
|||||||
import org.springframework.data.jpa.domain.Specification;
|
import org.springframework.data.jpa.domain.Specification;
|
||||||
import org.springframework.data.jpa.domain.Specifications;
|
import org.springframework.data.jpa.domain.Specifications;
|
||||||
import org.springframework.data.jpa.repository.Modifying;
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
import org.springframework.transaction.annotation.Isolation;
|
import org.springframework.transaction.annotation.Isolation;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import org.springframework.transaction.TransactionSystemException;
|
|||||||
*/
|
*/
|
||||||
@Aspect
|
@Aspect
|
||||||
public class ExceptionMappingAspectHandler implements Ordered {
|
public class ExceptionMappingAspectHandler implements Ordered {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(ExceptionMappingAspectHandler.class);
|
private static final Logger LOG = LoggerFactory.getLogger(ExceptionMappingAspectHandler.class);
|
||||||
|
|
||||||
private static final Map<String, String> EXCEPTION_MAPPING = new HashMap<>();
|
private static final Map<String, String> EXCEPTION_MAPPING = new HashMap<>();
|
||||||
@@ -63,6 +64,7 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
|||||||
private final SQLStateSQLExceptionTranslator sqlStateExceptionTranslator = new SQLStateSQLExceptionTranslator();
|
private final SQLStateSQLExceptionTranslator sqlStateExceptionTranslator = new SQLStateSQLExceptionTranslator();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|
||||||
MAPPED_EXCEPTION_ORDER.add(DuplicateKeyException.class);
|
MAPPED_EXCEPTION_ORDER.add(DuplicateKeyException.class);
|
||||||
MAPPED_EXCEPTION_ORDER.add(DataIntegrityViolationException.class);
|
MAPPED_EXCEPTION_ORDER.add(DataIntegrityViolationException.class);
|
||||||
MAPPED_EXCEPTION_ORDER.add(ConcurrencyFailureException.class);
|
MAPPED_EXCEPTION_ORDER.add(ConcurrencyFailureException.class);
|
||||||
@@ -90,9 +92,11 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
|||||||
+ " || execution( * org.eclipse.hawkbit.controller.*.*(..)) "
|
+ " || execution( * org.eclipse.hawkbit.controller.*.*(..)) "
|
||||||
+ " || execution( * org.eclipse.hawkbit.rest.resource.*.*(..)) "
|
+ " || execution( * org.eclipse.hawkbit.rest.resource.*.*(..)) "
|
||||||
+ " || execution( * org.eclipse.hawkbit.service.*.*(..)) )", throwing = "ex")
|
+ " || execution( * org.eclipse.hawkbit.service.*.*(..)) )", throwing = "ex")
|
||||||
// Exception squid:S00112 - Is aspectJ proxy
|
// Exception for squid:S00112, squid:S1162
|
||||||
@SuppressWarnings({ "squid:S00112" })
|
// It is a AspectJ proxy which deals with exceptions.
|
||||||
|
@SuppressWarnings({ "squid:S00112", "squid:S1162" })
|
||||||
public void catchAndWrapJpaExceptionsService(final Exception ex) throws Throwable {
|
public void catchAndWrapJpaExceptionsService(final Exception ex) throws Throwable {
|
||||||
|
|
||||||
LOG.trace("exception occured", ex);
|
LOG.trace("exception occured", ex);
|
||||||
Exception translatedAccessException = translateEclipseLinkExceptionIfPossible(ex);
|
Exception translatedAccessException = translateEclipseLinkExceptionIfPossible(ex);
|
||||||
|
|
||||||
@@ -122,6 +126,7 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG.trace("mapped exception {} to {}", translatedAccessException.getClass(), mappingException.getClass());
|
LOG.trace("mapped exception {} to {}", translatedAccessException.getClass(), mappingException.getClass());
|
||||||
throw mappingException;
|
throw mappingException;
|
||||||
}
|
}
|
||||||
@@ -138,7 +143,7 @@ public class ExceptionMappingAspectHandler implements Ordered {
|
|||||||
* translate the exception by the sql error code. Luckily, there we can use
|
* translate the exception by the sql error code. Luckily, there we can use
|
||||||
* {@link SQLStateSQLExceptionTranslator} if we can get a
|
* {@link SQLStateSQLExceptionTranslator} if we can get a
|
||||||
* {@link SQLException}.
|
* {@link SQLException}.
|
||||||
*
|
*
|
||||||
* @param accessException
|
* @param accessException
|
||||||
* the base access exception from jpa
|
* the base access exception from jpa
|
||||||
* @return the translated accessException
|
* @return the translated accessException
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ package org.eclipse.hawkbit.repository.jpa.model;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.eclipse.hawkbit.repository.eventbus.event.AbstractPropertyChangeEvent;
|
import org.eclipse.hawkbit.repository.eventbus.event.AbstractPropertyChangeEvent.PropertyChange;
|
||||||
import org.eclipse.hawkbit.repository.eventbus.event.ActionCreatedEvent;
|
import org.eclipse.hawkbit.repository.eventbus.event.ActionCreatedEvent;
|
||||||
import org.eclipse.hawkbit.repository.eventbus.event.ActionPropertyChangeEvent;
|
import org.eclipse.hawkbit.repository.eventbus.event.ActionPropertyChangeEvent;
|
||||||
import org.eclipse.hawkbit.repository.eventbus.event.RolloutGroupPropertyChangeEvent;
|
import org.eclipse.hawkbit.repository.eventbus.event.RolloutGroupPropertyChangeEvent;
|
||||||
@@ -33,7 +33,6 @@ import com.google.common.eventbus.EventBus;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Listens to change in property values of an entity.
|
* Listens to change in property values of an entity.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class EntityPropertyChangeListener extends DescriptorEventAdapter {
|
public class EntityPropertyChangeListener extends DescriptorEventAdapter {
|
||||||
|
|
||||||
@@ -53,27 +52,23 @@ public class EntityPropertyChangeListener extends DescriptorEventAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void postUpdate(final DescriptorEvent event) {
|
public void postUpdate(final DescriptorEvent event) {
|
||||||
if (event.getObject().getClass().equals(JpaAction.class)) {
|
if (event.getObject().getClass().equals(JpaAction.class)) {
|
||||||
getAfterTransactionCommmitExecutor().afterCommit(() -> getEventBus().post(
|
getAfterTransactionCommmitExecutor().afterCommit(() -> getEventBus()
|
||||||
new ActionPropertyChangeEvent((Action) event.getObject(), getChangeSet(Action.class, event))));
|
.post(new ActionPropertyChangeEvent((Action) event.getObject(), getChangeSet(event))));
|
||||||
} else if (event.getObject().getClass().equals(JpaRollout.class)) {
|
} else if (event.getObject().getClass().equals(JpaRollout.class)) {
|
||||||
getAfterTransactionCommmitExecutor().afterCommit(() -> getEventBus().post(
|
getAfterTransactionCommmitExecutor().afterCommit(() -> getEventBus()
|
||||||
new RolloutPropertyChangeEvent((Rollout) event.getObject(), getChangeSet(Rollout.class, event))));
|
.post(new RolloutPropertyChangeEvent((Rollout) event.getObject(), getChangeSet(event))));
|
||||||
} else if (event.getObject().getClass().equals(JpaRolloutGroup.class)) {
|
} else if (event.getObject().getClass().equals(JpaRolloutGroup.class)) {
|
||||||
getAfterTransactionCommmitExecutor().afterCommit(
|
getAfterTransactionCommmitExecutor().afterCommit(() -> getEventBus()
|
||||||
() -> getEventBus().post(new RolloutGroupPropertyChangeEvent((RolloutGroup) event.getObject(),
|
.post(new RolloutGroupPropertyChangeEvent((RolloutGroup) event.getObject(), getChangeSet(event))));
|
||||||
getChangeSet(RolloutGroup.class, event))));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T extends TenantAwareBaseEntity> Map<String, AbstractPropertyChangeEvent<T>.Values> getChangeSet(
|
private <T extends TenantAwareBaseEntity> Map<String, PropertyChange> getChangeSet(final DescriptorEvent event) {
|
||||||
final Class<T> clazz, final DescriptorEvent event) {
|
|
||||||
final T rolloutGroup = clazz.cast(event.getObject());
|
|
||||||
final ObjectChangeSet changeSet = ((UpdateObjectQuery) event.getQuery()).getObjectChangeSet();
|
final ObjectChangeSet changeSet = ((UpdateObjectQuery) event.getQuery()).getObjectChangeSet();
|
||||||
return changeSet.getChanges().stream().filter(record -> record instanceof DirectToFieldChangeRecord)
|
return changeSet.getChanges().stream().filter(record -> record instanceof DirectToFieldChangeRecord)
|
||||||
.map(record -> (DirectToFieldChangeRecord) record)
|
.map(record -> (DirectToFieldChangeRecord) record)
|
||||||
.collect(Collectors.toMap(record -> record.getAttribute(),
|
.collect(Collectors.toMap(record -> record.getAttribute(),
|
||||||
record -> new AbstractPropertyChangeEvent<T>(rolloutGroup, null).new Values(
|
record -> new PropertyChange(record.getOldValue(), record.getNewValue())));
|
||||||
record.getOldValue(), record.getNewValue())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AfterTransactionCommitExecutor getAfterTransactionCommmitExecutor() {
|
private AfterTransactionCommitExecutor getAfterTransactionCommmitExecutor() {
|
||||||
|
|||||||
@@ -98,8 +98,8 @@ public class JpaActionStatus extends AbstractJpaTenantAwareBaseEntity implements
|
|||||||
* the status for this action status
|
* the status for this action status
|
||||||
* @param occurredAt
|
* @param occurredAt
|
||||||
* the occurred timestamp
|
* the occurred timestamp
|
||||||
* @param messages
|
* @param message
|
||||||
* the messages which should be added to this action status
|
* the message which should be added to this action status
|
||||||
*/
|
*/
|
||||||
public JpaActionStatus(final JpaAction action, final Status status, final Long occurredAt, final String message) {
|
public JpaActionStatus(final JpaAction action, final Status status, final Long occurredAt, final String message) {
|
||||||
this.action = action;
|
this.action = action;
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ import org.springframework.data.domain.Persistable;
|
|||||||
// sub entities
|
// sub entities
|
||||||
@SuppressWarnings("squid:S2160")
|
@SuppressWarnings("squid:S2160")
|
||||||
public class JpaTarget extends AbstractJpaNamedEntity implements Persistable<Long>, Target {
|
public class JpaTarget extends AbstractJpaNamedEntity implements Persistable<Long>, Target {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Column(name = "controller_id", length = 64)
|
@Column(name = "controller_id", length = 64)
|
||||||
@@ -180,7 +181,7 @@ public class JpaTarget extends AbstractJpaNamedEntity implements Persistable<Lon
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param isNew
|
* @param entityNew
|
||||||
* the isNew to set
|
* the isNew to set
|
||||||
*/
|
*/
|
||||||
public void setNew(final boolean entityNew) {
|
public void setNew(final boolean entityNew) {
|
||||||
@@ -222,6 +223,7 @@ public class JpaTarget extends AbstractJpaNamedEntity implements Persistable<Lon
|
|||||||
* @param securityToken
|
* @param securityToken
|
||||||
* the securityToken to set
|
* the securityToken to set
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setSecurityToken(final String securityToken) {
|
public void setSecurityToken(final String securityToken) {
|
||||||
this.securityToken = securityToken;
|
this.securityToken = securityToken;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ public class JpaTargetInfo implements Persistable<Long>, TargetInfo {
|
|||||||
private boolean requestControllerAttributes = true;
|
private boolean requestControllerAttributes = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for {@link TargetStatus}.
|
* Constructor for {@link JpaTargetInfo}.
|
||||||
*
|
*
|
||||||
* @param target
|
* @param target
|
||||||
* related to this status.
|
* related to this status.
|
||||||
@@ -144,7 +144,7 @@ public class JpaTargetInfo implements Persistable<Long>, TargetInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param isNew
|
* @param entityNew
|
||||||
* the isNew to set
|
* the isNew to set
|
||||||
*/
|
*/
|
||||||
public void setNew(final boolean entityNew) {
|
public void setNew(final boolean entityNew) {
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.repository.jpa.rsql;
|
package org.eclipse.hawkbit.repository.jpa.rsql;
|
||||||
|
|
||||||
|
import static org.eclipse.hawkbit.repository.FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -15,7 +17,6 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
@@ -49,7 +50,7 @@ import cz.jirutka.rsql.parser.ast.RSQLVisitor;
|
|||||||
* A utility class which is able to parse RSQL strings into an spring data
|
* A utility class which is able to parse RSQL strings into an spring data
|
||||||
* {@link Specification} which then can be enhanced sql queries to filter
|
* {@link Specification} which then can be enhanced sql queries to filter
|
||||||
* entities. RSQL parser library: https://github.com/jirutka/rsql-parser
|
* entities. RSQL parser library: https://github.com/jirutka/rsql-parser
|
||||||
*
|
*
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>Equal to : ==</li>
|
* <li>Equal to : ==</li>
|
||||||
* <li>Not equal to : !=</li>
|
* <li>Not equal to : !=</li>
|
||||||
@@ -83,14 +84,12 @@ public final class RSQLUtility {
|
|||||||
/**
|
/**
|
||||||
* parses an RSQL valid string into an JPA {@link Specification} which then
|
* parses an RSQL valid string into an JPA {@link Specification} which then
|
||||||
* can be used to filter for JPA entities with the given RSQL query.
|
* can be used to filter for JPA entities with the given RSQL query.
|
||||||
*
|
*
|
||||||
* @param rsql
|
* @param rsql
|
||||||
* the rsql query
|
* the rsql query
|
||||||
* @param fieldNameProvider
|
* @param fieldNameProvider
|
||||||
* the enum class type which implements the
|
* the enum class type which implements the
|
||||||
* {@link FieldNameProvider}
|
* {@link FieldNameProvider}
|
||||||
* @param entityManager
|
|
||||||
* {@link EntityManager}
|
|
||||||
* @return an specification which can be used with JPA
|
* @return an specification which can be used with JPA
|
||||||
* @throws RSQLParameterUnsupportedFieldException
|
* @throws RSQLParameterUnsupportedFieldException
|
||||||
* if a field in the RSQL string is used but not provided by the
|
* if a field in the RSQL string is used but not provided by the
|
||||||
@@ -105,10 +104,10 @@ public final class RSQLUtility {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate the given rsql string regarding existence and correct syntax.
|
* Validate the given rsql string regarding existence and correct syntax.
|
||||||
*
|
*
|
||||||
* @param rsql
|
* @param rsql
|
||||||
* the rsql string to get validated
|
* the rsql string to get validated
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public static void isValid(final String rsql) {
|
public static void isValid(final String rsql) {
|
||||||
parseRsql(rsql);
|
parseRsql(rsql);
|
||||||
@@ -156,7 +155,7 @@ public final class RSQLUtility {
|
|||||||
/**
|
/**
|
||||||
* An implementation of the {@link RSQLVisitor} to visit the parsed tokens
|
* An implementation of the {@link RSQLVisitor} to visit the parsed tokens
|
||||||
* and build jpa where clauses.
|
* and build jpa where clauses.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param <A>
|
* @param <A>
|
||||||
@@ -205,7 +204,7 @@ public final class RSQLUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getAndValidatePropertyFieldName(final A propertyEnum, final ComparisonNode node) {
|
private String getAndValidatePropertyFieldName(final A propertyEnum, final ComparisonNode node) {
|
||||||
String finalProperty = propertyEnum.getFieldName();
|
|
||||||
final String[] graph = node.getSelector().split("\\" + FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR);
|
final String[] graph = node.getSelector().split("\\" + FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR);
|
||||||
|
|
||||||
validateMapParamter(propertyEnum, node, graph);
|
validateMapParamter(propertyEnum, node, graph);
|
||||||
@@ -215,9 +214,12 @@ public final class RSQLUtility {
|
|||||||
throw createRSQLParameterUnsupportedException(node);
|
throw createRSQLParameterUnsupportedException(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final StringBuilder fieldNameBuilder = new StringBuilder(propertyEnum.getFieldName());
|
||||||
|
|
||||||
for (int i = 1; i < graph.length; i++) {
|
for (int i = 1; i < graph.length; i++) {
|
||||||
|
|
||||||
final String propertyField = graph[i];
|
final String propertyField = graph[i];
|
||||||
finalProperty += FieldNameProvider.SUB_ATTRIBUTE_SEPERATOR + propertyField;
|
fieldNameBuilder.append(SUB_ATTRIBUTE_SEPERATOR).append(propertyField);
|
||||||
|
|
||||||
// the key of map is not in the graph
|
// the key of map is not in the graph
|
||||||
if (propertyEnum.isMap() && graph.length == (i + 1)) {
|
if (propertyEnum.isMap() && graph.length == (i + 1)) {
|
||||||
@@ -229,7 +231,7 @@ public final class RSQLUtility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return finalProperty;
|
return fieldNameBuilder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void validateMapParamter(final A propertyEnum, final ComparisonNode node, final String[] graph) {
|
private void validateMapParamter(final A propertyEnum, final ComparisonNode node, final String[] graph) {
|
||||||
|
|||||||
@@ -9,11 +9,24 @@
|
|||||||
package org.eclipse.hawkbit.rest.util;
|
package org.eclipse.hawkbit.rest.util;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static com.google.common.net.HttpHeaders.ACCEPT_RANGES;
|
||||||
|
import static com.google.common.net.HttpHeaders.CONTENT_DISPOSITION;
|
||||||
|
import static com.google.common.net.HttpHeaders.CONTENT_LENGTH;
|
||||||
|
import static com.google.common.net.HttpHeaders.CONTENT_RANGE;
|
||||||
|
import static com.google.common.net.HttpHeaders.ETAG;
|
||||||
|
import static com.google.common.net.HttpHeaders.IF_RANGE;
|
||||||
|
import static com.google.common.net.HttpHeaders.LAST_MODIFIED;
|
||||||
|
import static java.math.RoundingMode.DOWN;
|
||||||
|
import static javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT;
|
||||||
|
import static org.eclipse.hawkbit.rest.util.ByteRange.MULTIPART_BOUNDARY;
|
||||||
|
import static org.springframework.http.HttpStatus.OK;
|
||||||
|
import static org.springframework.http.HttpStatus.PARTIAL_CONTENT;
|
||||||
|
import static org.springframework.http.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE;
|
||||||
|
import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.math.RoundingMode;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -27,23 +40,19 @@ import org.eclipse.hawkbit.repository.model.ActionStatus;
|
|||||||
import org.eclipse.hawkbit.repository.model.LocalArtifact;
|
import org.eclipse.hawkbit.repository.model.LocalArtifact;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.http.MediaType;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
||||||
import com.google.common.math.DoubleMath;
|
import com.google.common.math.DoubleMath;
|
||||||
import com.google.common.net.HttpHeaders;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class for the Rest Source API.
|
* Utility class for the Rest Source API.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class RestResourceConversionHelper {
|
public final class RestResourceConversionHelper {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(RestResourceConversionHelper.class);
|
private static final Logger LOG = LoggerFactory.getLogger(RestResourceConversionHelper.class);
|
||||||
|
|
||||||
private static final int BUFFER_SIZE = 4096;
|
private static final int BUFFER_SIZE = 4096;
|
||||||
|
|
||||||
// utility class, private constructor.
|
|
||||||
private RestResourceConversionHelper() {
|
private RestResourceConversionHelper() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -92,7 +101,8 @@ public final class RestResourceConversionHelper {
|
|||||||
*
|
*
|
||||||
* @return http code
|
* @return http code
|
||||||
*
|
*
|
||||||
* @see https://tools.ietf.org/html/rfc7233
|
* @see <a href="https://tools.ietf.org/html/rfc7233">https://tools.ietf.org
|
||||||
|
* /html/rfc7233</a>
|
||||||
*/
|
*/
|
||||||
public static ResponseEntity<InputStream> writeFileResponse(final LocalArtifact artifact,
|
public static ResponseEntity<InputStream> writeFileResponse(final LocalArtifact artifact,
|
||||||
final HttpServletResponse response, final HttpServletRequest request, final DbArtifact file,
|
final HttpServletResponse response, final HttpServletRequest request, final DbArtifact file,
|
||||||
@@ -107,11 +117,11 @@ public final class RestResourceConversionHelper {
|
|||||||
|
|
||||||
response.reset();
|
response.reset();
|
||||||
response.setBufferSize(BUFFER_SIZE);
|
response.setBufferSize(BUFFER_SIZE);
|
||||||
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFilename());
|
response.setHeader(CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFilename());
|
||||||
response.setHeader(HttpHeaders.ETAG, etag);
|
response.setHeader(ETAG, etag);
|
||||||
response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
|
response.setHeader(ACCEPT_RANGES, "bytes");
|
||||||
response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModified);
|
response.setDateHeader(LAST_MODIFIED, lastModified);
|
||||||
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
response.setContentType(APPLICATION_OCTET_STREAM_VALUE);
|
||||||
|
|
||||||
final ByteRange full = new ByteRange(0, length - 1, length);
|
final ByteRange full = new ByteRange(0, length - 1, length);
|
||||||
final List<ByteRange> ranges = new ArrayList<>();
|
final List<ByteRange> ranges = new ArrayList<>();
|
||||||
@@ -123,9 +133,9 @@ public final class RestResourceConversionHelper {
|
|||||||
|
|
||||||
// Range header matches"bytes=n-n,n-n,n-n..."
|
// Range header matches"bytes=n-n,n-n,n-n..."
|
||||||
if (!range.matches("^bytes=\\d*-\\d*(,\\d*-\\d*)*$")) {
|
if (!range.matches("^bytes=\\d*-\\d*(,\\d*-\\d*)*$")) {
|
||||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes */" + length);
|
response.setHeader(CONTENT_RANGE, "bytes */" + length);
|
||||||
LOG.debug("range header for filename ({}) is not satisfiable: ", artifact.getFilename());
|
LOG.debug("range header for filename ({}) is not satisfiable: ", artifact.getFilename());
|
||||||
return new ResponseEntity<>(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
|
return new ResponseEntity<>(REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// RFC: if the representation is unchanged, send me the part(s) that
|
// RFC: if the representation is unchanged, send me the part(s) that
|
||||||
@@ -144,32 +154,31 @@ public final class RestResourceConversionHelper {
|
|||||||
// full request - no range
|
// full request - no range
|
||||||
if (ranges.isEmpty() || ranges.get(0).equals(full)) {
|
if (ranges.isEmpty() || ranges.get(0).equals(full)) {
|
||||||
LOG.debug("filename ({}) results into a full request: ", artifact.getFilename());
|
LOG.debug("filename ({}) results into a full request: ", artifact.getFilename());
|
||||||
fullfileRequest(artifact, response, file, controllerManagement, statusId, full);
|
handleFullFileRequest(artifact, response, file, controllerManagement, statusId, full);
|
||||||
result = new ResponseEntity<>(HttpStatus.OK);
|
result = new ResponseEntity<>(OK);
|
||||||
}
|
}
|
||||||
// standard range request
|
// standard range request
|
||||||
else if (ranges.size() == 1) {
|
else if (ranges.size() == 1) {
|
||||||
LOG.debug("filename ({}) results into a standard range request: ", artifact.getFilename());
|
LOG.debug("filename ({}) results into a standard range request: ", artifact.getFilename());
|
||||||
standardRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
handleStandardRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
||||||
result = new ResponseEntity<>(HttpStatus.PARTIAL_CONTENT);
|
result = new ResponseEntity<>(PARTIAL_CONTENT);
|
||||||
}
|
}
|
||||||
// multipart range request
|
// multipart range request
|
||||||
else {
|
else {
|
||||||
LOG.debug("filename ({}) results into a multipart range request: ", artifact.getFilename());
|
LOG.debug("filename ({}) results into a multipart range request: ", artifact.getFilename());
|
||||||
multipartRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
handleMultipartRangeRequest(artifact, response, file, controllerManagement, statusId, ranges);
|
||||||
result = new ResponseEntity<>(HttpStatus.PARTIAL_CONTENT);
|
result = new ResponseEntity<>(PARTIAL_CONTENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void fullfileRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
private static void handleFullFileRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||||
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
||||||
final ByteRange full) {
|
final ByteRange full) {
|
||||||
final ByteRange r = full;
|
final ByteRange r = full;
|
||||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
response.setHeader(CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||||
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(r.getLength()));
|
response.setHeader(CONTENT_LENGTH, String.valueOf(r.getLength()));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
copyStreams(file.getFileInputStream(), response.getOutputStream(), controllerManagement, statusId,
|
copyStreams(file.getFileInputStream(), response.getOutputStream(), controllerManagement, statusId,
|
||||||
@@ -182,7 +191,7 @@ public final class RestResourceConversionHelper {
|
|||||||
|
|
||||||
private static ResponseEntity<InputStream> extractRange(final HttpServletResponse response, final long length,
|
private static ResponseEntity<InputStream> extractRange(final HttpServletResponse response, final long length,
|
||||||
final List<ByteRange> ranges, final String range) {
|
final List<ByteRange> ranges, final String range) {
|
||||||
ResponseEntity<InputStream> result = null;
|
|
||||||
if (ranges.isEmpty()) {
|
if (ranges.isEmpty()) {
|
||||||
for (final String part : range.substring(6).split(",")) {
|
for (final String part : range.substring(6).split(",")) {
|
||||||
long start = sublong(part, 0, part.indexOf('-'));
|
long start = sublong(part, 0, part.indexOf('-'));
|
||||||
@@ -198,9 +207,8 @@ public final class RestResourceConversionHelper {
|
|||||||
// Check if Range is syntactically valid. If not, then return
|
// Check if Range is syntactically valid. If not, then return
|
||||||
// 416.
|
// 416.
|
||||||
if (start > end) {
|
if (start > end) {
|
||||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes */" + length);
|
response.setHeader(CONTENT_RANGE, "bytes */" + length);
|
||||||
result = new ResponseEntity<>(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE);
|
return new ResponseEntity<>(REQUESTED_RANGE_NOT_SATISFIABLE);
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add range.
|
// Add range.
|
||||||
@@ -218,10 +226,10 @@ public final class RestResourceConversionHelper {
|
|||||||
|
|
||||||
private static void checkForShortcut(final HttpServletRequest request, final String etag, final long lastModified,
|
private static void checkForShortcut(final HttpServletRequest request, final String etag, final long lastModified,
|
||||||
final ByteRange full, final List<ByteRange> ranges) {
|
final ByteRange full, final List<ByteRange> ranges) {
|
||||||
final String ifRange = request.getHeader(HttpHeaders.IF_RANGE);
|
final String ifRange = request.getHeader(IF_RANGE);
|
||||||
if (ifRange != null && !ifRange.equals(etag)) {
|
if (ifRange != null && !ifRange.equals(etag)) {
|
||||||
try {
|
try {
|
||||||
final long ifRangeTime = request.getDateHeader(HttpHeaders.IF_RANGE);
|
final long ifRangeTime = request.getDateHeader(IF_RANGE);
|
||||||
if (ifRangeTime != -1 && ifRangeTime + 1000 < lastModified) {
|
if (ifRangeTime != -1 && ifRangeTime + 1000 < lastModified) {
|
||||||
ranges.add(full);
|
ranges.add(full);
|
||||||
}
|
}
|
||||||
@@ -232,17 +240,17 @@ public final class RestResourceConversionHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void multipartRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
private static void handleMultipartRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||||
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
||||||
final List<ByteRange> ranges) {
|
final List<ByteRange> ranges) {
|
||||||
response.setContentType("multipart/byteranges; boundary=" + ByteRange.MULTIPART_BOUNDARY);
|
response.setContentType("multipart/byteranges; boundary=" + MULTIPART_BOUNDARY);
|
||||||
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
|
response.setStatus(SC_PARTIAL_CONTENT);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (final ByteRange r : ranges) {
|
for (final ByteRange r : ranges) {
|
||||||
// Add multipart boundary and header fields for every range.
|
// Add multipart boundary and header fields for every range.
|
||||||
response.getOutputStream().println();
|
response.getOutputStream().println();
|
||||||
response.getOutputStream().println("--" + ByteRange.MULTIPART_BOUNDARY);
|
response.getOutputStream().println("--" + MULTIPART_BOUNDARY);
|
||||||
response.getOutputStream()
|
response.getOutputStream()
|
||||||
.println("Content-Range: bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
.println("Content-Range: bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||||
|
|
||||||
@@ -253,20 +261,20 @@ public final class RestResourceConversionHelper {
|
|||||||
|
|
||||||
// End with final multipart boundary.
|
// End with final multipart boundary.
|
||||||
response.getOutputStream().println();
|
response.getOutputStream().println();
|
||||||
response.getOutputStream().print("--" + ByteRange.MULTIPART_BOUNDARY + "--");
|
response.getOutputStream().print("--" + MULTIPART_BOUNDARY + "--");
|
||||||
} catch (final IOException e) {
|
} catch (final IOException e) {
|
||||||
LOG.error("multipartRangeRequest of file ({}) failed!", artifact.getFilename(), e);
|
LOG.error("multipartRangeRequest of file ({}) failed!", artifact.getFilename(), e);
|
||||||
throw new FileSteamingFailedException(artifact.getFilename());
|
throw new FileSteamingFailedException(artifact.getFilename());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void standardRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
private static void handleStandardRangeRequest(final LocalArtifact artifact, final HttpServletResponse response,
|
||||||
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
final DbArtifact file, final ControllerManagement controllerManagement, final Long statusId,
|
||||||
final List<ByteRange> ranges) {
|
final List<ByteRange> ranges) {
|
||||||
final ByteRange r = ranges.get(0);
|
final ByteRange r = ranges.get(0);
|
||||||
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
response.setHeader(CONTENT_RANGE, "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
|
||||||
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(r.getLength()));
|
response.setHeader(CONTENT_LENGTH, String.valueOf(r.getLength()));
|
||||||
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
|
response.setStatus(SC_PARTIAL_CONTENT);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
copyStreams(file.getFileInputStream(), response.getOutputStream(), controllerManagement, statusId,
|
copyStreams(file.getFileInputStream(), response.getOutputStream(), controllerManagement, statusId,
|
||||||
@@ -315,7 +323,7 @@ public final class RestResourceConversionHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (controllerManagement != null) {
|
if (controllerManagement != null) {
|
||||||
final int newPercent = DoubleMath.roundToInt(total * 100.0 / length, RoundingMode.DOWN);
|
final int newPercent = DoubleMath.roundToInt(total * 100.0 / length, DOWN);
|
||||||
|
|
||||||
// every 10 percent an event
|
// every 10 percent an event
|
||||||
if (newPercent == 100 || newPercent > progressPercent + 10) {
|
if (newPercent == 100 || newPercent > progressPercent + 10) {
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ public class DosFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
boolean processChain;
|
boolean processChain;
|
||||||
|
|
||||||
final String ip = IpUtil.getClientIpFromRequest(request, forwardHeader, true).getHost();
|
final String ip = IpUtil.getClientIpFromRequest(request, forwardHeader).getHost();
|
||||||
|
|
||||||
if (checkIpFails(ip)) {
|
if (checkIpFails(ip)) {
|
||||||
processChain = handleMissingIpAddress(response);
|
processChain = handleMissingIpAddress(response);
|
||||||
} else {
|
} else {
|
||||||
@@ -121,7 +122,6 @@ public class DosFilter extends OncePerRequestFilter {
|
|||||||
if (processChain) {
|
if (processChain) {
|
||||||
filterChain.doFilter(request, response);
|
filterChain.doFilter(request, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public final class IpUtil {
|
|||||||
* {@link HttpServletRequest} by either the
|
* {@link HttpServletRequest} by either the
|
||||||
* {@link HttpHeaders#X_FORWARDED_FOR} or by the
|
* {@link HttpHeaders#X_FORWARDED_FOR} or by the
|
||||||
* {@link HttpServletRequest#getRemoteAddr()} methods.
|
* {@link HttpServletRequest#getRemoteAddr()} methods.
|
||||||
*
|
*
|
||||||
* @param request
|
* @param request
|
||||||
* the {@link HttpServletRequest} to determine the IP address
|
* the {@link HttpServletRequest} to determine the IP address
|
||||||
* where this request has been sent from
|
* where this request has been sent from
|
||||||
@@ -65,21 +65,23 @@ public final class IpUtil {
|
|||||||
* {@link HttpServletRequest} by either the
|
* {@link HttpServletRequest} by either the
|
||||||
* {@link HttpHeaders#X_FORWARDED_FOR} or by the
|
* {@link HttpHeaders#X_FORWARDED_FOR} or by the
|
||||||
* {@link HttpServletRequest#getRemoteAddr()} methods.
|
* {@link HttpServletRequest#getRemoteAddr()} methods.
|
||||||
*
|
*
|
||||||
* @param request
|
* @param request
|
||||||
* the {@link HttpServletRequest} to determine the IP address
|
* the {@link HttpServletRequest} to determine the IP address
|
||||||
* where this request has been sent from
|
* where this request has been sent from
|
||||||
* @param forwardHeader
|
* @param forwardHeader
|
||||||
* the header name containing the IP address e.g. forwarded by a
|
* the header name containing the IP address e.g. forwarded by a
|
||||||
* proxy {@code x-forwarded-for}
|
* proxy {@code x-forwarded-for}
|
||||||
*
|
|
||||||
* @param trackRemoteIp
|
|
||||||
* to <code>true</code> if remote IP should be tracked.
|
|
||||||
* @return the {@link URI} based IP address from the client which sent the
|
* @return the {@link URI} based IP address from the client which sent the
|
||||||
* request
|
* request
|
||||||
*/
|
*/
|
||||||
public static URI getClientIpFromRequest(final HttpServletRequest request, final String forwardHeader,
|
public static URI getClientIpFromRequest(final HttpServletRequest request, final String forwardHeader) {
|
||||||
|
return getClientIpFromRequest(request, forwardHeader, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static URI getClientIpFromRequest(final HttpServletRequest request, final String forwardHeader,
|
||||||
final boolean trackRemoteIp) {
|
final boolean trackRemoteIp) {
|
||||||
|
|
||||||
String ip;
|
String ip;
|
||||||
|
|
||||||
if (trackRemoteIp) {
|
if (trackRemoteIp) {
|
||||||
@@ -113,7 +115,7 @@ public final class IpUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a {@link URI} with scheme and host.
|
* Create a {@link URI} with scheme and host.
|
||||||
*
|
*
|
||||||
* @param scheme
|
* @param scheme
|
||||||
* the scheme
|
* the scheme
|
||||||
* @param host
|
* @param host
|
||||||
@@ -132,7 +134,7 @@ public final class IpUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a {@link URI} with amqp scheme and host.
|
* Create a {@link URI} with amqp scheme and host.
|
||||||
*
|
*
|
||||||
* @param host
|
* @param host
|
||||||
* the host
|
* the host
|
||||||
* @param exchange
|
* @param exchange
|
||||||
@@ -147,7 +149,7 @@ public final class IpUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a {@link URI} with http scheme and host.
|
* Create a {@link URI} with http scheme and host.
|
||||||
*
|
*
|
||||||
* @param host
|
* @param host
|
||||||
* the host
|
* the host
|
||||||
* @return the {@link URI}
|
* @return the {@link URI}
|
||||||
@@ -160,7 +162,7 @@ public final class IpUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if scheme contains http and uri ist not <code>null</code>.
|
* Check if scheme contains http and uri ist not <code>null</code>.
|
||||||
*
|
*
|
||||||
* @param uri
|
* @param uri
|
||||||
* the uri
|
* the uri
|
||||||
* @return true = is http host false = not
|
* @return true = is http host false = not
|
||||||
@@ -171,7 +173,7 @@ public final class IpUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if host scheme amqp and uri ist not <code>null</code>.
|
* Check if host scheme amqp and uri ist not <code>null</code>.
|
||||||
*
|
*
|
||||||
* @param uri
|
* @param uri
|
||||||
* the uri
|
* the uri
|
||||||
* @return true = is http host false = not
|
* @return true = is http host false = not
|
||||||
@@ -183,7 +185,7 @@ public final class IpUtil {
|
|||||||
/**
|
/**
|
||||||
* Check if the IP address of that {@link URI} is known, i.e. not an AQMP
|
* Check if the IP address of that {@link URI} is known, i.e. not an AQMP
|
||||||
* exchange in DMF case and not HIDDEN_IP in DDI case.
|
* exchange in DMF case and not HIDDEN_IP in DDI case.
|
||||||
*
|
*
|
||||||
* @param uri
|
* @param uri
|
||||||
* the uri
|
* the uri
|
||||||
* @return <code>true</code> if IP address is actually known by the server
|
* @return <code>true</code> if IP address is actually known by the server
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.util;
|
package org.eclipse.hawkbit.util;
|
||||||
|
|
||||||
|
import static com.google.common.net.HttpHeaders.X_FORWARDED_FOR;
|
||||||
import static org.fest.assertions.api.Assertions.assertThat;
|
import static org.fest.assertions.api.Assertions.assertThat;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
@@ -21,13 +22,13 @@ import java.net.URI;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import org.eclipse.hawkbit.security.HawkbitSecurityProperties;
|
||||||
|
import org.eclipse.hawkbit.security.HawkbitSecurityProperties.Clients;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.runners.MockitoJUnitRunner;
|
import org.mockito.runners.MockitoJUnitRunner;
|
||||||
|
|
||||||
import com.google.common.net.HttpHeaders;
|
|
||||||
|
|
||||||
import ru.yandex.qatools.allure.annotations.Description;
|
import ru.yandex.qatools.allure.annotations.Description;
|
||||||
import ru.yandex.qatools.allure.annotations.Features;
|
import ru.yandex.qatools.allure.annotations.Features;
|
||||||
import ru.yandex.qatools.allure.annotations.Stories;
|
import ru.yandex.qatools.allure.annotations.Stories;
|
||||||
@@ -37,69 +38,73 @@ import ru.yandex.qatools.allure.annotations.Stories;
|
|||||||
@Stories("IP Util Test")
|
@Stories("IP Util Test")
|
||||||
public class IpUtilTest {
|
public class IpUtilTest {
|
||||||
|
|
||||||
|
private static final String KNOWN_REQUEST_HEADER = "bumlux";
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private HttpServletRequest requestMock;
|
private HttpServletRequest requestMock;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private Clients clientMock;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private HawkbitSecurityProperties securityPropertyMock;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Description("Tests create uri from request")
|
@Description("Tests create uri from request")
|
||||||
public void getRemoteAddrFromRequestIfForwaredHeaderNotPresent() {
|
public void getRemoteAddrFromRequestIfForwaredHeaderNotPresent() {
|
||||||
// known values
|
|
||||||
final URI knownRemoteClientIP = IpUtil.createHttpUri("127.0.0.1");
|
final URI knownRemoteClientIP = IpUtil.createHttpUri("127.0.0.1");
|
||||||
// mock
|
when(requestMock.getHeader(X_FORWARDED_FOR)).thenReturn(null);
|
||||||
when(requestMock.getHeader(HttpHeaders.X_FORWARDED_FOR)).thenReturn(null);
|
|
||||||
when(requestMock.getRemoteAddr()).thenReturn(knownRemoteClientIP.getHost());
|
when(requestMock.getRemoteAddr()).thenReturn(knownRemoteClientIP.getHost());
|
||||||
|
|
||||||
// test
|
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, KNOWN_REQUEST_HEADER);
|
||||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "bumlux", true);
|
|
||||||
|
|
||||||
// verify
|
// verify
|
||||||
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
||||||
.isEqualTo(knownRemoteClientIP);
|
.isEqualTo(knownRemoteClientIP);
|
||||||
verify(requestMock, times(1)).getHeader("bumlux");
|
verify(requestMock, times(1)).getHeader(KNOWN_REQUEST_HEADER);
|
||||||
verify(requestMock, times(1)).getRemoteAddr();
|
verify(requestMock, times(1)).getRemoteAddr();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Description("Tests create uri from request with masked IP when IP tracking is disabled")
|
@Description("Tests create uri from request with masked IP when IP tracking is disabled")
|
||||||
public void maskRemoteAddrIfDisabled() {
|
public void maskRemoteAddrIfDisabled() {
|
||||||
// known values
|
|
||||||
final URI knownRemoteClientIP = IpUtil.createHttpUri("***");
|
final URI knownRemoteClientIP = IpUtil.createHttpUri("***");
|
||||||
// mock
|
when(requestMock.getHeader(X_FORWARDED_FOR)).thenReturn(null);
|
||||||
when(requestMock.getHeader(HttpHeaders.X_FORWARDED_FOR)).thenReturn(null);
|
|
||||||
when(requestMock.getRemoteAddr()).thenReturn(knownRemoteClientIP.getHost());
|
when(requestMock.getRemoteAddr()).thenReturn(knownRemoteClientIP.getHost());
|
||||||
|
when(securityPropertyMock.getClients()).thenReturn(clientMock);
|
||||||
|
when(clientMock.getRemoteIpHeader()).thenReturn(KNOWN_REQUEST_HEADER);
|
||||||
|
when(clientMock.isTrackRemoteIp()).thenReturn(false);
|
||||||
|
|
||||||
// test
|
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, securityPropertyMock);
|
||||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "bumlux", false);
|
|
||||||
|
|
||||||
// verify
|
|
||||||
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
||||||
.isEqualTo(knownRemoteClientIP);
|
.isEqualTo(knownRemoteClientIP);
|
||||||
verify(requestMock, times(0)).getHeader("bumlux");
|
verify(requestMock, times(0)).getHeader(KNOWN_REQUEST_HEADER);
|
||||||
verify(requestMock, times(0)).getRemoteAddr();
|
verify(requestMock, times(0)).getRemoteAddr();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Description("Tests create uri from x forward header")
|
@Description("Tests create uri from x forward header")
|
||||||
public void getRemoteAddrFromXForwardedForHeader() {
|
public void getRemoteAddrFromXForwardedForHeader() {
|
||||||
// known values
|
|
||||||
final URI knownRemoteClientIP = IpUtil.createHttpUri("10.99.99.1");
|
final URI knownRemoteClientIP = IpUtil.createHttpUri("10.99.99.1");
|
||||||
// mock
|
when(requestMock.getHeader(X_FORWARDED_FOR)).thenReturn(knownRemoteClientIP.getHost());
|
||||||
when(requestMock.getHeader(HttpHeaders.X_FORWARDED_FOR)).thenReturn(knownRemoteClientIP.getHost());
|
|
||||||
when(requestMock.getRemoteAddr()).thenReturn(null);
|
when(requestMock.getRemoteAddr()).thenReturn(null);
|
||||||
|
|
||||||
// test
|
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "X-Forwarded-For");
|
||||||
final URI remoteAddr = IpUtil.getClientIpFromRequest(requestMock, "X-Forwarded-For", true);
|
|
||||||
|
|
||||||
// verify
|
|
||||||
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
assertThat(remoteAddr).as("The remote address should be as the known client IP address")
|
||||||
.isEqualTo(knownRemoteClientIP);
|
.isEqualTo(knownRemoteClientIP);
|
||||||
verify(requestMock, times(1)).getHeader(HttpHeaders.X_FORWARDED_FOR);
|
verify(requestMock, times(1)).getHeader(X_FORWARDED_FOR);
|
||||||
verify(requestMock, times(0)).getRemoteAddr();
|
verify(requestMock, times(0)).getRemoteAddr();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Description("Tests create http uri ipv4 and ipv6")
|
@Description("Tests create http uri ipv4 and ipv6")
|
||||||
public void testCreateHttpUri() {
|
public void testCreateHttpUri() {
|
||||||
|
|
||||||
final String ipv4 = "10.99.99.1";
|
final String ipv4 = "10.99.99.1";
|
||||||
URI httpUri = IpUtil.createHttpUri(ipv4);
|
URI httpUri = IpUtil.createHttpUri(ipv4);
|
||||||
assertHttpUri(ipv4, httpUri);
|
assertHttpUri(ipv4, httpUri);
|
||||||
@@ -111,7 +116,6 @@ public class IpUtilTest {
|
|||||||
final String ipv6 = "0:0:0:0:0:0:0:1";
|
final String ipv6 = "0:0:0:0:0:0:0:1";
|
||||||
httpUri = IpUtil.createHttpUri(ipv6);
|
httpUri = IpUtil.createHttpUri(ipv6);
|
||||||
assertHttpUri("[" + ipv6 + "]", httpUri);
|
assertHttpUri("[" + ipv6 + "]", httpUri);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertHttpUri(final String host, final URI httpUri) {
|
private void assertHttpUri(final String host, final URI httpUri) {
|
||||||
@@ -124,6 +128,7 @@ public class IpUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
@Description("Tests create amqp uri ipv4 and ipv6")
|
@Description("Tests create amqp uri ipv4 and ipv6")
|
||||||
public void testCreateAmqpUri() {
|
public void testCreateAmqpUri() {
|
||||||
|
|
||||||
final String ipv4 = "10.99.99.1";
|
final String ipv4 = "10.99.99.1";
|
||||||
URI amqpUri = IpUtil.createAmqpUri(ipv4, "path");
|
URI amqpUri = IpUtil.createAmqpUri(ipv4, "path");
|
||||||
assertAmqpUri(ipv4, amqpUri);
|
assertAmqpUri(ipv4, amqpUri);
|
||||||
@@ -138,6 +143,7 @@ public class IpUtilTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void assertAmqpUri(final String host, final URI amqpUri) {
|
private void assertAmqpUri(final String host, final URI amqpUri) {
|
||||||
|
|
||||||
assertTrue("The given URI is an AMQP scheme", IpUtil.isAmqpUri(amqpUri));
|
assertTrue("The given URI is an AMQP scheme", IpUtil.isAmqpUri(amqpUri));
|
||||||
assertFalse("The given URI is not an HTTP scheme", IpUtil.isHttpUri(amqpUri));
|
assertFalse("The given URI is not an HTTP scheme", IpUtil.isHttpUri(amqpUri));
|
||||||
assertEquals("The given host matches the URI host", host, amqpUri.getHost());
|
assertEquals("The given host matches the URI host", host, amqpUri.getHost());
|
||||||
@@ -148,17 +154,19 @@ public class IpUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
@Description("Tests create invalid uri")
|
@Description("Tests create invalid uri")
|
||||||
public void testCreateInvalidUri() {
|
public void testCreateInvalidUri() {
|
||||||
|
|
||||||
final String host = "10.99.99.1";
|
final String host = "10.99.99.1";
|
||||||
final URI testUri = IpUtil.createUri("test", host);
|
final URI testUri = IpUtil.createUri("test", host);
|
||||||
|
|
||||||
assertFalse("The given URI is not an AMQP address", IpUtil.isAmqpUri(testUri));
|
assertFalse("The given URI is not an AMQP address", IpUtil.isAmqpUri(testUri));
|
||||||
assertFalse("The given URI is not an HTTP address", IpUtil.isHttpUri(testUri));
|
assertFalse("The given URI is not an HTTP address", IpUtil.isHttpUri(testUri));
|
||||||
assertEquals("The given host matches the URI host", host, testUri.getHost());
|
assertEquals("The given host matches the URI host", host, testUri.getHost());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
IpUtil.createUri(":/", host);
|
IpUtil.createUri(":/", host);
|
||||||
fail("Missing expected IllegalArgumentException due invalid URI");
|
fail("Missing expected IllegalArgumentException due invalid URI");
|
||||||
} catch (final IllegalArgumentException e) {
|
} catch (final IllegalArgumentException e) {
|
||||||
// expected
|
// expected
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ import com.vaadin.ui.UI;
|
|||||||
/**
|
/**
|
||||||
* Header of Software module table.
|
* Header of Software module table.
|
||||||
*/
|
*/
|
||||||
@SpringComponent
|
|
||||||
@ViewScope
|
@ViewScope
|
||||||
|
@SpringComponent
|
||||||
public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModule, Long> {
|
public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModule, Long> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 6469417305487144809L;
|
private static final long serialVersionUID = 6469417305487144809L;
|
||||||
@@ -66,7 +66,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UploadViewAcceptCriteria uploadViewAcceptCriteria;
|
private UploadViewAcceptCriteria uploadViewAcceptCriteria;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SwMetadataPopupLayout swMetadataPopupLayout;
|
private SwMetadataPopupLayout swMetadataPopupLayout;
|
||||||
|
|
||||||
@@ -162,7 +162,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
|||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
void onEvent(final UploadArtifactUIEvent event) {
|
void onEvent(final UploadArtifactUIEvent event) {
|
||||||
if (event == UploadArtifactUIEvent.DELETED_ALL_SOFWARE) {
|
if (event == UploadArtifactUIEvent.DELETED_ALL_SOFWARE) {
|
||||||
UI.getCurrent().access(() -> refreshFilter());
|
UI.getCurrent().access(this::refreshFilter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,12 +197,12 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
|||||||
public Object generateCell(final Table source, final Object itemId, final Object columnId) {
|
public Object generateCell(final Table source, final Object itemId, final Object columnId) {
|
||||||
final String nameVersionStr = getNameAndVerion(itemId);
|
final String nameVersionStr = getNameAndVerion(itemId);
|
||||||
final Button manageMetaDataBtn = createManageMetadataButton(nameVersionStr);
|
final Button manageMetaDataBtn = createManageMetadataButton(nameVersionStr);
|
||||||
manageMetaDataBtn.addClickListener(event -> showMetadataDetails((Long) itemId, nameVersionStr));
|
manageMetaDataBtn.addClickListener(event -> showMetadataDetails((Long) itemId));
|
||||||
return manageMetaDataBtn;
|
return manageMetaDataBtn;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<TableColumn> getTableVisibleColumns() {
|
protected List<TableColumn> getTableVisibleColumns() {
|
||||||
final List<TableColumn> columnList = super.getTableVisibleColumns();
|
final List<TableColumn> columnList = super.getTableVisibleColumns();
|
||||||
@@ -237,8 +237,7 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
|||||||
artifactUploadState.setNoDataAvilableSoftwareModule(!available);
|
artifactUploadState.setNoDataAvilableSoftwareModule(!available);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Button createManageMetadataButton(final String nameVersionStr) {
|
||||||
private Button createManageMetadataButton(String nameVersionStr) {
|
|
||||||
final Button manageMetadataBtn = SPUIComponentProvider.getButton(
|
final Button manageMetadataBtn = SPUIComponentProvider.getButton(
|
||||||
SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false,
|
SPUIComponentIdProvider.SW_TABLE_MANAGE_METADATA_ID + "." + nameVersionStr, "", "", null, false,
|
||||||
FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class);
|
FontAwesome.LIST_ALT, SPUIButtonStyleSmallNoBorder.class);
|
||||||
@@ -246,17 +245,17 @@ public class SoftwareModuleTable extends AbstractNamedVersionTable<SoftwareModul
|
|||||||
manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon"));
|
manageMetadataBtn.setDescription(i18n.get("tooltip.metadata.icon"));
|
||||||
return manageMetadataBtn;
|
return manageMetadataBtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getNameAndVerion(final Object itemId) {
|
private String getNameAndVerion(final Object itemId) {
|
||||||
final Item item = getItem(itemId);
|
final Item item = getItem(itemId);
|
||||||
final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
||||||
final String version = (String) item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).getValue();
|
final String version = (String) item.getItemProperty(SPUILabelDefinitions.VAR_VERSION).getValue();
|
||||||
return name + "." + version;
|
return name + "." + version;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showMetadataDetails(Long itemId, String nameVersionStr) {
|
private void showMetadataDetails(final Long itemId) {
|
||||||
SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(itemId);
|
final SoftwareModule swmodule = softwareManagement.findSoftwareModuleWithDetails(itemId);
|
||||||
/* display the window */
|
/* display the window */
|
||||||
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule,null));
|
UI.getCurrent().addWindow(swMetadataPopupLayout.getWindow(swmodule, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.artifacts.upload;
|
package org.eclipse.hawkbit.ui.artifacts.upload;
|
||||||
|
|
||||||
|
import static org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions.FAILED;
|
||||||
|
import static org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions.SUCCESS;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
@@ -56,13 +59,13 @@ import com.vaadin.ui.themes.ValoTheme;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Artifact upload confirmation popup.
|
* Artifact upload confirmation popup.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class UploadConfirmationwindow implements Button.ClickListener {
|
public class UploadConfirmationWindow implements Button.ClickListener {
|
||||||
|
|
||||||
private static final long serialVersionUID = -1679035890140031740L;
|
private static final long serialVersionUID = -1679035890140031740L;
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(UploadConfirmationwindow.class);
|
private static final Logger LOG = LoggerFactory.getLogger(UploadConfirmationWindow.class);
|
||||||
|
|
||||||
private static final String MD5_CHECKSUM = "md5Checksum";
|
private static final String MD5_CHECKSUM = "md5Checksum";
|
||||||
|
|
||||||
@@ -114,13 +117,13 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the upload confirmation window.
|
* Initialize the upload confirmation window.
|
||||||
*
|
*
|
||||||
* @param artifactUploadView
|
* @param artifactUploadView
|
||||||
* reference of upload layout.
|
* reference of upload layout.
|
||||||
* @param artifactUploadState
|
* @param artifactUploadState
|
||||||
* reference of session variable {@link ArtifactUploadState}.
|
* reference of session variable {@link ArtifactUploadState}.
|
||||||
*/
|
*/
|
||||||
public UploadConfirmationwindow(final UploadLayout artifactUploadView,
|
public UploadConfirmationWindow(final UploadLayout artifactUploadView,
|
||||||
final ArtifactUploadState artifactUploadState) {
|
final ArtifactUploadState artifactUploadState) {
|
||||||
this.uploadLayout = artifactUploadView;
|
this.uploadLayout = artifactUploadView;
|
||||||
this.artifactUploadState = artifactUploadState;
|
this.artifactUploadState = artifactUploadState;
|
||||||
@@ -615,6 +618,7 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
|||||||
|
|
||||||
private void createLocalArtifact(final String itemId, final String filePath,
|
private void createLocalArtifact(final String itemId, final String filePath,
|
||||||
final ArtifactManagement artifactManagement, final SoftwareModule baseSw) {
|
final ArtifactManagement artifactManagement, final SoftwareModule baseSw) {
|
||||||
|
|
||||||
final File newFile = new File(filePath);
|
final File newFile = new File(filePath);
|
||||||
final Item item = tabelContainer.getItem(itemId);
|
final Item item = tabelContainer.getItem(itemId);
|
||||||
final String sha1Checksum = ((TextField) item.getItemProperty(SHA1_CHECKSUM).getValue()).getValue();
|
final String sha1Checksum = ((TextField) item.getItemProperty(SHA1_CHECKSUM).getValue()).getValue();
|
||||||
@@ -624,27 +628,25 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
|||||||
final String[] itemDet = itemId.split("/");
|
final String[] itemDet = itemId.split("/");
|
||||||
final String swModuleNameVersion = itemDet[0];
|
final String swModuleNameVersion = itemDet[0];
|
||||||
|
|
||||||
FileInputStream fis = null;
|
try (FileInputStream fis = new FileInputStream(newFile)) {
|
||||||
try {
|
|
||||||
fis = new FileInputStream(newFile);
|
|
||||||
artifactManagement.createLocalArtifact(fis, baseSw.getId(), providedFileName,
|
artifactManagement.createLocalArtifact(fis, baseSw.getId(), providedFileName,
|
||||||
HawkbitCommonUtil.trimAndNullIfEmpty(md5Checksum),
|
HawkbitCommonUtil.trimAndNullIfEmpty(md5Checksum),
|
||||||
HawkbitCommonUtil.trimAndNullIfEmpty(sha1Checksum), true, customFile.getMimeType());
|
HawkbitCommonUtil.trimAndNullIfEmpty(sha1Checksum), true, customFile.getMimeType());
|
||||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.SUCCESS, "");
|
saveUploadStatus(providedFileName, swModuleNameVersion, SUCCESS, "");
|
||||||
} catch (final FileNotFoundException e) {
|
|
||||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
} catch (final ArtifactUploadFailedException | InvalidSHA1HashException | InvalidMD5HashException
|
||||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
| FileNotFoundException e) {
|
||||||
} catch (final ArtifactUploadFailedException e) {
|
|
||||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
saveUploadStatus(providedFileName, swModuleNameVersion, FAILED, e.getMessage());
|
||||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
|
||||||
} catch (final InvalidSHA1HashException e) {
|
|
||||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
|
||||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
|
||||||
} catch (final InvalidMD5HashException e) {
|
|
||||||
saveUploadStatus(providedFileName, swModuleNameVersion, SPUILabelDefinitions.FAILED, e.getMessage());
|
|
||||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
||||||
|
|
||||||
|
} catch (final IOException ex) {
|
||||||
|
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, ex);
|
||||||
} finally {
|
} finally {
|
||||||
closeFileStream(fis, newFile);
|
if (newFile.exists() && !newFile.delete()) {
|
||||||
|
LOG.error("Could not delete temporary file: {}", newFile);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -659,21 +661,6 @@ public class UploadConfirmationwindow implements Button.ClickListener {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void closeFileStream(final FileInputStream fis, final File newFile) {
|
|
||||||
|
|
||||||
if (fis != null) {
|
|
||||||
try {
|
|
||||||
fis.close();
|
|
||||||
} catch (final IOException e) {
|
|
||||||
LOG.error(ARTIFACT_UPLOAD_EXCEPTION, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (newFile.exists() && !newFile.delete()) {
|
|
||||||
LOG.error("Could not delete temporary file: {}", newFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Table getUploadDetailsTable() {
|
public Table getUploadDetailsTable() {
|
||||||
return uploadDetailsTable;
|
return uploadDetailsTable;
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ public class UploadLayout extends VerticalLayout {
|
|||||||
|
|
||||||
private Button discardBtn;
|
private Button discardBtn;
|
||||||
|
|
||||||
private UploadConfirmationwindow currentUploadConfirmationwindow;
|
private UploadConfirmationWindow currentUploadConfirmationwindow;
|
||||||
|
|
||||||
private VerticalLayout dropAreaLayout;
|
private VerticalLayout dropAreaLayout;
|
||||||
|
|
||||||
@@ -634,7 +634,7 @@ public class UploadLayout extends VerticalLayout {
|
|||||||
if (artifactUploadState.getFileSelected().isEmpty()) {
|
if (artifactUploadState.getFileSelected().isEmpty()) {
|
||||||
uiNotification.displayValidationError(i18n.get("message.error.noFileSelected"));
|
uiNotification.displayValidationError(i18n.get("message.error.noFileSelected"));
|
||||||
} else {
|
} else {
|
||||||
currentUploadConfirmationwindow = new UploadConfirmationwindow(this, artifactUploadState);
|
currentUploadConfirmationwindow = new UploadConfirmationWindow(this, artifactUploadState);
|
||||||
UI.getCurrent().addWindow(currentUploadConfirmationwindow.getUploadConfrimationWindow());
|
UI.getCurrent().addWindow(currentUploadConfirmationwindow.getUploadConfrimationWindow());
|
||||||
setConfirmationPopupHeightWidth(Page.getCurrent().getBrowserWindowWidth(),
|
setConfirmationPopupHeightWidth(Page.getCurrent().getBrowserWindowWidth(),
|
||||||
Page.getCurrent().getBrowserWindowHeight());
|
Page.getCurrent().getBrowserWindowHeight());
|
||||||
@@ -656,7 +656,7 @@ public class UploadLayout extends VerticalLayout {
|
|||||||
return spInfo;
|
return spInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentUploadConfirmationwindow(final UploadConfirmationwindow currentUploadConfirmationwindow) {
|
void setCurrentUploadConfirmationwindow(final UploadConfirmationWindow currentUploadConfirmationwindow) {
|
||||||
this.currentUploadConfirmationwindow = currentUploadConfirmationwindow;
|
this.currentUploadConfirmationwindow = currentUploadConfirmationwindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -136,25 +136,25 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
void onEvent(final UploadStatusEvent event) {
|
void onEvent(final UploadStatusEvent event) {
|
||||||
if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_IN_PROGRESS) {
|
if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_IN_PROGRESS) {
|
||||||
UI.getCurrent().access(
|
UI.getCurrent()
|
||||||
() -> updateProgress(event.getUploadStatus().getFileName(), event.getUploadStatus().getBytesRead(),
|
.access(() -> updateProgress(event.getUploadStatus().getFileName(),
|
||||||
event.getUploadStatus().getContentLength(), event.getUploadStatus().getSoftwareModule()));
|
event.getUploadStatus().getBytesRead(), event.getUploadStatus().getContentLength(),
|
||||||
|
event.getUploadStatus().getSoftwareModule()));
|
||||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STARTED) {
|
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STARTED) {
|
||||||
UI.getCurrent().access(() -> onStartOfUpload(event));
|
UI.getCurrent().access(() -> onStartOfUpload(event));
|
||||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STREAMING_FAILED) {
|
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STREAMING_FAILED) {
|
||||||
ui.access(() -> uploadFailed(event.getUploadStatus().getFileName(), event.getUploadStatus()
|
ui.access(() -> uploadFailed(event.getUploadStatus().getFileName(),
|
||||||
.getFailureReason(), event.getUploadStatus().getSoftwareModule()));
|
event.getUploadStatus().getFailureReason(), event.getUploadStatus().getSoftwareModule()));
|
||||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_SUCCESSFUL) {
|
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_SUCCESSFUL) {
|
||||||
UI.getCurrent().access(
|
UI.getCurrent().access(() -> uploadSucceeded(event.getUploadStatus().getFileName(),
|
||||||
() -> uploadSucceeded(event.getUploadStatus().getFileName(), event.getUploadStatus()
|
event.getUploadStatus().getSoftwareModule()));
|
||||||
.getSoftwareModule()));
|
|
||||||
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STREAMING_FINISHED) {
|
} else if (event.getUploadProgressEventType() == UploadStatusEventType.UPLOAD_STREAMING_FINISHED) {
|
||||||
ui.access(() -> uploadSucceeded(event.getUploadStatus().getFileName(), event.getUploadStatus()
|
ui.access(() -> uploadSucceeded(event.getUploadStatus().getFileName(),
|
||||||
.getSoftwareModule()));
|
event.getUploadStatus().getSoftwareModule()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onStartOfUpload(UploadStatusEvent event) {
|
private void onStartOfUpload(final UploadStatusEvent event) {
|
||||||
uploadSessionStarted();
|
uploadSessionStarted();
|
||||||
uploadStarted(event.getUploadStatus().getFileName(), event.getUploadStatus().getSoftwareModule());
|
uploadStarted(event.getUploadStatus().getFileName(), event.getUploadStatus().getSoftwareModule());
|
||||||
}
|
}
|
||||||
@@ -169,19 +169,19 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void restoreState() {
|
private void restoreState() {
|
||||||
Indexed container = grid.getContainerDataSource();
|
final Indexed container = grid.getContainerDataSource();
|
||||||
if (container.getItemIds().isEmpty()) {
|
if (container.getItemIds().isEmpty()) {
|
||||||
container.removeAllItems();
|
container.removeAllItems();
|
||||||
for (UploadStatusObject statusObject : artifactUploadState.getUploadedFileStatusList()) {
|
for (final UploadStatusObject statusObject : artifactUploadState.getUploadedFileStatusList()) {
|
||||||
Item item = container.addItem(getItemid(statusObject.getFilename(),
|
final Item item = container
|
||||||
statusObject.getSelectedSoftwareModule()));
|
.addItem(getItemid(statusObject.getFilename(), statusObject.getSelectedSoftwareModule()));
|
||||||
item.getItemProperty(REASON).setValue(statusObject.getReason() != null ? statusObject.getReason() : "");
|
item.getItemProperty(REASON).setValue(statusObject.getReason() != null ? statusObject.getReason() : "");
|
||||||
item.getItemProperty(STATUS).setValue(statusObject.getStatus());
|
item.getItemProperty(STATUS).setValue(statusObject.getStatus());
|
||||||
item.getItemProperty(PROGRESS).setValue(statusObject.getProgress());
|
item.getItemProperty(PROGRESS).setValue(statusObject.getProgress());
|
||||||
item.getItemProperty(FILE_NAME).setValue(statusObject.getFilename());
|
item.getItemProperty(FILE_NAME).setValue(statusObject.getFilename());
|
||||||
SoftwareModule sw = statusObject.getSelectedSoftwareModule();
|
final SoftwareModule sw = statusObject.getSelectedSoftwareModule();
|
||||||
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION).setValue(
|
item.getItemProperty(SPUILabelDefinitions.NAME_VERSION)
|
||||||
HawkbitCommonUtil.getFormattedNameVersion(sw.getName(), sw.getVersion()));
|
.setValue(HawkbitCommonUtil.getFormattedNameVersion(sw.getName(), sw.getVersion()));
|
||||||
}
|
}
|
||||||
if (artifactUploadState.isUploadCompleted()) {
|
if (artifactUploadState.isUploadCompleted()) {
|
||||||
minimizeButton.setEnabled(false);
|
minimizeButton.setEnabled(false);
|
||||||
@@ -209,7 +209,7 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Grid createGrid() {
|
private Grid createGrid() {
|
||||||
Grid statusGrid = new Grid(uploads);
|
final Grid statusGrid = new Grid(uploads);
|
||||||
statusGrid.addStyleName(SPUIStyleDefinitions.UPLOAD_STATUS_GRID);
|
statusGrid.addStyleName(SPUIStyleDefinitions.UPLOAD_STATUS_GRID);
|
||||||
statusGrid.setSelectionMode(SelectionMode.NONE);
|
statusGrid.setSelectionMode(SelectionMode.NONE);
|
||||||
statusGrid.setHeaderVisible(true);
|
statusGrid.setHeaderVisible(true);
|
||||||
@@ -219,7 +219,7 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private IndexedContainer getGridContainer() {
|
private IndexedContainer getGridContainer() {
|
||||||
IndexedContainer uploadContainer = new IndexedContainer();
|
final IndexedContainer uploadContainer = new IndexedContainer();
|
||||||
uploadContainer.addContainerProperty(STATUS, String.class, "Active");
|
uploadContainer.addContainerProperty(STATUS, String.class, "Active");
|
||||||
uploadContainer.addContainerProperty(FILE_NAME, String.class, null);
|
uploadContainer.addContainerProperty(FILE_NAME, String.class, null);
|
||||||
uploadContainer.addContainerProperty(PROGRESS, Double.class, 0D);
|
uploadContainer.addContainerProperty(PROGRESS, Double.class, 0D);
|
||||||
@@ -329,7 +329,7 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
HawkbitCommonUtil.getFormattedNameVersion(softwareModule.getName(), softwareModule.getVersion()));
|
HawkbitCommonUtil.getFormattedNameVersion(softwareModule.getName(), softwareModule.getVersion()));
|
||||||
}
|
}
|
||||||
grid.scrollToEnd();
|
grid.scrollToEnd();
|
||||||
UploadStatusObject uploadStatus = new UploadStatusObject(filename, softwareModule);
|
final UploadStatusObject uploadStatus = new UploadStatusObject(filename, softwareModule);
|
||||||
uploadStatus.setStatus("Active");
|
uploadStatus.setStatus("Active");
|
||||||
artifactUploadState.getUploadedFileStatusList().add(uploadStatus);
|
artifactUploadState.getUploadedFileStatusList().add(uploadStatus);
|
||||||
}
|
}
|
||||||
@@ -337,56 +337,53 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
void updateProgress(final String filename, final long readBytes, final long contentLength,
|
void updateProgress(final String filename, final long readBytes, final long contentLength,
|
||||||
final SoftwareModule softwareModule) {
|
final SoftwareModule softwareModule) {
|
||||||
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
||||||
double progress = (double) readBytes / (double) contentLength;
|
final double progress = (double) readBytes / (double) contentLength;
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
item.getItemProperty(PROGRESS).setValue(progress);
|
item.getItemProperty(PROGRESS).setValue(progress);
|
||||||
}
|
}
|
||||||
List<UploadStatusObject> uploadStatusObjectList = (List<UploadStatusObject>) artifactUploadState
|
final List<UploadStatusObject> uploadStatusObjectList = artifactUploadState.getUploadedFileStatusList().stream()
|
||||||
.getUploadedFileStatusList().stream().filter(e -> e.getFilename().equals(filename))
|
.filter(e -> e.getFilename().equals(filename)).collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
|
||||||
if (!uploadStatusObjectList.isEmpty()) {
|
if (!uploadStatusObjectList.isEmpty()) {
|
||||||
UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
final UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||||
uploadStatusObject.setProgress(progress);
|
uploadStatusObject.setProgress(progress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when each file upload is success.
|
* Called when each file upload is success.
|
||||||
*
|
*
|
||||||
* @param filename
|
* @param filename
|
||||||
* of the uploaded file.
|
* of the uploaded file.
|
||||||
* @param softwareModule
|
* @param softwareModule
|
||||||
* selected software module
|
* selected software module
|
||||||
*/
|
*/
|
||||||
public void uploadSucceeded(final String filename, SoftwareModule softwareModule) {
|
public void uploadSucceeded(final String filename, final SoftwareModule softwareModule) {
|
||||||
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
||||||
String status = "Finished";
|
final String status = "Finished";
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
item.getItemProperty(STATUS).setValue(status);
|
item.getItemProperty(STATUS).setValue(status);
|
||||||
}
|
}
|
||||||
List<UploadStatusObject> uploadStatusObjectList = (List<UploadStatusObject>) artifactUploadState
|
final List<UploadStatusObject> uploadStatusObjectList = artifactUploadState.getUploadedFileStatusList().stream()
|
||||||
.getUploadedFileStatusList().stream().filter(e -> e.getFilename().equals(filename))
|
.filter(e -> e.getFilename().equals(filename)).collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
|
||||||
if (!uploadStatusObjectList.isEmpty()) {
|
if (!uploadStatusObjectList.isEmpty()) {
|
||||||
UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
final UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||||
uploadStatusObject.setStatus(status);
|
uploadStatusObject.setStatus(status);
|
||||||
uploadStatusObject.setProgress(1d);
|
uploadStatusObject.setProgress(1d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void uploadFailed(final String filename, final String errorReason, SoftwareModule softwareModule) {
|
void uploadFailed(final String filename, final String errorReason, final SoftwareModule softwareModule) {
|
||||||
errorOccured = true;
|
errorOccured = true;
|
||||||
String status = "Failed";
|
final String status = "Failed";
|
||||||
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
final Item item = uploads.getItem(getItemid(filename, softwareModule));
|
||||||
if (item != null) {
|
if (item != null) {
|
||||||
item.getItemProperty(REASON).setValue(errorReason);
|
item.getItemProperty(REASON).setValue(errorReason);
|
||||||
item.getItemProperty(STATUS).setValue(status);
|
item.getItemProperty(STATUS).setValue(status);
|
||||||
}
|
}
|
||||||
List<UploadStatusObject> uploadStatusObjectList = (List<UploadStatusObject>) artifactUploadState
|
final List<UploadStatusObject> uploadStatusObjectList = artifactUploadState.getUploadedFileStatusList().stream()
|
||||||
.getUploadedFileStatusList().stream().filter(e -> e.getFilename().equals(filename))
|
.filter(e -> e.getFilename().equals(filename)).collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
|
||||||
if (!uploadStatusObjectList.isEmpty()) {
|
if (!uploadStatusObjectList.isEmpty()) {
|
||||||
UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
final UploadStatusObject uploadStatusObject = uploadStatusObjectList.get(0);
|
||||||
uploadStatusObject.setStatus(status);
|
uploadStatusObject.setStatus(status);
|
||||||
uploadStatusObject.setReason(errorReason);
|
uploadStatusObject.setReason(errorReason);
|
||||||
}
|
}
|
||||||
@@ -428,8 +425,8 @@ public class UploadStatusInfoWindow extends Window {
|
|||||||
return resizeBtn;
|
return resizeBtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resizeWindow(ClickEvent event) {
|
private void resizeWindow(final ClickEvent event) {
|
||||||
if (event.getButton().getIcon() == FontAwesome.EXPAND) {
|
if (FontAwesome.EXPAND.equals(event.getButton().getIcon())) {
|
||||||
event.getButton().setIcon(FontAwesome.COMPRESS);
|
event.getButton().setIcon(FontAwesome.COMPRESS);
|
||||||
setWindowMode(WindowMode.MAXIMIZED);
|
setWindowMode(WindowMode.MAXIMIZED);
|
||||||
resetColumnWidth();
|
resetColumnWidth();
|
||||||
|
|||||||
@@ -13,10 +13,6 @@ import com.vaadin.ui.AbstractColorPicker.Coordinates2Color;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts 2d-coordinates to a Color.
|
* Converts 2d-coordinates to a Color.
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class CoordinatesToColor implements Coordinates2Color {
|
public class CoordinatesToColor implements Coordinates2Color {
|
||||||
|
|
||||||
@@ -30,32 +26,31 @@ public class CoordinatesToColor implements Coordinates2Color {
|
|||||||
@Override
|
@Override
|
||||||
public int[] calculate(final Color color) {
|
public int[] calculate(final Color color) {
|
||||||
final float[] hsv = color.getHSV();
|
final float[] hsv = color.getHSV();
|
||||||
final int x = Math.round(hsv[0] * 220f);
|
final int x = Math.round(hsv[0] * 220F);
|
||||||
int y = 0;
|
final int y = calculateYCoordinateOfColor(hsv);
|
||||||
y = calculateYCoordinateOfColor(hsv);
|
|
||||||
return new int[] { x, y };
|
return new int[] { x, y };
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color calculateHSVColor(final int x, final int y) {
|
private static Color calculateHSVColor(final int x, final int y) {
|
||||||
final float h = x / 220f;
|
final float h = x / 220F;
|
||||||
float s = 1f;
|
float s = 1F;
|
||||||
float v = 1f;
|
float v = 1F;
|
||||||
if (y < 110) {
|
if (y < 110) {
|
||||||
s = y / 110f;
|
s = y / 110F;
|
||||||
} else if (y > 110) {
|
} else if (y > 110) {
|
||||||
v = 1f - (y - 110f) / 110f;
|
v = 1F - (y - 110F) / 110F;
|
||||||
}
|
}
|
||||||
return new Color(Color.HSVtoRGB(h, s, v));
|
return new Color(Color.HSVtoRGB(h, s, v));
|
||||||
}
|
}
|
||||||
|
|
||||||
private int calculateYCoordinateOfColor(final float[] hsv) {
|
private static int calculateYCoordinateOfColor(final float[] hsv) {
|
||||||
int y;
|
int y;
|
||||||
// lower half
|
// lower half
|
||||||
/* Assuming hsv[] array value will have in the range of 0 to 1 */
|
/* Assuming hsv[] array value will have in the range of 0 to 1 */
|
||||||
if (hsv[1] < 1f) {
|
if (hsv[1] < 1F) {
|
||||||
y = Math.round(hsv[1] * 110f);
|
y = Math.round(hsv[1] * 110F);
|
||||||
} else {
|
} else {
|
||||||
y = Math.round(110f - (hsv[1] + hsv[2]) * 110f);
|
y = Math.round(110F - (hsv[1] + hsv[2]) * 110F);
|
||||||
}
|
}
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,45 +33,43 @@ import com.vaadin.ui.UI;
|
|||||||
import com.vaadin.ui.themes.ValoTheme;
|
import com.vaadin.ui.themes.ValoTheme;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* DistributionSet Metadata details layout.
|
* DistributionSet Metadata details layout.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@VaadinSessionScope
|
@VaadinSessionScope
|
||||||
public class DistributionSetMetadatadetailslayout extends Table{
|
public class DistributionSetMetadatadetailslayout extends Table {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2913758299611837718L;
|
private static final long serialVersionUID = 2913758299611837718L;
|
||||||
|
|
||||||
|
|
||||||
private DistributionSetManagement distributionSetManagement;
|
|
||||||
|
|
||||||
private DsMetadataPopupLayout dsMetadataPopupLayout;
|
|
||||||
|
|
||||||
private static final String METADATA_KEY = "Key";
|
private static final String METADATA_KEY = "Key";
|
||||||
|
|
||||||
private static final String VIEW ="view";
|
private static final String VIEW = "view";
|
||||||
|
|
||||||
|
private transient DistributionSetManagement distributionSetManagement;
|
||||||
|
|
||||||
|
private DsMetadataPopupLayout dsMetadataPopupLayout;
|
||||||
|
|
||||||
private SpPermissionChecker permissionChecker;
|
private SpPermissionChecker permissionChecker;
|
||||||
|
|
||||||
private transient EntityFactory entityFactory;
|
private transient EntityFactory entityFactory;
|
||||||
|
|
||||||
private I18N i18n;
|
private I18N i18n;
|
||||||
|
|
||||||
private Long selectedDistSetId;
|
private Long selectedDistSetId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param i18n
|
* @param i18n
|
||||||
* @param permissionChecker
|
* @param permissionChecker
|
||||||
* @param distributionSetManagement
|
* @param distributionSetManagement
|
||||||
* @param dsMetadataPopupLayout
|
* @param dsMetadataPopupLayout
|
||||||
*/
|
*/
|
||||||
public void init(final I18N i18n, final SpPermissionChecker permissionChecker,
|
public void init(final I18N i18n, final SpPermissionChecker permissionChecker,
|
||||||
final DistributionSetManagement distributionSetManagement,
|
final DistributionSetManagement distributionSetManagement,
|
||||||
final DsMetadataPopupLayout dsMetadataPopupLayout,
|
final DsMetadataPopupLayout dsMetadataPopupLayout, final EntityFactory entityFactory) {
|
||||||
final EntityFactory entityFactory) {
|
|
||||||
this.i18n = i18n;
|
this.i18n = i18n;
|
||||||
this.permissionChecker = permissionChecker;
|
this.permissionChecker = permissionChecker;
|
||||||
this.distributionSetManagement = distributionSetManagement;
|
this.distributionSetManagement = distributionSetManagement;
|
||||||
@@ -80,45 +78,44 @@ public class DistributionSetMetadatadetailslayout extends Table{
|
|||||||
createDSMetadataTable();
|
createDSMetadataTable();
|
||||||
addCustomGeneratedColumns();
|
addCustomGeneratedColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populate software module metadata.
|
* Populate software module metadata.
|
||||||
*
|
*
|
||||||
* @param distributionSet
|
* @param distributionSet
|
||||||
*/
|
*/
|
||||||
public void populateDSMetadata(final DistributionSet distributionSet) {
|
public void populateDSMetadata(final DistributionSet distributionSet) {
|
||||||
removeAllItems();
|
removeAllItems();
|
||||||
if (null == distributionSet) {
|
if (null == distributionSet) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
selectedDistSetId = distributionSet.getId();
|
selectedDistSetId = distributionSet.getId();
|
||||||
final List<DistributionSetMetadata> dsMetadataList = distributionSet.getMetadata();
|
final List<DistributionSetMetadata> dsMetadataList = distributionSet.getMetadata();
|
||||||
if (null != dsMetadataList && !dsMetadataList.isEmpty()) {
|
if (null != dsMetadataList && !dsMetadataList.isEmpty()) {
|
||||||
dsMetadataList.forEach(dsMetadata -> setDSMetadataProperties(dsMetadata));
|
dsMetadataList.forEach(dsMetadata -> setDSMetadataProperties(dsMetadata));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create metadata .
|
* Create metadata.
|
||||||
*
|
*
|
||||||
* @param metadataKeyName
|
* @param metadataKeyName
|
||||||
*/
|
*/
|
||||||
public void createMetadata(final String metadataKeyName){
|
public void createMetadata(final String metadataKeyName) {
|
||||||
final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource();
|
final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource();
|
||||||
final Item item = metadataContainer.addItem(metadataKeyName);
|
final Item item = metadataContainer.addItem(metadataKeyName);
|
||||||
item.getItemProperty(METADATA_KEY).setValue(metadataKeyName);
|
item.getItemProperty(METADATA_KEY).setValue(metadataKeyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete metadata.
|
* Delete metadata.
|
||||||
*
|
*
|
||||||
* @param metadataKeyName
|
* @param metadataKeyName
|
||||||
*/
|
*/
|
||||||
public void deleteMetadata(final String metadataKeyName){
|
public void deleteMetadata(final String metadataKeyName) {
|
||||||
final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource();
|
final IndexedContainer metadataContainer = (IndexedContainer) getContainerDataSource();
|
||||||
metadataContainer.removeItem(metadataKeyName);
|
metadataContainer.removeItem(metadataKeyName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDSMetadataTable() {
|
private void createDSMetadataTable() {
|
||||||
@@ -131,9 +128,9 @@ public class DistributionSetMetadatadetailslayout extends Table{
|
|||||||
setContainerDataSource(getDistSetContainer());
|
setContainerDataSource(getDistSetContainer());
|
||||||
setColumnHeaderMode(ColumnHeaderMode.EXPLICIT);
|
setColumnHeaderMode(ColumnHeaderMode.EXPLICIT);
|
||||||
addDSMetadataTableHeader();
|
addDSMetadataTableHeader();
|
||||||
setSizeFull();
|
setSizeFull();
|
||||||
//same as height of other tabs in details tabsheet
|
// same as height of other tabs in details tabsheet
|
||||||
setHeight(116,Unit.PIXELS);
|
setHeight(116, Unit.PIXELS);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IndexedContainer getDistSetContainer() {
|
private IndexedContainer getDistSetContainer() {
|
||||||
@@ -141,7 +138,7 @@ public class DistributionSetMetadatadetailslayout extends Table{
|
|||||||
container.addContainerProperty(METADATA_KEY, String.class, "");
|
container.addContainerProperty(METADATA_KEY, String.class, "");
|
||||||
setColumnExpandRatio(METADATA_KEY, 0.7f);
|
setColumnExpandRatio(METADATA_KEY, 0.7f);
|
||||||
setColumnAlignment(METADATA_KEY, Align.LEFT);
|
setColumnAlignment(METADATA_KEY, Align.LEFT);
|
||||||
|
|
||||||
if (permissionChecker.hasUpdateDistributionPermission()) {
|
if (permissionChecker.hasUpdateDistributionPermission()) {
|
||||||
container.addContainerProperty(VIEW, Label.class, "");
|
container.addContainerProperty(VIEW, Label.class, "");
|
||||||
setColumnExpandRatio(VIEW, 0.2F);
|
setColumnExpandRatio(VIEW, 0.2F);
|
||||||
@@ -154,39 +151,36 @@ public class DistributionSetMetadatadetailslayout extends Table{
|
|||||||
setColumnHeader(METADATA_KEY, i18n.get("header.key"));
|
setColumnHeader(METADATA_KEY, i18n.get("header.key"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setDSMetadataProperties(final DistributionSetMetadata dsMetadata) {
|
||||||
private void setDSMetadataProperties(final DistributionSetMetadata dsMetadata){
|
|
||||||
final Item item = getContainerDataSource().addItem(dsMetadata.getKey());
|
final Item item = getContainerDataSource().addItem(dsMetadata.getKey());
|
||||||
item.getItemProperty(METADATA_KEY).setValue(dsMetadata.getKey());
|
item.getItemProperty(METADATA_KEY).setValue(dsMetadata.getKey());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addCustomGeneratedColumns() {
|
private void addCustomGeneratedColumns() {
|
||||||
addGeneratedColumn(METADATA_KEY,
|
addGeneratedColumn(METADATA_KEY, (source, itemId, columnId) -> customMetadataDetailButton((String) itemId));
|
||||||
(source, itemId, columnId) -> customMetadataDetailButton((String) itemId));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Button customMetadataDetailButton(final String metadataKey) {
|
private Button customMetadataDetailButton(final String metadataKey) {
|
||||||
final Button viewIcon = SPUIComponentProvider.getButton(getDetailLinkId(metadataKey), metadataKey, "View "
|
final Button viewIcon = SPUIComponentProvider.getButton(getDetailLinkId(metadataKey), metadataKey,
|
||||||
+ metadataKey + " Metadata details", null, false, null, SPUIButtonStyleSmallNoBorder.class);
|
"View " + metadataKey + " Metadata details", null, false, null, SPUIButtonStyleSmallNoBorder.class);
|
||||||
viewIcon.setData(metadataKey);
|
viewIcon.setData(metadataKey);
|
||||||
viewIcon.addStyleName(ValoTheme.BUTTON_TINY + " " + ValoTheme.BUTTON_LINK + " " + "on-focus-no-border link"
|
viewIcon.addStyleName(ValoTheme.BUTTON_TINY + " " + ValoTheme.BUTTON_LINK + " " + "on-focus-no-border link"
|
||||||
+ " " + "text-style");
|
+ " " + "text-style");
|
||||||
viewIcon.addClickListener(event -> showMetadataDetails(selectedDistSetId, metadataKey));
|
viewIcon.addClickListener(event -> showMetadataDetails(selectedDistSetId, metadataKey));
|
||||||
return viewIcon;
|
return viewIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getDetailLinkId(final String name) {
|
private static String getDetailLinkId(final String name) {
|
||||||
return new StringBuilder(SPUIComponentIdProvider.DS_METADATA_DETAIL_LINK).append('.').append(name)
|
return new StringBuilder(SPUIComponentIdProvider.DS_METADATA_DETAIL_LINK).append('.').append(name).toString();
|
||||||
.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showMetadataDetails(final Long selectedDistSetId , final String metadataKey) {
|
private void showMetadataDetails(final Long selectedDistSetId, final String metadataKey) {
|
||||||
DistributionSet distSet = distributionSetManagement.findDistributionSetById(selectedDistSetId);
|
final DistributionSet distSet = distributionSetManagement.findDistributionSetById(selectedDistSetId);
|
||||||
|
|
||||||
/* display the window */
|
/* display the window */
|
||||||
UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(distSet,
|
UI.getCurrent().addWindow(dsMetadataPopupLayout.getWindow(distSet,
|
||||||
entityFactory.generateDistributionSetMetadata(distSet, metadataKey, "") ));
|
entityFactory.generateDistributionSetMetadata(distSet, metadataKey, "")));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.common.filterlayout;
|
package org.eclipse.hawkbit.ui.common.filterlayout;
|
||||||
|
|
||||||
|
import static org.eclipse.hawkbit.ui.utils.SPUIDefinitions.NO_TAG_BUTTON_ID;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -50,7 +52,7 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize layout of filter buttons.
|
* Initialize layout of filter buttons.
|
||||||
*
|
*
|
||||||
* @param filterButtonClickBehaviour
|
* @param filterButtonClickBehaviour
|
||||||
* click behaviour of filter buttons.
|
* click behaviour of filter buttons.
|
||||||
*/
|
*/
|
||||||
@@ -95,16 +97,12 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
container.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, null, true, true);
|
container.addContainerProperty(SPUILabelDefinitions.VAR_NAME, String.class, null, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
protected void addColumn() {
|
protected void addColumn() {
|
||||||
addGeneratedColumn(FILTER_BUTTON_COLUMN, (source, itemId, columnId) -> addGeneratedCell(itemId));
|
addGeneratedColumn(FILTER_BUTTON_COLUMN, (source, itemId, columnId) -> addGeneratedCell(itemId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param itemId
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private DragAndDropWrapper addGeneratedCell(final Object itemId) {
|
private DragAndDropWrapper addGeneratedCell(final Object itemId) {
|
||||||
|
|
||||||
final Item item = getItem(itemId);
|
final Item item = getItem(itemId);
|
||||||
final Long id = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_ID).getValue();
|
final Long id = (Long) item.getItemProperty(SPUILabelDefinitions.VAR_ID).getValue();
|
||||||
final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
final String name = (String) item.getItemProperty(SPUILabelDefinitions.VAR_NAME).getValue();
|
||||||
@@ -116,16 +114,18 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
? item.getItemProperty(SPUILabelDefinitions.VAR_COLOR).getValue().toString() : DEFAULT_GREEN;
|
? item.getItemProperty(SPUILabelDefinitions.VAR_COLOR).getValue().toString() : DEFAULT_GREEN;
|
||||||
final Button typeButton = createFilterButton(id, name, desc, color, itemId);
|
final Button typeButton = createFilterButton(id, name, desc, color, itemId);
|
||||||
typeButton.addClickListener(event -> filterButtonClickBehaviour.processFilterButtonClick(event));
|
typeButton.addClickListener(event -> filterButtonClickBehaviour.processFilterButtonClick(event));
|
||||||
if (typeButton.getData().equals(SPUIDefinitions.NO_TAG_BUTTON_ID) && isNoTagSateSelected()) {
|
|
||||||
filterButtonClickBehaviour.setDefaultClickedButton(typeButton);
|
if ((NO_TAG_BUTTON_ID.equals(typeButton.getData()) && isNoTagStateSelected())
|
||||||
} else if (id != null && isClickedByDefault(name)) {
|
|| (id != null && isClickedByDefault(name))) {
|
||||||
|
|
||||||
filterButtonClickBehaviour.setDefaultClickedButton(typeButton);
|
filterButtonClickBehaviour.setDefaultClickedButton(typeButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
return createDragAndDropWrapper(typeButton, name, id);
|
return createDragAndDropWrapper(typeButton, name, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isNoTagSateSelected() {
|
protected boolean isNoTagStateSelected() {
|
||||||
return Boolean.FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private DragAndDropWrapper createDragAndDropWrapper(final Button tagButton, final String name, final Long id) {
|
private DragAndDropWrapper createDragAndDropWrapper(final Button tagButton, final String name, final Long id) {
|
||||||
@@ -195,21 +195,21 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Id of the buttons table to be used in test cases.
|
* Id of the buttons table to be used in test cases.
|
||||||
*
|
*
|
||||||
* @return Id of the Button table.
|
* @return Id of the Button table.
|
||||||
*/
|
*/
|
||||||
protected abstract String getButtonsTableId();
|
protected abstract String getButtonsTableId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create new lazyquery container to display the buttons.
|
* create new lazyquery container to display the buttons.
|
||||||
*
|
*
|
||||||
* @return reference of {@link LazyQueryContainer}
|
* @return reference of {@link LazyQueryContainer}
|
||||||
*/
|
*/
|
||||||
protected abstract LazyQueryContainer createButtonsLazyQueryContainer();
|
protected abstract LazyQueryContainer createButtonsLazyQueryContainer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if button should be displayed as clicked by default.
|
* Check if button should be displayed as clicked by default.
|
||||||
*
|
*
|
||||||
* @param buttonCaption
|
* @param buttonCaption
|
||||||
* button caption
|
* button caption
|
||||||
* @return true if button is clicked
|
* @return true if button is clicked
|
||||||
@@ -218,7 +218,7 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get filter button Id.
|
* Get filter button Id.
|
||||||
*
|
*
|
||||||
* @param name
|
* @param name
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -226,7 +226,7 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Drop Handler for Filter Buttons.
|
* Get Drop Handler for Filter Buttons.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected abstract DropHandler getFilterButtonDropHandler();
|
protected abstract DropHandler getFilterButtonDropHandler();
|
||||||
@@ -234,14 +234,14 @@ public abstract class AbstractFilterButtons extends Table {
|
|||||||
/**
|
/**
|
||||||
* Get prefix Id of Button Wrapper to be used for drag and drop, delete and
|
* Get prefix Id of Button Wrapper to be used for drag and drop, delete and
|
||||||
* test cases.
|
* test cases.
|
||||||
*
|
*
|
||||||
* @return prefix Id of Button Wrapper
|
* @return prefix Id of Button Wrapper
|
||||||
*/
|
*/
|
||||||
protected abstract String getButttonWrapperIdPrefix();
|
protected abstract String getButttonWrapperIdPrefix();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get info to be set for the button wrapper.
|
* Get info to be set for the button wrapper.
|
||||||
*
|
*
|
||||||
* @return button wrapper info.
|
* @return button wrapper info.
|
||||||
*/
|
*/
|
||||||
protected abstract String getButtonWrapperData();
|
protected abstract String getButtonWrapperData();
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.eclipse.hawkbit.repository.model.BaseEntity;
|
import org.eclipse.hawkbit.repository.model.BaseEntity;
|
||||||
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
import org.eclipse.hawkbit.repository.model.DistributionSet;
|
||||||
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
import org.eclipse.hawkbit.ui.common.UserDetailsFormatter;
|
||||||
|
import org.eclipse.hawkbit.ui.decorators.HeaderLayoutDecorator;
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUIButtonDecorator;
|
import org.eclipse.hawkbit.ui.decorators.SPUIButtonDecorator;
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUIComboBoxDecorator;
|
import org.eclipse.hawkbit.ui.decorators.SPUIComboBoxDecorator;
|
||||||
import org.eclipse.hawkbit.ui.decorators.HeaderLayoutDecorator;
|
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUILabelDecorator;
|
import org.eclipse.hawkbit.ui.decorators.SPUILabelDecorator;
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUITextAreaDecorator;
|
import org.eclipse.hawkbit.ui.decorators.SPUITextAreaDecorator;
|
||||||
import org.eclipse.hawkbit.ui.decorators.SPUITextFieldDecorator;
|
import org.eclipse.hawkbit.ui.decorators.SPUITextFieldDecorator;
|
||||||
@@ -82,8 +82,6 @@ public final class SPUIComponentProvider {
|
|||||||
/**
|
/**
|
||||||
* Get HorizontalLayout UI component.
|
* Get HorizontalLayout UI component.
|
||||||
*
|
*
|
||||||
* @param className
|
|
||||||
* as Layout
|
|
||||||
* @return HorizontalLayout as UI
|
* @return HorizontalLayout as UI
|
||||||
*/
|
*/
|
||||||
public static HorizontalLayout getHorizontalLayout() {
|
public static HorizontalLayout getHorizontalLayout() {
|
||||||
@@ -117,8 +115,7 @@ public final class SPUIComponentProvider {
|
|||||||
hLayout = layoutDecorator.decorate(hLayout);
|
hLayout = layoutDecorator.decorate(hLayout);
|
||||||
|
|
||||||
} catch (final InstantiationException | IllegalAccessException exception) {
|
} catch (final InstantiationException | IllegalAccessException exception) {
|
||||||
LOG.error("Error occured while creating horizontal decorator " + HeaderLayoutDecorator.class,
|
LOG.error("Error occured while creating horizontal decorator " + HeaderLayoutDecorator.class, exception);
|
||||||
exception);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return hLayout;
|
return hLayout;
|
||||||
@@ -139,7 +136,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get window component.
|
* Get window component.
|
||||||
*
|
*
|
||||||
* @param caption
|
* @param caption
|
||||||
* window caption
|
* window caption
|
||||||
* @param id
|
* @param id
|
||||||
@@ -154,7 +151,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Label UI component.
|
* Get Label UI component.
|
||||||
*
|
*
|
||||||
* @param caption
|
* @param caption
|
||||||
* set the caption of the textfield
|
* set the caption of the textfield
|
||||||
* @param style
|
* @param style
|
||||||
@@ -182,7 +179,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Label UI component. *
|
* Get Label UI component. *
|
||||||
*
|
*
|
||||||
* @param caption
|
* @param caption
|
||||||
* set the caption of the textArea
|
* set the caption of the textArea
|
||||||
* @param style
|
* @param style
|
||||||
@@ -206,7 +203,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Label UI component.
|
* Get Label UI component.
|
||||||
*
|
*
|
||||||
* @param caption
|
* @param caption
|
||||||
* caption of the combo box
|
* caption of the combo box
|
||||||
* @param height
|
* @param height
|
||||||
@@ -252,7 +249,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Button - Factory Approach for decoration.
|
* Get Button - Factory Approach for decoration.
|
||||||
*
|
*
|
||||||
* @param id
|
* @param id
|
||||||
* as string
|
* as string
|
||||||
* @param buttonName
|
* @param buttonName
|
||||||
@@ -289,7 +286,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the style required.
|
* Get the style required.
|
||||||
*
|
*
|
||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
public static String getPinButtonStyle() {
|
public static String getPinButtonStyle() {
|
||||||
@@ -305,7 +302,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get DistributionSet Info Panel.
|
* Get DistributionSet Info Panel.
|
||||||
*
|
*
|
||||||
* @param distributionSet
|
* @param distributionSet
|
||||||
* as DistributionSet
|
* as DistributionSet
|
||||||
* @param caption
|
* @param caption
|
||||||
@@ -323,7 +320,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to CreateName value labels.
|
* Method to CreateName value labels.
|
||||||
*
|
*
|
||||||
* @param label
|
* @param label
|
||||||
* as string
|
* as string
|
||||||
* @param values
|
* @param values
|
||||||
@@ -356,7 +353,7 @@ public final class SPUIComponentProvider {
|
|||||||
/**
|
/**
|
||||||
* Create label which represents the {@link BaseEntity#getCreatedBy()} by
|
* Create label which represents the {@link BaseEntity#getCreatedBy()} by
|
||||||
* user name
|
* user name
|
||||||
*
|
*
|
||||||
* @param i18n
|
* @param i18n
|
||||||
* the i18n
|
* the i18n
|
||||||
* @param baseEntity
|
* @param baseEntity
|
||||||
@@ -371,7 +368,7 @@ public final class SPUIComponentProvider {
|
|||||||
/**
|
/**
|
||||||
* Create label which represents the
|
* Create label which represents the
|
||||||
* {@link BaseEntity#getLastModifiedBy()()} by user name
|
* {@link BaseEntity#getLastModifiedBy()()} by user name
|
||||||
*
|
*
|
||||||
* @param i18n
|
* @param i18n
|
||||||
* the i18n
|
* the i18n
|
||||||
* @param baseEntity
|
* @param baseEntity
|
||||||
@@ -385,7 +382,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Bold Text.
|
* Get Bold Text.
|
||||||
*
|
*
|
||||||
* @param text
|
* @param text
|
||||||
* as String
|
* as String
|
||||||
* @return String as bold
|
* @return String as bold
|
||||||
@@ -396,7 +393,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the layout for Target:Controller Attributes.
|
* Get the layout for Target:Controller Attributes.
|
||||||
*
|
*
|
||||||
* @param controllerAttibs
|
* @param controllerAttibs
|
||||||
* as Map
|
* as Map
|
||||||
* @return VerticalLayout
|
* @return VerticalLayout
|
||||||
@@ -407,7 +404,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Tabsheet.
|
* Get Tabsheet.
|
||||||
*
|
*
|
||||||
* @return SPUITabSheet
|
* @return SPUITabSheet
|
||||||
*/
|
*/
|
||||||
public static TabSheet getDetailsTabSheet() {
|
public static TabSheet getDetailsTabSheet() {
|
||||||
@@ -416,7 +413,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Layout of tabs in detail tabsheet.
|
* Layout of tabs in detail tabsheet.
|
||||||
*
|
*
|
||||||
* @return VerticalLayout
|
* @return VerticalLayout
|
||||||
*/
|
*/
|
||||||
public static VerticalLayout getDetailTabLayout() {
|
public static VerticalLayout getDetailTabLayout() {
|
||||||
@@ -429,7 +426,7 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to create a link.
|
* Method to create a link.
|
||||||
*
|
*
|
||||||
* @param id
|
* @param id
|
||||||
* of the link
|
* of the link
|
||||||
* @param name
|
* @param name
|
||||||
@@ -465,10 +462,10 @@ public final class SPUIComponentProvider {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates help/documentation links from within management UI.
|
* Generates help/documentation links from within management UI.
|
||||||
*
|
*
|
||||||
* @param uri
|
* @param uri
|
||||||
* to documentation site
|
* to documentation site
|
||||||
*
|
*
|
||||||
* @return generated link
|
* @return generated link
|
||||||
*/
|
*/
|
||||||
public static Link getHelpLink(final String uri) {
|
public static Link getHelpLink(final String uri) {
|
||||||
|
|||||||
@@ -17,21 +17,22 @@ import com.vaadin.client.renderers.ClickableRenderer.RendererClickHandler;
|
|||||||
import com.vaadin.shared.ui.Connect;
|
import com.vaadin.shared.ui.Connect;
|
||||||
|
|
||||||
import elemental.json.JsonObject;
|
import elemental.json.JsonObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A connector for {@link CustomObjectRenderer }.
|
* A connector for {@link CustomObjectRenderer }.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer.class)
|
@Connect(org.eclipse.hawkbit.ui.customrenderers.renderers.RolloutRenderer.class)
|
||||||
public class RolloutRendererConnector extends ClickableRendererConnector<RolloutRendererData> {
|
public class RolloutRendererConnector extends ClickableRendererConnector<RolloutRendererData> {
|
||||||
private static final long serialVersionUID = 7734682321931830566L;
|
private static final long serialVersionUID = 7734682321931830566L;
|
||||||
|
|
||||||
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer getRenderer() {
|
@Override
|
||||||
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer) super.getRenderer();
|
public org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer getRenderer() {
|
||||||
}
|
return (org.eclipse.hawkbit.ui.customrenderers.client.renderers.RolloutRenderer) super.getRenderer();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected HandlerRegistration addClickHandler(
|
protected HandlerRegistration addClickHandler(final RendererClickHandler<JsonObject> handler) {
|
||||||
RendererClickHandler<JsonObject> handler) {
|
|
||||||
return getRenderer().addClickHandler(handler);
|
return getRenderer().addClickHandler(handler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,52 +11,42 @@ package org.eclipse.hawkbit.ui.customrenderers.client.renderers;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RendererData class with Name and Status.
|
* RendererData class with name and status.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class RolloutRendererData implements Serializable {
|
public class RolloutRendererData implements Serializable {
|
||||||
private static final long serialVersionUID = -5018181529953620263L;
|
|
||||||
|
|
||||||
private String name;
|
private static final long serialVersionUID = -5018181529953620263L;
|
||||||
|
|
||||||
private String status;
|
private String name;
|
||||||
|
|
||||||
/**
|
private String status;
|
||||||
* Initialize the RendererData.
|
|
||||||
*/
|
|
||||||
public RolloutRendererData() {
|
|
||||||
|
|
||||||
}
|
/**
|
||||||
|
* Initialize the RendererData.
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* Name of the Rollout.
|
||||||
|
* @param status
|
||||||
|
* Status of Rollout.
|
||||||
|
*/
|
||||||
|
public RolloutRendererData(final String name, final String status) {
|
||||||
|
this.name = name;
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
public String getName() {
|
||||||
* Initialize the RendererData.
|
return name;
|
||||||
*
|
}
|
||||||
* @param name
|
|
||||||
* Name of the Rollout.
|
|
||||||
* @param status
|
|
||||||
* Status of Rollout.
|
|
||||||
*/
|
|
||||||
public RolloutRendererData(String name, String status) {
|
|
||||||
super();
|
|
||||||
this.name = name;
|
|
||||||
this.status = status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
public void setName(final String name) {
|
||||||
return name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public String getStatus() {
|
||||||
this.name = name;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStatus(String status) {
|
|
||||||
this.status = status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public void setStatus(final String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,46 +16,44 @@ import com.vaadin.ui.renderers.ClickableRenderer;
|
|||||||
import elemental.json.JsonValue;
|
import elemental.json.JsonValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders button with provided CustomObject.
|
* Renders button with provided CustomObject. Used to display button with link.
|
||||||
* Used to display button with link.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData> {
|
public class RolloutRenderer extends ClickableRenderer<RolloutRendererData> {
|
||||||
|
|
||||||
private static final long serialVersionUID = -8754180585906263554L;
|
private static final long serialVersionUID = -8754180585906263554L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new custom object renderer.
|
* Creates a new custom object renderer.
|
||||||
*/
|
*/
|
||||||
public RolloutRenderer() {
|
public RolloutRenderer() {
|
||||||
super(RolloutRendererData.class, null);
|
super(RolloutRendererData.class, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize custom object renderer with {@link Class<CustomObject>}
|
|
||||||
*
|
|
||||||
* @param presentationType
|
|
||||||
* Class<CustomObject>
|
|
||||||
*/
|
|
||||||
|
|
||||||
public RolloutRenderer(Class<RolloutRendererData> presentationType) {
|
/**
|
||||||
super(presentationType);
|
* Initialize custom object renderer with the given type.
|
||||||
}
|
*
|
||||||
|
* @param presentationType
|
||||||
|
* Class<CustomObject>
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
public RolloutRenderer(final Class<RolloutRendererData> presentationType) {
|
||||||
* Creates a new custom object renderer and adds the given click listener to it.
|
super(presentationType);
|
||||||
*
|
}
|
||||||
* @param listener
|
|
||||||
* the click listener to register
|
|
||||||
*/
|
|
||||||
public RolloutRenderer(RendererClickListener listener) {
|
|
||||||
this();
|
|
||||||
addClickListener(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public JsonValue encode(RolloutRendererData resource) {
|
* Creates a new custom object renderer and adds the given click listener to
|
||||||
return super.encode(resource, RolloutRendererData.class);
|
* it.
|
||||||
}
|
*
|
||||||
|
* @param listener
|
||||||
|
* the click listener to register
|
||||||
|
*/
|
||||||
|
public RolloutRenderer(final RendererClickListener listener) {
|
||||||
|
this();
|
||||||
|
addClickListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonValue encode(final RolloutRendererData resource) {
|
||||||
|
return super.encode(resource, RolloutRendererData.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,9 +21,6 @@ import com.vaadin.ui.Window;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorator for Window.
|
* Decorator for Window.
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class SPUIWindowDecorator {
|
public final class SPUIWindowDecorator {
|
||||||
|
|
||||||
@@ -36,7 +33,7 @@ public final class SPUIWindowDecorator {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorates window based on type.
|
* Decorates window based on type.
|
||||||
*
|
*
|
||||||
* @param caption
|
* @param caption
|
||||||
* window caption
|
* window caption
|
||||||
* @param id
|
* @param id
|
||||||
@@ -48,36 +45,38 @@ public final class SPUIWindowDecorator {
|
|||||||
public static CommonDialogWindow getWindow(final String caption, final String id, final String type,
|
public static CommonDialogWindow getWindow(final String caption, final String id, final String type,
|
||||||
final Component content, final ClickListener saveButtonClickListener,
|
final Component content, final ClickListener saveButtonClickListener,
|
||||||
final ClickListener cancelButtonClickListener, final String helpLink, final AbstractLayout layout,
|
final ClickListener cancelButtonClickListener, final String helpLink, final AbstractLayout layout,
|
||||||
final I18N i18n) {
|
final I18N i18n) {
|
||||||
CommonDialogWindow window = null;
|
|
||||||
if (SPUIDefinitions.CUSTOM_METADATA_WINDOW.equals(type)) {
|
|
||||||
window = new CustomCommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
|
||||||
cancelButtonClickListener, layout, i18n);
|
|
||||||
window.setDraggable(true);
|
|
||||||
window.setClosable(true);
|
|
||||||
} else {
|
|
||||||
window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
|
||||||
cancelButtonClickListener, layout, i18n);
|
|
||||||
if (null != id) {
|
|
||||||
window.setId(id);
|
|
||||||
}
|
|
||||||
if (SPUIDefinitions.CONFIRMATION_WINDOW.equals(type)) {
|
|
||||||
window.setDraggable(false);
|
|
||||||
window.setClosable(true);
|
|
||||||
window.addStyleName(SPUIStyleDefinitions.CONFIRMATION_WINDOW_CAPTION);
|
|
||||||
|
|
||||||
} else if (SPUIDefinitions.CREATE_UPDATE_WINDOW.equals(type)) {
|
CommonDialogWindow window;
|
||||||
window.setDraggable(true);
|
|
||||||
window.setClosable(true);
|
if (SPUIDefinitions.CUSTOM_METADATA_WINDOW.equals(type)) {
|
||||||
}
|
window = new CustomCommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
||||||
}
|
cancelButtonClickListener, layout, i18n);
|
||||||
return window;
|
window.setDraggable(true);
|
||||||
}
|
window.setClosable(true);
|
||||||
|
} else {
|
||||||
|
window = new CommonDialogWindow(caption, content, helpLink, saveButtonClickListener,
|
||||||
|
cancelButtonClickListener, layout, i18n);
|
||||||
|
if (null != id) {
|
||||||
|
window.setId(id);
|
||||||
|
}
|
||||||
|
if (SPUIDefinitions.CONFIRMATION_WINDOW.equals(type)) {
|
||||||
|
window.setDraggable(false);
|
||||||
|
window.setClosable(true);
|
||||||
|
window.addStyleName(SPUIStyleDefinitions.CONFIRMATION_WINDOW_CAPTION);
|
||||||
|
|
||||||
|
} else if (SPUIDefinitions.CREATE_UPDATE_WINDOW.equals(type)) {
|
||||||
|
window.setDraggable(true);
|
||||||
|
window.setClosable(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return window;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorates window based on type.
|
* Decorates window based on type.
|
||||||
*
|
*
|
||||||
* @param caption
|
* @param caption
|
||||||
* window caption
|
* window caption
|
||||||
* @param id
|
* @param id
|
||||||
|
|||||||
@@ -117,5 +117,4 @@ public class DSTypeFilterButtons extends AbstractFilterButtons {
|
|||||||
private void refreshTypeTable() {
|
private void refreshTypeTable() {
|
||||||
setContainerDataSource(createButtonsLazyQueryContainer());
|
setContainerDataSource(createButtonsLazyQueryContainer());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,11 +15,9 @@ import org.eclipse.hawkbit.repository.SoftwareManagement;
|
|||||||
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
import org.eclipse.hawkbit.repository.SpPermissionChecker;
|
||||||
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
import org.eclipse.hawkbit.repository.model.SoftwareModule;
|
||||||
import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata;
|
import org.eclipse.hawkbit.repository.model.SoftwareModuleMetadata;
|
||||||
import org.eclipse.hawkbit.ui.artifacts.state.ArtifactUploadState;
|
|
||||||
import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout;
|
import org.eclipse.hawkbit.ui.common.AbstractMetadataPopupLayout;
|
||||||
import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent;
|
import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent;
|
||||||
import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent.MetadataUIEvent;
|
import org.eclipse.hawkbit.ui.distributions.event.MetadataEvent.MetadataUIEvent;
|
||||||
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import com.vaadin.spring.annotation.SpringComponent;
|
import com.vaadin.spring.annotation.SpringComponent;
|
||||||
@@ -27,7 +25,6 @@ import com.vaadin.spring.annotation.ViewScope;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Pop up layout to display software module metadata.
|
* Pop up layout to display software module metadata.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@ViewScope
|
@ViewScope
|
||||||
@@ -39,39 +36,35 @@ public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout<SoftwareM
|
|||||||
private transient SoftwareManagement softwareManagement;
|
private transient SoftwareManagement softwareManagement;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ArtifactUploadState artifactUploadState;
|
private transient EntityFactory entityFactory;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private EntityFactory entityFactory;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private ManageDistUIState manageDistUIState;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
protected SpPermissionChecker permChecker;
|
protected SpPermissionChecker permChecker;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void checkForDuplicate(SoftwareModule entity, String value) {
|
protected void checkForDuplicate(final SoftwareModule entity, final String value) {
|
||||||
softwareManagement.findSoftwareModuleMetadata(entity, value);
|
softwareManagement.findSoftwareModuleMetadata(entity, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create metadata for SWModule.
|
* Create metadata for SWModule.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected SoftwareModuleMetadata createMetadata(SoftwareModule entity, String key, String value) {
|
protected SoftwareModuleMetadata createMetadata(final SoftwareModule entity, final String key, final String value) {
|
||||||
SoftwareModuleMetadata swMetadata = softwareManagement.createSoftwareModuleMetadata(entityFactory
|
final SoftwareModuleMetadata swMetadata = softwareManagement
|
||||||
.generateSoftwareModuleMetadata(entity, key, value));
|
.createSoftwareModuleMetadata(entityFactory.generateSoftwareModuleMetadata(entity, key, value));
|
||||||
setSelectedEntity(swMetadata.getSoftwareModule());
|
setSelectedEntity(swMetadata.getSoftwareModule());
|
||||||
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA, swMetadata));
|
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.CREATE_SOFTWARE_MODULE_METADATA, swMetadata));
|
||||||
return swMetadata;
|
return swMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update metadata for SWModule.
|
* Update metadata for SWModule.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected SoftwareModuleMetadata updateMetadata(SoftwareModule entity, String key, String value) {
|
protected SoftwareModuleMetadata updateMetadata(final SoftwareModule entity, final String key, final String value) {
|
||||||
SoftwareModuleMetadata swMetadata = softwareManagement.updateSoftwareModuleMetadata(entityFactory
|
final SoftwareModuleMetadata swMetadata = softwareManagement
|
||||||
.generateSoftwareModuleMetadata(entity, key, value));
|
.updateSoftwareModuleMetadata(entityFactory.generateSoftwareModuleMetadata(entity, key, value));
|
||||||
setSelectedEntity(swMetadata.getSoftwareModule());
|
setSelectedEntity(swMetadata.getSoftwareModule());
|
||||||
return swMetadata;
|
return swMetadata;
|
||||||
}
|
}
|
||||||
@@ -80,25 +73,24 @@ public class SwMetadataPopupLayout extends AbstractMetadataPopupLayout<SoftwareM
|
|||||||
protected List<SoftwareModuleMetadata> getMetadataList() {
|
protected List<SoftwareModuleMetadata> getMetadataList() {
|
||||||
return getSelectedEntity().getMetadata();
|
return getSelectedEntity().getMetadata();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* delete metadata for SWModule.
|
* delete metadata for SWModule.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void deleteMetadata(SoftwareModule entity, String key, String value) {
|
protected void deleteMetadata(final SoftwareModule entity, final String key, final String value) {
|
||||||
SoftwareModuleMetadata swMetadata = entityFactory.generateSoftwareModuleMetadata(entity, key, value);
|
final SoftwareModuleMetadata swMetadata = entityFactory.generateSoftwareModuleMetadata(entity, key, value);
|
||||||
softwareManagement.deleteSoftwareModuleMetadata(entity, key);
|
softwareManagement.deleteSoftwareModuleMetadata(entity, key);
|
||||||
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA, swMetadata));
|
eventBus.publish(this, new MetadataEvent(MetadataUIEvent.DELETE_SOFTWARE_MODULE_METADATA, swMetadata));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean hasCreatePermission() {
|
protected boolean hasCreatePermission() {
|
||||||
return permChecker.hasCreateDistributionPermission();
|
return permChecker.hasCreateDistributionPermission();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean hasUpdatePermission() {
|
protected boolean hasUpdatePermission() {
|
||||||
return permChecker.hasUpdateDistributionPermission();
|
return permChecker.hasUpdateDistributionPermission();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.distributions.smtype;
|
package org.eclipse.hawkbit.ui.distributions.smtype;
|
||||||
|
|
||||||
|
import static org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.ADD_SOFTWARE_MODULE_TYPE;
|
||||||
|
import static org.eclipse.hawkbit.ui.artifacts.event.SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.UPDATE_SOFTWARE_MODULE_TYPE;
|
||||||
|
import static org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider.SW_MODULE_TYPE_TABLE_ID;
|
||||||
|
import static org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions.VAR_NAME;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -19,7 +24,6 @@ import org.eclipse.hawkbit.ui.distributions.event.SaveActionWindowEvent;
|
|||||||
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
|
import org.eclipse.hawkbit.ui.distributions.state.ManageDistUIState;
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
import org.eclipse.hawkbit.ui.utils.SPUIComponentIdProvider;
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
import org.eclipse.hawkbit.ui.utils.SPUIDefinitions;
|
||||||
import org.eclipse.hawkbit.ui.utils.SPUILabelDefinitions;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;
|
import org.vaadin.addons.lazyquerycontainer.BeanQueryFactory;
|
||||||
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
|
import org.vaadin.addons.lazyquerycontainer.LazyQueryContainer;
|
||||||
@@ -35,10 +39,9 @@ import com.vaadin.spring.annotation.ViewScope;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Software Module Type filter buttons.
|
* Software Module Type filter buttons.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SpringComponent
|
|
||||||
@ViewScope
|
@ViewScope
|
||||||
|
@SpringComponent
|
||||||
public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
||||||
|
|
||||||
private static final long serialVersionUID = 6804534533362387433L;
|
private static final long serialVersionUID = 6804534533362387433L;
|
||||||
@@ -51,7 +54,7 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getButtonsTableId() {
|
protected String getButtonsTableId() {
|
||||||
return SPUIComponentIdProvider.SW_MODULE_TYPE_TABLE_ID;
|
return SW_MODULE_TYPE_TABLE_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -60,7 +63,7 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
|||||||
final BeanQueryFactory<SoftwareModuleTypeBeanQuery> typeQF = new BeanQueryFactory<>(
|
final BeanQueryFactory<SoftwareModuleTypeBeanQuery> typeQF = new BeanQueryFactory<>(
|
||||||
SoftwareModuleTypeBeanQuery.class);
|
SoftwareModuleTypeBeanQuery.class);
|
||||||
typeQF.setQueryConfiguration(queryConfig);
|
typeQF.setQueryConfiguration(queryConfig);
|
||||||
return new LazyQueryContainer(new LazyQueryDefinition(true, 20, SPUILabelDefinitions.VAR_NAME), typeQF);
|
return new LazyQueryContainer(new LazyQueryDefinition(true, 20, VAR_NAME), typeQF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -70,8 +73,8 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isClickedByDefault(final String typeName) {
|
protected boolean isClickedByDefault(final String typeName) {
|
||||||
return manageDistUIState.getSoftwareModuleFilters().getSoftwareModuleType().isPresent()
|
return manageDistUIState.getSoftwareModuleFilters().getSoftwareModuleType().isPresent() && manageDistUIState
|
||||||
&& manageDistUIState.getSoftwareModuleFilters().getSoftwareModuleType().get().getName().equals(typeName);
|
.getSoftwareModuleFilters().getSoftwareModuleType().get().getName().equals(typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -104,13 +107,16 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
|||||||
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
void onEvent(final SoftwareModuleTypeEvent event) {
|
void onEvent(final SoftwareModuleTypeEvent event) {
|
||||||
if (event.getSoftwareModuleTypeEnum() == SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.ADD_SOFTWARE_MODULE_TYPE
|
if (isCreateOrUpdate(event) && event.getSoftwareModuleType() != null) {
|
||||||
|| event.getSoftwareModuleTypeEnum() == SoftwareModuleTypeEvent.SoftwareModuleTypeEnum.UPDATE_SOFTWARE_MODULE_TYPE
|
|
||||||
&& event.getSoftwareModuleType() != null) {
|
|
||||||
refreshTypeTable();
|
refreshTypeTable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isCreateOrUpdate(final SoftwareModuleTypeEvent event) {
|
||||||
|
return event.getSoftwareModuleTypeEnum() == ADD_SOFTWARE_MODULE_TYPE
|
||||||
|
|| event.getSoftwareModuleTypeEnum() == UPDATE_SOFTWARE_MODULE_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
@EventBusListenerMethod(scope = EventScope.SESSION)
|
@EventBusListenerMethod(scope = EventScope.SESSION)
|
||||||
void onEvent(final SaveActionWindowEvent event) {
|
void onEvent(final SaveActionWindowEvent event) {
|
||||||
if (event == SaveActionWindowEvent.SAVED_DELETE_SW_MODULE_TYPES) {
|
if (event == SaveActionWindowEvent.SAVED_DELETE_SW_MODULE_TYPES) {
|
||||||
@@ -121,6 +127,4 @@ public class DistSMTypeFilterButtons extends AbstractFilterButtons {
|
|||||||
private void refreshTypeTable() {
|
private void refreshTypeTable() {
|
||||||
setContainerDataSource(createButtonsLazyQueryContainer());
|
setContainerDataSource(createButtonsLazyQueryContainer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.eclipse.hawkbit.ui.distributions.state;
|
package org.eclipse.hawkbit.ui.distributions.state;
|
||||||
|
|
||||||
|
import static java.util.Collections.emptySet;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -49,7 +50,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
|||||||
|
|
||||||
private DistributionSetIdName lastSelectedDistribution;
|
private DistributionSetIdName lastSelectedDistribution;
|
||||||
|
|
||||||
private Set<Long> selectedSoftwareModules = Collections.emptySet();
|
private Set<Long> selectedSoftwareModules = emptySet();
|
||||||
|
|
||||||
private Set<String> selectedDeleteDistSetTypes = new HashSet<>();
|
private Set<String> selectedDeleteDistSetTypes = new HashSet<>();
|
||||||
|
|
||||||
@@ -57,23 +58,23 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
|||||||
|
|
||||||
private Long selectedBaseSwModuleId;
|
private Long selectedBaseSwModuleId;
|
||||||
|
|
||||||
private boolean distTypeFilterClosed = Boolean.FALSE;
|
private boolean distTypeFilterClosed;
|
||||||
|
|
||||||
private boolean swTypeFilterClosed = Boolean.FALSE;
|
private boolean swTypeFilterClosed;
|
||||||
|
|
||||||
private final Map<Long, String> deleteSofwareModulesList = new HashMap<>();
|
private final Map<Long, String> deleteSofwareModulesList = new HashMap<>();
|
||||||
|
|
||||||
private boolean swModuleTableMaximized = Boolean.FALSE;
|
private boolean swModuleTableMaximized;
|
||||||
|
|
||||||
private boolean dsTableMaximized = Boolean.FALSE;
|
private boolean dsTableMaximized;
|
||||||
|
|
||||||
private final Map<String, SoftwareModuleIdName> assignedSoftwareModuleDetails = new HashMap<>();
|
private final Map<String, SoftwareModuleIdName> assignedSoftwareModuleDetails = new HashMap<>();
|
||||||
|
|
||||||
private final Map<DistributionSetIdName, HashMap<Long, HashSet<SoftwareModuleIdName>>> consolidatedDistSoftwarewList = new HashMap<>();
|
private final Map<DistributionSetIdName, HashMap<Long, HashSet<SoftwareModuleIdName>>> consolidatedDistSoftwarewList = new HashMap<>();
|
||||||
|
|
||||||
private boolean noDataAvilableSwModule = Boolean.FALSE;
|
private boolean noDataAvilableSwModule;
|
||||||
|
|
||||||
private boolean noDataAvailableDist = Boolean.FALSE;
|
private boolean noDataAvailableDist;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the manageDistFilters
|
* @return the manageDistFilters
|
||||||
@@ -117,6 +118,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
|||||||
this.lastSelectedDistribution = value;
|
this.lastSelectedDistribution = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void setSelectedEnitities(final Set<DistributionSetIdName> values) {
|
public void setSelectedEnitities(final Set<DistributionSetIdName> values) {
|
||||||
selectedDistributions = values;
|
selectedDistributions = values;
|
||||||
}
|
}
|
||||||
@@ -223,7 +225,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
|||||||
/***
|
/***
|
||||||
* Set isDsModuleTableMaximized.
|
* Set isDsModuleTableMaximized.
|
||||||
*
|
*
|
||||||
* @param isDsModuleTableMaximized
|
* @param dsModuleTableMaximized
|
||||||
*/
|
*/
|
||||||
public void setDsTableMaximized(final boolean dsModuleTableMaximized) {
|
public void setDsTableMaximized(final boolean dsModuleTableMaximized) {
|
||||||
dsTableMaximized = dsModuleTableMaximized;
|
dsTableMaximized = dsModuleTableMaximized;
|
||||||
@@ -241,7 +243,7 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param isSwModuleTableMaximized
|
* @param swModuleTableMaximized
|
||||||
* the isSwModuleTableMaximized to set
|
* the isSwModuleTableMaximized to set
|
||||||
*/
|
*/
|
||||||
public void setSwModuleTableMaximized(final boolean swModuleTableMaximized) {
|
public void setSwModuleTableMaximized(final boolean swModuleTableMaximized) {
|
||||||
@@ -271,8 +273,8 @@ public class ManageDistUIState implements ManagmentEntityState<DistributionSetId
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param noDilableDist
|
* @param noDataAvailableDist
|
||||||
* the noDataAvailableDist to set
|
* the isNoDataAvailableDist to set
|
||||||
*/
|
*/
|
||||||
public void setNoDataAvailableDist(final boolean noDataAvailableDist) {
|
public void setNoDataAvailableDist(final boolean noDataAvailableDist) {
|
||||||
this.noDataAvailableDist = noDataAvailableDist;
|
this.noDataAvailableDist = noDataAvailableDist;
|
||||||
|
|||||||
@@ -114,10 +114,8 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Discard the changes and close the popup.
|
* Discard the changes and close the popup.
|
||||||
*
|
|
||||||
* @param event
|
|
||||||
*/
|
*/
|
||||||
protected void discard(final Button.ClickEvent event) {
|
protected void discard() {
|
||||||
UI.getCurrent().removeWindow(window);
|
UI.getCurrent().removeWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,7 +461,7 @@ public abstract class AbstractCreateUpdateTagLayout extends CustomComponent
|
|||||||
public CommonDialogWindow getWindow() {
|
public CommonDialogWindow getWindow() {
|
||||||
reset();
|
reset();
|
||||||
window = SPUIWindowDecorator.getWindow(getWindowCaption(), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this,
|
window = SPUIWindowDecorator.getWindow(getWindowCaption(), null, SPUIDefinitions.CREATE_UPDATE_WINDOW, this,
|
||||||
this::save, this::discard, null, mainLayout, i18n);
|
this::save, cancleEvent -> discard(), null, mainLayout, i18n);
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -118,12 +118,10 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* RESET.
|
* RESET.
|
||||||
*
|
|
||||||
* @param event
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void discard(final ClickEvent event) {
|
public void discard() {
|
||||||
super.discard(event);
|
super.discard();
|
||||||
resetDistTagValues();
|
resetDistTagValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +142,7 @@ public class CreateUpdateDistributionTagLayoutWindow extends AbstractCreateUpdat
|
|||||||
/**
|
/**
|
||||||
* Select tag & set tag name & tag desc values corresponding to selected
|
* Select tag & set tag name & tag desc values corresponding to selected
|
||||||
* tag.
|
* tag.
|
||||||
*
|
*
|
||||||
* @param distTagSelected
|
* @param distTagSelected
|
||||||
* as the selected tag from combo
|
* as the selected tag from combo
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ public class DistributionTagButtons extends AbstractFilterButtons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isNoTagSateSelected() {
|
protected boolean isNoTagStateSelected() {
|
||||||
return managementUIState.getDistributionTableFilters().isNoTagSelected();
|
return managementUIState.getDistributionTableFilters().isNoTagSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -391,22 +391,22 @@ public class BulkUploadHandler extends CustomComponent
|
|||||||
eventBus.publish(this, new BulkUploadValidationMessageEvent(errorMessage.toString()));
|
eventBus.publish(this, new BulkUploadValidationMessageEvent(errorMessage.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void addNewTarget(final String controllerId, final String name) {
|
private void addNewTarget(final String controllerId, final String name) {
|
||||||
final String newControllerId = HawkbitCommonUtil.trimAndNullIfEmpty(controllerId);
|
final String newControllerId = HawkbitCommonUtil.trimAndNullIfEmpty(controllerId);
|
||||||
if (mandatoryCheck(newControllerId) && duplicateCheck(newControllerId)) {
|
if (mandatoryCheck(newControllerId) && duplicateCheck(newControllerId)) {
|
||||||
final String newName = HawkbitCommonUtil.trimAndNullIfEmpty(name);
|
final String newName = HawkbitCommonUtil.trimAndNullIfEmpty(name);
|
||||||
final String newDesc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue());
|
final String newDesc = HawkbitCommonUtil.trimAndNullIfEmpty(descTextArea.getValue());
|
||||||
|
|
||||||
|
/* create new target entity */
|
||||||
|
final Target newTarget = entityFactory.generateTarget(newControllerId);
|
||||||
|
setTargetValues(newTarget, newName, newDesc);
|
||||||
|
targetManagement.createTarget(newTarget);
|
||||||
|
managementUIState.getTargetTableFilters().getBulkUpload().getTargetsCreated().add(newControllerId);
|
||||||
|
successfullTargetCount++;
|
||||||
|
}
|
||||||
|
|
||||||
/* create new target entity */
|
|
||||||
final Target newTarget = entityFactory.generateTarget(newControllerId);
|
|
||||||
setTargetValues(newTarget, newName, newDesc);
|
|
||||||
targetManagement.createTarget(newTarget);
|
|
||||||
managementUIState.getTargetTableFilters().getBulkUpload().getTargetsCreated().add(newControllerId);
|
|
||||||
successfullTargetCount++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setTargetValues(final Target target, final String name, final String description) {
|
private static void setTargetValues(final Target target, final String name, final String description) {
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ public class TargetTagFilterButtons extends AbstractFilterButtons {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isNoTagSateSelected() {
|
protected boolean isNoTagStateSelected() {
|
||||||
return managementUIState.getTargetTableFilters().isNoTagSelected();
|
return managementUIState.getTargetTableFilters().isNoTagSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import com.vaadin.spring.annotation.SpringComponent;
|
|||||||
import com.vaadin.spring.annotation.UIScope;
|
import com.vaadin.spring.annotation.UIScope;
|
||||||
import com.vaadin.ui.Alignment;
|
import com.vaadin.ui.Alignment;
|
||||||
import com.vaadin.ui.Button;
|
import com.vaadin.ui.Button;
|
||||||
|
import com.vaadin.ui.Button.ClickEvent;
|
||||||
import com.vaadin.ui.Button.ClickListener;
|
import com.vaadin.ui.Button.ClickListener;
|
||||||
import com.vaadin.ui.Component;
|
import com.vaadin.ui.Component;
|
||||||
import com.vaadin.ui.CustomComponent;
|
import com.vaadin.ui.CustomComponent;
|
||||||
@@ -52,14 +53,11 @@ import com.vaadin.ui.themes.ValoTheme;
|
|||||||
* A responsive menu component providing user information and the controls for
|
* A responsive menu component providing user information and the controls for
|
||||||
* primary navigation between the views.
|
* primary navigation between the views.
|
||||||
*/
|
*/
|
||||||
@SpringComponent
|
|
||||||
@UIScope
|
@UIScope
|
||||||
|
@SpringComponent
|
||||||
public final class DashboardMenu extends CustomComponent {
|
public final class DashboardMenu extends CustomComponent {
|
||||||
|
|
||||||
private static final String STYLE_VISIBLE = "valo-menu-visible";
|
private static final String ID = "dashboard-menu";
|
||||||
public static final String ID = "dashboard-menu";
|
|
||||||
public static final String REPORTS_BADGE_ID = "dashboard-menu-reports-badge";
|
|
||||||
public static final String NOTIFICATIONS_BADGE_ID = "dashboard-menu-notifications-badge";
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private I18N i18n;
|
private I18N i18n;
|
||||||
@@ -208,13 +206,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Component buildToggleButton() {
|
private Component buildToggleButton() {
|
||||||
final Button valoMenuToggleButton = new Button("Menu", (ClickListener) event -> {
|
final Button valoMenuToggleButton = new Button("Menu", new MenuToggleClickListenerMyClickListener());
|
||||||
if (getCompositionRoot().getStyleName().contains(STYLE_VISIBLE)) {
|
|
||||||
getCompositionRoot().removeStyleName(STYLE_VISIBLE);
|
|
||||||
} else {
|
|
||||||
getCompositionRoot().addStyleName(STYLE_VISIBLE);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
valoMenuToggleButton.setIcon(FontAwesome.LIST);
|
valoMenuToggleButton.setIcon(FontAwesome.LIST);
|
||||||
valoMenuToggleButton.addStyleName("valo-menu-toggle");
|
valoMenuToggleButton.addStyleName("valo-menu-toggle");
|
||||||
valoMenuToggleButton.addStyleName(ValoTheme.BUTTON_BORDERLESS);
|
valoMenuToggleButton.addStyleName(ValoTheme.BUTTON_BORDERLESS);
|
||||||
@@ -244,7 +236,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
/**
|
/**
|
||||||
* Returns all views which are currently accessible by the current logged in
|
* Returns all views which are currently accessible by the current logged in
|
||||||
* user.
|
* user.
|
||||||
*
|
*
|
||||||
* @return a list of all views which are currently visible and accessible
|
* @return a list of all views which are currently visible and accessible
|
||||||
* for the current logged in user
|
* for the current logged in user
|
||||||
*/
|
*/
|
||||||
@@ -264,7 +256,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the view name for the start page after login.
|
* Returns the view name for the start page after login.
|
||||||
*
|
*
|
||||||
* @return the initialViewName of the start page
|
* @return the initialViewName of the start page
|
||||||
*/
|
*/
|
||||||
public String getInitialViewName() {
|
public String getInitialViewName() {
|
||||||
@@ -273,7 +265,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Is a View available.
|
* Is a View available.
|
||||||
*
|
*
|
||||||
* @return the accessibleViewsEmpty <true> no rights for any view <false> a
|
* @return the accessibleViewsEmpty <true> no rights for any view <false> a
|
||||||
* view is available
|
* view is available
|
||||||
*/
|
*/
|
||||||
@@ -284,7 +276,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
/**
|
/**
|
||||||
* notifies the dashboard that the view has been changed and the button
|
* notifies the dashboard that the view has been changed and the button
|
||||||
* needs to be re-styled.
|
* needs to be re-styled.
|
||||||
*
|
*
|
||||||
* @param event
|
* @param event
|
||||||
* the post view change event
|
* the post view change event
|
||||||
*/
|
*/
|
||||||
@@ -294,7 +286,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the dashboard view type by a given view name.
|
* Returns the dashboard view type by a given view name.
|
||||||
*
|
*
|
||||||
* @param viewName
|
* @param viewName
|
||||||
* the name of the view to retrieve
|
* the name of the view to retrieve
|
||||||
* @return the dashboard view for a given viewname or {@code null} if view
|
* @return the dashboard view for a given viewname or {@code null} if view
|
||||||
@@ -313,7 +305,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Is the given view accessible.
|
* Is the given view accessible.
|
||||||
*
|
*
|
||||||
* @param viewName
|
* @param viewName
|
||||||
* the view name
|
* the view name
|
||||||
* @return <true> = denied, <false> = accessible
|
* @return <true> = denied, <false> = accessible
|
||||||
@@ -329,15 +321,28 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
return accessDeined;
|
return accessDeined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class MenuToggleClickListenerMyClickListener implements ClickListener {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
private static final String STYLE_VISIBLE = "valo-menu-visible";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void buttonClick(final ClickEvent event) {
|
||||||
|
if (getCompositionRoot().getStyleName().contains(STYLE_VISIBLE)) {
|
||||||
|
getCompositionRoot().removeStyleName(STYLE_VISIBLE);
|
||||||
|
} else {
|
||||||
|
getCompositionRoot().addStyleName(STYLE_VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An menu item button wrapper for the dashboard menu item.
|
* An menu item button wrapper for the dashboard menu item.
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public static final class ValoMenuItemButton extends Button {
|
public static final class ValoMenuItemButton extends Button {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private static final String STYLE_SELECTED = "selected";
|
private static final String STYLE_SELECTED = "selected";
|
||||||
|
|
||||||
private final DashboardMenuItem view;
|
private final DashboardMenuItem view;
|
||||||
@@ -345,7 +350,7 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
/**
|
/**
|
||||||
* creates a new button in case of pressed switches to the given
|
* creates a new button in case of pressed switches to the given
|
||||||
* {@code view}.
|
* {@code view}.
|
||||||
*
|
*
|
||||||
* @param view
|
* @param view
|
||||||
* the view to switch to in case the button is pressed
|
* the view to switch to in case the button is pressed
|
||||||
*/
|
*/
|
||||||
@@ -358,12 +363,11 @@ public final class DashboardMenu extends CustomComponent {
|
|||||||
/* Avoid double click */
|
/* Avoid double click */
|
||||||
setDisableOnClick(true);
|
setDisableOnClick(true);
|
||||||
addClickListener(event -> event.getComponent().getUI().getNavigator().navigateTo(view.getViewName()));
|
addClickListener(event -> event.getComponent().getUI().getNavigator().navigateTo(view.getViewName()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* notifies the button to change his style.
|
* notifies the button to change his style.
|
||||||
*
|
*
|
||||||
* @param event
|
* @param event
|
||||||
* the post view change event
|
* the post view change event
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import org.vaadin.alump.distributionbar.gwt.client.GwtDistributionBar;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public final class DistributionBarHelper {
|
public final class DistributionBarHelper {
|
||||||
|
private static final String HTML_DIV_END = "</div>";
|
||||||
private static final int PARENT_SIZE_IN_PCT = 100;
|
private static final int PARENT_SIZE_IN_PCT = 100;
|
||||||
private static final double MINIMUM_PART_SIZE = 10;
|
private static final double MINIMUM_PART_SIZE = 10;
|
||||||
private static final String DISTRIBUTION_BAR_PART_MAIN_STYLE = GwtDistributionBar.CLASSNAME + "-part";
|
private static final String DISTRIBUTION_BAR_PART_MAIN_STYLE = GwtDistributionBar.CLASSNAME + "-part";
|
||||||
@@ -38,23 +39,23 @@ public final class DistributionBarHelper {
|
|||||||
*
|
*
|
||||||
* @return string of format "status1:count,status2:count"
|
* @return string of format "status1:count,status2:count"
|
||||||
*/
|
*/
|
||||||
public static String getDistributionBarAsHTMLString(Map<Status, Long> statusTotalCountMap) {
|
public static String getDistributionBarAsHTMLString(final Map<Status, Long> statusTotalCountMap) {
|
||||||
StringBuilder htmlString = new StringBuilder();
|
final StringBuilder htmlString = new StringBuilder();
|
||||||
Map<Status, Long> statusMapWithNonZeroValues = getStatusMapWithNonZeroValues(statusTotalCountMap);
|
final Map<Status, Long> statusMapWithNonZeroValues = getStatusMapWithNonZeroValues(statusTotalCountMap);
|
||||||
Long totalValue = getTotalSizes(statusTotalCountMap);
|
final Long totalValue = getTotalSizes(statusTotalCountMap);
|
||||||
if (statusMapWithNonZeroValues.size() <= 0) {
|
if (statusMapWithNonZeroValues.size() <= 0) {
|
||||||
return getUnintialisedBar();
|
return getUnintialisedBar();
|
||||||
}
|
}
|
||||||
int partIndex = 1;
|
int partIndex = 1;
|
||||||
htmlString.append(getParentDivStart());
|
htmlString.append(getParentDivStart());
|
||||||
for (Map.Entry<Status, Long> entry : statusMapWithNonZeroValues.entrySet()) {
|
for (final Map.Entry<Status, Long> entry : statusMapWithNonZeroValues.entrySet()) {
|
||||||
if (entry.getValue() > 0) {
|
if (entry.getValue() > 0) {
|
||||||
htmlString.append(getPart(partIndex, entry.getKey(), entry.getValue(), totalValue,
|
htmlString.append(getPart(partIndex, entry.getKey(), entry.getValue(), totalValue,
|
||||||
statusMapWithNonZeroValues.size()));
|
statusMapWithNonZeroValues.size()));
|
||||||
partIndex++;
|
partIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
htmlString.append(getParentDivEnd());
|
htmlString.append(HTML_DIV_END);
|
||||||
return htmlString.toString();
|
return htmlString.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +66,7 @@ public final class DistributionBarHelper {
|
|||||||
* map with status and count
|
* map with status and count
|
||||||
* @return map with non zero values
|
* @return map with non zero values
|
||||||
*/
|
*/
|
||||||
public static Map<Status, Long> getStatusMapWithNonZeroValues(Map<Status, Long> statusTotalCountMap) {
|
public static Map<Status, Long> getStatusMapWithNonZeroValues(final Map<Status, Long> statusTotalCountMap) {
|
||||||
return statusTotalCountMap.entrySet().stream().filter(p -> p.getValue() > 0)
|
return statusTotalCountMap.entrySet().stream().filter(p -> p.getValue() > 0)
|
||||||
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
|
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
|
||||||
}
|
}
|
||||||
@@ -77,19 +78,20 @@ public final class DistributionBarHelper {
|
|||||||
* map with status and count details
|
* map with status and count details
|
||||||
* @return tool tip
|
* @return tool tip
|
||||||
*/
|
*/
|
||||||
public static String getTooltip(Map<Status, Long> statusCountMap) {
|
public static String getTooltip(final Map<Status, Long> statusCountMap) {
|
||||||
Map<Status, Long> nonZeroStatusCountMap = DistributionBarHelper.getStatusMapWithNonZeroValues(statusCountMap);
|
final Map<Status, Long> nonZeroStatusCountMap = DistributionBarHelper
|
||||||
StringBuilder tooltip = new StringBuilder();
|
.getStatusMapWithNonZeroValues(statusCountMap);
|
||||||
for (Entry<Status, Long> entry : nonZeroStatusCountMap.entrySet()) {
|
final StringBuilder tooltip = new StringBuilder();
|
||||||
|
for (final Entry<Status, Long> entry : nonZeroStatusCountMap.entrySet()) {
|
||||||
tooltip.append(entry.getKey().toString().toLowerCase()).append(" : ").append(entry.getValue())
|
tooltip.append(entry.getKey().toString().toLowerCase()).append(" : ").append(entry.getValue())
|
||||||
.append("<br>");
|
.append("<br>");
|
||||||
}
|
}
|
||||||
return tooltip.toString();
|
return tooltip.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getPartStyle(int partIndex, int noOfParts, String customStyle) {
|
private static String getPartStyle(final int partIndex, final int noOfParts, final String customStyle) {
|
||||||
StringBuilder mainStyle = new StringBuilder();
|
final StringBuilder mainStyle = new StringBuilder();
|
||||||
StringBuilder styleName = new StringBuilder(GwtDistributionBar.CLASSNAME);
|
final StringBuilder styleName = new StringBuilder(GwtDistributionBar.CLASSNAME);
|
||||||
if (noOfParts == 1) {
|
if (noOfParts == 1) {
|
||||||
styleName.append("-only");
|
styleName.append("-only");
|
||||||
} else if (partIndex == 1) {
|
} else if (partIndex == 1) {
|
||||||
@@ -108,15 +110,16 @@ public final class DistributionBarHelper {
|
|||||||
return mainStyle.toString();
|
return mainStyle.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getPartWidth(Long value, Long totalValue, int noOfParts) {
|
private static String getPartWidth(final Long value, final Long totalValue, final int noOfParts) {
|
||||||
final double minTotalSize = MINIMUM_PART_SIZE * noOfParts;
|
final double minTotalSize = MINIMUM_PART_SIZE * noOfParts;
|
||||||
final double availableSize = PARENT_SIZE_IN_PCT - minTotalSize;
|
final double availableSize = PARENT_SIZE_IN_PCT - minTotalSize;
|
||||||
double val = MINIMUM_PART_SIZE + (double) value / totalValue * availableSize;
|
final double val = MINIMUM_PART_SIZE + (double) value / totalValue * availableSize;
|
||||||
return String.format("%.3f", val) + "%";
|
return String.format("%.3f", val) + "%";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getPart(int partIndex, Status status, Long value, Long totalValue, int noOfParts) {
|
private static String getPart(final int partIndex, final Status status, final Long value, final Long totalValue,
|
||||||
String partValue = status.toString().toLowerCase();
|
final int noOfParts) {
|
||||||
|
final String partValue = status.toString().toLowerCase();
|
||||||
return "<div class=\"" + getPartStyle(partIndex, noOfParts, partValue) + "\" style=\"width: "
|
return "<div class=\"" + getPartStyle(partIndex, noOfParts, partValue) + "\" style=\"width: "
|
||||||
+ getPartWidth(value, totalValue, noOfParts) + ";\"><span class=\""
|
+ getPartWidth(value, totalValue, noOfParts) + ";\"><span class=\""
|
||||||
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">" + value + "</span></div>";
|
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">" + value + "</span></div>";
|
||||||
@@ -127,9 +130,9 @@ public final class DistributionBarHelper {
|
|||||||
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">uninitialized</span></div>";
|
+ DISTRIBUTION_BAR_PART_VALUE_CLASSNAME + "\">uninitialized</span></div>";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Long getTotalSizes(Map<Status, Long> statusTotalCountMap) {
|
private static Long getTotalSizes(final Map<Status, Long> statusTotalCountMap) {
|
||||||
Long total = 0L;
|
Long total = 0L;
|
||||||
for (Long value : statusTotalCountMap.values()) {
|
for (final Long value : statusTotalCountMap.values()) {
|
||||||
total = total + value;
|
total = total + value;
|
||||||
}
|
}
|
||||||
return total;
|
return total;
|
||||||
@@ -139,8 +142,4 @@ public final class DistributionBarHelper {
|
|||||||
return "<div class=\"" + GwtDistributionBar.CLASSNAME
|
return "<div class=\"" + GwtDistributionBar.CLASSNAME
|
||||||
+ "\" style=\"width: 100%; height: 100%;\" id=\"rollout.status.progress.bar.id\">";
|
+ "\" style=\"width: 100%; height: 100%;\" id=\"rollout.status.progress.bar.id\">";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getParentDivEnd() {
|
|
||||||
return "</div>";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ public class AddUpdateRolloutWindowLayout extends GridLayout {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the window.
|
* Get the window.
|
||||||
*
|
*
|
||||||
* @param rolloutId
|
* @param rolloutId
|
||||||
* the rollout id
|
* the rollout id
|
||||||
* @return the window
|
* @return the window
|
||||||
@@ -499,14 +499,6 @@ public class AddUpdateRolloutWindowLayout extends GridLayout {
|
|||||||
return errorThresoldPercent;
|
return errorThresoldPercent;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean validateFields() {
|
|
||||||
if (!noOfGroups.isValid() || !errorThreshold.isValid() || !triggerThreshold.isValid()) {
|
|
||||||
uiNotification.displayValidationError(i18n.get("message.correct.invalid.value"));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean duplicateCheck() {
|
private boolean duplicateCheck() {
|
||||||
if (rolloutManagement.findRolloutByName(getRolloutName()) != null) {
|
if (rolloutManagement.findRolloutByName(getRolloutName()) != null) {
|
||||||
uiNotification.displayValidationError(
|
uiNotification.displayValidationError(
|
||||||
@@ -694,9 +686,9 @@ public class AddUpdateRolloutWindowLayout extends GridLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Populate rollout details.
|
* Populate rollout details.
|
||||||
*
|
*
|
||||||
* @param rolloutId
|
* @param rolloutId
|
||||||
* rollout id
|
* rollout id
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ import com.vaadin.ui.renderers.ClickableRenderer.RendererClickEvent;
|
|||||||
import com.vaadin.ui.renderers.HtmlRenderer;
|
import com.vaadin.ui.renderers.HtmlRenderer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Rollout group list grid component.
|
* Rollout group list grid component.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -86,10 +86,10 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Handles the RolloutGroupChangeEvent to refresh the item in the grid.
|
* Handles the RolloutGroupChangeEvent to refresh the item in the grid.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param rolloutGroupChangeEvent
|
* @param rolloutGroupChangeEvent
|
||||||
* the event which contains the rollout group which has been
|
* the event which contains the rollout group which has been
|
||||||
* change
|
* change
|
||||||
@@ -242,6 +242,12 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onClickOfRolloutGroupName(final RendererClickEvent event) {
|
||||||
|
rolloutUIState
|
||||||
|
.setRolloutGroup(rolloutGroupManagement.findRolloutGroupWithDetailedStatus((Long) event.getItemId()));
|
||||||
|
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setHiddenColumns() {
|
protected void setHiddenColumns() {
|
||||||
final List<Object> columnsToBeHidden = new ArrayList<>();
|
final List<Object> columnsToBeHidden = new ArrayList<>();
|
||||||
@@ -261,12 +267,6 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
|||||||
return this::getDescription;
|
return this::getDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onClickOfRolloutGroupName(final RendererClickEvent event) {
|
|
||||||
rolloutUIState
|
|
||||||
.setRolloutGroup(rolloutGroupManagement.findRolloutGroupWithDetailedStatus((Long) event.getItemId()));
|
|
||||||
eventBus.publish(this, RolloutEvent.SHOW_ROLLOUT_GROUP_TARGETS);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createRolloutGroupStatusToFontMap() {
|
private void createRolloutGroupStatusToFontMap() {
|
||||||
statusIconMap.put(RolloutGroupStatus.FINISHED,
|
statusIconMap.put(RolloutGroupStatus.FINISHED,
|
||||||
new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
new StatusFontIcon(FontAwesome.CHECK_CIRCLE, SPUIStyleDefinitions.STATUS_ICON_GREEN));
|
||||||
@@ -311,7 +311,7 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Converts {@link TotalTargetCountStatus} into formatted string with status
|
* Converts {@link TotalTargetCountStatus} into formatted string with status
|
||||||
* and count details.
|
* and count details.
|
||||||
*
|
*
|
||||||
@@ -346,7 +346,7 @@ public class RolloutGroupListGrid extends AbstractGrid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Converts {@link RolloutGroupStatus} to string.
|
* Converts {@link RolloutGroupStatus} to string.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -161,13 +161,13 @@ public class AuthenticationConfigurationView extends BaseConfigurationView
|
|||||||
final CheckBox checkBox = (CheckBox) event.getProperty();
|
final CheckBox checkBox = (CheckBox) event.getProperty();
|
||||||
AuthenticationConfigurationItem configurationItem;
|
AuthenticationConfigurationItem configurationItem;
|
||||||
|
|
||||||
if (checkBox == gatewaySecTokenCheckBox) {
|
if (gatewaySecTokenCheckBox.equals(checkBox)) {
|
||||||
configurationItem = gatewaySecurityTokenAuthenticationConfigurationItem;
|
configurationItem = gatewaySecurityTokenAuthenticationConfigurationItem;
|
||||||
} else if (checkBox == targetSecTokenCheckBox) {
|
} else if (targetSecTokenCheckBox.equals(checkBox)) {
|
||||||
configurationItem = targetSecurityTokenAuthenticationConfigurationItem;
|
configurationItem = targetSecurityTokenAuthenticationConfigurationItem;
|
||||||
} else if (checkBox == certificateAuthCheckbox) {
|
} else if (certificateAuthCheckbox.equals(checkBox)) {
|
||||||
configurationItem = certificateAuthenticationConfigurationItem;
|
configurationItem = certificateAuthenticationConfigurationItem;
|
||||||
} else if (checkBox == downloadAnonymousCheckBox) {
|
} else if (downloadAnonymousCheckBox.equals(checkBox)) {
|
||||||
configurationItem = anonymousDownloadAuthenticationConfigurationItem;
|
configurationItem = anonymousDownloadAuthenticationConfigurationItem;
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -441,7 +441,7 @@ public final class HawkbitCommonUtil {
|
|||||||
*/
|
*/
|
||||||
public static float findRequiredExtraHeight(final float newBrowserHeight) {
|
public static float findRequiredExtraHeight(final float newBrowserHeight) {
|
||||||
return newBrowserHeight > SPUIDefinitions.REQ_MIN_BROWSER_HEIGHT
|
return newBrowserHeight > SPUIDefinitions.REQ_MIN_BROWSER_HEIGHT
|
||||||
? newBrowserHeight - SPUIDefinitions.REQ_MIN_BROWSER_HEIGHT : 0;
|
? (newBrowserHeight - SPUIDefinitions.REQ_MIN_BROWSER_HEIGHT) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -453,7 +453,7 @@ public final class HawkbitCommonUtil {
|
|||||||
*/
|
*/
|
||||||
public static float findRequiredSwModuleExtraHeight(final float newBrowserHeight) {
|
public static float findRequiredSwModuleExtraHeight(final float newBrowserHeight) {
|
||||||
return newBrowserHeight > SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_HEIGHT
|
return newBrowserHeight > SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_HEIGHT
|
||||||
? newBrowserHeight - SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_HEIGHT : 0;
|
? (newBrowserHeight - SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_HEIGHT) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -465,7 +465,7 @@ public final class HawkbitCommonUtil {
|
|||||||
*/
|
*/
|
||||||
public static float findRequiredSwModuleExtraWidth(final float newBrowserWidth) {
|
public static float findRequiredSwModuleExtraWidth(final float newBrowserWidth) {
|
||||||
return newBrowserWidth > SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_WIDTH
|
return newBrowserWidth > SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_WIDTH
|
||||||
? newBrowserWidth - SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_WIDTH : 0;
|
? (newBrowserWidth - SPUIDefinitions.REQ_MIN_UPLOAD_BROWSER_WIDTH) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -528,7 +528,7 @@ public final class HawkbitCommonUtil {
|
|||||||
*/
|
*/
|
||||||
public static float findExtraWidth(final float newBrowserWidth) {
|
public static float findExtraWidth(final float newBrowserWidth) {
|
||||||
return newBrowserWidth > SPUIDefinitions.REQ_MIN_BROWSER_WIDTH
|
return newBrowserWidth > SPUIDefinitions.REQ_MIN_BROWSER_WIDTH
|
||||||
? newBrowserWidth - SPUIDefinitions.REQ_MIN_BROWSER_WIDTH : 0;
|
? (newBrowserWidth - SPUIDefinitions.REQ_MIN_BROWSER_WIDTH) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -570,7 +570,7 @@ public final class HawkbitCommonUtil {
|
|||||||
final float requiredExtraWidth = findExtraWidth(newBrowserWidth);
|
final float requiredExtraWidth = findExtraWidth(newBrowserWidth);
|
||||||
float expectedDistWidth = minTableWidth;
|
float expectedDistWidth = minTableWidth;
|
||||||
if (requiredExtraWidth > 0) {
|
if (requiredExtraWidth > 0) {
|
||||||
expectedDistWidth = expectedDistWidth + Math.round(requiredExtraWidth * 0.5f);
|
expectedDistWidth = expectedDistWidth + Math.round(requiredExtraWidth * 0.5F);
|
||||||
}
|
}
|
||||||
return expectedDistWidth;
|
return expectedDistWidth;
|
||||||
}
|
}
|
||||||
@@ -741,6 +741,8 @@ public final class HawkbitCommonUtil {
|
|||||||
* base software module type
|
* base software module type
|
||||||
* @param description
|
* @param description
|
||||||
* base software module description
|
* base software module description
|
||||||
|
* @param entityFactory
|
||||||
|
* the entity factory to create new entity instances
|
||||||
* @return BaseSoftwareModule new base software module
|
* @return BaseSoftwareModule new base software module
|
||||||
*/
|
*/
|
||||||
public static SoftwareModule addNewBaseSoftware(final EntityFactory entityFactory, final String bsname,
|
public static SoftwareModule addNewBaseSoftware(final EntityFactory entityFactory, final String bsname,
|
||||||
|
|||||||
@@ -273,10 +273,6 @@ public final class SPUIDefinitions {
|
|||||||
* New Target save icon id.
|
* New Target save icon id.
|
||||||
*/
|
*/
|
||||||
public static final String NEW_TARGET_SAVE = "target.add.save";
|
public static final String NEW_TARGET_SAVE = "target.add.save";
|
||||||
/**
|
|
||||||
* New Target discard icon id.
|
|
||||||
*/
|
|
||||||
// public static final String NEW_TARGET_DISCARD = "target.add.discard";
|
|
||||||
/**
|
/**
|
||||||
* New Target add icon id.
|
* New Target add icon id.
|
||||||
*/
|
*/
|
||||||
@@ -1017,12 +1013,12 @@ public final class SPUIDefinitions {
|
|||||||
* Rollout action column property.
|
* Rollout action column property.
|
||||||
*/
|
*/
|
||||||
public static final String ROLLOUT_ACTION = "rollout-action";
|
public static final String ROLLOUT_ACTION = "rollout-action";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DistributionSet Metadata tab Id
|
* DistributionSet Metadata tab Id
|
||||||
*/
|
*/
|
||||||
public static final String DISTRIBUTIONSET_METADATA_TAB_ID = "distSet.metadata.tab.id";
|
public static final String DISTRIBUTIONSET_METADATA_TAB_ID = "distSet.metadata.tab.id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SoftwareModule Metadata tab Id
|
* SoftwareModule Metadata tab Id
|
||||||
*/
|
*/
|
||||||
@@ -1031,7 +1027,7 @@ public final class SPUIDefinitions {
|
|||||||
/***
|
/***
|
||||||
* Custom window for metadata.
|
* Custom window for metadata.
|
||||||
*/
|
*/
|
||||||
public static final String CUSTOM_METADATA_WINDOW = "custom.metadata.window";
|
public static final String CUSTOM_METADATA_WINDOW = "custom.metadata.window";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* /** Constructor.
|
* /** Constructor.
|
||||||
|
|||||||
Reference in New Issue
Block a user