This is an automated email from the ASF dual-hosted git repository.

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new b257c56d01 GH-1880: Replace ad hoc version information system
     new 909a56ad99 Merge pull request #1904 from afs/version2
b257c56d01 is described below

commit b257c56d01f3ae1f6c2e9bc74a702aec64db2116
Author: Andy Seaborne <[email protected]>
AuthorDate: Sun Jun 4 18:23:13 2023 +0100

    GH-1880: Replace ad hoc version information system
---
 .../src/main/java/org/apache/jena/query/ARQ.java   |  24 +---
 .../src/main/java/org/apache/jena/riot/RIOT.java   |  17 +--
 .../java/org/apache/jena/sparql/SystemARQ.java     |  23 ++--
 .../apache/jena/sparql/engine/QueryEngineBase.java |   7 --
 .../jena/sparql/function/StandardFunctions.java    |   3 -
 .../ARQMgt.java => function/library/version.java}  |  17 +--
 .../java/org/apache/jena/sparql/mgt/ARQMgt_X.java  | 135 ---------------------
 .../org/apache/jena/sparql/mgt/ContextMBean.java   | 132 --------------------
 .../apache/jena/sparql/mgt/QueryEngineInfo.java    |  14 ++-
 .../jena/sparql/mgt/QueryEngineInfoMBean.java      |  13 +-
 .../org/apache/jena/sparql/mgt/QueryExecMBean.java |  11 +-
 .../org/apache/jena/sparql/mgt/SystemInfo.java     |   4 +
 .../apache/jena/sparql/mgt/SystemInfoMBean.java    |   4 +
 .../jena/sparql/pfunction/library/version.java     |  78 ------------
 .../jena/sparql/pfunction/library/versionARQ.java  |  70 -----------
 jena-core/src/main/java/org/apache/jena/Jena.java  |  29 ++---
 .../src/main/java/org/apache/jena/JenaRuntime.java |  18 +--
 .../main/java/org/apache/jena/util/FileUtils.java  |  17 +--
 .../main/java/org/apache/jena/util/Metadata.java   | 103 ----------------
 .../main/java/org/apache/jena/fuseki/Fuseki.java   |  34 +-----
 .../apache/jena/fuseki/server/FusekiCoreInfo.java  |  14 +--
 .../src/services/mock/json-server.js               |   3 +-
 .../apache/jena/fuseki/mgt/ActionServerStatus.java |  10 +-
 .../java/org/apache/jena/tdb/StoreConnection.java  |   4 -
 .../src/main/java/org/apache/jena/tdb/TDB.java     |  27 +----
 .../main/java/org/apache/jena/tdb/mgt/TDBMgt.java  |  33 -----
 .../test/java/org/apache/jena/tdb/sys/TestSys.java |  13 +-
 .../src/main/java/org/apache/jena/tdb2/TDB2.java   |  21 +---
 .../java/org/apache/jena/tdb2/sys/TestSys.java     |   8 +-
 29 files changed, 110 insertions(+), 776 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/query/ARQ.java 
b/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
index d77e3d80f6..bd5e69de85 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/ARQ.java
@@ -18,6 +18,7 @@
 
 package org.apache.jena.query;
 
+import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.http.sys.HttpRequestModifier;
 import org.apache.jena.http.sys.RegistryRequestModifier;
 import org.apache.jena.riot.RIOT;
@@ -31,17 +32,14 @@ import org.apache.jena.sparql.exec.http.QuerySendMode;
 import org.apache.jena.sparql.expr.aggregate.AggregateRegistry;
 import org.apache.jena.sparql.function.FunctionRegistry;
 import org.apache.jena.sparql.function.scripting.ScriptLangSymbols;
-import org.apache.jena.sparql.mgt.ARQMgt;
 import org.apache.jena.sparql.mgt.Explain;
 import org.apache.jena.sparql.mgt.Explain.InfoLevel;
-import org.apache.jena.sparql.mgt.SystemInfo;
 import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry;
 import org.apache.jena.sparql.service.ServiceExecutorRegistry;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.MappingRegistry;
 import org.apache.jena.sparql.util.Symbol;
 import org.apache.jena.sys.JenaSystem;
-import org.apache.jena.util.Metadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -599,21 +597,11 @@ public class ARQ
 
     // ----------------------------------
 
-    /** The root package name for ARQ */
-    public static final String PATH         = "org.apache.jena.arq";
-
-    static private String metadataLocation  = 
"org/apache/jena/arq/arq-properties.xml";
-
-    static private Metadata metadata        = new Metadata(metadataLocation);
-
     /** The product name */
-    public static final String NAME         = "ARQ";
-
-    /** The full name of the current ARQ version */
-    public static final String VERSION      = metadata.get(PATH+".version", 
"unknown");
+    public static final String NAME         = "Apache Jena ARQ";
 
-    /** The date and time at which this release was built */
-    public static final String BUILD_DATE   = 
metadata.get(PATH+".build.datetime", "unset");
+    /** The ARQ version */
+    public static final String VERSION      = 
Version.versionForClass(ARQ.class).orElse("<development>");
 
     /**
      * Ensure things have started - applications do not need call this.
@@ -636,12 +624,8 @@ public class ARQ
             ResultSetLang.init();
             // Done as a class init.
             //globalContext = defaultSettings();
-            ARQMgt.init();         // After context and after 
PATH/NAME/VERSION/BUILD_DATE are set
             MappingRegistry.addPrefixMapping(ARQ.arqSymbolPrefix, 
ARQ.arqParamNS);
 
-            // This is the pattern for any subsystem to register.
-            SystemInfo sysInfo = new SystemInfo(ARQ.arqIRI, ARQ.PATH, 
ARQ.VERSION, ARQ.BUILD_DATE);
-            SystemARQ.registerSubSystem(sysInfo);
             AssemblerUtils.init();
             // Register RIOT details here, not earlier, to avoid
             // initialization loops with RIOT.init() called directly.
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RIOT.java 
b/jena-arq/src/main/java/org/apache/jena/riot/RIOT.java
index 230e039dce..88c457e275 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RIOT.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RIOT.java
@@ -18,11 +18,10 @@
 
 package org.apache.jena.riot ;
 
-import org.apache.jena.query.ARQ ;
+import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.riot.resultset.ResultSetLang;
 import org.apache.jena.riot.system.StreamRDF;
 import org.apache.jena.sparql.SystemARQ ;
-import org.apache.jena.sparql.mgt.SystemInfo ;
 import org.apache.jena.sparql.util.Context ;
 import org.apache.jena.sparql.util.MappingRegistry;
 import org.apache.jena.sparql.util.Symbol ;
@@ -45,8 +44,7 @@ public class RIOT {
     // public static final String VERSION = NAME+"/"+ARQ.VERSION ;
     // public static final String BUILD_DATE = ARQ.BUILD_DATE ;
 
-    public static String       VERSION ;
-    public static String       BUILD_DATE ;
+    public static final String       VERSION = 
Version.versionForClass(RIOT.class).orElse("<development>");;
 
     /** The root package name for RIOT */
     public static final String PATH    = "org.apache.jena.riot" ;
