blob: 3fe100faecb9f89194289c45678601af94296f92 [file] [log] [blame]
/*
* 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.conf;
import org.apache.openjpa.lib.conf.Configuration;
import org.apache.openjpa.lib.conf.ObjectValue;
import org.apache.openjpa.lib.conf.ProductDerivations;
import org.apache.openjpa.lib.conf.Value;
import org.apache.openjpa.lib.conf.ValueListener;
import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.util.UserException;
/**
* A plug-in for Specification that enforces certain overwriting rules.
*
* @author Pinaki Poddar
*
*/
public class SpecificationPlugin extends ObjectValue implements ValueListener {
private Configuration _conf;
protected static final Localizer _loc = Localizer.forPackage
(SpecificationPlugin.class);
public SpecificationPlugin(Configuration conf, String prop) {
super(prop);
_conf = conf;
addListener(this);
}
@Override
public Class<?> getValueType() {
return Specification.class;
}
/**
* Set a value from the given String after validating.
*
* @param str can be null to set the Specification to null.
* If non-null, then the String must be in Specification format
* @see Specification#create(String)
*/
@Override
public void setString(String str) {
this.set(str == null ? null : new Specification(str));
}
/**
* Set a value from the given object after validating.
*
* @param obj can be null to set the Specification to null.
*/
@Override
public void set(Object obj) {
if (obj == null) {
super.set(null);
return;
}
if (!(obj instanceof Specification)) {
throw new UserException(_loc.get("spec-wrong-obj", obj,
obj.getClass())).setFatal(true);
}
validateOverwrite((Specification)obj);
super.set(obj);
}
/**
* Validates if the given Specification can overwrite the current
* Specification. If the given Specification is not same as the
* current one, then it is valid to overwrite.
* If the given Specification is same as the current Specification then
* it must have a major version number equal or less than the current one.
*
* @exception fatal UserException if the given Specification is same as
* the current Specification but has a higher major version.
*
* @see Specification#equals(Object)
*/
protected void validateOverwrite(Specification newSpec) {
Specification current = (Specification)get();
if (current != null) {
Log log = _conf.getConfigurationLog();
if (!current.isSame(newSpec)) {
log.warn(_loc.get("spec-different", newSpec, current));
return;
}
if (current.compareVersion(newSpec) < 0) {
throw new UserException(_loc.get("spec-version-higher",
newSpec, current)).setFatal(true);
}
if (current.compareVersion(newSpec) > 0) {
log.warn(_loc.get("spec-version-lower", newSpec, current));
}
}
}
@Override
public void valueChanged(Value value) {
if (this.getClass().isInstance(value))
ProductDerivations.afterSpecificationSet(_conf);
}
}