/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.drools.core.metadata;
import org.drools.core.factmodel.traits.InstantiatorFactory;
import java.net.URI;
import java.util.UUID;
public abstract class NewInstanceLiteral<T extends Metadatable> extends AbstractWMTask<T> implements NewInstance<T> {
protected URI uri;
protected T result;
protected ModifyLiteral setter;
protected InstantiatorFactory instantiatorFactory;
protected With[] with;
public NewInstanceLiteral( With... args ) {
this.with = args;
}
public NewInstanceLiteral( Object identifier, With... args ) {
this.uri = URI.create( identifier.toString() );
this.with = args;
}
public boolean isInterface() {
return false;
}
@Override
public KIND kind() {
return KIND.ASSERT;
}
@Override
public Object getTargetId() {
return uri;
}
@Override
public Object callUntyped() {
return construct();
}
@Override
public Modify getInitArgs() {
return setter;
}
@Override
public T call() {
result = (T) construct();
if ( setter != null ) {
setter.setTarget( result );
setter.call();
}
return result;
}
protected abstract Object construct();
protected void constructId( Class<?> klass ) {
if ( uri == null ) {
uri = URI.create( getInstantiatorFactory() != null ?
getInstantiatorFactory().createId( klass ).toString() :
UUID.randomUUID().toString()
);
}
}
public InstantiatorFactory getInstantiatorFactory() {
return instantiatorFactory;
}
public NewInstance<T> setInstantiatorFactory( InstantiatorFactory instantiatorFactory ) {
this.instantiatorFactory = instantiatorFactory;
return this;
}
@Override
public URI getUri() {
return URI.create( uri.toString() + "?create" );
}
@Override
public Object getId() {
return uri;
}
@Override
public ModifyLiteral<T> getSetters() {
return setter;
}
@Override
public T getTarget() {
return result;
}
@Override
public int hashCode() {
return System.identityHashCode( this );
}
}