@@ -107,20 +105,15 @@ public class RIOT {
         if ( registered )
             return ;
         registered = true ;
-
-        VERSION = getVersion() ;
-        BUILD_DATE = getBuildDate() ;
-
-        SystemInfo sysInfo2 = new SystemInfo(RIOT.riotIRI, RIOT.PATH, VERSION, 
BUILD_DATE) ;
-        SystemARQ.registerSubSystem(sysInfo2) ;
     }
 
     public static String getVersion() {
-        return ARQ.VERSION ;
+        return RIOT.VERSION ;
     }
 
+    @Deprecated
     public static String getBuildDate() {
-        return ARQ.BUILD_DATE ;
+        return "";
     }
 
     // ---- Symbols
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/SystemARQ.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/SystemARQ.java
index 17054964cd..f7eda15038 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/SystemARQ.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/SystemARQ.java
@@ -18,10 +18,9 @@
 
 package org.apache.jena.sparql;
 
-import java.util.ArrayList ;
 import java.util.Iterator ;
-import java.util.List ;
 
+import org.apache.jena.atlas.iterator.Iter;
 import org.apache.jena.atlas.lib.Sync ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.compose.Polyadic ;
@@ -33,10 +32,10 @@ import org.apache.jena.reasoner.InfGraph ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sparql.core.GraphView ;
 import org.apache.jena.sparql.graph.GraphWrapper ;
-import org.apache.jena.sparql.mgt.ARQMgt ;
 import org.apache.jena.sparql.mgt.SystemInfo ;
 import org.apache.jena.sparql.util.Symbol ;
 
+@SuppressWarnings("deprecation")
 public class SystemARQ
 {
     // Various system wide settings, "constants" that might change e.g. test 
setups
@@ -126,16 +125,18 @@ public class SystemARQ
             ((Sync)object).sync() ;
     }
 
-    private static List<SystemInfo> versions = new ArrayList<>() ;
+    /**
+     * @deprected To be removed. This is a no-op.
+     */
+    @Deprecated(since="4.9.0")
     public static void registerSubSystem(SystemInfo systemInfo)
-    {
-        ARQMgt.register(systemInfo.getJmxPath() + ".system:type=SystemInfo", 
systemInfo) ;
-        versions.add(systemInfo) ;
-    }
+    { }
 
