Browse Source

Re-added Property.toString warning messages (#10916)

* Made it possible to toggle the toString() behavior using the "legacyPropertyToString" init parameter. The default value is "warning" which enables the legacy Property.toString implementation and logs a warning message when it is used. Other supported values are "true" which enables the legacy mode and "false" which disables it.

Change-Id: Ife19352b86590464c8e441b7f82f4fec3b1f3235
tags/7.1.0.beta1
Artur Signell 11 years ago
parent
commit
be433ace81

+ 4
- 0
WebContent/WEB-INF/web.xml View File

@@ -49,6 +49,10 @@
<servlet-name>VaadinApplicationRunner</servlet-name>
<servlet-class>com.vaadin.launcher.ApplicationRunnerServlet</servlet-class>
<!-- Non-default values for testing purposes -->
<init-param>
<param-name>legacyPropertyToString</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>heartbeatInterval</param-name>
<param-value>301</param-value>

+ 21
- 16
server/src/com/vaadin/data/util/AbstractProperty.java View File

@@ -18,7 +18,6 @@ package com.vaadin.data.util;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.vaadin.data.Property;
@@ -71,27 +70,33 @@ public abstract class AbstractProperty<T> implements Property<T>,
}

/**
* Returns the value of the <code>Property</code> in human readable textual
* format.
* Returns a string representation of this object. The returned string
* representation depends on if the legacy Property toString mode is enabled
* or disabled.
* <p>
* If legacy Property toString mode is enabled, returns the value of the
* <code>Property</code> converted to a String.
* </p>
* <p>
* If legacy Property toString mode is disabled, the string representation
* has no special meaning
* </p>
*
* @return String representation of the value stored in the Property
* @deprecated As of 7.0, use {@link #getValue()} instead and possibly
* toString on that
* @see LegacyPropertyHelper#isLegacyToStringEnabled()
*
* @return A string representation of the value value stored in the Property
* or a string representation of the Property object.
* @deprecated As of 7.0. To get the property value, use {@link #getValue()}
* instead (and possibly toString on that)
*/
@Deprecated
@Override
public String toString() {
getLogger()
.log(Level.WARNING,
"You are using Property.toString() instead of getValue() to get the value for a {0}."
+ "This will not be supported starting from Vaadin 7.1 "
+ "(your debugger might call toString() and cause this message to appear).",
getClass().getSimpleName());
T v = getValue();
if (v == null) {
return null;
if (!LegacyPropertyHelper.isLegacyToStringEnabled()) {
return super.toString();
} else {
return LegacyPropertyHelper.legacyPropertyToString(this);
}
return v.toString();
}

/* Events */

+ 20
- 18
server/src/com/vaadin/data/util/IndexedContainer.java View File

@@ -28,7 +28,6 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.vaadin.data.Container;
@@ -954,29 +953,32 @@ public class IndexedContainer extends
}

