/*
* 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.meta.org.test;
import org.drools.core.factmodel.traits.AbstractTraitFactory;
import org.drools.core.metadata.ClassLiteral;
import org.drools.core.metadata.DonLiteral;
import org.drools.core.metadata.Lit;
import org.drools.core.metadata.ManyToManyPropertyLiteral;
import org.drools.core.metadata.ManyToOnePropertyLiteral;
import org.drools.core.metadata.ManyValuedMetaProperty;
import org.drools.core.metadata.MetaClass;
import org.drools.core.metadata.MetaProperty;
import org.drools.core.metadata.MetadataContainer;
import org.drools.core.metadata.ModifyLiteral;
import org.drools.core.metadata.NewInstance;
import org.drools.core.metadata.NewInstanceLiteral;
import org.drools.core.metadata.OneToOnePropertyLiteral;
import org.drools.core.metadata.OneValuedMetaProperty;
import org.drools.core.metadata.ToOnePropertyLiteral;
import org.drools.core.metadata.With;
import org.drools.core.util.ClassUtils;
import java.io.Serializable;
import java.net.URI;
import java.util.Collections;
import java.util.List;
public class Klass_<T extends Klass> extends MetadataContainer<T> implements Serializable {
public Klass_( T x ) {
super( x );
metaClassInfo = Klass_Meta.getInstance();
}
public static final OneValuedMetaProperty<Klass,String> prop = Klass_Meta.prop;
public static final OneValuedMetaProperty<Klass,AnotherKlass> another = Klass_Meta.another;
public static final OneValuedMetaProperty<Klass,AnotherKlass> oneAnother = Klass_Meta.oneAnother;
public static final ManyValuedMetaProperty<Klass,AnotherKlass,List<AnotherKlass>> manyOthers = Klass_Meta.manyAnothers;
public static <X extends Klass> Klass_NewInstance<X> newKlass( Object id, With... args ) {
return Klass_Meta.getInstance().newInstance( id, args );
}
public static <X extends Klass> Klass_NewInstance<X> newKlass( With... args ) {
return Klass_Meta.getInstance().newInstance( args );
}
public static <X, K extends Klass> Klass_Don<X,K> donKlass( X core, With... args ) {
return new Klass_Don<X,K>( core, args );
}
public static Klass_Modify<? extends Klass> modify( Klass x, With... args ) {
return new Klass_Modify<Klass>( x, args );
}
public Klass_Modify<T> modify( With... args ) {
return new Klass_Modify<T>( getTarget(), args );
}
public static class Klass_NewInstance<T extends Klass> extends NewInstanceLiteral<T> implements NewInstance<T> {
public Klass_NewInstance( Object id, With... args ) {
super( URI.create( id.toString() ), args );
}
protected T construct() {
return (T) new KlassImpl( getId().toString() );
}
public Klass_NewInstance<T> prop( String newProp ) {
getSetter().prop( newProp );
return this;
}
public Klass_NewInstance<T> another( AnotherKlass newAnother ) {
getSetter().another( newAnother );
return this;
}
public Klass_NewInstance<T> manyOthers( List<AnotherKlass> val, Lit mode ) {
getSetter().manyOthers( val, mode );
return this;
}
public Klass_NewInstance<T> manyOthers( AnotherKlass val, Lit mode ) {
getSetter().manyOthers( val, mode );
return this;
}
protected Klass_Modify<T> getSetter() {
if ( setter == null ) {
setter = new Klass_Modify( null, this.with );
}
return (Klass_Modify<T>) setter;
}
@Override
public Class<T> getInstanceClass() {
return Klass_Meta.getInstance().getTargetClass();
}
}
public static class Klass_Modify<T extends Klass> extends ModifyLiteral<T> implements Serializable {
@Override
protected MetaClass<T> getMetaClassInfo() {
return Klass_Meta.getInstance();
}
public Klass_Modify( T x, With... args ) {
super( x, args );
}
public Klass_Modify prop( String newVal ) {
addTask( Klass_Meta.prop, newVal, newVal != null ? Lit.SET : Lit.REMOVE );
return this;
}
public Klass_Modify another( AnotherKlass newVal ) {
addTask( Klass_Meta.another, newVal, newVal != null ? Lit.SET : Lit.REMOVE );
return this;
}
public Klass_Modify oneAnother( AnotherKlass newVal ) {
addTask( Klass_Meta.oneAnother, newVal, newVal != null ? Lit.SET : Lit.REMOVE );
return this;
}
public Klass_Modify<T> manyOthers( List<AnotherKlass> val, Lit mode ) {
addTask( Klass_Meta.manyAnothers, val, mode );
return this;
}
public Klass_Modify<T> manyOthers( AnotherKlass val, Lit mode ) {
addTask( Klass_Meta.manyAnothers, Collections.singletonList( val ), mode );
return this;
}
public Class getModificationClass() {
return Klass.class;
}
}
public static class Klass_Meta<T extends Klass> extends ClassLiteral<T> implements Serializable {
private static Klass_Meta instance;
public static Klass_Meta getInstance() {
if ( instance == null ) {
instance = new Klass_Meta( new MetaProperty[] { prop, another, oneAnother, manyOthers } );
}
return instance;
}
public static final OneValuedMetaProperty<Klass,String> prop =
new ToOnePropertyLiteral<Klass,String>( 0, "prop", URI.create( "http://www.test.org#Klass?prop" ) ) {
public String get( Klass o ) { return o.getProp(); }
public void set( Klass o, String value ) { o.setProp( value ); }
public boolean isDatatype() { return true; }
};
public static final OneValuedMetaProperty<Klass,AnotherKlass> another =
new OneToOnePropertyLiteral<Klass, AnotherKlass>( 1, "another", URI.create( "http://www.test.org#Klass?another" ) ) {
public AnotherKlass get( Klass o ) { return o.getAnother(); }
public void set( Klass o, AnotherKlass value ) { o.setAnother( value ); }
@Override
public OneValuedMetaProperty<AnotherKlass, Klass> getInverse() {
return AnotherKlass_.theKlass;
}
public boolean isDatatype() { return false; }
};
public static final OneValuedMetaProperty<Klass,AnotherKlass> oneAnother =
new ManyToOnePropertyLiteral<Klass,AnotherKlass>( 2, "oneAnother", URI.create( "http://www.test.org#Klass?oneAnother" ) ) {
public AnotherKlass get( Klass o ) { return o.getOneAnother(); }
public void set( Klass o, AnotherKlass value ) { o.setOneAnother( value ); }
@Override
public ManyValuedMetaProperty<AnotherKlass, Klass, List<Klass>> getInverse() {
return AnotherKlass_.manyKlasses;
}
public boolean isDatatype() { return false; }
};
public static final ManyValuedMetaProperty<Klass,AnotherKlass,List<AnotherKlass>> manyAnothers =
new ManyToManyPropertyLiteral<Klass,AnotherKlass>( 3, "manyAnothers", URI.create( "http://www.test.org#AnotherKlass?manyAnothers" ) ) {
public List<AnotherKlass> get( Klass o ) { return o.getManyAnothers(); }
public void set( Klass o, List<AnotherKlass> value ) { o.setManyAnothers( value ); }
@Override
public ManyValuedMetaProperty<AnotherKlass,Klass,List<Klass>> getInverse() {
return AnotherKlass_.AnotherKlass_Meta.manyMoreKlasses;
}
public boolean isDatatype() { return false; }
};
protected Klass_Meta( MetaProperty<T,?,?>[] propertyLiterals ) {
super( propertyLiterals );
}
@Override
protected void cachePropertyNames() {
propertyNames = ClassUtils.getAccessibleProperties( Klass.class );
}
@Override
public URI getUri() {
if ( key == null ) {
key = URI.create( "http://www.test.org#Klass" );
}
return key;
}
@Override
public Object getId() {
return getUri();
}
@Override
public Class<T> getTargetClass() {
return (Class<T>) Klass.class;
}
public Klass_NewInstance<T> newInstance( Object id, With... args ) {
return new Klass_NewInstance<T>( id, args );
}
}
public static class Klass_Don<K, T extends Klass> extends DonLiteral<K,T> implements Serializable {
public Klass_Don( K target, With... args ) {
super( target, args );
}
@Override
protected MetaClass<T> getMetaClassInfo() {
return Klass_Meta.getInstance();
}
@Override
public Class<T> getTrait() {
return Klass_Meta.getInstance().getTargetClass();
}
@Override
public Klass_Don<K,T> setTraitFactory( AbstractTraitFactory factory ) {
super.setTraitFactory( factory );
return this;
}
protected Klass_Modify<T> getSetter() {
if ( setter == null ) {
setter = new Klass_Modify( null, this.with );
}
return ( Klass_Modify<T>) setter;
}
public Klass_Don<K,T> prop( String newProp ) {
getSetter().prop( newProp );
return this;
}
public Klass_Don<K,T> another( AnotherKlass newAnother ) {
getSetter().another( newAnother );
return this;
}
public Klass_Don<K,T> oneAnother( AnotherKlass newAnother ) {
getSetter().oneAnother( newAnother );
return this;
}
public Klass_Don<K,T> manyOthers( List<AnotherKlass> val, Lit mode ) {
getSetter().manyOthers( val, mode );
return this;
}
public Klass_Don<K,T> manyOthers( AnotherKlass val, Lit mode ) {
getSetter().manyOthers( val, mode );
return this;
}
}
}