-    public static Iterator<SystemInfo> registeredSubsystems() {
-        return versions.iterator() ;
-    }
+    /**
+     * @deprected To be removed. This is a no-op.
+     */
+    @Deprecated(since="4.9.0")
+    public static Iterator<SystemInfo> registeredSubsystems() { return 
Iter.nullIterator(); }
 
     public static Symbol allocSymbol(String shortName) {
         // This must work even if initialization is happening.
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
index 9d86a1b87b..d2158eba3e 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
@@ -33,14 +33,12 @@ import org.apache.jena.sparql.core.Substitute;
 import org.apache.jena.sparql.engine.binding.Binding;
 import org.apache.jena.sparql.engine.binding.BindingRoot;
 import org.apache.jena.sparql.mgt.Explain;
-import org.apache.jena.sparql.mgt.QueryEngineInfo;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.DatasetUtils;
 
 /** Main part of a QueryEngine - something that takes responsibility for a 
complete query execution */
 public abstract class QueryEngineBase implements OpEval, Closeable
 {
-    public final static QueryEngineInfo queryEngineInfo = new 
QueryEngineInfo();
     // See also ExecutionContext.getDataset()
     protected final DatasetGraph originalDataset;
     protected DatasetGraph dataset = null;
@@ -163,11 +161,6 @@ public abstract class QueryEngineBase implements OpEval, 
Closeable
         if ( query != null )
             Explain.explain("QUERY", query, context);
         Explain.explain("ALGEBRA", op, context);
-        queryEngineInfo.incQueryCount();
-        queryEngineInfo.setLastQueryExecAt();
-        //queryEngineInfo.setLastQueryExecTime(-1);
-        
queryEngineInfo.setLastQueryString((Query)context.get(ARQConstants.sysCurrentQuery));
-        queryEngineInfo.setLastOp(op);
         return eval(op, dsg, binding, context);
     }
 
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
index 31458c340a..c3fff3936f 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/StandardFunctions.java
@@ -61,10 +61,7 @@ public class StandardFunctions
         String math = ARQConstants.mathPrefix ;
         String sparqlfn = ARQConstants.fnSparql ;
 
-
-
         // Update documentation in xsd-support.md
-
         // See also:
         // http://www.w3.org/TR/xpath-datamodel/#types-hierarchy
         // https://www.w3.org/TR/xpath-datamodel-3/
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ARQMgt.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/version.java
similarity index 69%
rename from jena-arq/src/main/java/org/apache/jena/sparql/mgt/ARQMgt.java
rename to 
jena-arq/src/main/java/org/apache/jena/sparql/function/library/version.java
index 88f4f636d5..1a4c7f47fb 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ARQMgt.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/function/library/version.java
@@ -16,12 +16,15 @@
  * limitations under the License.
  */
 
-package org.apache.jena.sparql.mgt ;
+package org.apache.jena.sparql.function.library;
 
-public class ARQMgt {
-    // No-op version.
-    // See JENA-614 and ARQMgt_X
-    public static void init() {}
-    public static void register(String name, Object bean) { }
-    public static void unregister(String name) { }
+import org.apache.jena.query.ARQ;
+import org.apache.jena.sparql.expr.NodeValue ;
+import org.apache.jena.sparql.function.FunctionBase0 ;
+
+/** Version number, as a string */
+public class version extends FunctionBase0
+{
+    @Override
+    public NodeValue exec() { return NodeValue.makeNodeString(ARQ.VERSION);}
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ARQMgt_X.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ARQMgt_X.java
deleted file mode 100644
index 386380b095..0000000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ARQMgt_X.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.jena.sparql.mgt ;
-
-import java.lang.management.ManagementFactory ;
-import java.util.HashMap ;
-import java.util.Map ;
-
-import javax.management.* ;
-
-import org.apache.jena.atlas.lib.InternalErrorException ;
-import org.apache.jena.atlas.logging.Log ;
-import org.apache.jena.query.ARQ ;
-import org.apache.jena.sparql.ARQException ;
-import org.apache.jena.sparql.engine.QueryEngineBase ;
-import org.slf4j.Logger ;
-import org.slf4j.LoggerFactory ;
-
-/* Old version of the class which did JMX operations.
- * See JENA-614 
- */
-class ARQMgt_X {
-    // In some environments, JMX does not exist.
-    static private Logger                  log         = 
LoggerFactory.getLogger(ARQMgt_X.class) ;
-    private static boolean                 initialized = false ;
-    private static boolean                 noJMX       = false ;
-    private static Map<ObjectName, Object> mgtObjects  = new HashMap<>() ;
-    private static MBeanServer             mbs         = null ;
-
-    public static synchronized void init() {
-        if (initialized)
-            return ;
-        initialized = true ;
-        if ( noJMX )
-            return ;
-
-        try {
-            mbs = ManagementFactory.getPlatformMBeanServer() ;
-        } catch (Throwable ex) {
-            Log.debug(ARQMgt_X.class, "Failed to initialize JMX: 
"+ex.getMessage()) ;
-            noJMX = true ;
-            mbs = null ;
-        }
-    }
-    
-    public static void register() {
-        init() ;
-        String NS = ARQ.PATH ;
-        ContextMBean cxtBean = new ContextMBean(ARQ.getContext()) ;
-        QueryEngineInfo qeInfo = QueryEngineBase.queryEngineInfo ;
-        // Done in ARQ initialization --
-        // register(NS+".system:type=SystemInfo", ARQ.systemInfo) ;
-        register(NS + ".system:type=Context", cxtBean) ;
-        register(NS + ".system:type=Engine", qeInfo) ;
-    }
-
-    public static void register(String name, Object bean) {
-        init() ;
-        if (noJMX)
-            return ;
-        ObjectName objName = objectName(name) ;
-        register(objName, bean) ;
-    }
-
-    public static void unregister(String name) {
-        init() ;
-        if (noJMX)
-            return ;
-        ObjectName objName = objectName(name) ;
-        unregister(objName) ;
-    }
-
-    private static void register(ObjectName objName, Object bean) {
-        try {
-            // Unregister to avoid classloader problems.
-            // A previous load of this class will have registered something
-            // with the object name. Remove it - copes with reloading.
-            // (Does not cope with multiple loads running in parallel.)
-            if (mbs.isRegistered(objName)) {
-                try {
-                    mbs.unregisterMBean(objName) ;
-                } catch (InstanceNotFoundException ex) {}
-            }
-            log.debug("Register MBean: " + objName) ;
-            mbs.registerMBean(bean, objName) ;
-            // remember ...
-            mgtObjects.put(objName, bean) ;
-        } catch (NotCompliantMBeanException ex) {
-            log.warn("Failed to register (NotCompliantMBeanException)'" + 
objName.getCanonicalName() + "': " + ex.getMessage()) ;
-            throw new ARQException("Failed to register '" + 
objName.getCanonicalName() + "': " + ex.getMessage(), ex) ;
-        } catch (InstanceAlreadyExistsException ex) {
-            log.warn("Failed to register (InstanceAlreadyExistsException)'" + 
objName.getCanonicalName() + "': " + ex.getMessage()) ;
-            throw new ARQException("Failed to register '" + 
objName.getCanonicalName() + "': " + ex.getMessage(), ex) ;
-        } catch (MBeanRegistrationException ex) {
-            log.warn("Failed to register (MBeanRegistrationException)'" + 
objName.getCanonicalName() + "': " + ex.getMessage()) ;
-            throw new ARQException("Failed to register '" + 
objName.getCanonicalName() + "': " + ex.getMessage(), ex) ;
-        }
-    }
-
-    private static void unregister(ObjectName objName) {
-        log.debug("Unregister MBean: " + objName) ;
-        if ( ! mgtObjects.containsKey(objName) )
-            log.warn("MBean not already registered: " + objName) ;
-        try {
-            mbs.unregisterMBean(objName) ;
-        } 
-        catch (InstanceNotFoundException ex) { }    // Meh, whatever
-        catch (MBeanRegistrationException ex) {
-            throw new InternalErrorException(ex) ;
-        }
-    }
-
-    private static ObjectName objectName(String name) {
-        try { return new ObjectName(name) ; }
-        catch (MalformedObjectNameException ex) {
-            throw new ARQException("Failed to create name '" + name + "': " + 
ex.getMessage(), ex) ;
-        }
-    }
-}
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ContextMBean.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ContextMBean.java
deleted file mode 100644
index 9327daf5ad..0000000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/ContextMBean.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.jena.sparql.mgt;
-
-import javax.management.* ;
-
-import org.apache.jena.sparql.util.Context ;
-import org.apache.jena.sparql.util.Symbol ;
-
-/** MBean for a context object (which can change) */
-public class ContextMBean implements DynamicMBean
-{
-    private final Context context ;
-    
-    public ContextMBean(Context context)
-    { 
-        this.context = context ;
-    }
-
-    private Object getAsString(String name) { return 
context.getAsString(Symbol.create(name)) ; }
-    
-    @Override
-    public Object getAttribute(String attribute) throws 
AttributeNotFoundException, MBeanException, ReflectionException
-    {
-        return getAsString(attribute) ;
-    }
-
-    @Override
-    public AttributeList getAttributes(String[] attributes)
-    {
-        AttributeList x = new AttributeList() ;
-        for ( String k : attributes )
-        {
-            Attribute a = new Attribute(k,  getAsString(k)) ; 
-            x.add(a) ;
-        }
-        return x ;
-    }
-
-    @Override
-    public MBeanInfo getMBeanInfo()
-    {
-        /*
-         * MBeanAttributeInfo(String name, String type, String description, 
boolean isReadable, boolean isWritable, boolean isIs) 
-         */
-        MBeanAttributeInfo[] attrInfo = new MBeanAttributeInfo[context.size()] 
;
-        int idx = 0 ;
-        for ( Symbol sk : context.keys() )
-        {
-            // Not all are settable - only is string, boolean, integer.
-            Object obj = context.get(sk) ;
-            boolean settable = false ;
-            
-            if ( obj instanceof String ) settable = true ;
-            if ( obj instanceof Boolean ) settable = true ;
-            if ( obj instanceof Integer ) settable = true ;
-            
-            MBeanAttributeInfo attr = new MBeanAttributeInfo(sk.getSymbol(), 
"java.lang.String", sk.getSymbol(),
-                                                             true, settable, 
false) ;
-            attrInfo[idx++] = attr ;
-        }
-        
-        /*
-         * String className,
-                 String description,
-                 MBeanAttributeInfo[] attributes,
-                 MBeanConstructorInfo[] constructors,
-                 MBeanOperationInfo[] operations,
-                 MBeanNotificationInfo[] notifications)
-          throws IllegalArgumentException
-         */
-        MBeanInfo info = new MBeanInfo(this.getClass().getName(), "ARQ global 
context",
-                                       attrInfo,
-                                       null,        // Constructors
-                                       null,        // Operations
-                                       null         // Notifications
-                                        ) ;
-        return info ;
-    }
-
-    @Override
-    public Object invoke(String actionName, Object[] params, String[] 
signature) throws MBeanException,
-                                                                               
 ReflectionException
-    {
-        return null ;
-    }
-
-    @Override
-    public void setAttribute(Attribute attribute) throws 
AttributeNotFoundException, InvalidAttributeValueException,
-                                                 MBeanException, 
ReflectionException
-    {
-        context.set(Symbol.create(attribute.getName()), attribute.getValue()) ;
-    }
-
-    @Override
-    public AttributeList setAttributes(AttributeList attributes)
-    {
-        AttributeList results = new AttributeList() ;
-        for ( Object obj : attributes )
-        {
-            Attribute a = (Attribute)obj ;
-            
-            Object value = a.getValue() ;
-            Object oldValue = getAsString(a.getName()) ;
-            
-            // Check type of old value.
-            //if ( oldValue instanceof Boolean )
-            
-            try { setAttribute(a) ; } catch (Exception ex) {}
-            results.add(new Attribute( a.getName(), getAsString(a.getName()) 
)) ;
-        }
-        
-        return results ;
-    }
-    
-}
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfo.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfo.java
index c9079ee1ce..ffbeeb52e0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfo.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfo.java
@@ -24,21 +24,25 @@ import org.apache.jena.atlas.lib.DateTimeUtils ;
 import org.apache.jena.query.Query ;
 import org.apache.jena.sparql.algebra.Op ;
 
+/**
+ * @deprecated To be removed.
+ */
+@Deprecated(since="4.9.0")
 public class QueryEngineInfo implements QueryEngineInfoMBean
 {
     // Has to be careful about concurrency.
     // It is possible that the count may be momentarily wrong
     // (reading longs is not atomic).
-    
+
     private AtomicLong count = new AtomicLong(0) ;
     @Override
     public long getQueryCount()                 { return count.get() ; }
     public void incQueryCount()                 { count.incrementAndGet() ; }
-    
+
     Query query = null ;
     @Override
     public String getLastQueryString()
-    { 
+    {
         Query q = query ;    // Get once.
         if ( q != null ) return q.toString() ;
         // Sometimes an alegra expression is executited without a query.
@@ -63,6 +67,6 @@ public class QueryEngineInfo implements QueryEngineInfoMBean
 //    private long lastExecTime ;
 //    public long getLastQueryExecTime()          { return lastExecTime ; }
 //    public void setLastQueryExecTime(long timeMillis)   { lastExecTime = 
timeMillis ; }
-    
-    
+
+
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfoMBean.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfoMBean.java
index 75b36ea766..6dc5e3fb99 100644
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfoMBean.java
+++ 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryEngineInfoMBean.java
@@ -18,21 +18,24 @@
 
 package org.apache.jena.sparql.mgt;
 
-/** Overall statistics from a query engine - one such per type of engine. */
+/**
+ * @deprecated To be removed.
+ */
+@Deprecated(since="4.9.0")
 public interface QueryEngineInfoMBean
 {
     /** Number of queries executed */
-    long getQueryCount() ; 
-    
+    long getQueryCount() ;
+
     /** Last query seen, as a string */
     String getLastQueryString() ;
-    
+
     /** Last algebra expression seen, as a string */
     String getLastAlgebra() ;
 
     /** Point in time when last query seen */
     String getLastQueryExecAt() ;
 
-//    /** Length of elapsed time (in microseconds) for the last query : -1 for 
unknown */  
+//    /** Length of elapsed time (in microseconds) for the last query : -1 for 
unknown */
 //    long getLastQueryExecTime() ;
 }
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryExecMBean.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryExecMBean.java
index 135e0905ed..07e3d4e87a 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryExecMBean.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/QueryExecMBean.java
@@ -18,18 +18,21 @@
 
 package org.apache.jena.sparql.mgt;
 
-/** Details of a single query execution */
+/**
+ * @deprecated To be removed.
+ */
+@Deprecated(since="4.9.0")
 public interface QueryExecMBean
 {
     /** State - what's it doing */
     String getState() ;
-    
+
     /** Query as a string */
     String getQueryString() ;
-    
+
     /** Point in time when query execution started */
     String getQueryExecAt() ;
 
-    /** Length of elapsed time (in microseconds) for query : -1 for unknown or 
unfinished */  
+    /** Length of elapsed time (in microseconds) for query : -1 for unknown or 
unfinished */
     long getQueryExecTime() ;
 }
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfo.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfo.java
index f19f80af7c..911aa1c5bf 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfo.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfo.java
@@ -22,6 +22,10 @@ import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.NodeFactory ;
 import org.apache.jena.irix.IRIs;
 
+/**
+ * @deprecated To be removed.
+ */
+@Deprecated(since="4.9.0")
 public class SystemInfo implements SystemInfoMBean {
     private final String name ;
     private final Node   iri ;
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfoMBean.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfoMBean.java
index 5a8baa176c..0c34d96faa 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfoMBean.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/mgt/SystemInfoMBean.java
@@ -18,6 +18,10 @@
 
 package org.apache.jena.sparql.mgt;
 
+/**
+ * @deprecated To be removed.
+ */
+@Deprecated(since="4.9.0")
 public interface SystemInfoMBean
 {
     public String getName() ;
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/version.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/version.java
deleted file mode 100644
index b667c5743e..0000000000
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/version.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.jena.sparql.pfunction.library;
-
-import java.util.ArrayList ;
-import java.util.Iterator ;
-import java.util.List ;
-
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.sparql.SystemARQ ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.engine.ExecutionContext ;
-import org.apache.jena.sparql.engine.QueryIterator ;
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.apache.jena.sparql.engine.binding.BindingBuilder;
-import org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper ;
-import org.apache.jena.sparql.mgt.SystemInfo ;
-import org.apache.jena.sparql.pfunction.PropFuncArg ;
-import org.apache.jena.sparql.pfunction.PropFuncArgType ;
-import org.apache.jena.sparql.pfunction.PropertyFunctionEval ;
-
-/** Access the subsystem version registry and yield URI/version for each entry 
*/
-public class version extends PropertyFunctionEval
-{
-    public version()
-    { super(PropFuncArgType.PF_ARG_SINGLE, PropFuncArgType.PF_ARG_SINGLE) ; }
-
-    @Override
-    public QueryIterator execEvaluated(Binding binding, PropFuncArg subject, 
Node predicate, PropFuncArg object, ExecutionContext execCxt)
-    {
-
-        List<Binding> results = new ArrayList<>() ;
-        Node subj = subject.getArg() ;
-        Node obj = object.getArg() ;
-
-        Iterator<SystemInfo> iter = SystemARQ.registeredSubsystems() ;
-
-        for ( ; iter.hasNext() ; )
-        {
-            SystemInfo info = iter.next();
-            if ( ! isSameOrVar(subj, info.getIRI()) )
-                continue ;
-            Node version = NodeFactory.createLiteral(info.getVersion()) ;
-            if ( ! isSameOrVar(obj, version) )
-                continue ;
-
-            BindingBuilder builder = Binding.builder(binding) ;
-            if ( subj.isVariable() )
-                builder.add(Var.alloc(subj), info.getIRI()) ;
-            if ( subj.isVariable() )
-                builder.add(Var.alloc(obj), version) ;
-            results.add(builder.build()) ;
-        }
-        return QueryIterPlainWrapper.create(results.iterator(), execCxt) ;
-    }
-
-    private boolean isSameOrVar(Node var, Node value)
-    {
-        return var.isVariable() || var.equals(value) ;
-    }
-}
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/versionARQ.java
 
b/jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/versionARQ.java
deleted file mode 100644
index f6e4af0e76..0000000000
--- 
a/jena-arq/src/main/java/org/apache/jena/sparql/pfunction/library/versionARQ.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.jena.sparql.pfunction.library;
-
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.query.ARQ ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.engine.ExecutionContext ;
-import org.apache.jena.sparql.engine.QueryIterator ;
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.apache.jena.sparql.engine.binding.BindingBuilder;
-import org.apache.jena.sparql.expr.NodeValue ;
-import org.apache.jena.sparql.pfunction.PropFuncArg ;
-import org.apache.jena.sparql.pfunction.PropFuncArgType ;
-import org.apache.jena.sparql.pfunction.PropertyFunctionEval ;
-import org.apache.jena.sparql.util.IterLib ;
-
-public class versionARQ extends PropertyFunctionEval
-{
-    static String versionStr = ARQ.VERSION ;    // X.Y.Z
-
-    static Node version = NodeValue.makeString(versionStr).asNode() ;
-
-    static Node arq = NodeFactory.createURI(ARQ.arqIRI) ;
-
-    public versionARQ()
-    { super(PropFuncArgType.PF_ARG_SINGLE, PropFuncArgType.PF_ARG_SINGLE) ; }
-
-    @Override
-    public QueryIterator execEvaluated(Binding binding, PropFuncArg subject, 
Node predicate, PropFuncArg object, ExecutionContext execCxt)
-    {
-        BindingBuilder builder = Binding.builder(binding) ;
-
-        Node subj = subject.getArg() ;
-        if ( ! isSameOrVar(subj, arq) )
-            IterLib.noResults(execCxt) ;
-        if ( subj.isVariable() )
-            builder.add(Var.alloc(subj), arq) ;
-
-        Node obj = object.getArg() ;
-        if ( ! isSameOrVar(obj, version) )
-            IterLib.noResults(execCxt) ;
-        if ( obj.isVariable() )
-            builder.add(Var.alloc(obj), version) ;
-
-        return IterLib.result(builder.build(), execCxt) ;
-    }
-
-    private boolean isSameOrVar(Node var, Node value)
-    {
-        return var.isVariable() || var.equals(value) ;
-    }
-}
diff --git a/jena-core/src/main/java/org/apache/jena/Jena.java 
b/jena-core/src/main/java/org/apache/jena/Jena.java
index 56cf970ece..a2d539b807 100644
--- a/jena-core/src/main/java/org/apache/jena/Jena.java
+++ b/jena-core/src/main/java/org/apache/jena/Jena.java
@@ -18,6 +18,8 @@
 
 package org.apache.jena;
 
+import org.apache.jena.atlas.lib.Version;
+
 /**
  * <p>
  * Provides various meta-data constants about the Jena package.
@@ -25,23 +27,18 @@ package org.apache.jena;
  */
 public interface Jena
 {
-       /** The root package name for Jena */    
+       /** The root package name for Jena */
     public static final String PATH = "org.apache.jena";
-    
+
     /** The root name for metadata */
-    
     public static final String MPATH = "org.apache.jena";
-    static final String UNSET = "unset" ;
-    
-    /** The product name */    
-    public static final String NAME = JenaRuntime.getMetadata( MPATH + 
".name", UNSET ) ;
-    
-    /** The Jena web site */    
-    public static final String WEBSITE = JenaRuntime.getMetadata( MPATH + 
".website", UNSET ) ;
-    
-    /** The full name of the current Jena version */    
-    public static final String VERSION = JenaRuntime.getMetadata( MPATH + 
".version", UNSET ) ;
-    
-    /** The date and time at which this release was built */    
-    public static final String BUILD_DATE = JenaRuntime.getMetadata( MPATH + 
".build.datetime", UNSET ) ;
+
+    /** The product name */
+    public static final String NAME = "Apache Jena";
+
+    /** The Jena web site */
+    public static final String WEBSITE = "https://jena.apache.org/";;
+
+    /** The full name of the current Jena version */
+    public static final String VERSION = 
Version.versionForClass(Jena.class).orElse("<development>");
 }
diff --git a/jena-core/src/main/java/org/apache/jena/JenaRuntime.java 
b/jena-core/src/main/java/org/apache/jena/JenaRuntime.java
index 7001b07206..71a491c405 100644
--- a/jena-core/src/main/java/org/apache/jena/JenaRuntime.java
+++ b/jena-core/src/main/java/org/apache/jena/JenaRuntime.java
@@ -20,8 +20,6 @@ package org.apache.jena;
 
 import java.util.* ;
 
-import org.apache.jena.util.Metadata ;
-
 /**
  * Methods and constants that define features of the current the environment.
  * Primarily for other parts of the Jena framework.
@@ -84,14 +82,16 @@ public class JenaRuntime
 
     // --------------------------------------------------------------
 
-    private static String metadataLocation = 
"org/apache/jena/jena-properties.xml" ;
-    private static Metadata metadata = new Metadata(metadataLocation) ;
-    public static String getMetadata(String key, String defaultValue) { return 
metadata.get(key, defaultValue) ; }
+    /** @deprecated To be removed */
+    @Deprecated(since="4.9.0")
+    public static String getMetadata(String key, String defaultValue) { return 
null; }
 
-    /** The JVM does not implement java.security (correctly) */
+    /** @deprecated To be removed */
+    @Deprecated(since="4.9.0")
     public static final String featureNoSecurity = 
"http://jena.hpl.hp.com/2004/07/feature/noSecurity"; ;
 
-    /** The JVM does not implement java.nio.charset.Charset operations 
(correctly) */
+    /** @deprecated To be removed */
+    @Deprecated(since="4.9.0")
     public static final String featureNoCharset = 
"http://jena.hpl.hp.com/2004/07/feature/noCharset"; ;
 
     static Map<String, String> features = new HashMap<>() ;
@@ -105,9 +105,9 @@ public class JenaRuntime
                 setFeature(featureNoCharset) ;
     }
 
+    /** @deprecated To be removed */
+    @Deprecated(since="4.9.0")
     public static void setFeature(String featureName) { 
features.put(featureName, "true") ; }
-    public static boolean runUnder(String featureName) { return 
features.containsKey(featureName) ; }
-    public static boolean runNotUnder(String featureName) { return ! 
features.containsKey(featureName) ; }
 
 
     static final String lineSeparator = getSystemProperty("line.separator", 
"\n") ;
diff --git a/jena-core/src/main/java/org/apache/jena/util/FileUtils.java 
b/jena-core/src/main/java/org/apache/jena/util/FileUtils.java
index d7416d2d85..f85a7e5ebc 100644
--- a/jena-core/src/main/java/org/apache/jena/util/FileUtils.java
+++ b/jena-core/src/main/java/org/apache/jena/util/FileUtils.java
@@ -45,30 +45,21 @@ public class FileUtils
     static Charset utf8 = StandardCharsets.UTF_8 ;
 
     /** Create a reader that uses UTF-8 encoding */
-
     static public Reader asUTF8(InputStream in) {
-        if ( JenaRuntime.runUnder(JenaRuntime.featureNoCharset) )
-            return new InputStreamReader(in) ;
-        // Not ,utf8 -- GNUClassPath (0.20) apparently fails on passing in a 
charset
-        // but if passed not the decoder or the name of the charset.
-        // Reported and fixed.
         return new InputStreamReader(in, utf8.newDecoder());
     }
 
     /** Create a buffered reader that uses UTF-8 encoding */
 
-    static public BufferedReader asBufferedUTF8(InputStream in)
-    {
-        BufferedReader r = new BufferedReader(asUTF8(in)) ;
-        return r ;
+    static public BufferedReader asBufferedUTF8(InputStream in) {
+        BufferedReader r = new BufferedReader(asUTF8(in));
+        return r;
     }
 
     /** Create a writer that uses UTF-8 encoding */
 
     static public Writer asUTF8(OutputStream out) {
-        if ( JenaRuntime.runUnder(JenaRuntime.featureNoCharset) )
-            return new OutputStreamWriter(out) ;
-        return new OutputStreamWriter(out, utf8.newEncoder());
+        return new OutputStreamWriter(out, utf8);
     }
 
     /** Create a print writer that uses UTF-8 encoding */
diff --git a/jena-core/src/main/java/org/apache/jena/util/Metadata.java 
b/jena-core/src/main/java/org/apache/jena/util/Metadata.java
deleted file mode 100644
index c564766c3a..0000000000
--- a/jena-core/src/main/java/org/apache/jena/util/Metadata.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.jena.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList ;
-import java.util.InvalidPropertiesFormatException;
-import java.util.List ;
-import java.util.Properties;
-
-import org.apache.jena.atlas.AtlasException;
-import org.apache.jena.atlas.RuntimeIOException;
-import org.apache.jena.atlas.lib.SystemUtils;
-import org.apache.jena.atlas.logging.Log;
-import org.apache.jena.shared.JenaException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Pluck data out of the ether - or failing that, read it from a properties 
file. Assumes
- * the properties file is in the "right place" through configuration of the 
build or
- * compile processes.
- */
-public class Metadata {
-    private static Logger log        = LoggerFactory.getLogger(Metadata.class);
-    List<String>          resources  = new ArrayList<>();
-    Properties            properties = new Properties();
-
-    public Metadata() {}
-
-    public Metadata(String resourceName) {
-        this();
-        addMetadata(resourceName);
-    }
-
-    public void addMetadata(String resourceName) {
-        resources.add(resourceName);
-        read(properties, resourceName);
-    }
-
-    // Protect all classloader choosing -- sometimes systems mess with even 
the system
-    // class loader.
-    private static void read(Properties properties, String resourceName) {
-        // Armour-plate this - classloaders and using them can be blocked by 
some
-        // environments.
-        try {
-            ClassLoader classLoader = null;
-
-            try { classLoader = SystemUtils.chooseClassLoader(); } catch 
(AtlasException ex) {}
-
-            if ( classLoader == null ) {
-                try { classLoader = Metadata.class.getClassLoader(); } catch 
(AtlasException ex) {}
-            }
-
-            if ( classLoader == null ) {
-                Log.error(Metadata.class, "No classloader");
-                return;
-            }
-
-            InputStream in = classLoader.getResourceAsStream(resourceName);
-            if ( in == null )
-                return;
-
-            try {
-                properties.loadFromXML(in);
-            } catch (InvalidPropertiesFormatException ex) {
-                throw new JenaException("Invalid properties file", ex);
-            } catch (IOException ex) {
-                throw new RuntimeIOException("Metadata ==> IOException", ex);
-            }
-        } catch (Throwable ex) {
-            Log.error(Metadata.class, "Unexpected Throwable", ex);
-            return;
-        }
-    }
-
-    public String get(String name) {
-        return get(name, null);
-    }
-
-    public String get(String name, String defaultValue) {
-        if ( properties == null )
-            return defaultValue;
-        return properties.getProperty(name, defaultValue);
-    }
-}
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java
index fabcae866e..9097b6e48d 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/Fuseki.java
@@ -25,18 +25,16 @@ import java.util.concurrent.TimeUnit;
 import javax.servlet.ServletContext;
 
 import org.apache.jena.atlas.lib.DateTimeUtils;
+import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.query.ARQ;
 import org.apache.jena.riot.system.stream.LocatorFTP;
 import org.apache.jena.riot.system.stream.LocatorHTTP;
 import org.apache.jena.riot.system.stream.StreamManager;
-import org.apache.jena.sparql.SystemARQ;
-import org.apache.jena.sparql.mgt.SystemInfo;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.MappingRegistry;
 import org.apache.jena.sys.JenaSystem;
 import org.apache.jena.tdb.TDB;
 import org.apache.jena.tdb.transaction.TransactionManager;
-import org.apache.jena.util.Metadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,30 +66,11 @@ public class Fuseki {
     /** Add CORS header */
     static public final boolean CORS_ENABLED = false;
 
-    /**
-     * A relative resources path to the location of
-     * <code>fuseki-properties.xml</code> file.
-     */
-    static private String   metadataLocation             = 
"org/apache/jena/fuseki/fuseki-properties.xml";
-
-    /**
-     * Object which holds metadata specified within
-     * {@link Fuseki#metadataLocation}
-     */
-    static private Metadata metadata                     = initMetadata();
-
-    private static Metadata initMetadata() {
-        return new Metadata(metadataLocation);
-    }
-
     /** The name of the Fuseki server.*/
     static public final String        NAME              = "Apache Jena Fuseki";
 
     /** Version of this Fuseki instance */
-    static public final String        VERSION           = metadata.get(PATH + 
".version", "development");
-
-    /** Date when Fuseki was built */
-    static public final String        BUILD_DATE        = metadata.get(PATH + 
".build.datetime", "unknown");
+    static public final String        VERSION           = 
Version.versionForClass(Fuseki.class).orElse("<devlopment>");
 
     /** Supporting Graph Store Protocol direct naming.
      * <p>
@@ -264,12 +243,10 @@ public class Fuseki {
             return;
         initialized = true;
         JenaSystem.init();
-        SystemInfo sysInfo = new SystemInfo(FusekiIRI, PATH, VERSION, 
BUILD_DATE);
-        SystemARQ.registerSubSystem(sysInfo);
         MappingRegistry.addPrefixMapping("fuseki", FusekiSymbolIRI);
 
         TDB.setOptimizerWarningFlag(false);
-        // Don't set TDB batch commits.
+        // Don't use TDB1 batch commits.
         // This can be slower, but it less memory hungry and more predictable.
         TransactionManager.QueueBatchSize = 0;
     }
@@ -282,9 +259,4 @@ public class Fuseki {
     public static Context getContext() {
         return ARQ.getContext();
     }
-
-    // Force a call to init.
-    static {
-        init();
-    }
 }
diff --git 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java
 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java
index cc2cb89c18..0b64600f25 100644
--- 
a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java
+++ 
b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java
@@ -22,7 +22,6 @@ import static java.lang.String.format;
 
 import java.util.*;
 
-import org.apache.jena.atlas.lib.DateTimeUtils;
 import org.apache.jena.atlas.logging.FmtLog;
 import org.apache.jena.fuseki.Fuseki;
 import org.slf4j.Logger;
@@ -33,19 +32,8 @@ public class FusekiCoreInfo {
     /** Details of the code version. */
     public static void logCode(Logger log) {
         String version = Fuseki.VERSION;
-        String buildDate = Fuseki.BUILD_DATE;
         String serverName = Fuseki.NAME;
-
-        if ( version != null && version.equals("${project.version}") )
-            version = null;
-        if ( buildDate != null && buildDate.equals("${build.time.xsd}") )
-            buildDate = DateTimeUtils.nowAsXSDDateTimeString();
-        if ( version != null ) {
-            if ( Fuseki.developmentMode && buildDate != null )
-                FmtLog.info(log, "%s %s %s", serverName, version, buildDate);
-            else
-                FmtLog.info(log, "%s %s", serverName, version);
-        }
+        FmtLog.info(log, "%s %s", serverName, version);
     }
 
     /** Log details - this function is about command line details */
diff --git a/jena-fuseki2/jena-fuseki-ui/src/services/mock/json-server.js 
b/jena-fuseki2/jena-fuseki-ui/src/services/mock/json-server.js
index 1bc021bac7..8a9f31e330 100644
--- a/jena-fuseki2/jena-fuseki-ui/src/services/mock/json-server.js
+++ b/jena-fuseki2/jena-fuseki-ui/src/services/mock/json-server.js
@@ -42,8 +42,7 @@ server.get('/index.html', (req, res) => res.jsonp(''))
 // GET SERVER INFO
 server.get('/\\$/server', (req, res) => {
   res.jsonp({
-    version: '3.14.0',
-    built: builtTime.toISOString(),
+    version: '4.x.y',
     startDateTime: startTime.toISOString(),
     uptime: parseInt(`${(new Date() - startTime) / 1000}`),
     datasets: Object.values(DATASETS)
diff --git 
a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionServerStatus.java
 
b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionServerStatus.java
index 7d3783e30a..33df28e62a 100644
--- 
a/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionServerStatus.java
+++ 
b/jena-fuseki2/jena-fuseki-webapp/src/main/java/org/apache/jena/fuseki/mgt/ActionServerStatus.java
@@ -82,19 +82,11 @@ public class ActionServerStatus extends ActionCtl
 
     private void describeServer(JsonBuilder builder, int requestPort) {
         String versionStr = Fuseki.VERSION;
-        String builtDateStr = Fuseki.BUILD_DATE;
-        if ( versionStr == null || versionStr.startsWith("${") )
-            versionStr = "Development";
-        if ( builtDateStr == null || builtDateStr.startsWith("${") )
-            builtDateStr = "Unknown";
-
         builder
             .pair(ServerMgtConst.version,   versionStr)
-            .pair(ServerMgtConst.built,     builtDateStr)
             .pair(ServerMgtConst.startDT,   Fuseki.serverStartedAt())
             .pair(ServerMgtConst.uptime,    Fuseki.serverUptimeSeconds())
-;
-
+            ;
     }
 
     private void describeDatasets(JsonBuilder builder, DataAccessPointRegistry 
registry) {
diff --git a/jena-tdb1/src/main/java/org/apache/jena/tdb/StoreConnection.java 
b/jena-tdb1/src/main/java/org/apache/jena/tdb/StoreConnection.java
index d70bb36635..4163763ca4 100644
--- a/jena-tdb1/src/main/java/org/apache/jena/tdb/StoreConnection.java
+++ b/jena-tdb1/src/main/java/org/apache/jena/tdb/StoreConnection.java
@@ -23,7 +23,6 @@ import java.util.Map ;
 import java.util.Set ;
 
 import org.apache.jena.query.TxnType;
-import org.apache.jena.sparql.mgt.ARQMgt ;
 import org.apache.jena.tdb.base.file.ChannelManager ;
 import org.apache.jena.tdb.base.file.Location ;
 import org.apache.jena.tdb.base.file.LocationLock ;
@@ -282,9 +281,6 @@ public class StoreConnection
             if (!location.isMemUnique())
                 // Don't cache use-once in-memory datasets.
                 cache.put(location, sConn) ;
-            String NS = TDB.PATH ;
-            TransactionInfo txInfo = new 
TransactionInfo(sConn.transactionManager) ;
-            ARQMgt.register(NS + ".system:type=Transactions", txInfo) ;
         }
         return sConn ;
     }
diff --git a/jena-tdb1/src/main/java/org/apache/jena/tdb/TDB.java 
b/jena-tdb1/src/main/java/org/apache/jena/tdb/TDB.java
index 50fabaed37..46ba684a2b 100644
--- a/jena-tdb1/src/main/java/org/apache/jena/tdb/TDB.java
+++ b/jena-tdb1/src/main/java/org/apache/jena/tdb/TDB.java
@@ -22,6 +22,7 @@ import java.util.Iterator ;
 
 import org.apache.jena.atlas.iterator.Iter ;
 import org.apache.jena.atlas.lib.Sync ;
+import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.ontology.OntModel ;
@@ -30,11 +31,9 @@ import org.apache.jena.query.ARQ ;
 import org.apache.jena.query.Dataset ;
 import org.apache.jena.rdf.model.Model ;
 import org.apache.jena.reasoner.InfGraph ;
-import org.apache.jena.sparql.SystemARQ ;
 import org.apache.jena.sparql.core.DatasetGraph ;
 import org.apache.jena.sparql.engine.main.StageBuilder ;
 import org.apache.jena.sparql.engine.main.StageGenerator ;
-import org.apache.jena.sparql.mgt.SystemInfo ;
 import org.apache.jena.sparql.util.Context ;
 import org.apache.jena.sparql.util.MappingRegistry ;
 import org.apache.jena.sparql.util.Symbol ;
@@ -49,7 +48,6 @@ import org.apache.jena.tdb.sys.EnvTDB ;
 import org.apache.jena.tdb.sys.SystemTDB ;
 import org.apache.jena.tdb.sys.TDBInternal;
 import org.apache.jena.tdb.transaction.DatasetGraphTransaction ;
-import org.apache.jena.util.Metadata;
 import org.slf4j.Logger ;
 import org.slf4j.LoggerFactory ;
 
@@ -214,20 +212,13 @@ public class TDB {
             ((Sync)object).sync() ;
     }
 
-    // ---- Static constants read by modVersion
-    // ---- Must be after initialization.
-
-    static private String      metadataLocation = 
"org/apache/jena/tdb/tdb-properties.xml" ;
-    static private Metadata    metadata         = new 
Metadata(metadataLocation) ;
     /** The root package name for TDB */
     public static final String PATH             = "org.apache.jena.tdb" ;
     // The names known to ModVersion : "NAME", "VERSION", "BUILD_DATE"
 
     public static final String NAME             = "TDB1" ;
     /** The full name of the current TDB version */
-    public static final String VERSION          = metadata.get(PATH + 
".version", "DEV") ;
-    /** The date and time at which this release was built */
-    public static final String BUILD_DATE       = metadata.get(PATH + 
".build.datetime", "unset") ;
+    public static final String VERSION          = 
Version.versionForClass(TDB.class).orElse("<development>");
 
     static { JenaSystem.init(); }
 
@@ -274,22 +265,10 @@ public class TDB {
         StageBuilder.setGenerator(ARQ.getContext(), stageGenerator) ;
     }
 
-    // ---- Static constants read by modVersion
-    // ---- Must be after initialization.
-
-
-
-    // The names known to ModVersion : "NAME", "VERSION", "BUILD_DATE"
-
     // Final initialization (in case any statics in this file are important).
     static {
         initialization2() ;
     }
 
-    private static void initialization2() {
-        // Set management information.
-        SystemInfo systemInfo = new SystemInfo(TDB.tdbIRI, TDB.PATH, 
TDB.VERSION, TDB.BUILD_DATE) ;
-        SystemARQ.registerSubSystem(systemInfo) ;
-    }
-
+    private static void initialization2() {}
 }
diff --git a/jena-tdb1/src/main/java/org/apache/jena/tdb/mgt/TDBMgt.java 
b/jena-tdb1/src/main/java/org/apache/jena/tdb/mgt/TDBMgt.java
deleted file mode 100644
index ea92eaa4c3..0000000000
--- a/jena-tdb1/src/main/java/org/apache/jena/tdb/mgt/TDBMgt.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.jena.tdb.mgt;
-
-import org.apache.jena.sparql.mgt.SystemInfo ;
-import org.apache.jena.tdb.TDB ;
-
-public class TDBMgt
-{
-    public static void init()
-    {
-        String NS = TDB.PATH ;
-        SystemInfo sysInfo = new SystemInfo(TDB.tdbIRI, TDB.PATH, TDB.VERSION, 
TDB.BUILD_DATE) ;
-//        ARQMgt.register(NS+".system:type=SystemInfo", sysInfo) ;
-//        ARQMgt.register(NS+".system2:type=SystemInfo", new TDBSystemInfo()) 
; 
-    }
-}
diff --git a/jena-tdb1/src/test/java/org/apache/jena/tdb/sys/TestSys.java 
b/jena-tdb1/src/test/java/org/apache/jena/tdb/sys/TestSys.java
index dd52720026..089fb832b9 100644
--- a/jena-tdb1/src/test/java/org/apache/jena/tdb/sys/TestSys.java
+++ b/jena-tdb1/src/test/java/org/apache/jena/tdb/sys/TestSys.java
@@ -18,17 +18,14 @@
 
 package org.apache.jena.tdb.sys;
 
-
 import static org.junit.Assert.assertNotNull;
 
-import org.apache.jena.tdb.TDB ;
+import org.apache.jena.tdb.TDB;
 import org.junit.Test;
 
-public class TestSys
-{
-    @Test public void sys1()
-    {
-        assertNotNull(TDB.VERSION) ;
-        assertNotNull(TDB.BUILD_DATE) ;
+public class TestSys {
+    @Test
+    public void sys1() {
+        assertNotNull(TDB.VERSION);
     }
 }
diff --git a/jena-tdb2/src/main/java/org/apache/jena/tdb2/TDB2.java 
b/jena-tdb2/src/main/java/org/apache/jena/tdb2/TDB2.java
index 49763564d9..bc1a10c3a5 100644
--- a/jena-tdb2/src/main/java/org/apache/jena/tdb2/TDB2.java
+++ b/jena-tdb2/src/main/java/org/apache/jena/tdb2/TDB2.java
@@ -18,12 +18,11 @@
 
 package org.apache.jena.tdb2;
 
+import org.apache.jena.atlas.lib.Version;
 import org.apache.jena.query.ARQ;
-import org.apache.jena.sparql.SystemARQ;
 import org.apache.jena.sparql.core.assembler.AssemblerUtils;
 import org.apache.jena.sparql.engine.main.StageBuilder;
 import org.apache.jena.sparql.engine.main.StageGenerator;
-import org.apache.jena.sparql.mgt.SystemInfo;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.MappingRegistry;
 import org.apache.jena.sparql.util.Symbol;
@@ -35,7 +34,7 @@ import org.apache.jena.tdb2.solver.StageGeneratorDirectTDB;
 import org.apache.jena.tdb2.sys.EnvTDB;
 import org.apache.jena.tdb2.sys.SystemTDB;
 import org.apache.jena.tdb2.sys.TDBInternal;
-import org.apache.jena.util.Metadata;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -153,12 +152,8 @@ public class TDB2 {
         StageBuilder.setGenerator(ARQ.getContext(), stageGenerator);
     }
 
-    // ---- Static constants read by modVersion
     // ---- Must be after initialization.
 
-    private static final String      metadataLocation = 
"org/apache/jena/tdb2/tdb2-properties.xml";
-    private static final Metadata    metadata         = new 
Metadata(metadataLocation);
-
     /** The root package name for TDB */
     public static final String PATH             = "org.apache.jena.tdb2";
 
@@ -167,20 +162,12 @@ public class TDB2 {
     public static final String NAME             = "TDB";
 
     /** The full name of the current TDB version */
-    public static final String VERSION          = metadata.get(PATH + 
".version", "DEV");
-
-    /** The date and time at which this release was built */
-    public static final String BUILD_DATE       = metadata.get(PATH + 
".build.datetime", "unset");
+    public static final String VERSION          = 
Version.versionForClass(TDB2.class).orElse("<development>");
 
     // Final initialization (in case any statics in this file are important).
     static {
         initialization2();
     }
 
-    private static void initialization2() {
-        // Set management information.
-        SystemInfo systemInfo = new SystemInfo(TDB2.tdbIRI, TDB2.PATH, 
TDB2.VERSION, TDB2.BUILD_DATE);
-        SystemARQ.registerSubSystem(systemInfo);
-    }
-
+    private static void initialization2() {}
 }
diff --git a/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestSys.java 
b/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestSys.java
index 0f2631a60b..2e2242d87d 100644
--- a/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestSys.java
+++ b/jena-tdb2/src/test/java/org/apache/jena/tdb2/sys/TestSys.java
@@ -24,11 +24,9 @@ import static org.junit.Assert.*;
 import org.apache.jena.tdb2.TDB2;
 import org.junit.Test;
 
-public class TestSys
-{
-    @Test public void sys1()
-    {
+public class TestSys {
+    @Test
+    public void sys1() {
         assertNotNull(TDB2.VERSION);
-        assertNotNull(TDB2.BUILD_DATE);
     }
 }

Reply via email to