/**
* Returns the value of the Property in human readable textual format.
* The return value should be assignable to the <code>setValue</code>
* method if the Property is not in read-only mode.
* Returns a string representation of this object. The returned string
* representation depends on if the legacy Property toString mode is
* enabled or disabled.
* <p>
* If legacy Property toString mode is enabled, returns the value of the
* <code>Property</code> converted to a String.
* </p>
* <p>
* If legacy Property toString mode is disabled, the string
* representation has no special meaning
* </p>
*
* @return <code>String</code> representation of the value stored in the
* Property
* @deprecated As of 7.0, use {@link #getValue()} instead and possibly
* toString on that
* @return A string representation of the value value stored in the
* Property or a string representation of the Property object.
* @deprecated As of 7.0. To get the property value, use
* {@link #getValue()} instead (and possibly toString on
* that)
*/
@Deprecated
@Override
public String toString() {
getLogger()
.log(Level.WARNING,
"You are using IndexedContainerProperty.toString() instead of getValue() to get the value for a {0}."
+ " This will not be supported starting from Vaadin 7.1 "
+ "(your debugger might call toString() and cause this message to appear).",
getClass().getSimpleName());
Object v = getValue();
if (v == null) {
return null;
if (!LegacyPropertyHelper.isLegacyToStringEnabled()) {
return super.toString();
} else {
return LegacyPropertyHelper.legacyPropertyToString(this);
}
return v.toString();
}

private Logger getLogger() {

+ 102
- 0
server/src/com/vaadin/data/util/LegacyPropertyHelper.java View File

@@ -0,0 +1,102 @@
/*
* Copyright 2000-2013 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.data.util;

import java.util.logging.Level;
import java.util.logging.Logger;

import com.vaadin.data.Property;
import com.vaadin.server.Constants;
import com.vaadin.server.DeploymentConfiguration.LegacyProperyToStringMode;
import com.vaadin.server.VaadinService;

/**
* Helper class which provides methods for handling Property.toString in a
* Vaadin 6 compatible way
*
* @author Vaadin Ltd
* @since 7.1
* @deprecated This is only used internally for backwards compatibility
*/
@Deprecated
public class LegacyPropertyHelper {

/**
* Returns the property value converted to a String.
*
* @param p
* The property
* @return A string representation of the property value, compatible with
* how Property implementations in Vaadin 6 do it
*/
public static String legacyPropertyToString(Property p) {
maybeLogLegacyPropertyToStringWarning(p);
Object value = p.getValue();
if (value == null) {
return null;
}
return value.toString();
}

public static void maybeLogLegacyPropertyToStringWarning(Property p) {
if (!logLegacyToStringWarning()) {
return;
}

getLogger().log(Level.WARNING,
Constants.WARNING_LEGACY_PROPERTY_TOSTRING,
p.getClass().getName());
}

/**
* Checks if legacy Property.toString() implementation is enabled. The
* legacy Property.toString() will return the value of the property somehow
* converted to a String. If the legacy mode is disabled, toString() will
* return super.toString().
* <p>
* The legacy toString mode can be toggled using the
* "legacyPropertyToString" init parameter
* </p>
*
* @return true if legacy Property.toString() mode is enabled, false
* otherwise
*/
public static boolean isLegacyToStringEnabled() {
if (VaadinService.getCurrent() == null) {
// This should really not happen but we need to handle it somehow.
// IF it happens it seems more safe to use the legacy mode and log.
return true;
}
return VaadinService.getCurrent().getDeploymentConfiguration()
.getLegacyPropertyToStringMode().useLegacyMode();
}

private static boolean logLegacyToStringWarning() {
if (VaadinService.getCurrent() == null) {
// This should really not happen but we need to handle it somehow.
// IF it happens it seems more safe to use the legacy mode and log.
return true;
}
return VaadinService.getCurrent().getDeploymentConfiguration()
.getLegacyPropertyToStringMode() == LegacyProperyToStringMode.WARNING;

}

private static Logger getLogger() {
return Logger.getLogger(LegacyPropertyHelper.class.getName());
}

}

+ 22
- 15
server/src/com/vaadin/data/util/sqlcontainer/ColumnProperty.java View File

@@ -18,10 +18,10 @@ package com.vaadin.data.util.sqlcontainer;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.vaadin.data.Property;
import com.vaadin.data.util.LegacyPropertyHelper;
import com.vaadin.data.util.converter.Converter.ConversionException;

/**
@@ -255,26 +255,33 @@ final public class ColumnProperty implements Property {
}

/**
* Returns the value of the Property in human readable textual format.
* Returns a string representation of this object. The returned string
* representation depends on if the legacy Property toString mode is enabled
* or disabled.
* <p>
* If legacy Property toString mode is enabled, returns the value of this
* <code>Property</code> converted to a String.
* </p>
* <p>
* If legacy Property toString mode is disabled, the string representation
* has no special meaning
* </p>
*
* @see java.lang.Object#toString()
* @deprecated As of 7.0, use {@link #getValue()} instead and possibly
* toString on that
* @see LegacyPropertyHelper#isLegacyToStringEnabled()
*
* @return A string representation of the value value stored in the Property
* or a string representation of the Property object.
* @deprecated As of 7.0. To get the property value, use {@link #getValue()}
* instead (and possibly toString on that)
*/
@Deprecated
@Override
public String toString() {
getLogger()
.log(Level.WARNING,
"You are using ColumnProperty.toString() instead of getValue() to get the value for a {0}. "
+ "This will not be supported starting from Vaadin 7.1 (your debugger might call toString() "
+ "and cause this message to appear).",
getClass().getSimpleName());
Object v = getValue();
if (v == null) {
return null;
if (!LegacyPropertyHelper.isLegacyToStringEnabled()) {
return super.toString();
} else {
return LegacyPropertyHelper.legacyPropertyToString(this);
}
return v.toString();
}

private static Logger getLogger() {

+ 14
- 0
server/src/com/vaadin/server/Constants.java View File

@@ -99,6 +99,19 @@ public interface Constants {
+ ".\n"
+ "=================================================================";

public static final String WARNING_LEGACY_PROPERTY_TOSTRING = "You are using toString() instead of getValue() to get the value for a Property of type {0}"
+ ". This is strongly discouraged and only provided for backwards compatibility with Vaadin 6. "
+ "To disable this warning message and retain the behavior, set the init parameter \""
+ Constants.SERVLET_PARAMETER_LEGACY_PROPERTY_TOSTRING
+ "\" to \"true\". To disable the legacy functionality, set \""
+ Constants.SERVLET_PARAMETER_LEGACY_PROPERTY_TOSTRING
+ "\" to false."
+ " (Note that your debugger might call toString() and trigger this message).";

static final String WARNING_UNKNOWN_LEGACY_PROPERTY_TOSTRING_VALUE = "Unknown value '{0}' for parameter "
+ Constants.SERVLET_PARAMETER_LEGACY_PROPERTY_TOSTRING
+ ". Supported values are 'false','warning','true'";

static final String URL_PARAMETER_THEME = "theme";

static final String SERVLET_PARAMETER_PRODUCTION_MODE = "productionMode";
@@ -108,6 +121,7 @@ public interface Constants {
static final String SERVLET_PARAMETER_CLOSE_IDLE_SESSIONS = "closeIdleSessions";
static final String SERVLET_PARAMETER_PUSH_MODE = "pushMode";
static final String SERVLET_PARAMETER_UI_PROVIDER = "UIProvider";
static final String SERVLET_PARAMETER_LEGACY_PROPERTY_TOSTRING = "legacyPropertyToString";

// Configurable parameter names
static final String PARAMETER_VAADIN_RESOURCES = "Resources";

+ 29
- 0
server/src/com/vaadin/server/DefaultDeploymentConfiguration.java View File

@@ -17,6 +17,7 @@
package com.vaadin.server;

import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.vaadin.shared.communication.PushMode;
@@ -37,6 +38,7 @@ public class DefaultDeploymentConfiguration implements DeploymentConfiguration {
private boolean closeIdleSessions;
private PushMode pushMode;
private final Class<?> systemPropertyBaseClass;
private LegacyProperyToStringMode legacyPropertyToStringMode;

/**
* Create a new deployment configuration instance.
@@ -59,6 +61,26 @@ public class DefaultDeploymentConfiguration implements DeploymentConfiguration {
checkHeartbeatInterval();
checkCloseIdleSessions();
checkPushMode();
checkLegacyPropertyToString();
}

private void checkLegacyPropertyToString() {
String param = getApplicationOrSystemProperty(
Constants.SERVLET_PARAMETER_LEGACY_PROPERTY_TOSTRING, "warning");
if ("true".equals(param)) {
legacyPropertyToStringMode = LegacyProperyToStringMode.ENABLED;
} else if ("false".equals(param)) {
legacyPropertyToStringMode = LegacyProperyToStringMode.DISABLED;
} else {
if (!"warning".equals(param)) {
getLogger()
.log(Level.WARNING,
Constants.WARNING_UNKNOWN_LEGACY_PROPERTY_TOSTRING_VALUE,
param);
}
legacyPropertyToStringMode = LegacyProperyToStringMode.WARNING;

}
}

@Override
@@ -270,4 +292,11 @@ public class DefaultDeploymentConfiguration implements DeploymentConfiguration {
private Logger getLogger() {
return Logger.getLogger(getClass().getName());
}

@Override
@Deprecated
public LegacyProperyToStringMode getLegacyPropertyToStringMode() {
return legacyPropertyToStringMode;
}

}

+ 27
- 0
server/src/com/vaadin/server/DeploymentConfiguration.java View File

@@ -19,6 +19,7 @@ package com.vaadin.server;
import java.io.Serializable;
import java.util.Properties;

import com.vaadin.data.util.AbstractProperty;
import com.vaadin.shared.communication.PushMode;

/**
@@ -30,6 +31,23 @@ import com.vaadin.shared.communication.PushMode;
* @since 7.0.0
*/
public interface DeploymentConfiguration extends Serializable {

/**
* Determines the mode of the "legacyPropertyToString" parameter.
*
* @author Vaadin Ltd
* @since 7.1
*/
@Deprecated
public enum LegacyProperyToStringMode {
DISABLED, WARNING, ENABLED;

public boolean useLegacyMode() {
return this == WARNING || this == ENABLED;
}

}

/**
* Returns whether Vaadin is in production mode.
*
@@ -111,4 +129,13 @@ public interface DeploymentConfiguration extends Serializable {
public String getApplicationOrSystemProperty(String propertyName,
String defaultValue);

/**
* Returns to legacy Property.toString() mode used. See
* {@link AbstractProperty#isLegacyToStringEnabled()} for more information.
*
* @return The Property.toString() mode in use.
*/
@Deprecated
public LegacyProperyToStringMode getLegacyPropertyToStringMode();

}

+ 34
- 4
server/src/com/vaadin/ui/AbstractField.java View File

@@ -25,13 +25,13 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.logging.Logger;

import com.vaadin.data.Buffered;
import com.vaadin.data.Property;
import com.vaadin.data.Validatable;
import com.vaadin.data.Validator;
import com.vaadin.data.Validator.InvalidValueException;
import com.vaadin.data.util.LegacyPropertyHelper;
import com.vaadin.data.util.converter.Converter;
import com.vaadin.data.util.converter.Converter.ConversionException;
import com.vaadin.data.util.converter.ConverterUtil;
@@ -75,9 +75,6 @@ public abstract class AbstractField<T> extends AbstractComponent implements

/* Private members */

private static final Logger logger = Logger.getLogger(AbstractField.class
.getName());

/**
* Value of the abstract field.
*/
@@ -371,6 +368,39 @@ public abstract class AbstractField<T> extends AbstractComponent implements
return buffered;
}

/**
* Returns a string representation of this object. The returned string
* representation depends on if the legacy Property toString mode is enabled
* or disabled.
* <p>
* If legacy Property toString mode is enabled, returns the value of this
* <code>Field</code> converted to a String.
* </p>
* <p>
* If legacy Property toString mode is disabled, the string representation
* has no special meaning
* </p>
*
* @see LegacyPropertyHelper#isLegacyToStringEnabled()
*
* @return A string representation of the value value stored in the Property
* or a string representation of the Property object.
* @deprecated As of 7.0. Use {@link #getValue()} to get the value of the
* field, {@link #getConvertedValue()} to get the field value
* converted to the data model type or
* {@link #getPropertyDataSource()} .getValue() to get the value
* of the data source.
*/
@Deprecated
@Override
public String toString() {
if (!LegacyPropertyHelper.isLegacyToStringEnabled()) {
return super.toString();
} else {
return LegacyPropertyHelper.legacyPropertyToString(this);
}
}

/* Property interface implementation */

/**

+ 33
- 0
server/src/com/vaadin/ui/Label.java View File

@@ -21,6 +21,8 @@ import java.util.Locale;
import java.util.logging.Logger;

import com.vaadin.data.Property;
import com.vaadin.data.util.AbstractProperty;
import com.vaadin.data.util.LegacyPropertyHelper;
import com.vaadin.data.util.converter.Converter;
import com.vaadin.data.util.converter.ConverterUtil;
import com.vaadin.shared.ui.label.ContentMode;
@@ -525,4 +527,35 @@ public class Label extends AbstractComponent implements Property<String>,
markAsDirty();
}

/**
* Returns a string representation of this object. The returned string
* representation depends on if the legacy Property toString mode is enabled
* or disabled.
* <p>
* If legacy Property toString mode is enabled, returns the value displayed
* by this label.
* </p>
* <p>
* If legacy Property toString mode is disabled, the string representation
* has no special meaning
* </p>
*
* @see AbstractProperty#isLegacyToStringEnabled()
*
* @return The value displayed by this label or a string representation of
* this Label object.
*
* @deprecated As of 7.0, use {@link #getValue()} to get the value of the
* label or {@link #getPropertyDataSource()}.getValue() to get
* the value of the data source.
*/
@Deprecated
@Override
public String toString() {
if (!LegacyPropertyHelper.isLegacyToStringEnabled()) {
return super.toString();
} else {
return LegacyPropertyHelper.legacyPropertyToString(this);
}
}
}

+ 19
- 0
server/tests/src/com/vaadin/tests/util/MockDeploymentConfiguration.java View File

@@ -18,7 +18,9 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
private PushMode pushMode = PushMode.DISABLED;
private Properties initParameters = new Properties();
private Map<String, String> applicationOrSystemProperty = new HashMap<String, String>();
private LegacyProperyToStringMode legacyPropertyToStringMode = LegacyProperyToStringMode.DISABLED;

@Override
public boolean isProductionMode() {
return productionMode;
}
@@ -27,6 +29,7 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
this.productionMode = productionMode;
}

@Override
public boolean isXsrfProtectionEnabled() {
return xsrfProtectionEnabled;
}
@@ -35,6 +38,7 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
this.xsrfProtectionEnabled = xsrfProtectionEnabled;
}

@Override
public int getResourceCacheTime() {
return resourceCacheTime;
}
@@ -43,6 +47,7 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
this.resourceCacheTime = resourceCacheTime;
}

@Override
public int getHeartbeatInterval() {
return heartbeatInterval;
}
@@ -51,6 +56,7 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
this.heartbeatInterval = heartbeatInterval;
}

@Override
public boolean isCloseIdleSessions() {
return closeIdleSessions;
}
@@ -59,6 +65,7 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
this.closeIdleSessions = closeIdleSessions;
}

@Override
public PushMode getPushMode() {
return pushMode;
}
@@ -67,6 +74,7 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
this.pushMode = pushMode;
}

@Override
public Properties getInitParameters() {
return initParameters;
}
@@ -89,4 +97,15 @@ public class MockDeploymentConfiguration implements DeploymentConfiguration {
}
}

@Override
@Deprecated
public LegacyProperyToStringMode getLegacyPropertyToStringMode() {
return legacyPropertyToStringMode;
}

public void setLegacyPropertyToStringMode(
LegacyProperyToStringMode legacyPropertyToStringMode) {
this.legacyPropertyToStringMode = legacyPropertyToStringMode;
}

}

Loading…
Cancel
Save