blob: 32fa5ccb0de81969a134f2ab8e2f4772e6c12cdc [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.myfaces.extensions.scripting.core.reloading;
import org.apache.myfaces.extensions.scripting.core.api.ReloadingStrategy;
import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A simple implementation of our reloading strategy
* pattern this is the most basic implementation
* covering our reloading.
* <p/>
* Applicable for most artifacts except for now managed beans
* <p/> *
*
* @author Werner Punz (latest modification by $Author$)
* @version $Revision$ $Date$
*/
public class SimpleReloadingStrategy implements ReloadingStrategy
{
public SimpleReloadingStrategy() {
}
/**
* <p>
* the central callback for our strategy here
* it has to handle the reload of the scriptingInstance
* if possible, otherwise it has to return the
* original object if no reload was necessary or possible
* </p>
*
* @param scriptingInstance the instance to be reloaded by the system
* @return either the same object or a new instance utilizing the changed code
*/
public Object reload(Object scriptingInstance, int engineType, int artifactType) {
//reload the class to get new static content if needed
Class aclass = WeavingContext.getInstance().reload(scriptingInstance.getClass());
if (aclass == null || aclass.hashCode() == scriptingInstance.getClass().hashCode()) {
//class of this object has not changed although
// reload is enabled we can skip the rest now
return scriptingInstance;
}
getLog().info("[EXT-SCRIPTING] possible reload for " + scriptingInstance.getClass().getName());
/*only recreation of empty constructor classes is possible*/
try {
//reload the object by instantiating a new class and
// assigning the attributes properly
Object newObject = aclass.newInstance();
/*now we shuffle the properties between the objects*/
mapProperties(newObject, engineType, scriptingInstance);
return newObject;
} catch (Exception e) {
getLog().log(Level.SEVERE, "reload ", e);
}
return null;
}
/**
* helper to map the properties wherever possible
* <p/>
* This is the simplest solution for now,
* we apply only a copy properties here, which should be enough
* for all artifacts except the managed beans and the ones
* which have to preserve some kind of delegate before instantiation.
*
* @param target the target which has to receive the properties
* @param src the source which has the original properties
*/
protected void mapProperties(Object target, int engineType, Object src) {
WeavingContext.getInstance().getEngine(engineType).copyProperties(target, src);
}
protected Logger getLog() {
return Logger.getLogger(this.getClass().getName());
}
}