docs: public ClientLayerInfo securityClone(ClientLayerInfo original) {
  		// the data is explicitly copied as this assures the security is considered when copying.
  		if (null == original) {
  			return null;
  		}
  		ClientLayerInfo client = null;
  		String layerId = original.getServerLayerId();
  		if (securityContext.isLayerVisible(layerId)) {
  			client = (ClientLayerInfo) SerializationUtils.clone(original);
  			client.setWidgetInfo(securityClone(original.getWidgetInfo()));
  			client.getLayerInfo().setExtraInfo(securityCloneLayerExtraInfo(original.getLayerInfo().getExtraInfo()));
  			if (client instanceof ClientVectorLayerInfo) {
  				ClientVectorLayerInfo vectorLayer = (ClientVectorLayerInfo) client;
  				// set statuses
  				vectorLayer.setCreatable(securityContext.isLayerCreateAuthorized(layerId));
  				vectorLayer.setUpdatable(securityContext.isLayerUpdateAuthorized(layerId));
  				vectorLayer.setDeletable(securityContext.isLayerDeleteAuthorized(layerId));
  				// filter feature info
  				FeatureInfo featureInfo = vectorLayer.getFeatureInfo();
  				List<AttributeInfo> originalAttr = featureInfo.getAttributes();
  				List<AttributeInfo> filteredAttr = new ArrayList<AttributeInfo>();
  				featureInfo.setAttributes(filteredAttr);
  				for (AttributeInfo ai : originalAttr) {
  					if (securityContext.isAttributeReadable(layerId, null, ai.getName())) {
  						filteredAttr.add(ai);
  					}
  				}
  			}
  		}
  		return client;
  	}