All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.openjpa.lib.conf.PluginValue Maven / Gradle / Ivy

The newest version!
/*
 * 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.openjpa.lib.conf;

import java.util.Objects;

import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.lib.log.LogFactory;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.lib.util.ParseException;

/**
 * A plugin {@link Value} consisting of plugin name and properties.
 * Plugins should be specified in the form:
* <plugin-name>(<prop1>=<val1>, ...)
* Both the plugin name and prop list are optional, so that the following * forms are also valid:
* <plugin-name>
* <prop1>=<val1> ... * Defaults and aliases on plugin values apply only to the plugin name. * * @author Abe White */ public class PluginValue extends ObjectValue { private static final Localizer _loc = Localizer.forPackage (PluginValue.class); private final boolean _singleton; private String _name = null; private String _props = null; public PluginValue(String prop, boolean singleton) { super(prop); _singleton = singleton; } /** * Whether this value is a singleton. */ public boolean isSingleton() { return _singleton; } /** * The plugin class name. */ public String getClassName() { return _name; } /** * The plugin class name. */ public void setClassName(String name) { assertChangeable(); String oldName = _name; _name = name; if (!Objects.equals(oldName, name)) { if (_singleton) set(null, true); valueChanged(); } } /** * The plugin properties. */ public String getProperties() { return _props; } /** * The plugin properties. */ public void setProperties(String props) { String oldProps = _props; _props = props; if (!Objects.equals(oldProps, props)) { if (_singleton) set(null, true); valueChanged(); } } /** * Instantiate the plugin as an instance of the given class. */ @Override public Object instantiate(Class type, Configuration conf, boolean fatal) { Object obj = newInstance(_name, type, conf, fatal); // ensure plugin value is compatible with plugin type if (obj != null && !type.isAssignableFrom(obj.getClass())) { Log log = (conf == null || type.equals(LogFactory.class)) ? null : conf.getConfigurationLog(); String msg = getIncompatiblePluginMessage(obj, type); if (log != null && log.isErrorEnabled()) { log.error(msg); } if (fatal) { throw new ParseException(msg); } return null; } Configurations.configureInstance(obj, conf, _props, (fatal) ? getProperty() : null); if (_singleton) set(obj, true); return obj; } private String getIncompatiblePluginMessage(Object obj, Class type) { return _loc.get("incompatible-plugin", new Object[]{ _name, obj == null ? null : obj.getClass().getName(), type == null ? null : type.getName() }).toString(); } /** * Configure the given object. */ @Override public Object configure(Object obj, Configuration conf, boolean fatal) { Configurations.configureInstance(obj, conf, _props, (fatal) ? getProperty() : null); if (_singleton) set(obj, true); return obj; } @Override public void set(Object obj, boolean derived) { if (!_singleton) throw new IllegalStateException(_loc.get("not-singleton", getProperty()).getMessage()); super.set(obj, derived); } @Override public String getString() { return Configurations.getPlugin(alias(_name), _props); } @Override public void setString(String str) { assertChangeable(); _name = Configurations.getClassName(str); _name = unalias(_name); _props = Configurations.getProperties(str); if (_singleton) set(null, true); valueChanged(); } @Override public Class getValueType() { return Object.class; } @Override protected void objectChanged() { Object obj = get(); _name = (obj == null) ? unalias(null) : obj.getClass().getName(); _props = null; } @Override protected String getInternalString() { // should never get called throw new IllegalStateException(); } @Override protected void setInternalString(String str) { // should never get called throw new IllegalStateException(); } }