/*
* 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.AbstractTraitFactory;
import org.drools.core.factmodel.traits.LogicalTypeInconsistencyException;
import org.drools.core.factmodel.traits.Thing;
import org.drools.core.factmodel.traits.Traitable;
import org.drools.core.factmodel.traits.TraitableBean;
import org.drools.core.util.BitMaskUtil;
import org.drools.core.util.StandaloneTraitFactory;
import java.net.URI;
public abstract class DonLiteral<K, T extends Metadatable> extends AbstractWMTask<T> implements Don<K,T> {
protected K core;
private URI key;
protected AbstractTraitFactory factory;
protected ModifyLiteral setter;
protected With[] with;
protected abstract MetaClass<T> getMetaClassInfo();
public DonLiteral( K target, With... with ) {
this.core = target;
this.with = with;
}
public K getCore() {
return core;
}
void setCore( K target ) {
this.core = target;
}
@Override
public KIND kind() {
return KIND.DON;
}
@Override
public Object getTargetId() {
return MetadataContainer.getIdentifier( core );
}
public T call() {
if ( getCore() == null ) {
return null;
}
if ( factory != null && factory instanceof StandaloneTraitFactory ) {
StandaloneTraitFactory stf = (StandaloneTraitFactory) factory;
try {
T x = (T) stf.don( getCore() instanceof TraitableBean ? ((TraitableBean) getCore()) : stf.makeTraitable( getCore(), getCore().getClass() ),
getTrait() != null ? getTrait() : Thing.class );
if ( setter != null ) {
setter.call( x );
}
return x;
} catch ( LogicalTypeInconsistencyException e ) {
e.printStackTrace();
}
} else {
throw new UnsupportedOperationException( );
}
return null;
}
public Modify getInitArgs() {
return setter;
}
@Override
public URI getUri() {
if ( key == null ) {
key = createURI();
}
return key;
}
@Override
public Object getId() {
return getUri();
}
protected URI createURI() {
StringBuilder sb = new StringBuilder();
sb.append( MetadataContainer.getIdentifier( core ) );
sb.append( "?don=" ).append( getTrait().getName() );
return URI.create( sb.toString() );
}
public static URI createURI( String coreId, Class type ) {
StringBuilder sb = new StringBuilder();
sb.append( coreId );
sb.append( "?don=" ).append( type.getName() );
return URI.create( sb.toString() );
}
@Override
public Don<K,T> setTraitFactory( AbstractTraitFactory factory ) {
this.factory = factory;
return this;
}
@Override
public ModifyLiteral<T> getSetters() {
return setter;
}
@Override
public Object getTarget() {
return core;
}
}